@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.
Files changed (211) hide show
  1. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +240 -0
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +614 -0
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +263 -0
  5. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +718 -0
  6. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +275 -0
  7. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
  8. package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
  9. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
  10. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
  11. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +282 -0
  12. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +332 -0
  13. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +631 -0
  14. package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
  15. package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
  16. package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
  17. package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
  18. package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
  19. package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
  20. package/esm2020/lib/models/app-config.model.mjs +2 -0
  21. package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
  22. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
  23. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
  24. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
  25. package/esm2020/lib/models/component-loading-states.mjs +7 -0
  26. package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
  27. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
  28. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
  29. package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
  30. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
  31. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
  32. package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
  33. package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
  34. package/esm2020/lib/reports-lib.component.mjs +22 -0
  35. package/esm2020/lib/reports-lib.module.mjs +172 -0
  36. package/esm2020/lib/reports-lib.service.mjs +14 -0
  37. package/esm2020/lib/services/config.service.mjs +39 -0
  38. package/esm2020/lib/services/report.service.mjs +374 -0
  39. package/esm2020/lib/shared/export-generic.service.mjs +443 -0
  40. package/esm2020/lib/shared/export.service.mjs +379 -0
  41. package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
  42. package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
  43. package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
  44. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2147 -0
  45. package/esm2020/lib/shared/shared.module.mjs +21 -0
  46. package/esm2020/public-api.mjs +41 -0
  47. package/esm2020/sachin9822-reports-lib.mjs +5 -0
  48. package/fesm2015/sachin9822-reports-lib.mjs +8649 -0
  49. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
  50. package/fesm2020/sachin9822-reports-lib.mjs +8510 -0
  51. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
  52. package/index.d.ts +5 -0
  53. package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
  54. package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
  55. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
  56. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
  57. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
  58. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +108 -0
  59. package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
  60. package/lib/components/funding-report/funding-report.component.d.ts +55 -0
  61. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
  62. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
  63. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
  64. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +69 -0
  65. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +71 -0
  66. package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
  67. package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
  68. package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
  69. package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
  70. package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
  71. package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
  72. package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
  73. package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
  74. package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
  75. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
  76. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
  77. package/lib/models/component-loading-states.d.ts +5 -0
  78. package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
  79. 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
  80. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
  81. package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
  82. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
  83. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
  84. package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +38 -0
  85. package/lib/reports-lib-routing.module.d.ts +7 -0
  86. package/lib/reports-lib.component.d.ts +8 -0
  87. package/lib/reports-lib.module.d.ts +33 -0
  88. package/lib/reports-lib.service.d.ts +6 -0
  89. package/lib/services/config.service.d.ts +20 -0
  90. package/lib/services/report.service.d.ts +80 -0
  91. package/lib/shared/export-generic.service.d.ts +50 -0
  92. package/lib/shared/export.service.d.ts +32 -0
  93. package/lib/shared/loader/loader.component.d.ts +5 -0
  94. package/lib/shared/metadata/metadata.component.d.ts +24 -0
  95. package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
  96. package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
  97. package/lib/shared/shared.module.d.ts +11 -0
  98. package/package.json +31 -16
  99. package/{src/public-api.ts → public-api.d.ts} +7 -17
  100. package/karma.conf.js +0 -44
  101. package/ng-package.json +0 -17
  102. package/src/assets/images/BreadcrumbArrow.png +0 -0
  103. package/src/assets/images/XMCoral.png +0 -0
  104. package/src/lib/assets/images/Search.svg +0 -10
  105. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
  106. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
  107. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
  108. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
  109. package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
  110. package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
  111. package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
  112. package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
  113. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
  114. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
  115. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
  116. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
  117. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
  118. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
  119. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
  120. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
  121. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
  122. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
  123. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
  124. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
  125. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
  126. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
  127. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
  128. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
  129. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
  130. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
  131. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
  132. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
  133. package/src/lib/components/funding-report/funding-report.component.html +0 -49
  134. package/src/lib/components/funding-report/funding-report.component.scss +0 -1
  135. package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
  136. package/src/lib/components/funding-report/funding-report.component.ts +0 -221
  137. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
  138. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
  139. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
  140. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
  141. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
  142. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
  143. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
  144. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
  145. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
  146. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
  147. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
  148. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
  149. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
  150. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
  151. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
  152. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
  153. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
  154. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
  155. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
  156. package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
  157. package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
  158. package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
  159. package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
  160. package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
  161. package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
  162. package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
  163. package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
  164. package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
  165. package/src/lib/models/component-loading-states.ts +0 -5
  166. package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
  167. package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
  168. package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
  169. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
  170. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
  171. package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
  172. package/src/lib/reports-lib-routing.module.ts +0 -20
  173. package/src/lib/reports-lib.component.spec.ts +0 -23
  174. package/src/lib/reports-lib.component.ts +0 -20
  175. package/src/lib/reports-lib.module.ts +0 -102
  176. package/src/lib/reports-lib.service.spec.ts +0 -16
  177. package/src/lib/reports-lib.service.ts +0 -9
  178. package/src/lib/services/config.service.ts +0 -43
  179. package/src/lib/services/report.service.spec.ts +0 -16
  180. package/src/lib/services/report.service.ts +0 -463
  181. package/src/lib/shared/export-generic.service.ts +0 -557
  182. package/src/lib/shared/export.service.spec.ts +0 -16
  183. package/src/lib/shared/export.service.ts +0 -457
  184. package/src/lib/shared/loader/loader.component.html +0 -8
  185. package/src/lib/shared/loader/loader.component.scss +0 -52
  186. package/src/lib/shared/loader/loader.component.ts +0 -10
  187. package/src/lib/shared/metadata/metadata.component.html +0 -42
  188. package/src/lib/shared/metadata/metadata.component.scss +0 -95
  189. package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
  190. package/src/lib/shared/metadata/metadata.component.ts +0 -38
  191. package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
  192. package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
  193. package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
  194. package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
  195. package/src/lib/shared/search-filter/search-filter.component.html +0 -601
  196. package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
  197. package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
  198. package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
  199. package/src/lib/shared/shared.module.ts +0 -13
  200. package/src/styles/ag-grid-report-style.scss +0 -71
  201. package/src/styles/common-ag-grid-style.scss +0 -146
  202. package/src/styles/common-report-style.scss +0 -395
  203. package/src/styles/common-style.scss +0 -615
  204. package/src/test.ts +0 -27
  205. package/tsconfig.lib.json +0 -15
  206. package/tsconfig.lib.prod.json +0 -10
  207. package/tsconfig.spec.json +0 -17
  208. /package/{src/lib → lib}/assets/config/app-config.json +0 -0
  209. /package/{src → lib}/assets/images/Search.svg +0 -0
  210. /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
  211. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0L3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHL0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7QUEyQnhDLE1BQU0sT0FBTyxtQ0FBbUM7SUF5RTlDLFlBQW9CLGFBQTRCLEVBQVUsYUFBNEI7UUFBbEUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXRFdEYsZUFBVSxHQUFXLDBCQUEwQixDQUFBO1FBSS9DLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztRQUV2RSx5QkFBb0IsR0FBVyxPQUFPLENBQUM7UUFDdkMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRzNCLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFFMUIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRzdCLGtCQUFhLEdBQVc7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osaUJBQWlCLEVBQUUsS0FBSztZQUN4QixTQUFTLEVBQUU7Z0JBQ1QsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLGFBQWEsRUFBRSxLQUFLO2dCQUNwQixhQUFhLEVBQUUsUUFBUTtnQkFDdkIsWUFBWSxFQUFFLFFBQVE7Z0JBQ3RCLGVBQWUsRUFBRSxZQUFZO2FBQzlCO1lBRUQsY0FBYyxFQUFFLElBQUk7WUFDcEIsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBRWhCLGNBQWMsRUFBRTtnQkFDZCxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQztnQkFDeEUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQ3ZFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUM7Z0JBQ3pFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUM7YUFDekU7U0FDRixDQUFDO1FBRUYsa0JBQWEsR0FBRztZQUNkLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVTtTQUMvQyxDQUFDO1FBRUYsZUFBVSxHQUNSO1lBQ0UsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDbEcsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDOUcsRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDcEksRUFBRSxVQUFVLEVBQUUsOEJBQThCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFO1lBQzlILEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO1lBQ25HLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO1lBQ3RHLEVBQUUsVUFBVSxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFO1lBQ3JILEVBQUUsVUFBVSxFQUFFLDhCQUE4QixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRTtTQUMvSCxDQUFDO1FBRUosWUFBTyxHQUFvQixFQUFFLENBQUM7SUFHNEQsQ0FBQztJQUUzRixRQUFRLEtBQVcsQ0FBQztJQUVwQiw2QkFBNkIsQ0FBQyxHQUFRO1FBRXBDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7UUFFbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUQsSUFBSSxFQUFFLENBQUMsTUFBMEIsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0JBRXJDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO2dCQUVyQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEQsR0FBRyxHQUFHO29CQUNOLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3JELEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ25DLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQy9DLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUVKLElBQUksQ0FBQyxXQUFXLEdBQUc7b0JBQ2pCLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDbkMsQ0FBQztnQkFFRixJQUFJLENBQUMsV0FBVyxHQUFHO29CQUNqQixvQkFBb0IsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRTtpQkFDaEUsQ0FBQztnQkFFRixNQUFNLGNBQWMsR0FBdUI7b0JBQ3pDLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDdkMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDNUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDN0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDN0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUNyQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUMxQixDQUFDO2dCQUVGLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO2dCQUdyQyxJQUFJLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUEwQjtRQUN0QyxNQUFNLElBQUksR0FBb0IsRUFBRSxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM5QixHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDMUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBRXBELElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQ1IsT0FBTyxFQUFFLEVBQUU7d0JBQ1gsV0FBVyxFQUFFLFFBQVE7d0JBQ3JCLGtCQUFrQixFQUFFLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRTt3QkFDM0MsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQzVELEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDNUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQ3RELGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUM1RCxVQUFVLEVBQUUsSUFBSTtxQkFDakIsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsV0FBVyxFQUFFLFFBQVE7b0JBQ3JCLGtCQUFrQixFQUFFLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFO29CQUM5QyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQzFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEQsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQzVELFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNoRCxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFdBQVcsRUFBRSxFQUFFO1lBQ2Ysa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuRCxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM3RCxjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuRSxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBc0I7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUV0QyxNQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNwRCxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZO1FBQ25CLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBUSxFQUFVLEVBQUUsQ0FDckMsR0FBRztZQUNELEVBQUUsUUFBUSxFQUFFO2FBQ1gsV0FBVyxFQUFFO2FBQ2IsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7YUFDakIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDcEIsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQzthQUNyQyxJQUFJLEVBQUUsQ0FBQztRQUVaLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixJQUFJLE1BQU0sRUFBRTtZQUNWLHdDQUF3QztZQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2lCQUN2RCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLEdBQUcsR0FBRztnQkFDTixjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3RELENBQUMsQ0FBQztpQkFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDYixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDckUsQ0FBQztTQUNMO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2lCQUN2RCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLEdBQUcsR0FBRztnQkFDTixjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3RELENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQWM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztRQUNuQyxRQUFRLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNqQyxLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLE1BQU07WUFDUjtnQkFDRSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFNUQsTUFBTSxLQUFLLEdBQUcsNEJBQTRCLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsZ0NBQWdDLENBQUM7UUFFbEQsd0JBQXdCO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxVQUFVLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN6RSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUUzQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRW5CLG1CQUFtQjtRQUNuQixNQUFNLFFBQVEsR0FBdUI7WUFDbkMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3JDLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuRSxDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFM0MsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUU7WUFDbEMsSUFBSTtnQkFDRixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUN6RjtZQUFDLE1BQU0sR0FBRztTQUNaO1FBQ0QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTVELHdCQUF3QjtRQUN4QixHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakQsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXBDLHVDQUF1QztRQUN2QyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRCxRQUFRLElBQUksQ0FBQyxDQUFDO1FBRWQscUNBQXFDO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7WUFFeEQsb0JBQW9CO1lBQ3BCLElBQUksSUFBSSxFQUFFO2dCQUNSLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsR0FBRyxjQUFjLEdBQUcsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2hGO1lBRUQsb0NBQW9DO1lBQ3BDLElBQUksS0FBSyxFQUFFO2dCQUNULEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGVBQWUsR0FBRyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDckY7WUFFRCxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsMEJBQTBCO1NBQzFDO1FBRUQsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUVkLGtCQUFrQjtRQUNsQixNQUFNLE9BQU8sR0FBRztZQUNkLE9BQU87WUFDUCxVQUFVLEVBQUUsY0FBYyxFQUFFLHFCQUFxQjtZQUNqRCwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUI7WUFDcEUsd0JBQXdCLEVBQUUsMkJBQTJCO1NBQ3RELENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRS9ELGVBQWU7UUFDZixNQUFNLElBQUksR0FBWSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsQ0FBQyxHQUFHLENBQUM7WUFDTCxHQUFHLENBQUMsT0FBTztZQUNYLEdBQUcsQ0FBQyxXQUFXO1lBQ2YsR0FBRyxDQUFDLGtCQUFrQjtZQUN0QixHQUFHLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkUsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2RCxHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakUsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ3hFLENBQUMsQ0FBQztRQUVILHdCQUF3QjtRQUN4QixNQUFNLFlBQVksR0FBMkI7WUFDM0MsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtZQUNwQixDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7WUFDcEIsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtZQUNwQixDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7WUFDcEIsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtZQUNwQixDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7U0FDckIsQ0FBQztRQUVGLHFCQUFxQjtRQUNwQixHQUFXLENBQUMsU0FBUyxDQUFDO1lBQ3JCLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNmLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLE1BQU07WUFDYixVQUFVLEVBQUU7Z0JBQ1YsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixRQUFRLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLGFBQWEsRUFBRSxFQUFFO2FBQ2xCO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxDQUFDO2dCQUNYLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUMxQixTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNyQjtZQUNELE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFO1lBQ25FLFlBQVk7WUFDWixZQUFZLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFFdEMsSUFBSSxVQUFVO29CQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7Z0JBRXBELDZCQUE2QjtnQkFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ3pCLE1BQU0sTUFBTSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdEYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO3dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUMxQztpQkFDRjtZQUNILENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsTUFBTSxVQUFVLEdBQUksR0FBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNqRCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLFVBQVUsRUFBRSxFQUFFLFNBQVMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDckY7UUFFRCxtQkFBbUI7UUFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU07WUFBRSxPQUFPO1FBRTVELE1BQU0sUUFBUSxHQUFHLGlDQUFpQyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFckQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1RSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQ3pHO1FBRUQsZ0JBQWdCO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFDO1FBQzNDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN4QixTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ25FLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixtQkFBbUI7UUFDbkIsTUFBTSxRQUFRLEdBQXVCO1lBQ25DLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNyQyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkUsQ0FBQztRQUNGLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ2xDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsRUFBRSxDQUFDO1FBRWIsa0NBQWtDO1FBQ2xDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLG1CQUFtQixDQUFDO1FBQ3pELEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNuRCxVQUFVLElBQUksQ0FBQyxDQUFDO1FBRWhCLDBCQUEwQjtRQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7WUFDeEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBRXZDLFlBQVk7WUFDWixLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7Z0JBQ3JCLFFBQVEsRUFBRTtvQkFDUixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ3ZELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtpQkFDMUI7YUFDRixDQUFDO1lBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUVsRSwrQkFBK0I7WUFDL0IsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztvQkFDckIsUUFBUSxFQUFFO3dCQUNSLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDeEQsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3FCQUMzQjtpQkFDRixDQUFDO2dCQUNGLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7YUFDbkU7U0FDRjtRQUNELFVBQVUsRUFBRSxDQUFDO1FBRWIsa0JBQWtCO1FBQ2xCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsT0FBTztZQUNQLFVBQVUsRUFBRSxjQUFjLEVBQUUscUJBQXFCO1lBQ2pELDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQjtZQUNwRSx3QkFBd0IsRUFBRSwyQkFBMkI7U0FDdEQsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQy9FLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUN6SCxDQUFDLENBQUMsQ0FBQztRQUVILG1EQUFtRDtRQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4RSxNQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDOUYsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLEdBQUcsR0FBRyxDQUFDO2dCQUNQLEdBQUcsQ0FBQyxPQUFPO2dCQUNYLEdBQUcsQ0FBQyxXQUFXO2dCQUNmLEdBQUcsQ0FBQyxrQkFBa0I7Z0JBQ3RCLEdBQUcsT0FBTztnQkFDVixHQUFHLENBQUMsVUFBVSxJQUFJLEtBQUs7YUFDeEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNmLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyw0REFBNEQ7Z0JBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRTtvQkFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs7b0JBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO2dCQUV0QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBRXZILGtCQUFrQjtnQkFDbEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBRXJDLHVCQUF1QjtnQkFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQzdELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDMUU7Z0JBRUQsdUNBQXVDO2dCQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFM0Qsb0JBQW9CO1FBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUVBQW1FLEVBQUUsQ0FBQyxDQUFDO1lBQy9HLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNO1lBQUUsT0FBTztRQUU1RCxNQUFNLFFBQVEsR0FBRyxnQ0FBZ0MsQ0FBQztRQUVsRCxtQkFBbUI7UUFDbkIsTUFBTSxRQUFRLEdBQXVCO1lBQ25DLENBQUMsZUFBZSxFQUFFLDRCQUE0QixDQUFDO1lBQy9DLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNyQyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkUsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTNDLDZDQUE2QztRQUM3QyxNQUFNLE9BQU8sR0FBRztZQUNkLE9BQU87WUFDUCxVQUFVLEVBQUUsY0FBYyxFQUFFLHFCQUFxQjtZQUNqRCwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUI7WUFDcEUsd0JBQXdCLEVBQUUsMkJBQTJCO1NBQ3RELENBQUM7UUFFRixxQ0FBcUM7UUFDckMsTUFBTSxJQUFJLEdBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNwRixLQUFLLEdBQUcsQ0FBQztZQUNULEdBQUcsQ0FBQyxPQUFPO1lBQ1gsR0FBRyxDQUFDLFdBQVc7WUFDZixHQUFHLENBQUMsa0JBQWtCO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3JELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDakUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDVixDQUFDLENBQUM7UUFFRiw0QkFBNEI7UUFDNUIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLFdBQVc7UUFDWCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNsQyxVQUFVLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTTtRQUUxQixrQ0FBa0M7UUFDbEMsVUFBVSxJQUFJLHFCQUFxQixDQUFDO1FBRXBDLCtDQUErQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXBDLFlBQVk7WUFDWixJQUFJLElBQUk7Z0JBQUUsVUFBVSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRXZFLGFBQWE7WUFDYixJQUFJLEtBQUs7Z0JBQUUsVUFBVSxJQUFJLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRTNFLFVBQVUsSUFBSSxJQUFJLENBQUM7U0FDcEI7UUFDRCxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsNEJBQTRCO1FBRWhELGdCQUFnQjtRQUNoQixVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFOUQsYUFBYTtRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakIsVUFBVSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFZO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDO1FBRXhDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlELE1BQU0sR0FBRyxHQUF5QztZQUNoRCxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDakMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTztZQUN2QixNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbkIsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM1QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFlBQVksRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUU7U0FDMUgsQ0FBQztRQUVGLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO0lBQzdCLENBQUM7O2dJQTdyQlUsbUNBQW1DO29IQUFuQyxtQ0FBbUMsdUlDcENoRCxnK0NBd0JNOzJGRFlPLG1DQUFtQztrQkFML0MsU0FBUzsrQkFDRSxtQ0FBbUM7Z0lBb043QyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29sRGVmLCBDb2x1bW5BcGksIEdyaWRBcGksIEdyaWRSZWFkeUV2ZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IEFjY291bnREZXRhaWwsIFRyaWFsQmFsYW5jZVJlcG9ydCB9IGZyb20gJy4uLy4uL21vZGVscy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLm1vZGVscyc7XHJcbmltcG9ydCB7IFJlcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQuc2VydmljZSc7XHJcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XHJcbmltcG9ydCAnanNwZGYtYXV0b3RhYmxlJztcclxuaW1wb3J0ICogYXMgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC5zZXJ2aWNlJztcclxuXHJcblxyXG5kZWNsYXJlIG1vZHVsZSAnanNwZGYnIHtcclxuICBpbnRlcmZhY2UganNQREYge1xyXG4gICAgYXV0b1RhYmxlOiAob3B0aW9uczogYW55KSA9PiBqc1BERjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnRSZXF1ZXN0RFRPIHtcclxuICB5ZWFyOiBudW1iZXI7XHJcbiAgZGF0ZVR5cGU6IHN0cmluZztcclxuICBmcm9tRGF0ZTogc3RyaW5nO1xyXG4gIHRvRGF0ZTogc3RyaW5nO1xyXG4gIGFjY291bnRTdGF0dXM6IHN0cmluZztcclxuICBidXNpbmVzc0xpbmU6IHN0cmluZztcclxuICBjdXJyZW5jeTogc3RyaW5nO1xyXG4gIGNvbXBhbnlDb2RlOiBzdHJpbmc7XHJcbiAgcmVwb3J0UGVyaW9kOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblxyXG4gIFJlcG9ydE5hbWU6IHN0cmluZyA9IFwiVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzXCJcclxuICBncmlkQXBpOiBHcmlkQXBpO1xyXG4gIG1ldGFEYXRhT25lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+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=