ngx-vector-components 5.172.0 → 6.0.0

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 (168) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/assets/styles/_primeng-custom-theme.scss +697 -141
  3. package/assets/styles/_spinner.scss +2 -1
  4. package/assets/styles/_styles.scss +20 -1
  5. package/assets/styles/_variables.scss +35 -1
  6. package/fesm2022/ngx-vector-components.mjs +397 -273
  7. package/fesm2022/ngx-vector-components.mjs.map +1 -1
  8. package/lib/components/drawer/drawer.component.d.ts +21 -0
  9. package/lib/components/drawer/drawer.module.d.ts +9 -0
  10. package/lib/components/drawer/index.d.ts +2 -0
  11. package/lib/components/fields/data-table/data-table.component.d.ts +2 -2
  12. package/lib/components/fields/fields.module.d.ts +5 -5
  13. package/lib/components/fields/input-switch-field/input-switch-field.component.d.ts +3 -2
  14. package/lib/components/fields/select-button-field/select-button-field.component.d.ts +4 -1
  15. package/lib/components/fields/text-field/text-field.component.d.ts +1 -1
  16. package/lib/components/index.d.ts +1 -0
  17. package/lib/config/index.d.ts +14 -0
  18. package/lib/models/profile.model.d.ts +2 -1
  19. package/package.json +13 -14
  20. package/public-api.d.ts +1 -0
  21. package/esm2022/lib/components/badge/badge.component.mjs +0 -39
  22. package/esm2022/lib/components/badge/badge.module.mjs +0 -19
  23. package/esm2022/lib/components/badge/index.mjs +0 -3
  24. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +0 -74
  25. package/esm2022/lib/components/breadcrumb/breadcrumb.module.mjs +0 -18
  26. package/esm2022/lib/components/breadcrumb/index.mjs +0 -3
  27. package/esm2022/lib/components/crud-base/crud-base.component.mjs +0 -47
  28. package/esm2022/lib/components/crud-base/index.mjs +0 -2
  29. package/esm2022/lib/components/crud-footer/crud-footer.component.mjs +0 -40
  30. package/esm2022/lib/components/crud-footer/crud-footer.module.mjs +0 -20
  31. package/esm2022/lib/components/crud-footer/index.mjs +0 -3
  32. package/esm2022/lib/components/crud-header/crud-header.component.mjs +0 -30
  33. package/esm2022/lib/components/crud-header/crud-header.module.mjs +0 -19
  34. package/esm2022/lib/components/crud-header/index.mjs +0 -3
  35. package/esm2022/lib/components/crud-history/crud-history.component.mjs +0 -100
  36. package/esm2022/lib/components/crud-history/crud-history.module.mjs +0 -21
  37. package/esm2022/lib/components/crud-history/index.mjs +0 -3
  38. package/esm2022/lib/components/fields/button/button.component.mjs +0 -48
  39. package/esm2022/lib/components/fields/button/index.mjs +0 -2
  40. package/esm2022/lib/components/fields/calendar-field/calendar-field.component.mjs +0 -107
  41. package/esm2022/lib/components/fields/calendar-field/index.mjs +0 -2
  42. package/esm2022/lib/components/fields/checkbox-field/checkbox-field.component.mjs +0 -62
  43. package/esm2022/lib/components/fields/checkbox-field/index.mjs +0 -2
  44. package/esm2022/lib/components/fields/currency-field/currency-field.component.mjs +0 -103
  45. package/esm2022/lib/components/fields/currency-field/index.mjs +0 -2
  46. package/esm2022/lib/components/fields/data-table/data-table.component.mjs +0 -454
  47. package/esm2022/lib/components/fields/data-table/index.mjs +0 -2
  48. package/esm2022/lib/components/fields/dropdown-field/dropdown-field.component.mjs +0 -308
  49. package/esm2022/lib/components/fields/dropdown-field/index.mjs +0 -2
  50. package/esm2022/lib/components/fields/field-error-message/field-error-message.component.mjs +0 -35
  51. package/esm2022/lib/components/fields/field-error-message/index.mjs +0 -2
  52. package/esm2022/lib/components/fields/fields.module.mjs +0 -229
  53. package/esm2022/lib/components/fields/filters/filters.component.mjs +0 -212
  54. package/esm2022/lib/components/fields/filters/index.mjs +0 -2
  55. package/esm2022/lib/components/fields/index.mjs +0 -21
  56. package/esm2022/lib/components/fields/input-number-field/index.mjs +0 -2
  57. package/esm2022/lib/components/fields/input-number-field/input-number-field.component.mjs +0 -88
  58. package/esm2022/lib/components/fields/input-otp/index.mjs +0 -2
  59. package/esm2022/lib/components/fields/input-otp/input-otp.component.mjs +0 -50
  60. package/esm2022/lib/components/fields/input-switch-field/index.mjs +0 -2
  61. package/esm2022/lib/components/fields/input-switch-field/input-switch-field.component.mjs +0 -21
  62. package/esm2022/lib/components/fields/multiselect-field/index.mjs +0 -2
  63. package/esm2022/lib/components/fields/multiselect-field/multiselect-field.component.mjs +0 -315
  64. package/esm2022/lib/components/fields/percentage-field/index.mjs +0 -2
  65. package/esm2022/lib/components/fields/percentage-field/percentage-field.component.mjs +0 -54
  66. package/esm2022/lib/components/fields/radio-button-field/index.mjs +0 -2
  67. package/esm2022/lib/components/fields/radio-button-field/radio-button-field.component.mjs +0 -62
  68. package/esm2022/lib/components/fields/range-value/index.mjs +0 -2
  69. package/esm2022/lib/components/fields/range-value/range-value.component.mjs +0 -72
  70. package/esm2022/lib/components/fields/search-field/index.mjs +0 -2
  71. package/esm2022/lib/components/fields/search-field/search-field.component.mjs +0 -33
  72. package/esm2022/lib/components/fields/select-button-field/index.mjs +0 -2
  73. package/esm2022/lib/components/fields/select-button-field/select-button-field.component.mjs +0 -23
  74. package/esm2022/lib/components/fields/text-field/index.mjs +0 -2
  75. package/esm2022/lib/components/fields/text-field/text-field.component.mjs +0 -277
  76. package/esm2022/lib/components/fields/textarea-field/index.mjs +0 -2
  77. package/esm2022/lib/components/fields/textarea-field/textarea-field.component.mjs +0 -81
  78. package/esm2022/lib/components/generic-error-modal/generic-error-modal.component.mjs +0 -33
  79. package/esm2022/lib/components/generic-error-modal/generic-error-modal.module.mjs +0 -20
  80. package/esm2022/lib/components/generic-error-modal/index.mjs +0 -3
  81. package/esm2022/lib/components/generic-modal/generic-modal.component.mjs +0 -66
  82. package/esm2022/lib/components/generic-modal/generic-modal.module.mjs +0 -20
  83. package/esm2022/lib/components/generic-modal/index.mjs +0 -3
  84. package/esm2022/lib/components/index.mjs +0 -15
  85. package/esm2022/lib/components/menu/index.mjs +0 -4
  86. package/esm2022/lib/components/menu/menu.component.mjs +0 -306
  87. package/esm2022/lib/components/menu/menu.module.mjs +0 -20
  88. package/esm2022/lib/components/menu/sub-menus-list/sub-menus-list.component.mjs +0 -41
  89. package/esm2022/lib/components/panel/index.mjs +0 -3
  90. package/esm2022/lib/components/panel/panel.component.mjs +0 -15
  91. package/esm2022/lib/components/panel/panel.module.mjs +0 -19
  92. package/esm2022/lib/components/score/index.mjs +0 -3
  93. package/esm2022/lib/components/score/score.component.mjs +0 -17
  94. package/esm2022/lib/components/score/score.module.mjs +0 -16
  95. package/esm2022/lib/components/stepper/index.mjs +0 -3
  96. package/esm2022/lib/components/stepper/stepper.component.mjs +0 -47
  97. package/esm2022/lib/components/stepper/stepper.module.mjs +0 -19
  98. package/esm2022/lib/components/top-bar/index.mjs +0 -3
  99. package/esm2022/lib/components/top-bar/top-bar.component.mjs +0 -158
  100. package/esm2022/lib/components/top-bar/top-bar.module.mjs +0 -21
  101. package/esm2022/lib/guards/crud-list-has-items.guard.mjs +0 -11
  102. package/esm2022/lib/guards/get-token-by-guid.guard.mjs +0 -41
  103. package/esm2022/lib/guards/has-permission.guard.mjs +0 -15
  104. package/esm2022/lib/guards/index.mjs +0 -6
  105. package/esm2022/lib/guards/role.guard.mjs +0 -14
  106. package/esm2022/lib/guards/token-is-present.guard.mjs +0 -14
  107. package/esm2022/lib/injections/index.mjs +0 -5
  108. package/esm2022/lib/interceptors/http-interceptor.mjs +0 -186
  109. package/esm2022/lib/interceptors/index.mjs +0 -2
  110. package/esm2022/lib/models/app-name.enum.mjs +0 -10
  111. package/esm2022/lib/models/boolean-type.enum.mjs +0 -6
  112. package/esm2022/lib/models/crud-history.model.mjs +0 -3
  113. package/esm2022/lib/models/crud-mode.enum.mjs +0 -7
  114. package/esm2022/lib/models/currency.enum.mjs +0 -7
  115. package/esm2022/lib/models/data-table.model.mjs +0 -23
  116. package/esm2022/lib/models/document-type.enum.mjs +0 -6
  117. package/esm2022/lib/models/filters.model.mjs +0 -2
  118. package/esm2022/lib/models/generic-modal.model.mjs +0 -2
  119. package/esm2022/lib/models/http-response.model.mjs +0 -2
  120. package/esm2022/lib/models/index.mjs +0 -19
  121. package/esm2022/lib/models/ip-info.enum.mjs +0 -2
  122. package/esm2022/lib/models/list-item.model.mjs +0 -2
  123. package/esm2022/lib/models/locale.enum.mjs +0 -7
  124. package/esm2022/lib/models/menu-item.model.mjs +0 -2
  125. package/esm2022/lib/models/message-status.enum.mjs +0 -8
  126. package/esm2022/lib/models/profile.model.mjs +0 -711
  127. package/esm2022/lib/models/role.enum.mjs +0 -5
  128. package/esm2022/lib/models/status.enum.mjs +0 -9
  129. package/esm2022/lib/models/topbar.model.mjs +0 -2
  130. package/esm2022/lib/models/vector-app.model.mjs +0 -2
  131. package/esm2022/lib/models/vector-notification.model.mjs +0 -2
  132. package/esm2022/lib/models/view.enum.mjs +0 -9
  133. package/esm2022/lib/pipes/currency-brl.pipe.mjs +0 -18
  134. package/esm2022/lib/pipes/format-document.pipe.mjs +0 -17
  135. package/esm2022/lib/pipes/index.mjs +0 -9
  136. package/esm2022/lib/pipes/mask.pipe.mjs +0 -21
  137. package/esm2022/lib/pipes/not-hidden.pipe.mjs +0 -16
  138. package/esm2022/lib/pipes/only-active.pipe.mjs +0 -16
  139. package/esm2022/lib/pipes/pipes.module.mjs +0 -50
  140. package/esm2022/lib/pipes/remove-last-child.pipe.mjs +0 -18
  141. package/esm2022/lib/pipes/unread-notifications.pipe.mjs +0 -15
  142. package/esm2022/lib/resolvers/get-selected-crud-item.resolver.mjs +0 -17
  143. package/esm2022/lib/resolvers/index.mjs +0 -2
  144. package/esm2022/lib/services/auth.service.mjs +0 -78
  145. package/esm2022/lib/services/base-dropdown.mjs +0 -2
  146. package/esm2022/lib/services/breadcrumb.service.mjs +0 -22
  147. package/esm2022/lib/services/crud-base.service.mjs +0 -14
  148. package/esm2022/lib/services/enum.service.mjs +0 -43
  149. package/esm2022/lib/services/error-message.service.mjs +0 -16
  150. package/esm2022/lib/services/geolocation.service.mjs +0 -23
  151. package/esm2022/lib/services/index.mjs +0 -14
  152. package/esm2022/lib/services/loading.service.mjs +0 -15
  153. package/esm2022/lib/services/menu.service.mjs +0 -154
  154. package/esm2022/lib/services/modal.service.mjs +0 -15
  155. package/esm2022/lib/services/notifications.service.mjs +0 -64
  156. package/esm2022/lib/services/profile.service.mjs +0 -115
  157. package/esm2022/lib/services/storage.service.mjs +0 -104
  158. package/esm2022/lib/shared/shared.module.mjs +0 -19
  159. package/esm2022/lib/utils/cpf-cnpj-validator.util.mjs +0 -109
  160. package/esm2022/lib/utils/file.util.mjs +0 -15
  161. package/esm2022/lib/utils/index.mjs +0 -8
  162. package/esm2022/lib/utils/mask.util.mjs +0 -82
  163. package/esm2022/lib/utils/object.util.mjs +0 -27
  164. package/esm2022/lib/utils/string.util.mjs +0 -52
  165. package/esm2022/lib/utils/validation.util.mjs +0 -279
  166. package/esm2022/lib/utils/window.util.mjs +0 -9
  167. package/esm2022/ngx-vector-components.mjs +0 -5
  168. package/esm2022/public-api.mjs +0 -10
@@ -1,454 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { DateTime } from 'luxon';
3
- import { Subscription } from 'rxjs';
4
- import { debounceTime } from 'rxjs/operators';
5
- import { Status } from '../../../models';
6
- import { TableColumnType } from '../../../models/data-table.model';
7
- import { MaskUtil } from '../../../utils';
8
- import { FiltersComponent } from '../filters/filters.component';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "@angular/forms";
12
- import * as i3 from "primeng/inputtext";
13
- import * as i4 from "primeng/api";
14
- import * as i5 from "primeng/inputnumber";
15
- import * as i6 from "../../panel/panel.component";
16
- import * as i7 from "primeng/tabview";
17
- import * as i8 from "../../badge/badge.component";
18
- import * as i9 from "../../score/score.component";
19
- import * as i10 from "primeng/menu";
20
- import * as i11 from "primeng/table";
21
- import * as i12 from "../button/button.component";
22
- import * as i13 from "../filters/filters.component";
23
- import * as i14 from "@ngx-translate/core";
24
- export class DataTableComponent {
25
- set data(_data) {
26
- this._data = _data;
27
- this.selectedItems = this._data?.filter((item) => item.selected) || [];
28
- }
29
- get data() {
30
- return this._data;
31
- }
32
- set tabs(_tabs) {
33
- this._tabs = _tabs;
34
- this._tabSelected = _tabs[0];
35
- }
36
- set selectionMode(_selectionMode) {
37
- switch (_selectionMode) {
38
- case 'single':
39
- this._selectionMode = 'single';
40
- break;
41
- case 'multiple':
42
- this._selectionMode = 'multiple';
43
- break;
44
- default:
45
- this._selectionMode = null;
46
- break;
47
- }
48
- }
49
- set height(_height) {
50
- switch (_height) {
51
- case 'small':
52
- this._height = '300px';
53
- break;
54
- case 'medium':
55
- this._height = '500px';
56
- break;
57
- case 'large':
58
- this._height = '700px';
59
- break;
60
- case 'full':
61
- this._height = 'flex';
62
- break;
63
- default:
64
- this._height = '300px';
65
- }
66
- }
67
- get balance() {
68
- return (itemAccount) => {
69
- return itemAccount.showBalance
70
- ? itemAccount.valueBalance.toLocaleString('pt-BR', {
71
- currency: 'BRL',
72
- minimumFractionDigits: 2,
73
- maximumFractionDigits: 2,
74
- })
75
- : '-,--';
76
- };
77
- }
78
- get tabs() {
79
- return this._tabs;
80
- }
81
- get height() {
82
- return this._height;
83
- }
84
- get selectionMode() {
85
- return this._selectionMode;
86
- }
87
- constructor(cd) {
88
- this.cd = cd;
89
- this.columns = [];
90
- this._data = [];
91
- this.exportExcel = false;
92
- this.exportPDF = false;
93
- this.totalRecords = 0;
94
- this.disabledHeadercheckbox = false;
95
- this.filters = [];
96
- this.addItemLabel = '';
97
- this.pagination = true;
98
- this.virtualPagination = false;
99
- this.addItemButtonPlusSign = false;
100
- this.hasActions = true;
101
- this.hasExpandableIcon = false;
102
- this.addNameColumnExpand = '';
103
- this.expandable = false;
104
- this.selectionType = null;
105
- this.showLimitBalance = false;
106
- this.showDataBalance = false;
107
- this.dataAccountBalance = [];
108
- this.onLazyLoad = new EventEmitter();
109
- this.onFilter = new EventEmitter();
110
- this.onAdd = new EventEmitter();
111
- this.onExportExcel = new EventEmitter();
112
- this.onExportPDF = new EventEmitter();
113
- this.onSelectedRows = new EventEmitter();
114
- this.onFilterChanged = new EventEmitter();
115
- this.onTabSelected = new EventEmitter();
116
- this.onExpandRow = new EventEmitter();
117
- this.onCellEdit = new EventEmitter();
118
- this.firstLazyLoad = false;
119
- this.shouldLazyLoadWithoutFilter = false;
120
- this.reorderableColumns = false;
121
- this.disableInitialSearch = false;
122
- this.selectedItems = [];
123
- this._selectionMode = null;
124
- this._height = 'small';
125
- this._tabs = [];
126
- this._draw = 1;
127
- this._firstLazyLoadedDone = this.firstLazyLoad;
128
- this._filterSubscription = new Subscription();
129
- }
130
- ngOnInit() {
131
- if (!this.height) {
132
- this.height = 'small';
133
- }
134
- if (!this.pagination || this.virtualPagination) {
135
- this.filtersComponent?.search();
136
- }
137
- }
138
- ngOnDestroy() {
139
- this._filterSubscription.unsubscribe();
140
- }
141
- getColStyle(col) {
142
- return { 'min-width': col.width };
143
- }
144
- lazyLoaded(params = { filter: false, data: { start: 0, rows: 10 } }) {
145
- if (this.disableInitialSearch) {
146
- this.disableInitialSearch = false;
147
- return;
148
- }
149
- if (!params.filter && !this.shouldLazyLoadWithoutFilter) {
150
- const columns = this.columns.map((col) => {
151
- return {
152
- data: col.field,
153
- name: `${col.field.substring(0, 1).toUpperCase()}${col.field.substring(1, col.field.length)}`,
154
- orderable: true,
155
- search: { value: '', regex: false },
156
- searchable: true,
157
- };
158
- });
159
- if (this.hasActions) {
160
- columns.unshift({
161
- data: 'active',
162
- name: 'Active',
163
- orderable: true,
164
- search: { value: '', regex: false },
165
- searchable: true,
166
- });
167
- }
168
- this._lastLazyLoadEvent = {
169
- ...(this._lastLazyLoadEvent || {}),
170
- page: params.data.first / params.data.rows + 1,
171
- start: params.data.first,
172
- length: params.data.rows,
173
- draw: this._draw++,
174
- order: params.data.sortField
175
- ? [
176
- {
177
- column: this.columns.findIndex((col) => col.field === params.data.sortField) + (this.hasActions ? 1 : 0),
178
- dir: params.data.sortOrder > 0 ? 'asc' : 'desc',
179
- },
180
- ]
181
- : [{ column: 0, dir: 'desc' }],
182
- columns: columns,
183
- tab: this._tabSelected,
184
- };
185
- }
186
- else {
187
- this._lastLazyLoadEvent = {
188
- ...this._lastLazyLoadEvent,
189
- ...params.data,
190
- start: 0,
191
- };
192
- if (this._tabSelected) {
193
- this._lastLazyLoadEvent = {
194
- ...(this._lastLazyLoadEvent || {}),
195
- ...{ Status: this._tabSelected.code },
196
- tab: this._tabSelected,
197
- };
198
- }
199
- }
200
- if (this._firstLazyLoadedDone || this.firstLazyLoad) {
201
- this.onLazyLoad.emit(this._lastLazyLoadEvent);
202
- }
203
- this._firstLazyLoadedDone = true;
204
- }
205
- getCellContent(item, col) {
206
- const cellText = this.getCellText(item, col);
207
- let content = `<span class="p-column-title">${col.header}</span><span class="w-100">`;
208
- if (!col.type ||
209
- [TableColumnType.ENUM, TableColumnType.TEXT, TableColumnType.DATETIME, TableColumnType.DATE].includes(col.type)) {
210
- content += cellText;
211
- }
212
- switch (col.type) {
213
- case TableColumnType.CUSTOM_STYLE:
214
- content += `<span class="${col.textFieldClass ? item[col.textFieldClass] : ''}">${cellText}</span>`;
215
- break;
216
- case TableColumnType.BOOLEAN:
217
- content += `<div class="text-centered"><i class=" status-table-field fas fa-${cellText ? 'check boolean-value-positive' : 'times boolean-value-negative'}"></i></div>`;
218
- break;
219
- case TableColumnType.STATUS_BADGE:
220
- content += `<div class="text-centered"><i class="fas fa-circle status-table-field ${this.getStatusColor(cellText)}"></i></div>`;
221
- break;
222
- case TableColumnType.ACTIVE_BOOLEAN_BADGE:
223
- content += `<div class="text-centered"><i class="fas fa-circle status-table-field ${this.getActiveStatusColor(cellText)}"></i></div>`;
224
- break;
225
- case TableColumnType.BUTTON:
226
- let iconClass = '';
227
- if (typeof col.icon === 'function') {
228
- iconClass = col.icon(item);
229
- }
230
- else {
231
- iconClass = col.icon || 'fas fa-circle';
232
- }
233
- content += `<div class="text-centered"><i class="${iconClass} status-table-field table-button"></i></div>`;
234
- break;
235
- case TableColumnType.MASK:
236
- if (col.mask === 'dynamicCpfCnpj') {
237
- content += MaskUtil.formatDocument(cellText);
238
- }
239
- else {
240
- content += MaskUtil.doMaskString(cellText, col.mask);
241
- }
242
- break;
243
- case TableColumnType.CURRENCY:
244
- content += Number(cellText).toLocaleString('pt-BR', {
245
- currency: col.currencyType || 'BRL',
246
- currencyDisplay: 'narrowSymbol',
247
- style: 'currency',
248
- });
249
- }
250
- content += `</span>`;
251
- return content;
252
- }
253
- getCellText(item, col) {
254
- if (col.getEnumTranslated) {
255
- return col.getEnumTranslated(item[col.field]);
256
- }
257
- if (col.type === TableColumnType.DATETIME && item[col.field]) {
258
- const dateTime = item[col.field] instanceof Date ? DateTime.fromJSDate(item[col.field]) : DateTime.fromISO(item[col.field]);
259
- return dateTime.toUTC().toFormat('dd/MM/yyyy HH:mm');
260
- }
261
- if (col.type === TableColumnType.DATE && item[col.field]) {
262
- const dateTime = item[col.field] instanceof Date ? DateTime.fromJSDate(item[col.field]) : DateTime.fromISO(item[col.field]);
263
- return dateTime.toUTC().toFormat('dd/MM/yyyy');
264
- }
265
- if (col.type === TableColumnType.STACK_BADGE) {
266
- if (!item[col.field].length || item[col.field].length === 1) {
267
- return item[col.field];
268
- }
269
- else {
270
- return `+${item[col.field].length}`;
271
- }
272
- }
273
- if (col.type === TableColumnType.STATUS_BADGE) {
274
- return item[col.field] == 0 ? 0 : item[col.field];
275
- }
276
- return item[col.field || ''] || '';
277
- }
278
- getTooltipText(item, col) {
279
- if (!col.type ||
280
- ![TableColumnType.STACK_BADGE].includes(col.type) ||
281
- !Array.isArray(item[col.field]) ||
282
- item[col.field].length === 1) {
283
- return null;
284
- }
285
- if (!Array.isArray(item[col.field])) {
286
- return item[col.field];
287
- }
288
- return item[col.field].join(' - ');
289
- }
290
- onTabChange($event) {
291
- this._tabSelected = this.tabs[$event.index];
292
- this.lazyLoaded({ filter: true, data: {} });
293
- this.onTabSelected.emit(this._tabSelected);
294
- }
295
- subscribeToFilterChanges() {
296
- this._filterSubscription.unsubscribe();
297
- this._filterSubscription = new Subscription();
298
- Object.keys(this.filtersComponent?.formGroup.controls || {}).forEach((key) => {
299
- this._filterSubscription.add(this.filtersComponent?.formGroup
300
- .get(key)
301
- ?.valueChanges.pipe(debounceTime(300))
302
- .subscribe((value) => {
303
- this.onFilterChanged.emit({ field: key, value });
304
- }));
305
- this.onFilterChanged.emit({ field: key, value: this.filtersComponent?.formGroup.get(key)?.value });
306
- });
307
- }
308
- onRowClick(item) {
309
- setTimeout(() => {
310
- this.cd.markForCheck();
311
- });
312
- this.onExpandRow.emit(item);
313
- }
314
- get listHasActions() {
315
- return this.data.some((item) => item.actions?.length);
316
- }
317
- changeSelectedItems(value) {
318
- this.onSelectedRows.emit(this.selectedItems);
319
- }
320
- isHtmlCell(col) {
321
- return !col.type || !this.isBadgeCell(col);
322
- }
323
- isEditableCell(col) {
324
- return this.isHtmlCell(col) && !!col.cellEdit;
325
- }
326
- onCellEditComplete(item, col, value) {
327
- item[col.field] = value;
328
- this.onCellEdit.emit({ item, field: col.field, value });
329
- }
330
- isBadgeCell(col) {
331
- return col.type && [TableColumnType.TEXT_BADGE, TableColumnType.STACK_BADGE].includes(col.type);
332
- }
333
- isScoreCell(col) {
334
- return col.type === TableColumnType.SCORE;
335
- }
336
- onSelectionChange(selection) {
337
- for (let i = selection.length - 1; i >= 0; i--) {
338
- let data = selection[i];
339
- if (data.disabledCheckBox) {
340
- selection.splice(i, 1);
341
- }
342
- }
343
- this.selectedItems = selection;
344
- }
345
- changeShowBalance(itemAccount) {
346
- if (itemAccount) {
347
- itemAccount.showBalance = !itemAccount.showBalance;
348
- }
349
- }
350
- getStatusColor(status) {
351
- switch (status) {
352
- case Status.PENDING:
353
- return 'warning';
354
- case Status.APPROVED:
355
- return 'success';
356
- case Status.REJECTED:
357
- return 'error';
358
- case Status.INFO:
359
- return 'info';
360
- }
361
- return '';
362
- }
363
- getActiveStatusColor(active) {
364
- return active ? 'success' : 'error';
365
- }
366
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
367
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataTableComponent, selector: "vector-data-table", inputs: { columns: "columns", data: "data", exportExcel: "exportExcel", exportPDF: "exportPDF", customFunction: "customFunction", totalRecords: "totalRecords", disabledHeadercheckbox: "disabledHeadercheckbox", filters: "filters", addItemLabel: "addItemLabel", pagination: "pagination", virtualPagination: "virtualPagination", tabs: "tabs", customButtons: "customButtons", addItemButtonPlusSign: "addItemButtonPlusSign", hasActions: "hasActions", hasExpandableIcon: "hasExpandableIcon", addNameColumnExpand: "addNameColumnExpand", expandable: "expandable", expansionTemplate: "expansionTemplate", selectionMode: "selectionMode", selectionType: "selectionType", height: "height", showLimitBalance: "showLimitBalance", showDataBalance: "showDataBalance", dataAccountBalance: "dataAccountBalance", firstLazyLoad: "firstLazyLoad", shouldLazyLoadWithoutFilter: "shouldLazyLoadWithoutFilter", reorderableColumns: "reorderableColumns", disableInitialSearch: "disableInitialSearch" }, outputs: { onLazyLoad: "onLazyLoad", onFilter: "onFilter", onAdd: "onAdd", onExportExcel: "onExportExcel", onExportPDF: "onExportPDF", onSelectedRows: "onSelectedRows", onFilterChanged: "onFilterChanged", onTabSelected: "onTabSelected", onExpandRow: "onExpandRow", onCellEdit: "onCellEdit" }, viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: FiltersComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"grid\">\n <div class=\"col-12\">\n <vector-filters\n [fields]=\"filters\"\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\n (formBuilded)=\"subscribeToFilterChanges()\"\n ></vector-filters>\n </div>\n <div\n class=\"table-header-actions field\"\n *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction || customButtons\"\n >\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\n </button>\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\n </button>\n <button\n *ngFor=\"let button of customFunction\"\n (click)=\"button.clickFunction()\"\n class=\"export-button custom-function\"\n >\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\n </button>\n\n <vector-button\n *ngFor=\"let button of customButtons\"\n class=\"add-item-button\"\n [round]=\"true\"\n [label]=\"button.label\"\n (click)=\"button.clickFunction()\"\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\n [disabled]=\"button.disabled === true\"\n ></vector-button>\n <vector-button\n *ngIf=\"addItemLabel\"\n class=\"add-item-button\"\n [label]=\"addItemLabel\"\n (click)=\"onAdd.emit()\"\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\n [round]=\"true\"\n ></vector-button>\n </div>\n @if (showLimitBalance) {\n <div class=\"col-12 grid ml-0\">\n @for (itemAccount of dataAccountBalance; track $index) {\n @if (itemAccount.visible) {\n <div class=\"card balance-container\">\n <span class=\"card-header\">{{ itemAccount.name }}</span>\n <div class=\"card-content value-container\">\n <span>R$ </span>\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\n <div class=\"icon-container\">\n <i\n class=\"fas\"\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\n (click)=\"changeShowBalance(itemAccount)\"\n ></i>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n @if (showDataBalance) {\n <div class=\"col-12 grid ml-0\">\n @for (itemAccount of dataAccountBalance; track $index) {\n <div class=\"card balance-container\">\n <span class=\"card-header\">{{ itemAccount.name }}</span>\n <div class=\"card-content value-container\">\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"col-12\">\n <vector-panel class=\"data-table-panel\">\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\n <p-tabPanel *ngFor=\"let tab of tabs\">\n <ng-template pTemplate=\"header\">\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\">&nbsp;</em>\n <span>{{ tab.name }}</span>\n </ng-template>\n </p-tabPanel>\n </p-tabView>\n <p-table\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\n sortMode=\"single\"\n [rows]=\"10\"\n [lazy]=\"pagination && !virtualPagination\"\n [value]=\"data\"\n [paginator]=\"pagination\"\n [totalRecords]=\"totalRecords\"\n [showCurrentPageReport]=\"true\"\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\n [responsive]=\"true\"\n [resizableColumns]=\"true\"\n [scrollable]=\"true\"\n scrollDirection=\"vertical\"\n responsiveLayout=\"scroll\"\n dataKey=\"id\"\n [scrollHeight]=\"height\"\n [attr.selectionMode]=\"selectionMode\"\n [(selection)]=\"selectedItems\"\n (onRowSelect)=\"changeSelectedItems($event)\"\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\n (onRowUnselect)=\"changeSelectedItems($event)\"\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\n (selectionChange)=\"onSelectionChange($event)\"\n [reorderableColumns]=\"reorderableColumns\"\n editMode=\"cell\"\n >\n <ng-template pTemplate=\"header\">\n <tr class=\"header\">\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\n\n <th *ngIf=\"selectionType === 'checkbox'\">\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\n </th>\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\n {{ addNameColumnExpand }}\n </th>\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\n <th *ngIf=\"selectionType === 'radiobutton'\">\n <div class=\"flex align-items-center\">\n <span></span>\n </div>\n </th>\n @for (col of columns; track $index) {\n @if (!col.hidden) {\n <th\n [ngStyle]=\"getColStyle(col)\"\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\n pReorderableColumn\n >\n <div class=\"flex align-items-center\">\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\n </div>\n </th>\n }\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\n <tr\n class=\"row\"\n [pSelectableRow]=\"rowData\"\n [ngClass]=\"{ expandable: expandable }\"\n [pRowToggler]=\"expandable ? item : undefined\"\n (click)=\"onRowClick(item)\"\n [pReorderableRow]=\"index\"\n >\n <ng-container *ngIf=\"reorderableColumns\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n </ng-container>\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\n </td>\n </ng-container>\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n </ng-container>\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <i\n [ngClass]=\"\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\n \"\n ></i>\n </td>\n <td *ngIf=\"hasActions\">\n <p-menu\n #menu\n [model]=\"item.actions\"\n [popup]=\"true\"\n appendTo=\"body\"\n (onShow)=\"item._menuOpen = true\"\n (onHide)=\"item._menuOpen = false\"\n ></p-menu>\n <i\n class=\"actions-menu-button fas fa-cog\"\n [class.active]=\"item._menuOpen\"\n (click)=\"menu.toggle($event)\"\n ></i>\n </td>\n @for (col of columns; track $index) {\n @if (!col.hidden) {\n <ng-container>\n <td\n *ngIf=\"isEditableCell(col)\"\n class=\"cell\"\n [pEditableColumn]=\"item\"\n [pEditableColumnField]=\"col.field\"\n [ngStyle]=\"getColStyle(col)\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-inputNumber\n *ngIf=\"!col.cellEdit?.editType || col.cellEdit?.editType === 'number'\"\n [(ngModel)]=\"item[col.field]\"\n [suffix]=\"col.cellEdit?.editSuffix || ''\"\n mode=\"decimal\"\n [maxFractionDigits]=\"col.cellEdit?.editMaxFractionDigits ?? 2\"\n [min]=\"col.cellEdit?.editMin ?? 0\"\n [max]=\"col.cellEdit?.editMax\"\n (onBlur)=\"onCellEditComplete(item, col, item[col.field])\"\n ></p-inputNumber>\n <input\n *ngIf=\"col.cellEdit?.editType === 'text'\"\n pInputText\n [(ngModel)]=\"item[col.field]\"\n (blur)=\"onCellEditComplete(item, col, item[col.field])\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span>{{ item[col.field] }}{{ col.cellEdit?.editSuffix || '' }}</span>\n <i class=\"pi pi-pencil ml-2 text-primary\"></i>\n </ng-template>\n </p-cellEditor>\n </td>\n <td\n *ngIf=\"isHtmlCell(col) && !col.cellEdit\"\n class=\"cell\"\n [innerHTML]=\"getCellContent(item, col)\"\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\n [ngStyle]=\"getColStyle(col)\"\n ></td>\n <td\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\n class=\"cell\"\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\n [ngStyle]=\"getColStyle(col)\"\n >\n <vector-badge\n *ngIf=\"isBadgeCell(col)\"\n [label]=\"getCellText(item, col)\"\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\n [tooltip]=\"getTooltipText(item, col)\"\n ></vector-badge>\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\n </td>\n </ng-container>\n }\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"row\">\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n <tr>\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </vector-panel>\n </div>\n</div>\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium);padding:6px;border-radius:50%;transition:all .15s ease}.actions-menu-button:hover{background-color:#0000000d}.actions-menu-button:active{transform:scale(.92);background-color:#0000001a;color:var(--theme-dark)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;min-width:13%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i6.PanelComponent, selector: "vector-panel" }, { kind: "component", type: i7.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i7.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i8.BadgeComponent, selector: "vector-badge", inputs: ["type", "label", "customColor", "customBackgroundColor", "tooltip"] }, { kind: "component", type: i9.ScoreComponent, selector: "vector-score", inputs: ["score"] }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i11.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i11.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i11.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i11.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "directive", type: i11.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i11.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i11.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i11.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i11.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i11.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i11.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i11.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "component", type: i12.ButtonComponent, selector: "vector-button", inputs: ["disabled", "label", "type", "leftIcon", "rightIcon", "noShadow", "round", "style", "loading"], outputs: ["onClick"] }, { kind: "component", type: i13.FiltersComponent, selector: "vector-filters", inputs: ["fields"], outputs: ["onSearch", "formBuilded"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] }); }
368
- }
369
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataTableComponent, decorators: [{
370
- type: Component,
371
- args: [{ selector: 'vector-data-table', template: "<div class=\"grid\">\n <div class=\"col-12\">\n <vector-filters\n [fields]=\"filters\"\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\n (formBuilded)=\"subscribeToFilterChanges()\"\n ></vector-filters>\n </div>\n <div\n class=\"table-header-actions field\"\n *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction || customButtons\"\n >\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\n </button>\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\n </button>\n <button\n *ngFor=\"let button of customFunction\"\n (click)=\"button.clickFunction()\"\n class=\"export-button custom-function\"\n >\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\n </button>\n\n <vector-button\n *ngFor=\"let button of customButtons\"\n class=\"add-item-button\"\n [round]=\"true\"\n [label]=\"button.label\"\n (click)=\"button.clickFunction()\"\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\n [disabled]=\"button.disabled === true\"\n ></vector-button>\n <vector-button\n *ngIf=\"addItemLabel\"\n class=\"add-item-button\"\n [label]=\"addItemLabel\"\n (click)=\"onAdd.emit()\"\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\n [round]=\"true\"\n ></vector-button>\n </div>\n @if (showLimitBalance) {\n <div class=\"col-12 grid ml-0\">\n @for (itemAccount of dataAccountBalance; track $index) {\n @if (itemAccount.visible) {\n <div class=\"card balance-container\">\n <span class=\"card-header\">{{ itemAccount.name }}</span>\n <div class=\"card-content value-container\">\n <span>R$ </span>\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\n <div class=\"icon-container\">\n <i\n class=\"fas\"\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\n (click)=\"changeShowBalance(itemAccount)\"\n ></i>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n @if (showDataBalance) {\n <div class=\"col-12 grid ml-0\">\n @for (itemAccount of dataAccountBalance; track $index) {\n <div class=\"card balance-container\">\n <span class=\"card-header\">{{ itemAccount.name }}</span>\n <div class=\"card-content value-container\">\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"col-12\">\n <vector-panel class=\"data-table-panel\">\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\n <p-tabPanel *ngFor=\"let tab of tabs\">\n <ng-template pTemplate=\"header\">\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\">&nbsp;</em>\n <span>{{ tab.name }}</span>\n </ng-template>\n </p-tabPanel>\n </p-tabView>\n <p-table\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\n sortMode=\"single\"\n [rows]=\"10\"\n [lazy]=\"pagination && !virtualPagination\"\n [value]=\"data\"\n [paginator]=\"pagination\"\n [totalRecords]=\"totalRecords\"\n [showCurrentPageReport]=\"true\"\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\n [responsive]=\"true\"\n [resizableColumns]=\"true\"\n [scrollable]=\"true\"\n scrollDirection=\"vertical\"\n responsiveLayout=\"scroll\"\n dataKey=\"id\"\n [scrollHeight]=\"height\"\n [attr.selectionMode]=\"selectionMode\"\n [(selection)]=\"selectedItems\"\n (onRowSelect)=\"changeSelectedItems($event)\"\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\n (onRowUnselect)=\"changeSelectedItems($event)\"\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\n (selectionChange)=\"onSelectionChange($event)\"\n [reorderableColumns]=\"reorderableColumns\"\n editMode=\"cell\"\n >\n <ng-template pTemplate=\"header\">\n <tr class=\"header\">\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\n\n <th *ngIf=\"selectionType === 'checkbox'\">\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\n </th>\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\n {{ addNameColumnExpand }}\n </th>\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\n <th *ngIf=\"selectionType === 'radiobutton'\">\n <div class=\"flex align-items-center\">\n <span></span>\n </div>\n </th>\n @for (col of columns; track $index) {\n @if (!col.hidden) {\n <th\n [ngStyle]=\"getColStyle(col)\"\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\n pReorderableColumn\n >\n <div class=\"flex align-items-center\">\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\n </div>\n </th>\n }\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\n <tr\n class=\"row\"\n [pSelectableRow]=\"rowData\"\n [ngClass]=\"{ expandable: expandable }\"\n [pRowToggler]=\"expandable ? item : undefined\"\n (click)=\"onRowClick(item)\"\n [pReorderableRow]=\"index\"\n >\n <ng-container *ngIf=\"reorderableColumns\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n </ng-container>\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\n </td>\n </ng-container>\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n </ng-container>\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <i\n [ngClass]=\"\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\n \"\n ></i>\n </td>\n <td *ngIf=\"hasActions\">\n <p-menu\n #menu\n [model]=\"item.actions\"\n [popup]=\"true\"\n appendTo=\"body\"\n (onShow)=\"item._menuOpen = true\"\n (onHide)=\"item._menuOpen = false\"\n ></p-menu>\n <i\n class=\"actions-menu-button fas fa-cog\"\n [class.active]=\"item._menuOpen\"\n (click)=\"menu.toggle($event)\"\n ></i>\n </td>\n @for (col of columns; track $index) {\n @if (!col.hidden) {\n <ng-container>\n <td\n *ngIf=\"isEditableCell(col)\"\n class=\"cell\"\n [pEditableColumn]=\"item\"\n [pEditableColumnField]=\"col.field\"\n [ngStyle]=\"getColStyle(col)\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-inputNumber\n *ngIf=\"!col.cellEdit?.editType || col.cellEdit?.editType === 'number'\"\n [(ngModel)]=\"item[col.field]\"\n [suffix]=\"col.cellEdit?.editSuffix || ''\"\n mode=\"decimal\"\n [maxFractionDigits]=\"col.cellEdit?.editMaxFractionDigits ?? 2\"\n [min]=\"col.cellEdit?.editMin ?? 0\"\n [max]=\"col.cellEdit?.editMax\"\n (onBlur)=\"onCellEditComplete(item, col, item[col.field])\"\n ></p-inputNumber>\n <input\n *ngIf=\"col.cellEdit?.editType === 'text'\"\n pInputText\n [(ngModel)]=\"item[col.field]\"\n (blur)=\"onCellEditComplete(item, col, item[col.field])\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span>{{ item[col.field] }}{{ col.cellEdit?.editSuffix || '' }}</span>\n <i class=\"pi pi-pencil ml-2 text-primary\"></i>\n </ng-template>\n </p-cellEditor>\n </td>\n <td\n *ngIf=\"isHtmlCell(col) && !col.cellEdit\"\n class=\"cell\"\n [innerHTML]=\"getCellContent(item, col)\"\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\n [ngStyle]=\"getColStyle(col)\"\n ></td>\n <td\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\n class=\"cell\"\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\n [ngStyle]=\"getColStyle(col)\"\n >\n <vector-badge\n *ngIf=\"isBadgeCell(col)\"\n [label]=\"getCellText(item, col)\"\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\n [tooltip]=\"getTooltipText(item, col)\"\n ></vector-badge>\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\n </td>\n </ng-container>\n }\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"row\">\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n <tr>\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </vector-panel>\n </div>\n</div>\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium);padding:6px;border-radius:50%;transition:all .15s ease}.actions-menu-button:hover{background-color:#0000000d}.actions-menu-button:active{transform:scale(.92);background-color:#0000001a;color:var(--theme-dark)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;min-width:13%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"] }]
372
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { columns: [{
373
- type: Input
374
- }], data: [{
375
- type: Input
376
- }], exportExcel: [{
377
- type: Input
378
- }], exportPDF: [{
379
- type: Input
380
- }], customFunction: [{
381
- type: Input
382
- }], totalRecords: [{
383
- type: Input
384
- }], disabledHeadercheckbox: [{
385
- type: Input
386
- }], filters: [{
387
- type: Input
388
- }], addItemLabel: [{
389
- type: Input
390
- }], pagination: [{
391
- type: Input
392
- }], virtualPagination: [{
393
- type: Input
394
- }], tabs: [{
395
- type: Input
396
- }], customButtons: [{
397
- type: Input
398
- }], addItemButtonPlusSign: [{
399
- type: Input
400
- }], hasActions: [{
401
- type: Input
402
- }], hasExpandableIcon: [{
403
- type: Input
404
- }], addNameColumnExpand: [{
405
- type: Input
406
- }], expandable: [{
407
- type: Input
408
- }], expansionTemplate: [{
409
- type: Input
410
- }], selectionMode: [{
411
- type: Input
412
- }], selectionType: [{
413
- type: Input
414
- }], height: [{
415
- type: Input
416
- }], showLimitBalance: [{
417
- type: Input
418
- }], showDataBalance: [{
419
- type: Input
420
- }], dataAccountBalance: [{
421
- type: Input
422
- }], onLazyLoad: [{
423
- type: Output
424
- }], onFilter: [{
425
- type: Output
426
- }], onAdd: [{
427
- type: Output
428
- }], onExportExcel: [{
429
- type: Output
430
- }], onExportPDF: [{
431
- type: Output
432
- }], onSelectedRows: [{
433
- type: Output
434
- }], onFilterChanged: [{
435
- type: Output
436
- }], onTabSelected: [{
437
- type: Output
438
- }], onExpandRow: [{
439
- type: Output
440
- }], onCellEdit: [{
441
- type: Output
442
- }], firstLazyLoad: [{
443
- type: Input
444
- }], shouldLazyLoadWithoutFilter: [{
445
- type: Input
446
- }], reorderableColumns: [{
447
- type: Input
448
- }], disableInitialSearch: [{
449
- type: Input
450
- }], filtersComponent: [{
451
- type: ViewChild,
452
- args: [FiltersComponent, { static: true }]
453
- }] } });
454
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFnQyxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQXVDLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLElBQ1csSUFBSSxDQUFDLEtBQVk7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFD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QURuQixLQUFLO2dCQUdDLHFCQUFxQjtzQkFEM0IsS0FBSztnQkFHQyxVQUFVO3NCQURoQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUssYUFBYTtzQkFEdkIsS0FBSztnQkFlQyxhQUFhO3NCQURuQixLQUFLO2dCQUdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBb0JDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFHQyxlQUFlO3NCQURyQixLQUFLO2dCQUdDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixNQUFNO2dCQUdBLFFBQVE7c0JBRGQsTUFBTTtnQkFHQSxLQUFLO3NCQURYLE1BQU07Z0JBR0EsYUFBYTtzQkFEbkIsTUFBTTtnQkFHQSxXQUFXO3NCQURqQixNQUFNO2dCQUdBLGNBQWM7c0JBRHBCLE1BQU07Z0JBR0EsZUFBZTtzQkFEckIsTUFBTTtnQkFHQSxhQUFhO3NCQURuQixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBR0EsVUFBVTtzQkFEaEIsTUFBTTtnQkFJQSxhQUFhO3NCQURuQixLQUFLO2dCQUdDLDJCQUEyQjtzQkFEakMsS0FBSztnQkFHQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBR0Msb0JBQW9CO3NCQUQxQixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQsIExpc3RJdGVtLCBTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVDb2x1bW4sIFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXRhLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IE1hc2tVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRmlsdGVyRmllbGQsIEZpbHRlcnNDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJzL2ZpbHRlcnMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmVjdG9yLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBwdWJsaWMgY29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGEoX2RhdGE6IGFueVtdKSB7XG4gICAgdGhpcy5fZGF0YSA9IF9kYXRhO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2RhdGE/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCkgfHwgW107XG4gIH1cbiAgcHVibGljIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG4gIHByaXZhdGUgX2RhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBleHBvcnRFeGNlbCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXhwb3J0UERGID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjdXN0b21GdW5jdGlvbjogeyBsYWJlbDogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjbGlja0Z1bmN0aW9uOiBGdW5jdGlvbiB9W10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0b3RhbFJlY29yZHMgPSAwO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWRIZWFkZXJjaGVja2JveCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZmlsdGVyczogRmlsdGVyRmllbGRbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWRkSXRlbUxhYmVsID0gJyc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYWdpbmF0aW9uID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIHZpcnR1YWxQYWdpbmF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGFicyhfdGFiczogTGlzdEl0ZW1bXSkge1xuICAgIHRoaXMuX3RhYnMgPSBfdGFicztcbiAgICB0aGlzLl90YWJTZWxlY3RlZCA9IF90YWJzWzBdO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjdXN0b21CdXR0b25zOiB7IGxhYmVsOiBzdHJpbmc7IGNsaWNrRnVuY3Rpb246IEZ1bmN0aW9uOyBkaXNhYmxlZD86IGJvb2xlYW4gfVtdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWRkSXRlbUJ1dHRvblBsdXNTaWduID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIGhhc0V4cGFuZGFibGVJY29uID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhZGROYW1lQ29sdW1uRXhwYW5kID0gJyc7XG4gIEBJbnB1dCgpIGV4cGFuZGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgZXhwYW5zaW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3Rpb25Nb2RlKF9zZWxlY3Rpb25Nb2RlKSB7XG4gICAgc3dpdGNoIChfc2VsZWN0aW9uTW9kZSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ211bHRpcGxlJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogJ2NoZWNrYm94JyB8ICdyYWRpb2J1dHRvbicgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWlnaHQoX2hlaWdodDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChfaGVpZ2h0KSB7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICczMDBweCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWVkaXVtJzpcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gJzUwMHB4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXJnZSc6XG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICc3MDBweCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZnVsbCc6XG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICdmbGV4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9oZWlnaHQgPSAnMzAwcHgnO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0xpbWl0QmFsYW5jZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0RhdGFCYWxhbmNlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkYXRhQWNjb3VudEJhbGFuY2U6IHsgdmlzaWJsZTogYm9vbGVhbjsgbmFtZTogc3RyaW5nOyB2YWx1ZUJhbGFuY2U6IG51bWJlcjsgc2hvd0JhbGFuY2U6IGJvb2xlYW4gfVtdID0gW107XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvbkxhenlMb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVMYXp5TG9hZEV2ZW50PigpO1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25BZGQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25FeHBvcnRFeGNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvbkV4cG9ydFBERiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvblNlbGVjdGVkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyQ2hhbmdlZEV2ZW50PigpO1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uVGFiU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RJdGVtPigpO1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uRXhwYW5kUm93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvbkNlbGxFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IGFueTsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IGFueSB9PigpO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaXJzdExhenlMb2FkID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG91bGRMYXp5TG9hZFdpdGhvdXRGaWx0ZXIgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIHJlb3JkZXJhYmxlQ29sdW1ucyA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZUluaXRpYWxTZWFyY2ggPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKEZpbHRlcnNDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBmaWx0ZXJzQ29tcG9uZW50OiBGaWx0ZXJzQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBhbnkgPSBbXTtcblxuICBnZXQgYmFsYW5jZSgpOiAoaXRlbUFjY291bnQ/OiBhbnkpID0+IG51bWJlciB8IHN0cmluZyB7XG4gICAgcmV0dXJuIChpdGVtQWNjb3VudD86IGFueSk6IG51bWJlciB8IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gaXRlbUFjY291bnQuc2hvd0JhbGFuY2VcbiAgICAgICAgPyBpdGVtQWNjb3VudC52YWx1ZUJhbGFuY2UudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgICAgY3VycmVuY3k6ICdCUkwnLFxuICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogJy0sLS0nO1xuICAgIH07XG4gIH1cblxuICBnZXQgdGFicygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFicztcbiAgfVxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gIH1cbiAgZ2V0IHNlbGVjdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGU7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaGVpZ2h0OiBzdHJpbmcgPSAnc21hbGwnO1xuICBwcml2YXRlIF90YWJzOiBMaXN0SXRlbVtdID0gW107XG4gIHByaXZhdGUgX2RyYXcgPSAxO1xuICBwcml2YXRlIF9maXJzdExhenlMb2FkZWREb25lID0gdGhpcy5maXJzdExhenlMb2FkO1xuICBwcml2YXRlIF9sYXN0TGF6eUxvYWRFdmVudDogRGF0YVRhYmxlTGF6eUxvYWRFdmVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdGFiU2VsZWN0ZWQ6IExpc3RJdGVtIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9maWx0ZXJTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLmhlaWdodCA9ICdzbWFsbCc7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb24gfHwgdGhpcy52aXJ0dWFsUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5maWx0ZXJzQ29tcG9uZW50Py5zZWFyY2goKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldENvbFN0eWxlKGNvbDogVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4geyAnbWluLXdpZHRoJzogY29sLndpZHRoIH07XG4gIH1cblxuICBsYXp5TG9hZGVkKHBhcmFtczogeyBmaWx0ZXI6IGJvb2xlYW47IGRhdGE6IGFueSB9ID0geyBmaWx0ZXI6IGZhbHNlLCBkYXRhOiB7IHN0YXJ0OiAwLCByb3dzOiAxMCB9IH0pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlSW5pdGlhbFNlYXJjaCkge1xuICAgICAgdGhpcy5kaXNhYmxlSW5pdGlhbFNlYXJjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5maWx0ZXIgJiYgIXRoaXMuc2hvdWxkTGF6eUxvYWRXaXRob3V0RmlsdGVyKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogY29sLmZpZWxkLFxuICAgICAgICAgIG5hbWU6IGAke2NvbC5maWVsZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKX0ke2NvbC5maWVsZC5zdWJzdHJpbmcoMSwgY29sLmZpZWxkLmxlbmd0aCl9YCxcbiAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgc2VhcmNoOiB7IHZhbHVlOiAnJywgcmVnZXg6IGZhbHNlIH0sXG4gICAgICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuaGFzQWN0aW9ucykge1xuICAgICAgICBjb2x1bW5zLnVuc2hpZnQoe1xuICAgICAgICAgIGRhdGE6ICdhY3RpdmUnLFxuICAgICAgICAgIG5hbWU6ICdBY3RpdmUnLFxuICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBzZWFyY2g6IHsgdmFsdWU6ICcnLCByZWdleDogZmFsc2UgfSxcbiAgICAgICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50ID0ge1xuICAgICAgICAuLi4odGhpcy5fbGFzdExhenlMb2FkRXZlbnQgfHwgKHt9IGFzIGFueSkpLFxuICAgICAgICBwYWdlOiBwYXJhbXMuZGF0YS5maXJzdCAvIHBhcmFtcy5kYXRhLnJvd3MgKyAxLFxuICAgICAgICBzdGFydDogcGFyYW1zLmRhdGEuZmlyc3QsXG4gICAgICAgIGxlbmd0aDogcGFyYW1zLmRhdGEucm93cyxcbiAgICAgICAgZHJhdzogdGhpcy5fZHJhdysrLFxuICAgICAgICBvcmRlcjogcGFyYW1zLmRhdGEuc29ydEZpZWxkXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2x1bW46XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMuZmluZEluZGV4KChjb2wpID0+IGNvbC5maWVsZCA9PT0gcGFyYW1zLmRhdGEuc29ydEZpZWxkKSArICh0aGlzLmhhc0FjdGlvbnMgPyAxIDogMCksXG4gICAgICAgICAgICAgICAgZGlyOiBwYXJhbXMuZGF0YS5zb3J0T3JkZXIgPiAwID8gJ2FzYycgOiAnZGVzYycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbeyBjb2x1bW46IDAsIGRpcjogJ2Rlc2MnIH1dLFxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICB0YWI6IHRoaXMuX3RhYlNlbGVjdGVkLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGFzdExhenlMb2FkRXZlbnQgPSB7XG4gICAgICAgIC4uLnRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50LFxuICAgICAgICAuLi5wYXJhbXMuZGF0YSxcbiAgICAgICAgc3RhcnQ6IDAsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuX3RhYlNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50ID0ge1xuICAgICAgICAgIC4uLih0aGlzLl9sYXN0TGF6eUxvYWRFdmVudCB8fCAoe30gYXMgYW55KSksXG4gICAgICAgICAgLi4ueyBTdGF0dXM6IHRoaXMuX3RhYlNlbGVjdGVkLmNvZGUgfSxcbiAgICAgICAgICB0YWI6IHRoaXMuX3RhYlNlbGVjdGVkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdExhenlMb2FkZWREb25lIHx8IHRoaXMuZmlyc3RMYXp5TG9hZCkge1xuICAgICAgdGhpcy5vbkxhenlMb2FkLmVtaXQodGhpcy5fbGFzdExhenlMb2FkRXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLl9maXJzdExhenlMb2FkZWREb25lID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENlbGxDb250ZW50KGl0ZW06IGFueSwgY29sOiBUYWJsZUNvbHVtbikge1xuICAgIGNvbnN0IGNlbGxUZXh0ID0gdGhpcy5nZXRDZWxsVGV4dChpdGVtLCBjb2wpO1xuICAgIGxldCBjb250ZW50ID0gYDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj4ke2NvbC5oZWFkZXJ9PC9zcGFuPjxzcGFuIGNsYXNzPVwidy0xMDBcIj5gO1xuICAgIGlmIChcbiAgICAgICFjb2wudHlwZSB8fFxuICAgICAgW1RhYmxlQ29sdW1uVHlwZS5FTlVNLCBUYWJsZUNvbHVtblR5cGUuVEVYVCwgVGFibGVDb2x1bW5UeXBlLkRBVEVUSU1FLCBUYWJsZUNvbHVtblR5cGUuREFURV0uaW5jbHVkZXMoY29sLnR5cGUpXG4gICAgKSB7XG4gICAgICBjb250ZW50ICs9IGNlbGxUZXh0O1xuICAgIH1cbiAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5DVVNUT01fU1RZTEU6XG4gICAgICAgIGNvbnRlbnQgKz0gYDxzcGFuIGNsYXNzPVwiJHtjb2wudGV4dEZpZWxkQ2xhc3MgPyBpdGVtW2NvbC50ZXh0RmllbGRDbGFzc10gOiAnJ31cIj4ke2NlbGxUZXh0fTwvc3Bhbj5gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkJPT0xFQU46XG4gICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlcmVkXCI+PGkgY2xhc3M9XCIgc3RhdHVzLXRhYmxlLWZpZWxkIGZhcyBmYS0ke1xuICAgICAgICAgIGNlbGxUZXh0ID8gJ2NoZWNrIGJvb2xlYW4tdmFsdWUtcG9zaXRpdmUnIDogJ3RpbWVzIGJvb2xlYW4tdmFsdWUtbmVnYXRpdmUnXG4gICAgICAgIH1cIj48L2k+PC9kaXY+YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5TVEFUVVNfQkFER0U6XG4gICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlcmVkXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlIHN0YXR1cy10YWJsZS1maWVsZCAke3RoaXMuZ2V0U3RhdHVzQ29sb3IoXG4gICAgICAgICAgY2VsbFRleHQsXG4gICAgICAgICl9XCI+PC9pPjwvZGl2PmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQUNUSVZFX0JPT0xFQU5fQkFER0U6XG4gICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlcmVkXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlIHN0YXR1cy10YWJsZS1maWVsZCAke3RoaXMuZ2V0QWN0aXZlU3RhdHVzQ29sb3IoXG4gICAgICAgICAgY2VsbFRleHQsXG4gICAgICAgICl9XCI+PC9pPjwvZGl2PmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQlVUVE9OOlxuICAgICAgICBsZXQgaWNvbkNsYXNzID0gJyc7XG4gICAgICAgIGlmICh0eXBlb2YgY29sLmljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpY29uQ2xhc3MgPSBjb2wuaWNvbihpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpY29uQ2xhc3MgPSBjb2wuaWNvbiB8fCAnZmFzIGZhLWNpcmNsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyZWRcIj48aSBjbGFzcz1cIiR7aWNvbkNsYXNzfSBzdGF0dXMtdGFibGUtZmllbGQgdGFibGUtYnV0dG9uXCI+PC9pPjwvZGl2PmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuTUFTSzpcbiAgICAgICAgaWYgKGNvbC5tYXNrID09PSAnZHluYW1pY0NwZkNucGonKSB7XG4gICAgICAgICAgY29udGVudCArPSBNYXNrVXRpbC5mb3JtYXREb2N1bWVudChjZWxsVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGVudCArPSBNYXNrVXRpbC5kb01hc2tTdHJpbmcoY2VsbFRleHQsIGNvbC5tYXNrKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkNVUlJFTkNZOlxuICAgICAgICBjb250ZW50ICs9IE51bWJlcihjZWxsVGV4dCkudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgIGN1cnJlbmN5OiBjb2wuY3VycmVuY3lUeXBlIHx8ICdCUkwnLFxuICAgICAgICAgIGN1cnJlbmN5RGlzcGxheTogJ25hcnJvd1N5bWJvbCcsXG4gICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnRlbnQgKz0gYDwvc3Bhbj5gO1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldENlbGxUZXh0KGl0ZW06IGFueSwgY29sOiBUYWJsZUNvbHVtbikge1xuICAgIGlmIChjb2wuZ2V0RW51bVRyYW5zbGF0ZWQpIHtcbiAgICAgIHJldHVybiBjb2wuZ2V0RW51bVRyYW5zbGF0ZWQoaXRlbVtjb2wuZmllbGRdKTtcbiAgICB9XG4gICAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbHVtblR5cGUuREFURVRJTUUgJiYgaXRlbVtjb2wuZmllbGRdKSB7XG4gICAgICBjb25zdCBkYXRlVGltZSA9XG4gICAgICAgIGl0ZW1bY29sLmZpZWxkXSBpbnN0YW5jZW9mIERhdGUgPyBEYXRlVGltZS5mcm9tSlNEYXRlKGl0ZW1bY29sLmZpZWxkXSkgOiBEYXRlVGltZS5mcm9tSVNPKGl0ZW1bY29sLmZpZWxkXSk7XG4gICAgICByZXR1cm4gZGF0ZVRpbWUudG9VVEMoKS50b0Zvcm1hdCgnZGQvTU0veXl5eSBISDptbScpO1xuICAgIH1cbiAgICBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sdW1uVHlwZS5EQVRFICYmIGl0ZW1bY29sLmZpZWxkXSkge1xuICAgICAgY29uc3QgZGF0ZVRpbWUgPVxuICAgICAgICBpdGVtW2NvbC5maWVsZF0gaW5zdGFuY2VvZiBEYXRlID8gRGF0ZVRpbWUuZnJvbUpTRGF0ZShpdGVtW2NvbC5maWVsZF0pIDogRGF0ZVRpbWUuZnJvbUlTTyhpdGVtW2NvbC5maWVsZF0pO1xuICAgICAgcmV0dXJuIGRhdGVUaW1lLnRvVVRDKCkudG9Gb3JtYXQoJ2RkL01NL3l5eXknKTtcbiAgICB9XG4gICAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0UpIHtcbiAgICAgIGlmICghaXRlbVtjb2wuZmllbGRdLmxlbmd0aCB8fCBpdGVtW2NvbC5maWVsZF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBpdGVtW2NvbC5maWVsZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCske2l0ZW1bY29sLmZpZWxkXS5sZW5ndGh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbHVtblR5cGUuU1RBVFVTX0JBREdFKSB7XG4gICAgICByZXR1cm4gaXRlbVtjb2wuZmllbGRdID09IDAgPyAwIDogaXRlbVtjb2wuZmllbGRdO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtW2NvbC5maWVsZCB8fCAnJ10gfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHQoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uKSB7XG4gICAgaWYgKFxuICAgICAgIWNvbC50eXBlIHx8XG4gICAgICAhW1RhYmxlQ29sdW1uVHlwZS5TVEFDS19CQURHRV0uaW5jbHVkZXMoY29sLnR5cGUpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShpdGVtW2NvbC5maWVsZF0pIHx8XG4gICAgICBpdGVtW2NvbC5maWVsZF0ubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbVtjb2wuZmllbGRdKSkge1xuICAgICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXS5qb2luKCcgLSAnKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5fdGFiU2VsZWN0ZWQgPSB0aGlzLnRhYnNbJGV2ZW50LmluZGV4XTtcbiAgICB0aGlzLmxhenlMb2FkZWQoeyBmaWx0ZXI6IHRydWUsIGRhdGE6IHt9IH0pO1xuICAgIHRoaXMub25UYWJTZWxlY3RlZC5lbWl0KHRoaXMuX3RhYlNlbGVjdGVkKTtcbiAgfVxuXG4gIHN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9maWx0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9maWx0ZXJTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzQ29tcG9uZW50Py5mb3JtR3JvdXAuY29udHJvbHMgfHwge30pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5fZmlsdGVyU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgdGhpcy5maWx0ZXJzQ29tcG9uZW50Py5mb3JtR3JvdXBcbiAgICAgICAgICAuZ2V0KGtleSlcbiAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlZC5lbWl0KHsgZmllbGQ6IGtleSwgdmFsdWUgfSk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZWQuZW1pdCh7IGZpZWxkOiBrZXksIHZhbHVlOiB0aGlzLmZpbHRlcnNDb21wb25lbnQ/LmZvcm1Hcm91cC5nZXQoa2V5KT8udmFsdWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvblJvd0NsaWNrKGl0ZW06IGFueSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25FeHBhbmRSb3cuZW1pdChpdGVtKTtcbiAgfVxuXG4gIGdldCBsaXN0SGFzQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnNvbWUoKGl0ZW0pID0+IGl0ZW0uYWN0aW9ucz8ubGVuZ3RoKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTZWxlY3RlZEl0ZW1zKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm9uU2VsZWN0ZWRSb3dzLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0h0bWxDZWxsKGNvbDogVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4gIWNvbC50eXBlIHx8ICF0aGlzLmlzQmFkZ2VDZWxsKGNvbCk7XG4gIH1cblxuICBwdWJsaWMgaXNFZGl0YWJsZUNlbGwoY29sOiBUYWJsZUNvbHVtbikge1xuICAgIHJldHVybiB0aGlzLmlzSHRtbENlbGwoY29sKSAmJiAhIWNvbC5jZWxsRWRpdDtcbiAgfVxuXG4gIHB1YmxpYyBvbkNlbGxFZGl0Q29tcGxldGUoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uLCB2YWx1ZTogYW55KSB7XG4gICAgaXRlbVtjb2wuZmllbGRdID0gdmFsdWU7XG4gICAgdGhpcy5vbkNlbGxFZGl0LmVtaXQoeyBpdGVtLCBmaWVsZDogY29sLmZpZWxkLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0JhZGdlQ2VsbChjb2w6IFRhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIGNvbC50eXBlICYmIFtUYWJsZUNvbHVtblR5cGUuVEVYVF9CQURHRSwgVGFibGVDb2x1bW5UeXBlLlNUQUNLX0JBREdFXS5pbmNsdWRlcyhjb2wudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNTY29yZUNlbGwoY29sOiBUYWJsZUNvbHVtbikge1xuICAgIHJldHVybiBjb2wudHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLlNDT1JFO1xuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogYW55KSB7XG4gICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGRhdGEgPSBzZWxlY3Rpb25baV07XG4gICAgICBpZiAoZGF0YS5kaXNhYmxlZENoZWNrQm94KSB7XG4gICAgICAgIHNlbGVjdGlvbi5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTaG93QmFsYW5jZShpdGVtQWNjb3VudD86IGFueSk6IHZvaWQge1xuICAgIGlmIChpdGVtQWNjb3VudCkge1xuICAgICAgaXRlbUFjY291bnQuc2hvd0JhbGFuY2UgPSAhaXRlbUFjY291bnQuc2hvd0JhbGFuY2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0dXNDb2xvcihzdGF0dXM6IFN0YXR1cykge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlIFN0YXR1cy5QRU5ESU5HOlxuICAgICAgICByZXR1cm4gJ3dhcm5pbmcnO1xuICAgICAgY2FzZSBTdGF0dXMuQVBQUk9WRUQ6XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlIFN0YXR1cy5SRUpFQ1RFRDpcbiAgICAgICAgcmV0dXJuICdlcnJvcic7XG4gICAgICBjYXNlIFN0YXR1cy5JTkZPOlxuICAgICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVN0YXR1c0NvbG9yKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHJldHVybiBhY3RpdmUgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgPHZlY3Rvci1maWx0ZXJzXG4gICAgICBbZmllbGRzXT1cImZpbHRlcnNcIlxuICAgICAgKG9uU2VhcmNoKT1cImxhenlMb2FkZWQoeyBmaWx0ZXI6IHRydWUsIGRhdGE6ICRldmVudCB9KVwiXG4gICAgICAoZm9ybUJ1aWxkZWQpPVwic3Vic2NyaWJlVG9GaWx0ZXJDaGFuZ2VzKClcIlxuICAgID48L3ZlY3Rvci1maWx0ZXJzPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtaGVhZGVyLWFjdGlvbnMgZmllbGRcIlxuICAgICpuZ0lmPVwiYWRkSXRlbUxhYmVsIHx8IGV4cG9ydEV4Y2VsIHx8IGV4cG9ydFBERiB8fCBjdXN0b21GdW5jdGlvbiB8fCBjdXN0b21CdXR0b25zXCJcbiAgPlxuICAgIDxidXR0b24gKm5nSWY9XCJleHBvcnRFeGNlbFwiIChjbGljayk9XCJvbkV4cG9ydEV4Y2VsLmVtaXQoKVwiIGNsYXNzPVwiZXhwb3J0LWJ1dHRvbiBleHBvcnQtZXhjZWxcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtZXhjZWxcIj48L2k+PHNwYW4+RXhjZWw8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImV4cG9ydFBERlwiIChjbGljayk9XCJvbkV4cG9ydFBERi5lbWl0KClcIiBjbGFzcz1cImV4cG9ydC1idXR0b24gZXhwb3J0LXBkZlwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS1wZGZcIj48L2k+PHNwYW4+UERGPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2YgY3VzdG9tRnVuY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cImJ1dHRvbi5jbGlja0Z1bmN0aW9uKClcIlxuICAgICAgY2xhc3M9XCJleHBvcnQtYnV0dG9uIGN1c3RvbS1mdW5jdGlvblwiXG4gICAgPlxuICAgICAgPGkgKm5nSWY9XCJidXR0b24/Lmljb25cIiBjbGFzcz1cInt7IGJ1dHRvbj8uaWNvbiB9fVwiPjwvaT48c3Bhbj57eyBidXR0b24/LmxhYmVsIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPHZlY3Rvci1idXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2YgY3VzdG9tQnV0dG9uc1wiXG4gICAgICBjbGFzcz1cImFkZC1pdGVtLWJ1dHRvblwiXG4gICAgICBbcm91bmRdPVwidHJ1ZVwiXG4gICAgICBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgIChjbGljayk9XCJidXR0b24uY2xpY2tGdW5jdGlvbigpXCJcbiAgICAgIFtyaWdodEljb25dPVwiYWRkSXRlbUJ1dHRvblBsdXNTaWduID8gJ3BpIHBpLXBsdXMnIDogJydcIlxuICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZCA9PT0gdHJ1ZVwiXG4gICAgPjwvdmVjdG9yLWJ1dHRvbj5cbiAgICA8dmVjdG9yLWJ1dHRvblxuICAgICAgKm5nSWY9XCJhZGRJdGVtTGFiZWxcIlxuICAgICAgY2xhc3M9XCJhZGQtaXRlbS1idXR0b25cIlxuICAgICAgW2xhYmVsXT1cImFkZEl0ZW1MYWJlbFwiXG4gICAgICAoY2xpY2spPVwib25BZGQuZW1pdCgpXCJcbiAgICAgIFtyaWdodEljb25dPVwiYWRkSXRlbUJ1dHRvblBsdXNTaWduID8gJ3BpIHBpLXBsdXMnIDogJydcIlxuICAgICAgW3JvdW5kXT1cInRydWVcIlxuICAgID48L3ZlY3Rvci1idXR0b24+XG4gIDwvZGl2PlxuICBAaWYgKHNob3dMaW1pdEJhbGFuY2UpIHtcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGdyaWQgbWwtMFwiPlxuICAgICAgQGZvciAoaXRlbUFjY291bnQgb2YgZGF0YUFjY291bnRCYWxhbmNlOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgQGlmIChpdGVtQWNjb3VudC52aXNpYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYmFsYW5jZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1oZWFkZXJcIj57eyBpdGVtQWNjb3VudC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCB2YWx1ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4+UiQgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW1BY2NvdW50LnNob3dCYWxhbmNlXCIgY2xhc3M9XCJiYWxhbmNlXCI+e3sgYmFsYW5jZShpdGVtQWNjb3VudCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4tYmFsYW5jZVwiICpuZ0lmPVwiIWl0ZW1BY2NvdW50LnNob3dCYWxhbmNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZhc1wiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmYS1leWUnOiAhaXRlbUFjY291bnQuc2hvd0JhbGFuY2UsICdmYS1leWUtc2xhc2gnOiBpdGVtQWNjb3VudC5zaG93QmFsYW5jZSB9XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTaG93QmFsYW5jZShpdGVtQWNjb3VudClcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKHNob3dEYXRhQmFsYW5jZSkge1xuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZ3JpZCBtbC0wXCI+XG4gICAgICBAZm9yIChpdGVtQWNjb3VudCBvZiBkYXRhQWNjb3VudEJhbGFuY2U7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBiYWxhbmNlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1oZWFkZXJcIj57eyBpdGVtQWNjb3VudC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgdmFsdWUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhbGFuY2VcIj57eyBpdGVtQWNjb3VudC52YWx1ZUJhbGFuY2UgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgIDx2ZWN0b3ItcGFuZWwgY2xhc3M9XCJkYXRhLXRhYmxlLXBhbmVsXCI+XG4gICAgICA8cC10YWJWaWV3IChvbkNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCIgKm5nSWY9XCJ0YWJzPy5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPGVtICpuZ0lmPVwidGFiLmljb25cIiBbY2xhc3NdPVwidGFiLmljb25cIj4mbmJzcDs8L2VtPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGFiLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYlBhbmVsPlxuICAgICAgPC9wLXRhYlZpZXc+XG4gICAgICA8cC10YWJsZVxuICAgICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwiTW9zdHJhbmRvIHtmaXJzdH0gYXTDqSB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCJcbiAgICAgICAgc29ydE1vZGU9XCJzaW5nbGVcIlxuICAgICAgICBbcm93c109XCIxMFwiXG4gICAgICAgIFtsYXp5XT1cInBhZ2luYXRpb24gJiYgIXZpcnR1YWxQYWdpbmF0aW9uXCJcbiAgICAgICAgW3ZhbHVlXT1cImRhdGFcIlxuICAgICAgICBbcGFnaW5hdG9yXT1cInBhZ2luYXRpb25cIlxuICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXG4gICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEwLCAyNSwgNTAsIDEwMF1cIlxuICAgICAgICBbcmVzcG9uc2l2ZV09XCJ0cnVlXCJcbiAgICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiXG4gICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgICAgICBkYXRhS2V5PVwiaWRcIlxuICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICAgIFthdHRyLnNlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiXG4gICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcbiAgICAgICAgKG9uUm93U2VsZWN0KT1cImNoYW5nZVNlbGVjdGVkSXRlbXMoJGV2ZW50KVwiXG4gICAgICAgIChvbkhlYWRlckNoZWNrYm94VG9nZ2xlKT1cImNoYW5nZVNlbGVjdGVkSXRlbXMoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1Vuc2VsZWN0KT1cImNoYW5nZVNlbGVjdGVkSXRlbXMoJGV2ZW50KVwiXG4gICAgICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkZWQoeyBmaWx0ZXI6IGZhbHNlLCBkYXRhOiAkZXZlbnQgfSlcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cInJlb3JkZXJhYmxlQ29sdW1uc1wiXG4gICAgICAgIGVkaXRNb2RlPVwiY2VsbFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cInJlb3JkZXJhYmxlQ29sdW1uc1wiIHN0eWxlPVwid2lkdGg6IDVyZW1cIj48L3RoPlxuXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAnY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggW2Rpc2FibGVkXT1cImRpc2FibGVkSGVhZGVyY2hlY2tib3hcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaGFzRXhwYW5kYWJsZUljb25cIj5cbiAgICAgICAgICAgICAge3sgYWRkTmFtZUNvbHVtbkV4cGFuZCB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImhhc0FjdGlvbnNcIj57eyAnYXBwLmxhYmVsLmFjdGlvbnMnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdyYWRpb2J1dHRvbidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIEBpZiAoIWNvbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbFN0eWxlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wubm90U29ydGFibGUgPyAnJyA6IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj4gPHAtc29ydEljb24gKm5nSWY9XCIhY29sLm5vdFNvcnRhYmxlXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1pdGVtIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCIgbGV0LWluZGV4PVwicm93SW5kZXhcIj5cbiAgICAgICAgICA8dHJcbiAgICAgICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZXhwYW5kYWJsZTogZXhwYW5kYWJsZSB9XCJcbiAgICAgICAgICAgIFtwUm93VG9nZ2xlcl09XCJleHBhbmRhYmxlID8gaXRlbSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhpdGVtKVwiXG4gICAgICAgICAgICBbcFJlb3JkZXJhYmxlUm93XT1cImluZGV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVvcmRlcmFibGVDb2x1bW5zXCI+XG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDogM3JlbTsgcGFkZGluZy1sZWZ0OiAxMHB4XCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGkgcGktYmFyc1wiIHBSZW9yZGVyYWJsZVJvd0hhbmRsZT48L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAnY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDogM3JlbTsgcGFkZGluZy1sZWZ0OiAxMHB4XCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZENoZWNrQm94XCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAncmFkaW9idXR0b24nXCI+XG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDogM3JlbTsgcGFkZGluZy1sZWZ0OiAxMHB4XCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVSYWRpb0J1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzRXhwYW5kYWJsZUljb25cIiBzdHlsZT1cIm1heC13aWR0aDogMTUwcHhcIiBjbGFzcz1cImNlbnRlcmVkXCI+XG4gICAgICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIml0ZW0uYWN0aW9uc1wiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICBleHBhbmRlZCA/ICdhY3Rpb25zLW1lbnUtYnV0dG9uIHBpIHBpLWNoZXZyb24tZG93bicgOiAnYWN0aW9ucy1tZW51LWJ1dHRvbiBwaSBwaS1jaGV2cm9uLXJpZ2h0J1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8cC1tZW51XG4gICAgICAgICAgICAgICAgI21lbnVcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwiaXRlbS5hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAob25TaG93KT1cIml0ZW0uX21lbnVPcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgKG9uSGlkZSk9XCJpdGVtLl9tZW51T3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgPjwvcC1tZW51PlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9ucy1tZW51LWJ1dHRvbiBmYXMgZmEtY29nXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIml0ZW0uX21lbnVPcGVuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICBAaWYgKCFjb2wuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRWRpdGFibGVDZWxsKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICBbcEVkaXRhYmxlQ29sdW1uXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbcEVkaXRhYmxlQ29sdW1uRmllbGRdPVwiY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sU3R5bGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2wuY2VsbEVkaXQ/LmVkaXRUeXBlIHx8IGNvbC5jZWxsRWRpdD8uZWRpdFR5cGUgPT09ICdudW1iZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtW2NvbC5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VmZml4XT1cImNvbC5jZWxsRWRpdD8uZWRpdFN1ZmZpeCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9XCJkZWNpbWFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cImNvbC5jZWxsRWRpdD8uZWRpdE1heEZyYWN0aW9uRGlnaXRzID8/IDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImNvbC5jZWxsRWRpdD8uZWRpdE1pbiA/PyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJjb2wuY2VsbEVkaXQ/LmVkaXRNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob25CbHVyKT1cIm9uQ2VsbEVkaXRDb21wbGV0ZShpdGVtLCBjb2wsIGl0ZW1bY29sLmZpZWxkXSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5jZWxsRWRpdD8uZWRpdFR5cGUgPT09ICd0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtW2NvbC5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkNlbGxFZGl0Q29tcGxldGUoaXRlbSwgY29sLCBpdGVtW2NvbC5maWVsZF0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtW2NvbC5maWVsZF0gfX17eyBjb2wuY2VsbEVkaXQ/LmVkaXRTdWZmaXggfHwgJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXBlbmNpbCBtbC0yIHRleHQtcHJpbWFyeVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWxDZWxsKGNvbCkgJiYgIWNvbC5jZWxsRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ2V0Q2VsbENvbnRlbnQoaXRlbSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wgJiYgY29sLmNsaWNrRnVuY3Rpb24gJiYgY29sLmNsaWNrRnVuY3Rpb24oaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2xTdHlsZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgID48L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKCFpc0h0bWxDZWxsKGNvbCkgJiYgISFjb2wuZ2V0U3RhdHVzKSB8fCBpc1Njb3JlQ2VsbChjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbCAmJiBjb2wuY2xpY2tGdW5jdGlvbiAmJiBjb2wuY2xpY2tGdW5jdGlvbihpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbFN0eWxlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dmVjdG9yLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0JhZGdlQ2VsbChjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0Q2VsbFRleHQoaXRlbSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sLmdldFN0YXR1cyAmJiBjb2wuZ2V0U3RhdHVzKGl0ZW1bY29sLmZpZWxkXSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImdldFRvb2x0aXBUZXh0KGl0ZW0sIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZWN0b3ItYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgIDx2ZWN0b3Itc2NvcmUgKm5nSWY9XCJpc1Njb3JlQ2VsbChjb2wpXCIgW3Njb3JlXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdmVjdG9yLXNjb3JlPlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vLXJlc3VsdHNcIiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPk5lbmh1bSByZXN1bHRhZG8gZW5jb250cmFkbzwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInBhZ2luYXRvcnJpZ2h0XCI+IDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJwYWdpbmF0b3Jkcm9wZG93bml0ZW1cIj4ge3sgaXRlbS52YWx1ZSB9fSA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LWl0ZW0+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoaGFzQWN0aW9ucyA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXhwYW5zaW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgaXRlbSB9XCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9wLXRhYmxlPlxuICAgIDwvdmVjdG9yLXBhbmVsPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19