@dev-tcloud/tcloud-ui 4.2.2 → 5.0.1

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 (148) hide show
  1. package/README.md +106 -105
  2. package/datepicker/js/_info.txt +3 -3
  3. package/fesm2022/dev-tcloud-tcloud-ui.mjs +432 -365
  4. package/fesm2022/dev-tcloud-tcloud-ui.mjs.map +1 -1
  5. package/lib/_interfaces/theme.service.interface.d.ts +3 -0
  6. package/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.component.d.ts +1 -0
  7. package/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.component.d.ts +1 -1
  8. package/lib/_services/tcloud-ui-theme.services.d.ts +12 -0
  9. package/lib/tcloud-ui.config.d.ts +1 -0
  10. package/package.json +3 -5
  11. package/scss/components/custom/el-copy.scss +17 -17
  12. package/scss/components/custom/loading-transitions.scss +27 -27
  13. package/scss/components/custom/loading.scss +2 -2
  14. package/scss/components/custom/tab-menu.scss +57 -57
  15. package/scss/components/custom/table.scss +98 -98
  16. package/scss/components/custom/tooltip.scss +89 -89
  17. package/scss/components/custom/ui-datepicker.scss +15 -15
  18. package/scss/components/custom/validation.scss +7 -7
  19. package/scss/components/custom/variables.scss +32 -32
  20. package/scss/components/styles.scss +9 -9
  21. package/scss/tcloud/custom/alerts.scss +38 -37
  22. package/scss/tcloud/custom/buttons.scss +1002 -1002
  23. package/scss/tcloud/custom/card.scss +51 -51
  24. package/scss/tcloud/custom/colors.scss +97 -97
  25. package/scss/tcloud/custom/forms.scss +81 -81
  26. package/scss/tcloud/custom/layout.scss +5 -5
  27. package/scss/tcloud/custom/left-navigation.scss +47 -47
  28. package/scss/tcloud/custom/mixins.scss +318 -318
  29. package/scss/tcloud/custom/tcloud-prime.scss +4519 -4519
  30. package/scss/tcloud/custom/tcloud-standard.scss +121 -121
  31. package/scss/tcloud/custom/text.scss +57 -57
  32. package/scss/tcloud/custom/top-navigation.scss +59 -59
  33. package/scss/tcloud/custom/variables.scss +60 -60
  34. package/scss/tcloud/disaster-recovery/colors.scss +14 -14
  35. package/scss/tcloud/disaster-recovery/layout.scss +13 -13
  36. package/scss/tcloud/disaster-recovery/styles.scss +2 -2
  37. package/scss/tcloud/prime/cards-products.scss +333 -331
  38. package/scss/tcloud/prime/left-navigation.scss +329 -327
  39. package/scss/tcloud/prime/styles.scss +3 -3
  40. package/scss/tcloud/prime/tcloud-prime.scss +3874 -3872
  41. package/scss/tcloud/standard/left-navigation.scss +47 -47
  42. package/scss/tcloud/standard/styles.scss +3 -3
  43. package/scss/tcloud/standard/tcloud-standard.scss +125 -125
  44. package/scss/tcloud/standard/top-navigation.scss +61 -61
  45. package/scss/tcloud/styles.scss +19 -19
  46. package/scss/tcloud/tcloud-ui.scss +7 -7
  47. package/esm2022/dev-tcloud-tcloud-ui.mjs +0 -5
  48. package/esm2022/lib/_directives/align/align.directive.mjs +0 -42
  49. package/esm2022/lib/_directives/currency/currency.directive.mjs +0 -160
  50. package/esm2022/lib/_directives/directives.module.mjs +0 -76
  51. package/esm2022/lib/_directives/el-copy/el-copy.directive.mjs +0 -68
  52. package/esm2022/lib/_directives/hover-parent/hover-parent.directive.mjs +0 -58
  53. package/esm2022/lib/_directives/tcloud-access/tcloud-ui-check-access.directive.mjs +0 -66
  54. package/esm2022/lib/_directives/tcloud-access/tcloud-ui-ng-check-access.directive.mjs +0 -50
  55. package/esm2022/lib/_directives/tcloud-access/tcloud-ui-ng-feature-flags.directive.mjs +0 -44
  56. package/esm2022/lib/_directives/tcloud-ui-digit-only.directive.mjs +0 -64
  57. package/esm2022/lib/_directives/tcloud-ui-highlight.diretive.mjs +0 -36
  58. package/esm2022/lib/_directives/tcloud-ui-ip-mask.directive.mjs +0 -54
  59. package/esm2022/lib/_directives/tooltip/tooltip.directive.mjs +0 -196
  60. package/esm2022/lib/_interfaces/user.service.interface.mjs +0 -2
  61. package/esm2022/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-body/tcloud-ui-accordion-body.component.mjs +0 -35
  62. package/esm2022/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-title/tcloud-ui-accordion-title.component.mjs +0 -54
  63. package/esm2022/lib/_modules/tcloud-ui-accordion/services/tcloud-ui-accordion.service.mjs +0 -38
  64. package/esm2022/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.component.mjs +0 -75
  65. package/esm2022/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.module.mjs +0 -35
  66. package/esm2022/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.component.mjs +0 -87
  67. package/esm2022/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.module.mjs +0 -32
  68. package/esm2022/lib/_modules/tcloud-ui-data-list/services/data-list.service.mjs +0 -38
  69. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list-option/tcloud-ui-data-list-option.component.mjs +0 -65
  70. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.component.mjs +0 -317
  71. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.mjs +0 -3
  72. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.module.mjs +0 -37
  73. package/esm2022/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.component.mjs +0 -440
  74. package/esm2022/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.module.mjs +0 -32
  75. package/esm2022/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component.mjs +0 -320
  76. package/esm2022/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.module.mjs +0 -40
  77. package/esm2022/lib/_modules/tcloud-ui-filters/components/range-date/range-date.component.mjs +0 -213
  78. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.component.mjs +0 -537
  79. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.mjs +0 -20
  80. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.module.mjs +0 -45
  81. package/esm2022/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.component.mjs +0 -142
  82. package/esm2022/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.module.mjs +0 -32
  83. package/esm2022/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.component.mjs +0 -66
  84. package/esm2022/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.module.mjs +0 -32
  85. package/esm2022/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.component.mjs +0 -36
  86. package/esm2022/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.module.mjs +0 -31
  87. package/esm2022/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.component.mjs +0 -93
  88. package/esm2022/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.module.mjs +0 -25
  89. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.component.mjs +0 -43
  90. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.mjs +0 -2
  91. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.module.mjs +0 -19
  92. package/esm2022/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.component.mjs +0 -65
  93. package/esm2022/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.module.mjs +0 -25
  94. package/esm2022/lib/_modules/tcloud-ui-loading/components/tcloud-ui-cubes/tcloud-ui-cubes.component.mjs +0 -11
  95. package/esm2022/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.component.mjs +0 -29
  96. package/esm2022/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.module.mjs +0 -21
  97. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-body/tcloud-ui-modal-body.component.mjs +0 -14
  98. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-footer/tcloud-ui-modal-footer.component.mjs +0 -61
  99. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-header/tcloud-ui-modal-header.component.mjs +0 -24
  100. package/esm2022/lib/_modules/tcloud-ui-modal/services/tcloud-modal.service.mjs +0 -63
  101. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.component.mjs +0 -203
  102. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.mjs +0 -2
  103. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.module.mjs +0 -47
  104. package/esm2022/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.component.mjs +0 -155
  105. package/esm2022/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.module.mjs +0 -28
  106. package/esm2022/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.component.mjs +0 -170
  107. package/esm2022/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.module.mjs +0 -28
  108. package/esm2022/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.component.mjs +0 -348
  109. package/esm2022/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.module.mjs +0 -36
  110. package/esm2022/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.component.mjs +0 -20
  111. package/esm2022/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.module.mjs +0 -25
  112. package/esm2022/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.component.mjs +0 -33
  113. package/esm2022/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.module.mjs +0 -28
  114. package/esm2022/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.component.mjs +0 -165
  115. package/esm2022/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.module.mjs +0 -21
  116. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.component.mjs +0 -105
  117. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.mjs +0 -2
  118. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.module.mjs +0 -24
  119. package/esm2022/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.component.mjs +0 -46
  120. package/esm2022/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.module.mjs +0 -25
  121. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-content/tcloud-ui-tab-content.component.mjs +0 -36
  122. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-head/tcloud-ui-tab-head.component.mjs +0 -85
  123. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-subtitle/tcloud-ui-tab-subtitle.component.mjs +0 -69
  124. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-title/tcloud-ui-tab-title.component.mjs +0 -71
  125. package/esm2022/lib/_modules/tcloud-ui-tab-menu/services/tab-menu.service.mjs +0 -104
  126. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.component.mjs +0 -64
  127. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.mjs +0 -2
  128. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.module.mjs +0 -45
  129. package/esm2022/lib/_modules/tcloud-ui-table/tcloud-ui-table.component.mjs +0 -21
  130. package/esm2022/lib/_modules/tcloud-ui-table/tcloud-ui-table.module.mjs +0 -25
  131. package/esm2022/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.component.mjs +0 -37
  132. package/esm2022/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.module.mjs +0 -25
  133. package/esm2022/lib/_pipes/array-to-text.mjs +0 -29
  134. package/esm2022/lib/_pipes/bytes.mjs +0 -31
  135. package/esm2022/lib/_pipes/cnpj.mjs +0 -37
  136. package/esm2022/lib/_pipes/cpf.mjs +0 -37
  137. package/esm2022/lib/_pipes/datebr.mjs +0 -102
  138. package/esm2022/lib/_pipes/index.mjs +0 -9
  139. package/esm2022/lib/_pipes/monthname.mjs +0 -25
  140. package/esm2022/lib/_pipes/respective.mjs +0 -73
  141. package/esm2022/lib/_pipes/statusinfo.mjs +0 -78
  142. package/esm2022/lib/_pipes/tcloud-pipes.module.mjs +0 -75
  143. package/esm2022/lib/_services/loading-transitions.service.mjs +0 -52
  144. package/esm2022/lib/_services/search-in-object.service.mjs +0 -99
  145. package/esm2022/lib/_services/tcloud-ui-check-access.service.mjs +0 -170
  146. package/esm2022/lib/tcloud-ui.config.mjs +0 -2
  147. package/esm2022/lib/tcloud-ui.module.mjs +0 -235
  148. package/esm2022/public-api.mjs +0 -116
@@ -1,537 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
- import { TCCondition, TCFiltersType } from './tcloud-ui-filters';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "../tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component";
7
- import * as i4 from "../tcloud-ui-datepicker/tcloud-ui-datepicker.component";
8
- import * as i5 from "./components/range-date/range-date.component";
9
- export class TCloudUiFiltersComponent {
10
- set data(data) {
11
- // this._data = JSON.parse(JSON.stringify(data));
12
- }
13
- get data() { return this._data; }
14
- set filters(filters) {
15
- //this._filters = filters;
16
- }
17
- get filters() { return this._filters; }
18
- set submitText(v) {
19
- if (v && v !== this._submitText) {
20
- this._submitText = v;
21
- }
22
- }
23
- get submitText() { return this._submitText; }
24
- constructor(datepipe) {
25
- this.datepipe = datepipe;
26
- this.datepickers = [];
27
- this.inputs = [];
28
- this.show_filters = false;
29
- this.border = true;
30
- this._submitText = 'Filtrar';
31
- this.btnSubmitClass = 'tc-btn-primary';
32
- this.useOnChangeSubmit = true; // useOnChangeSubmit - Submit automatico quando for alterado quanquer input
33
- this.useButtonSubmit = false; // useButtonSubmit - Exibe um botão de submit e não executa a busca automaticamente
34
- this.useNormalizeCaseSensitive = true; // useNormalizeCaseSensitive - Não valida caixa alta ou baixa e caracteres especiais
35
- this.useRangeDate = true;
36
- this.useFilterAccept = false;
37
- this.result = new EventEmitter();
38
- this.onFilter = new EventEmitter();
39
- this.onChange = new EventEmitter();
40
- this.onSubmit = new EventEmitter();
41
- this.descriptionStart = '';
42
- this.descriptionStop = '';
43
- this.first_active_filter = false;
44
- this.start_stop = false;
45
- this.start_stop_width = 0;
46
- this.start_stop_und = ''; // px ou %
47
- this.first = true;
48
- this.start_filter_fc = undefined;
49
- }
50
- ngOnInit() {
51
- setTimeout(() => {
52
- if (this.filters && (this.filters).length > 0) {
53
- for (let i = 0; i < (this.filters).length; i++) {
54
- if (this.filters[i].value) {
55
- if (this.filters[i].type === 'datetime-local') {
56
- try {
57
- this.filters[i].searchText = new Date(`${this.filters[i].value}`);
58
- }
59
- catch (error) { }
60
- }
61
- else {
62
- this.filters[i].searchText = this.filters[i].value;
63
- }
64
- this.first_active_filter = true;
65
- }
66
- }
67
- }
68
- this.start_stop = (this.useRangeDate) ? this.is_start_stop_datetime() : false;
69
- this.toSubmit();
70
- });
71
- }
72
- is_start_stop_datetime() {
73
- let start = false;
74
- let stop = false;
75
- if (this.filters && (this.filters).length > 0) {
76
- this.start_stop_width = 0;
77
- for (let i = 0; i < (this.filters).length; i++) {
78
- if (this.filters[i].id === 'start') {
79
- start = true;
80
- this.start_stop_width += this.getValueWidth(this.filters[i].width);
81
- this.start_stop_und = this.getUnidade(this.filters[i].width);
82
- this.descriptionStart = this.filters[i].description;
83
- }
84
- if (this.filters[i].id === 'stop') {
85
- stop = true;
86
- this.start_stop_width += this.getValueWidth(this.filters[i].width);
87
- this.descriptionStop = this.filters[i].description;
88
- }
89
- }
90
- }
91
- return (start && stop) ? true : false;
92
- }
93
- getValueWidth(v) {
94
- let und = this.getUnidade(v);
95
- v = (v).replace(und, '');
96
- return +(v);
97
- }
98
- getUnidade(v) {
99
- let und = '%';
100
- if (v && (v).includes('px')) {
101
- und = 'px';
102
- }
103
- return und;
104
- }
105
- ngOnChanges(changes) {
106
- if (changes && changes['data']) {
107
- const data = changes['data'].currentValue;
108
- if (this._data !== data) {
109
- this._data = JSON.parse(JSON.stringify(data));
110
- this.search_data = JSON.parse(JSON.stringify(data));
111
- this.init();
112
- }
113
- }
114
- if (changes && changes['filters']) {
115
- const filters = changes['filters'].currentValue;
116
- if (this._filters !== filters) {
117
- this._filters = JSON.parse(JSON.stringify(filters));
118
- this.init();
119
- }
120
- }
121
- }
122
- init() {
123
- if (this.data && this.filters) {
124
- this.show_filters = true;
125
- if (this.filters && (this.filters).length > 0) {
126
- (this.filters).forEach((filter) => {
127
- this.searchIn(filter, 'sync');
128
- });
129
- }
130
- if (!this.useOnChangeSubmit) {
131
- this.result_accept(this.data);
132
- }
133
- if (this.useOnChangeSubmit || this.useButtonSubmit) {
134
- this.start_filter();
135
- }
136
- }
137
- }
138
- normalize(text) {
139
- if (this.useNormalizeCaseSensitive) {
140
- const v = (((`${text}`).normalize('NFD').replace(/[\u0300-\u036f]/g, "")).trim()).toLowerCase();
141
- return v;
142
- }
143
- return text;
144
- }
145
- toSubmit() {
146
- if (this.filters && (this.filters).length > 0) {
147
- this.init();
148
- }
149
- this.emitSubmitFilters();
150
- }
151
- emitSubmitFilters() {
152
- let filters = JSON.parse(JSON.stringify(this.filters));
153
- if (filters && (filters).length > 0) {
154
- (filters).forEach((filter, i) => {
155
- if (filter.width) {
156
- delete (filters[i].width);
157
- }
158
- if (filter.placeholder) {
159
- delete (filters[i].placeholder);
160
- }
161
- if (filter.description) {
162
- delete (filters[i].description);
163
- }
164
- if ((!filter.searchText || filter.searchText && filter.searchText === '') && filter.type !== "boolean") {
165
- delete (filters[i]);
166
- }
167
- if (filter.type === "boolean") {
168
- if (!filter.searchText) {
169
- filter.searchText = false;
170
- }
171
- }
172
- });
173
- }
174
- this.onSubmit.emit(this.filters);
175
- }
176
- collectionFind(obj, path) {
177
- const pathArray = path.split(".");
178
- let current = obj;
179
- for (let i = 0; i < pathArray.length; i++) {
180
- const key = pathArray[i];
181
- if (key.includes('[') && key.includes(']')) {
182
- const nextKeys = pathArray.slice(i + 1);
183
- const index = key.substring(key.indexOf('[') + 1, key.indexOf(']'));
184
- const arrayKey = key.substring(0, key.indexOf('['));
185
- if (current && current[arrayKey] && current[arrayKey][index]) {
186
- return this.collectionFind(current[arrayKey][index], nextKeys.join("."));
187
- }
188
- }
189
- if (key.includes("[]")) {
190
- const arrayKey = key.replace("[]", "");
191
- current = current[arrayKey] || [];
192
- const nextKeys = pathArray.slice(i + 1);
193
- const results = [];
194
- for (let j = 0; j < current.length; j++) {
195
- let result = this.collectionFind(current[j], nextKeys.join("."));
196
- if (result !== undefined) {
197
- results.push(result);
198
- }
199
- }
200
- if (results.length === 0) {
201
- return undefined;
202
- }
203
- return results;
204
- }
205
- else {
206
- if (!current || (current && !current[key])) {
207
- return undefined;
208
- }
209
- current = current[key];
210
- if (current === undefined) {
211
- return undefined;
212
- }
213
- }
214
- }
215
- return current;
216
- }
217
- searchInRange(range_date) {
218
- if (this.filters && (this.filters).length > 0) {
219
- let event = {};
220
- event.datepickertime = true;
221
- for (let i = 0; i < (this.filters).length; i++) {
222
- if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'start') {
223
- this.filters[i].value = range_date?.result?.start;
224
- this.filters[i].searchText = range_date?.result?.start;
225
- event.innerValue = this.start_value = range_date?.result?.start;
226
- this.searchIn(this.filters[i], event);
227
- }
228
- if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'stop') {
229
- this.filters[i].value = range_date?.result?.stop;
230
- this.filters[i].searchText = range_date?.result?.stop;
231
- event.innerValue = this.stop_value = range_date?.result?.stop;
232
- this.searchIn(this.filters[i], event);
233
- }
234
- }
235
- if (this.first || this.useOnChangeSubmit) {
236
- this.toSubmit();
237
- }
238
- }
239
- this.first = false;
240
- }
241
- convertDataToNumber(dataString) {
242
- try {
243
- const [dia, mes, ano] = dataString.split('/');
244
- return +(`${ano}${mes}${dia}`);
245
- }
246
- catch (error) { }
247
- return 0;
248
- }
249
- searchIn(item, event) {
250
- this.start_filter_fc = undefined;
251
- let isValid = true;
252
- if (event === 'sync' && isValid) {
253
- isValid = false;
254
- this.onChange.emit(true);
255
- }
256
- if (typeof event === 'boolean' && isValid) {
257
- isValid = false;
258
- item.searchText = event;
259
- this.onChange.emit(true);
260
- }
261
- if ((event === undefined || event === null || event === '') && isValid) {
262
- isValid = false;
263
- item.searchText = '';
264
- this.onChange.emit(true);
265
- }
266
- if (event?.datepickertime && isValid) {
267
- isValid = false;
268
- item.searchText = event?.innerValue;
269
- this.onChange.emit(true);
270
- }
271
- if (event?.target?.value && isValid) {
272
- isValid = false;
273
- item.searchText = this.normalize(event.target.value);
274
- this.onChange.emit(true);
275
- }
276
- if (event?.target?.value === '' && isValid) {
277
- isValid = false;
278
- item.searchText = '';
279
- this.onChange.emit(true);
280
- }
281
- if (item.type === 'date-local' && item.value) {
282
- isValid = false;
283
- item.searchText = `${this.convertDataToNumber(item.value)}`;
284
- this.onChange.emit(true);
285
- }
286
- if (event && event.result && (event.result.start || event.result.stop)) {
287
- isValid = false;
288
- this.onChange.emit(true);
289
- }
290
- if (this.useOnChangeSubmit || this.first_active_filter) {
291
- this.start_filter_fc = this.start_filter();
292
- this.first_active_filter = false;
293
- }
294
- if (!this.useButtonSubmit) {
295
- this.emitSubmitFilters();
296
- }
297
- }
298
- getDateUTC(dt) {
299
- const ano = dt.getFullYear();
300
- const mes = dt.getMonth();
301
- const dia = dt.getDate();
302
- const horas = dt.getHours();
303
- const minutos = dt.getMinutes();
304
- const segundos = dt.getSeconds();
305
- return new Date(Date.UTC(ano, mes, dia, horas, minutos, segundos));
306
- }
307
- start_filter() {
308
- for (let i = 0; i < (this.data).length; i++) {
309
- this.setDataIndex(i, true);
310
- for (let j = 0; j < (this.filters).length; j++) {
311
- const filter_item = this.filters[j];
312
- if (filter_item.searchText && typeof (filter_item.searchText) === 'string' && filter_item.searchText !== '' && filter_item.type !== TCFiltersType.number && filter_item.type !== TCFiltersType.date) {
313
- filter_item.searchText = this.normalize(filter_item.searchText);
314
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
315
- if (item_value) {
316
- item_value = this.normalize(item_value);
317
- if (typeof filter_item.notIn === 'boolean' && filter_item.notIn) {
318
- if ((item_value === filter_item.searchText)) {
319
- this.setDataIndex(i, false);
320
- }
321
- }
322
- else {
323
- if (filter_item.type === TCFiltersType.select) {
324
- // Exclusivo para select
325
- if (filter_item.data && (filter_item.data).length > 0) {
326
- // uso do select com o notValues: string[]
327
- let current_option = [];
328
- for (let k = 0; k < (filter_item.data).length; k++) {
329
- const k_item = filter_item.data[k];
330
- if (`${k_item?.value}` === `${filter_item.searchText}`) {
331
- current_option = k_item?.notValues;
332
- break;
333
- }
334
- }
335
- if (current_option && (current_option).length > 0) {
336
- for (let v = 0; v < (current_option).length; v++) {
337
- const v_item = current_option[v];
338
- if ((item_value === v_item)) {
339
- this.setDataIndex(i, false);
340
- }
341
- }
342
- }
343
- else {
344
- // uso normal do select
345
- if (!(item_value === filter_item.searchText)) {
346
- this.setDataIndex(i, false);
347
- }
348
- }
349
- }
350
- }
351
- else {
352
- if (!(item_value.includes(filter_item.searchText) || item_value === filter_item.searchText)) {
353
- this.setDataIndex(i, false);
354
- }
355
- }
356
- }
357
- }
358
- else {
359
- this.setDataIndex(i, false);
360
- }
361
- }
362
- if (filter_item.searchText && filter_item.searchText instanceof Date && !isNaN(filter_item.searchText.valueOf()) && filter_item.type === TCFiltersType.datetime) {
363
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
364
- try {
365
- item_value = new Date(item_value);
366
- }
367
- catch (error) { }
368
- if (item_value && item_value instanceof Date && !isNaN(item_value.valueOf())) {
369
- let is_accept = false;
370
- const dt_target = ((filter_item.searchText).getTime()).toString().substring(0, 10); /* + (3 * 60 * 60 * 1000); */
371
- const dt_current = ((item_value).getTime()).toString().substring(0, 10);
372
- if (filter_item.condition) {
373
- switch (filter_item.condition) {
374
- case TCCondition.gt:
375
- is_accept = (Number(dt_target) > Number(dt_current));
376
- break;
377
- case TCCondition.lt:
378
- is_accept = (Number(dt_target) < Number(dt_current));
379
- break;
380
- case TCCondition.gte:
381
- is_accept = (Number(dt_target) <= Number(dt_current));
382
- break;
383
- case TCCondition.lte:
384
- is_accept = (Number(dt_target) >= Number(dt_current));
385
- break;
386
- case TCCondition.equal:
387
- is_accept = (Number(dt_target) === Number(dt_current));
388
- break;
389
- case TCCondition.notEqual:
390
- is_accept = (Number(dt_target) != Number(dt_current));
391
- break;
392
- default: is_accept = (Number(dt_target) == Number(dt_current));
393
- }
394
- }
395
- else {
396
- is_accept = (Number(filter_item.searchText) === Number(item_value));
397
- }
398
- if (!is_accept) {
399
- this.setDataIndex(i, false);
400
- }
401
- }
402
- }
403
- if (filter_item.searchText && typeof Number(filter_item.searchText) === 'number' && (filter_item.type === TCFiltersType.number || filter_item.type === TCFiltersType.date)) {
404
- filter_item.searchText = Number(filter_item.searchText);
405
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
406
- if (typeof Number(item_value) === 'number') {
407
- item_value = Number(item_value);
408
- let is_accept = false;
409
- if (filter_item.condition) {
410
- switch (filter_item.condition) {
411
- case TCCondition.gt:
412
- is_accept = (Number(filter_item.searchText) > Number(item_value));
413
- break;
414
- case TCCondition.lt:
415
- is_accept = (Number(filter_item.searchText) < Number(item_value));
416
- break;
417
- case TCCondition.gte:
418
- is_accept = (Number(filter_item.searchText) <= Number(item_value));
419
- break;
420
- case TCCondition.lte:
421
- is_accept = (Number(filter_item.searchText) >= Number(item_value));
422
- break;
423
- case TCCondition.equal:
424
- is_accept = (Number(filter_item.searchText) === Number(item_value));
425
- break;
426
- case TCCondition.notEqual:
427
- is_accept = (Number(filter_item.searchText) != Number(item_value));
428
- break;
429
- default: is_accept = (Number(filter_item.searchText) == Number(item_value));
430
- }
431
- }
432
- else {
433
- is_accept = (Number(filter_item.searchText) === Number(item_value));
434
- }
435
- if (!is_accept) {
436
- this.setDataIndex(i, false);
437
- }
438
- }
439
- }
440
- if (typeof (filter_item.searchText) === 'boolean' && filter_item.searchText === true) {
441
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
442
- if (item_value && (item_value).length > 0) {
443
- let qtd_is_true = 0;
444
- for (let i = 0; i < ((item_value).length); i++) {
445
- const item = item_value[i];
446
- if (item === filter_item.searchText) {
447
- qtd_is_true++;
448
- }
449
- }
450
- if (qtd_is_true === 0) {
451
- this.setDataIndex(i, false);
452
- }
453
- }
454
- else {
455
- if (!(item_value === filter_item.searchText)) {
456
- this.setDataIndex(i, false);
457
- }
458
- }
459
- }
460
- }
461
- } // end for
462
- this.toResult();
463
- }
464
- toResult() {
465
- const search_data = [];
466
- let is_filter = false;
467
- for (let i = 0; i < (this.filters).length; i++) {
468
- if (this.filters[i].searchText && this.filters[i].searchText !== '') {
469
- is_filter = true;
470
- break;
471
- }
472
- }
473
- if (is_filter) {
474
- for (let i = 0; i < (this.data).length; i++) {
475
- if (this.data && this.data[i] && this.data[i]['tc_filter_accept']) {
476
- (search_data).push(this.data[i]);
477
- }
478
- }
479
- this.result_accept(search_data);
480
- this.onFilter.emit({ ...this.filters });
481
- return;
482
- }
483
- this.result_accept(this.data);
484
- this.onFilter.emit({ ...this.filters });
485
- }
486
- setDataIndex(index, value) {
487
- if (this.data && this.data[index]) {
488
- this.data[index]['tc_filter_accept'] = value;
489
- }
490
- }
491
- result_accept(data) {
492
- if (!this.useFilterAccept && data && (data).length > 0) {
493
- for (let i = 0; i < (data).length; i++) {
494
- delete data[i]['tc_filter_accept'];
495
- }
496
- }
497
- this.result.emit(data);
498
- }
499
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TCloudUiFiltersComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
500
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TCloudUiFiltersComponent, selector: "tcloud-ui-filters", inputs: { border: "border", data: "data", filters: "filters", submitText: "submitText", btnSubmitClass: "btnSubmitClass", useOnChangeSubmit: "useOnChangeSubmit", useButtonSubmit: "useButtonSubmit", useNormalizeCaseSensitive: "useNormalizeCaseSensitive", useRangeDate: "useRangeDate", useFilterAccept: "useFilterAccept" }, outputs: { result: "result", onFilter: "onFilter", onChange: "onChange", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "_formulario", first: true, predicate: ["_formulario"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\" [class.no-border]=\"!border\">\n <ng-container *ngFor=\"let item of filters; let i = index\">\n\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\n\n <ng-container *ngIf=\"item.type === 'date-local'\">\n\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <tcloud-ui-datepicker \n #_input\n name=\"input_{{i+1}}\"\n [modeInput]=\"true\"\n [(ngModel)]=\"item.value\"\n (ngModelChange)=\"searchIn(item, _input)\">\n </tcloud-ui-datepicker>\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n\n \n </ng-container>\n\n <ng-container *ngIf=\"item.type !== 'date-local'\">\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\n\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\n <!-- PERIOD RANGE DATE -->\n <ng-container *ngIf=\"item.id === 'start'\">\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\n <range-date \n #_range_date ngModel name=\"input_{{i+1}}\" \n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\n [descriptionStart]=\"descriptionStart\"\n [descriptionStop]=\"descriptionStop\"\n required \n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\n </range-date>\n </div>\n </ng-container> \n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \n </ng-container>\n\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\n\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <tcloud-ui-datepicker-time \n #_input \n [(ngModel)]=\"item.value\" \n name=\"input_{{i+1}}\" \n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\n (eventChange)=\"searchIn(item, _input)\" >\n </tcloud-ui-datepicker-time>\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n\n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <input \n #_input\n [(ngModel)]=\"item.value\"\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\n name=\"input_{{i+1}}\" \n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \n class=\"tc-form-control\" \n (keyup)=\"searchIn(item, $event)\"> \n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <select \n #_input\n [(ngModel)]=\"item.value\"\n name=\"input_{{i+1}}\" \n class=\"tc-form-control\" \n (change)=\"searchIn(item, $event)\">\n <option [ngValue]=\"\"></option>\n <ng-container *ngFor=\"let v of item.data\">\n <option [value]=\"v.value\">{{ v.description }}</option>\n </ng-container>\n </select>\n </div>\n </div>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\n \n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"area-input-checkbox\">\n <div class=\"tc-form-control\">\n <label>\n {{ item.placeholder }}\n <input \n #_input\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\n name=\"input_{{i+1}}\" \n type=\"checkbox\" \n (change)=\"searchIn(item, _input.checked)\"> \n </label>\n </div> \n </div>\n </div>\n\n </ng-container>\n\n\n </ng-container>\n\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\n </div>\n\n</div>\n\n<!-- <pre>{{ inputs | json }}</pre> -->\n<!-- <pre> {{ data | json }} </pre> -->\n\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\n\n<!--\n <pre>start_stop: {{ start_stop }}</pre>\n <pre>start_stop_width: {{ start_stop_width }}</pre>\n <pre>start_stop_und: {{ start_stop_und }}</pre>\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-border{border:none!important}\n"], dependencies: [{ 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: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.TCloudUiDatepickerTimeComponent, selector: "tcloud-ui-datepicker-time", inputs: ["ngModel", "minDate", "maxDate", "useOptionsDateTime"], outputs: ["ngModelChange", "onChange", "eventChange"] }, { kind: "component", type: i4.TCloudUiDatepickerComponent, selector: "tcloud-ui-datepicker", inputs: ["multiple", "maxNumberOfDates", "daysOfWeekDisabled", "minDate", "maxDate", "datesDisabled", "modeInput", "useBorder", "childInputDateTime", "startViewInMinDate", "startViewInMaxDate", "disabled", "ngModel", "code"], outputs: ["onChange", "ngModelChange", "onCheckDate"] }, { kind: "component", type: i5.TCloudUiRangeDateComponent, selector: "range-date", inputs: ["defaultValuePeriodStartStop", "required", "descriptionStart", "descriptionStop"], outputs: ["onChange"] }] }); }
501
- }
502
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TCloudUiFiltersComponent, decorators: [{
503
- type: Component,
504
- args: [{ selector: 'tcloud-ui-filters', template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\" [class.no-border]=\"!border\">\n <ng-container *ngFor=\"let item of filters; let i = index\">\n\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\n\n <ng-container *ngIf=\"item.type === 'date-local'\">\n\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <tcloud-ui-datepicker \n #_input\n name=\"input_{{i+1}}\"\n [modeInput]=\"true\"\n [(ngModel)]=\"item.value\"\n (ngModelChange)=\"searchIn(item, _input)\">\n </tcloud-ui-datepicker>\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n\n \n </ng-container>\n\n <ng-container *ngIf=\"item.type !== 'date-local'\">\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\n\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\n <!-- PERIOD RANGE DATE -->\n <ng-container *ngIf=\"item.id === 'start'\">\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\n <range-date \n #_range_date ngModel name=\"input_{{i+1}}\" \n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\n [descriptionStart]=\"descriptionStart\"\n [descriptionStop]=\"descriptionStop\"\n required \n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\n </range-date>\n </div>\n </ng-container> \n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \n </ng-container>\n\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\n\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <tcloud-ui-datepicker-time \n #_input \n [(ngModel)]=\"item.value\" \n name=\"input_{{i+1}}\" \n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\n (eventChange)=\"searchIn(item, _input)\" >\n </tcloud-ui-datepicker-time>\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n\n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <input \n #_input\n [(ngModel)]=\"item.value\"\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\n name=\"input_{{i+1}}\" \n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \n class=\"tc-form-control\" \n (keyup)=\"searchIn(item, $event)\"> \n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"box-type-{{item.type}}\">\n <select \n #_input\n [(ngModel)]=\"item.value\"\n name=\"input_{{i+1}}\" \n class=\"tc-form-control\" \n (change)=\"searchIn(item, $event)\">\n <option [ngValue]=\"\"></option>\n <ng-container *ngFor=\"let v of item.data\">\n <option [value]=\"v.value\">{{ v.description }}</option>\n </ng-container>\n </select>\n </div>\n </div>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\n \n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\n <div class=\"area-input-checkbox\">\n <div class=\"tc-form-control\">\n <label>\n {{ item.placeholder }}\n <input \n #_input\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\n name=\"input_{{i+1}}\" \n type=\"checkbox\" \n (change)=\"searchIn(item, _input.checked)\"> \n </label>\n </div> \n </div>\n </div>\n\n </ng-container>\n\n\n </ng-container>\n\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\n </div>\n\n</div>\n\n<!-- <pre>{{ inputs | json }}</pre> -->\n<!-- <pre> {{ data | json }} </pre> -->\n\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\n\n<!--\n <pre>start_stop: {{ start_stop }}</pre>\n <pre>start_stop_width: {{ start_stop_width }}</pre>\n <pre>start_stop_und: {{ start_stop_und }}</pre>\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-border{border:none!important}\n"] }]
505
- }], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { _formulario: [{
506
- type: ViewChild,
507
- args: ['_formulario']
508
- }], border: [{
509
- type: Input
510
- }], data: [{
511
- type: Input
512
- }], filters: [{
513
- type: Input
514
- }], submitText: [{
515
- type: Input
516
- }], btnSubmitClass: [{
517
- type: Input
518
- }], useOnChangeSubmit: [{
519
- type: Input
520
- }], useButtonSubmit: [{
521
- type: Input
522
- }], useNormalizeCaseSensitive: [{
523
- type: Input
524
- }], useRangeDate: [{
525
- type: Input
526
- }], useFilterAccept: [{
527
- type: Input
528
- }], result: [{
529
- type: Output
530
- }], onFilter: [{
531
- type: Output
532
- }], onChange: [{
533
- type: Output
534
- }], onSubmit: [{
535
- type: Output
536
- }] } });
537
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwSCxPQUFPLEVBQUUsV0FBVyxFQUFpQixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQU9oRixNQUFNLE9BQU8sd0JBQXdCO0lBZW5DLElBQWEsSUFBSSxDQUFDLElBQVM7UUFDekIsaURBQWlEO0lBQ25ELENBQUM7SUFDRCxJQUFJLElBQUksS0FBUyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBR3JDLElBQWEsT0FBTyxDQUFDLE9BQVk7UUFDL0IsMEJBQTBCO0lBQzVCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBUyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRzNDLElBQWEsVUFBVSxDQUFDLENBQVM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksVUFBVSxLQUFXLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUF1Qm5ELFlBQ1UsUUFB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Q3JCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxjQUFjLElBQUssT0FBTyxFQUFFLENBQUM7WUFDdEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtB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QUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7K0dBOWlCVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2bEJDVnJDLHE0U0F5Skc7OzRGRC9JVSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsbUJBQW1COzZFQVFGLFdBQVc7c0JBQXJDLFNBQVM7dUJBQUMsYUFBYTtnQkFRZixNQUFNO3NCQUFkLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFNTyxPQUFPO3NCQUFuQixLQUFLO2dCQU1PLFVBQVU7c0JBQXRCLEtBQUs7Z0JBT0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUQ0NvbmRpdGlvbiwgVENEYXRhRmlsdGVycywgVENGaWx0ZXJzVHlwZSB9IGZyb20gJy4vdGNsb3VkLXVpLWZpbHRlcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0Y2xvdWQtdWktZmlsdGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi90Y2xvdWQtdWktZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RjbG91ZC11aS1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVENsb3VkVWlGaWx0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIGRhdGVwaWNrZXJzID0gW10gYXMgYW55O1xuXG4gIEBWaWV3Q2hpbGQoJ19mb3JtdWxhcmlvJykgIF9mb3JtdWxhcmlvOiBOZ0Zvcm0gfCB1bmRlZmluZWQ7XG5cbiAgaW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHNob3dfZmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNlYXJjaF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KCkgYm9yZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHNldCBkYXRhKGRhdGE6IGFueSl7XG4gICAgLy8gdGhpcy5fZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICB9XG4gIGdldCBkYXRhKCk6IGFueXsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBwcml2YXRlIF9maWx0ZXJzOiBUQ0RhdGFGaWx0ZXJzIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBzZXQgZmlsdGVycyhmaWx0ZXJzOiBhbnkpe1xuICAgIC8vdGhpcy5fZmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cbiAgZ2V0IGZpbHRlcnMoKTogYW55eyByZXR1cm4gdGhpcy5fZmlsdGVyczsgfVxuXG4gIHByaXZhdGUgX3N1Ym1pdFRleHQ6IHN0cmluZyA9ICdGaWx0cmFyJztcbiAgQElucHV0KCkgc2V0IHN1Ym1pdFRleHQodjogc3RyaW5nKXsgXG4gICAgaWYoIHYgJiYgdiAhPT0gdGhpcy5fc3VibWl0VGV4dCApe1xuICAgICAgdGhpcy5fc3VibWl0VGV4dCA9IHY7XG4gICAgfVxuICB9XG4gIGdldCBzdWJtaXRUZXh0KCk6c3RyaW5neyByZXR1cm4gdGhpcy5fc3VibWl0VGV4dDsgfVxuXG4gIEBJbnB1dCgpIGJ0blN1Ym1pdENsYXNzOiBzdHJpbmcgPSAndGMtYnRuLXByaW1hcnknO1xuICBASW5wdXQoKSB1c2VPbkNoYW5nZVN1Ym1pdDogYm9vbGVhbiA9IHRydWU7IC8vIHVzZU9uQ2hhbmdlU3VibWl0IC0gU3VibWl0IGF1dG9tYXRpY28gcXVhbmRvIGZvciBhbHRlcmFkbyBxdWFucXVlciBpbnB1dFxuICBASW5wdXQoKSB1c2VCdXR0b25TdWJtaXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdXNlQnV0dG9uU3VibWl0IC0gRXhpYmUgdW0gYm90w6NvIGRlIHN1Ym1pdCBlIG7Do28gZXhlY3V0YSBhIGJ1c2NhIGF1dG9tYXRpY2FtZW50ZVxuICBASW5wdXQoKSB1c2VOb3JtYWxpemVDYXNlU2Vuc2l0aXZlOiBib29sZWFuID0gdHJ1ZTsgLy8gdXNlTm9ybWFsaXplQ2FzZVNlbnNpdGl2ZSAtIE7Do28gdmFsaWRhIGNhaXhhIGFsdGEgb3UgYmFpeGEgZSBjYXJhY3RlcmVzIGVzcGVjaWFpc1xuICBASW5wdXQoKSB1c2VSYW5nZURhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSB1c2VGaWx0ZXJBY2NlcHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZGVzY3JpcHRpb25TdGFydDogc3RyaW5nID0gJyc7XG4gIGRlc2NyaXB0aW9uU3RvcDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBmaXJzdF9hY3RpdmVfZmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc3RhcnRfc3RvcDogYm9vbGVhbiA9IGZhbHNlO1xuICBzdGFydF9zdG9wX3dpZHRoOiBudW1iZXIgPSAwO1xuICBzdGFydF9zdG9wX3VuZDogc3RyaW5nID0gJyc7IC8vIHB4IG91ICVcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVwaXBlOiBEYXRlUGlwZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYoIHRoaXMuZmlsdGVycyAmJiAodGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwICl7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXS52YWx1ZSApe1xuICAgICAgICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXS50eXBlID09PSAnZGF0ZXRpbWUtbG9jYWwnICl7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzW2ldLnNlYXJjaFRleHQgPSBuZXcgRGF0ZSggYCR7dGhpcy5maWx0ZXJzW2ldLnZhbHVlfWAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzW2ldLnNlYXJjaFRleHQgPSB0aGlzLmZpbHRlcnNbaV0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcnN0X2FjdGl2ZV9maWx0ZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAgICAgIFxuICAgICAgfVxuICAgICAgdGhpcy5zdGFydF9zdG9wID0gKHRoaXMudXNlUmFuZ2VEYXRlKSA/IHRoaXMuaXNfc3RhcnRfc3RvcF9kYXRldGltZSgpIDogZmFsc2U7XG4gICAgICB0aGlzLnRvU3VibWl0KCk7XG4gICAgfSk7XG4gIH1cblxuICBpc19zdGFydF9zdG9wX2RhdGV0aW1lKCl7XG4gICAgbGV0IHN0YXJ0ID0gZmFsc2U7XG4gICAgbGV0IHN0b3AgPSBmYWxzZTtcbiAgICBpZiggdGhpcy5maWx0ZXJzICYmICh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDAgKXtcbiAgICAgIHRoaXMuc3RhcnRfc3RvcF93aWR0aCA9IDA7XG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgKHRoaXMuZmlsdGVycykubGVuZ3RoOyBpKyspe1xuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldLmlkID09PSAnc3RhcnQnICl7XG4gICAgICAgICAgc3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhcnRfc3RvcF93aWR0aCArPSB0aGlzLmdldFZhbHVlV2lkdGgodGhpcy5maWx0ZXJzW2ldLndpZHRoKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3BfdW5kID0gdGhpcy5nZXRVbmlkYWRlKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdGlvblN0YXJ0ID0gdGhpcy5maWx0ZXJzW2ldLmRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdG9wJyApe1xuICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhcnRfc3RvcF93aWR0aCArPSB0aGlzLmdldFZhbHVlV2lkdGgodGhpcy5maWx0ZXJzW2ldLndpZHRoKTtcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RvcCA9IHRoaXMuZmlsdGVyc1tpXS5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCBzdGFydCAmJiBzdG9wICkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBnZXRWYWx1ZVdpZHRoKHY6IHN0cmluZyk6bnVtYmVyIHtcbiAgICBsZXQgdW5kID0gdGhpcy5nZXRVbmlkYWRlKHYpO1xuICAgIHYgPSAodikucmVwbGFjZSh1bmQsICcnKTtcbiAgICByZXR1cm4gKyh2KTtcbiAgfVxuXG4gIGdldFVuaWRhZGUodjogc3RyaW5nKTpzdHJpbmcge1xuICAgIGxldCB1bmQgPSAnJSc7XG4gICAgaWYoIHYgJiYgKHYpLmluY2x1ZGVzKCdweCcpICl7XG4gICAgICB1bmQgPSAncHgnO1xuICAgIH1cbiAgICByZXR1cm4gdW5kO1xuICB9XG4gXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykgeyAgXG4gICAgXG4gICAgaWYoIGNoYW5nZXMgJiYgY2hhbmdlc1snZGF0YSddICl7XG4gICAgICBjb25zdCBkYXRhID0gY2hhbmdlc1snZGF0YSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmKCB0aGlzLl9kYXRhICE9PSBkYXRhICl7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgdGhpcy5zZWFyY2hfZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiggY2hhbmdlcyAmJiBjaGFuZ2VzWydmaWx0ZXJzJ10gKXtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSBjaGFuZ2VzWydmaWx0ZXJzJ10uY3VycmVudFZhbHVlO1xuICAgICAgaWYoIHRoaXMuX2ZpbHRlcnMgIT09IGZpbHRlcnMgKXtcbiAgICAgICAgdGhpcy5fZmlsdGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoKXtcbiAgICBpZiggdGhpcy5kYXRhICYmIHRoaXMuZmlsdGVycyApe1xuICAgICAgdGhpcy5zaG93X2ZpbHRlcnMgPSB0cnVlO1xuICAgICAgaWYoIHRoaXMuZmlsdGVycyAmJiAodGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwICl7XG4gICAgICAgICh0aGlzLmZpbHRlcnMpLmZvckVhY2goKGZpbHRlcjogVENEYXRhRmlsdGVycykgPT4geyAgICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuc2VhcmNoSW4oZmlsdGVyLCAnc3luYycpO1xuICAgICAgICB9KTtcbiAgICAgIH0gXG4gICAgICBpZiggIXRoaXMudXNlT25DaGFuZ2VTdWJtaXQgKXtcbiAgICAgICAgdGhpcy5yZXN1bHRfYWNjZXB0KHRoaXMuZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMudXNlQnV0dG9uU3VibWl0ICl7XG4gICAgICAgIHRoaXMuc3RhcnRfZmlsdGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemUodGV4dDogYW55KTogc3RyaW5ne1xuICAgIGlmKCB0aGlzLnVzZU5vcm1hbGl6ZUNhc2VTZW5zaXRpdmUgKXtcbiAgICAgIGNvbnN0IHYgPSAoICggKGAke3RleHR9YCkubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCBcIlwiKSApLnRyaW0oKSApLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdjtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0b1N1Ym1pdCgpe1xuICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN1Ym1pdEZpbHRlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN1Ym1pdEZpbHRlcnMoKXtcbiAgICBsZXQgZmlsdGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXJzKSk7XG4gICAgaWYoIGZpbHRlcnMgJiYgKGZpbHRlcnMpLmxlbmd0aCA+IDAgKXtcbiAgICAgIChmaWx0ZXJzKS5mb3JFYWNoKChmaWx0ZXI6IFRDRGF0YUZpbHRlcnMsIGk6IG51bWJlcikgPT4ge1xuXG4gICAgICAgIGlmKCBmaWx0ZXIud2lkdGggKXsgZGVsZXRlKGZpbHRlcnNbaV0ud2lkdGgpOyB9XG4gICAgICAgIGlmKCBmaWx0ZXIucGxhY2Vob2xkZXIgKXsgZGVsZXRlKGZpbHRlcnNbaV0ucGxhY2Vob2xkZXIpOyB9XG4gICAgICAgIGlmKCBmaWx0ZXIuZGVzY3JpcHRpb24gKXsgZGVsZXRlKGZpbHRlcnNbaV0uZGVzY3JpcHRpb24pOyB9XG5cbiAgICAgICAgaWYoICghZmlsdGVyLnNlYXJjaFRleHQgfHwgZmlsdGVyLnNlYXJjaFRleHQgJiYgZmlsdGVyLnNlYXJjaFRleHQgPT09ICcnKSAmJiBmaWx0ZXIudHlwZSAhPT0gXCJib29sZWFuXCIgKXtcbiAgICAgICAgICBkZWxldGUoZmlsdGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIGZpbHRlci50eXBlID09PSBcImJvb2xlYW5cIiApe1xuICAgICAgICAgIGlmKCAhZmlsdGVyLnNlYXJjaFRleHQgKXtcbiAgICAgICAgICAgIGZpbHRlci5zZWFyY2hUZXh0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgfSk7XG4gICAgfSAgIFxuICAgIFxuICAgIHRoaXMub25TdWJtaXQuZW1pdCh0aGlzLmZpbHRlcnMpO1xuICB9XG5cblxuICBwcml2YXRlIGNvbGxlY3Rpb25GaW5kKG9iajogYW55LCBwYXRoOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoQXJyYXlbaV07XG5cbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ1snKSAmJiBrZXkuaW5jbHVkZXMoJ10nKSkge1xuICAgICAgICBjb25zdCBuZXh0S2V5cyA9IHBhdGhBcnJheS5zbGljZShpICsgMSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZignWycpICsgMSwga2V5LmluZGV4T2YoJ10nKSk7XG4gICAgICAgIGNvbnN0IGFycmF5S2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignWycpKTtcbiAgICAgICAgaWYoIGN1cnJlbnQgJiYgY3VycmVudFthcnJheUtleV0gJiYgY3VycmVudFthcnJheUtleV1baW5kZXhdICl7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkZpbmQoY3VycmVudFthcnJheUtleV1baW5kZXhdLCBuZXh0S2V5cy5qb2luKFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiW11cIikpIHtcbiAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBrZXkucmVwbGFjZShcIltdXCIsIFwiXCIpO1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFthcnJheUtleV0gfHwgW107XG4gICAgICAgIGNvbnN0IG5leHRLZXlzID0gcGF0aEFycmF5LnNsaWNlKGkgKyAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGN1cnJlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb2xsZWN0aW9uRmluZChjdXJyZW50W2pdLCBuZXh0S2V5cy5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTsgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiggIWN1cnJlbnQgfHwgKGN1cnJlbnQgJiYgIWN1cnJlbnRba2V5XSkgKXtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG4gICAgXG4gIGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcbiAgc3RhcnRfZmlsdGVyX2ZjOiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgc3RhcnRfdmFsdWU6IGFueSB8IHVuZGVmaW5lZDtcbiAgc3RvcF92YWx1ZTogYW55IHwgdW5kZWZpbmVkO1xuXG4gIHNlYXJjaEluUmFuZ2UoIHJhbmdlX2RhdGU6IGFueSl7XG4gICAgXG4gICAgaWYoIHRoaXMuZmlsdGVycyAmJiAodGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwICl7XG5cbiAgICAgIGxldCBldmVudCA9IHt9IGFzIGFueTsgXG4gICAgICBldmVudC5kYXRlcGlja2VydGltZSA9IHRydWU7XG5cbiAgICAgIGZvciggbGV0IGkgPSAwOyBpIDwgKHRoaXMuZmlsdGVycykubGVuZ3RoOyBpKysgKXtcblxuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldICYmIHRoaXMuZmlsdGVyc1tpXS5pZCAmJiB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdGFydCcgKXtcbiAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0udmFsdWUgPSByYW5nZV9kYXRlPy5yZXN1bHQ/LnN0YXJ0ITtcbiAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RhcnQhO1xuICAgICAgICAgIGV2ZW50LmlubmVyVmFsdWUgPSB0aGlzLnN0YXJ0X3ZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdGFydCE7XG4gICAgICAgICAgdGhpcy5zZWFyY2hJbih0aGlzLmZpbHRlcnNbaV0sIGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0gJiYgdGhpcy5maWx0ZXJzW2ldLmlkICYmIHRoaXMuZmlsdGVyc1tpXS5pZCA9PT0gJ3N0b3AnICl7XG4gICAgICAgICAgdGhpcy5maWx0ZXJzW2ldLnZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdG9wITtcbiAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XG4gICAgICAgICAgZXZlbnQuaW5uZXJWYWx1ZSA9IHRoaXMuc3RvcF92YWx1ZSA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XG4gICAgICAgICAgdGhpcy5zZWFyY2hJbih0aGlzLmZpbHRlcnNbaV0sIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoIHRoaXMuZmlyc3QgfHwgdGhpcy51c2VPbkNoYW5nZVN1Ym1pdCApe1xuICAgICAgICB0aGlzLnRvU3VibWl0KCk7XG4gICAgICB9XG4gICAgICBcbiAgICB9XG4gICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuXG4gIH1cblxuICBjb252ZXJ0RGF0YVRvTnVtYmVyKGRhdGFTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtkaWEsIG1lcywgYW5vXSA9IGRhdGFTdHJpbmcuc3BsaXQoJy8nKTtcbiAgICAgIHJldHVybiArKGAke2Fub30ke21lc30ke2RpYX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHNlYXJjaEluKGl0ZW06IFRDRGF0YUZpbHRlcnMsIGV2ZW50PzogYW55KXtcblxuICAgIFxuXG4gICAgdGhpcy5zdGFydF9maWx0ZXJfZmMgPSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG5cbiAgICBpZiggZXZlbnQgPT09ICdzeW5jJyAmJiBpc1ZhbGlkICl7XG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYoIHR5cGVvZiBldmVudCA9PT0gJ2Jvb2xlYW4nICYmIGlzVmFsaWQgKXtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9IGV2ZW50O1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmKCAoZXZlbnQgPT09IHVuZGVmaW5lZCB8fCBldmVudCA9PT0gbnVsbCB8fCBldmVudCA9PT0gJycpICYmIGlzVmFsaWQgKXtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmKCBldmVudD8uZGF0ZXBpY2tlcnRpbWUgICYmIGlzVmFsaWQgKXtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9IGV2ZW50Py5pbm5lclZhbHVlOyAgICAgIFxuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmKGV2ZW50Py50YXJnZXQ/LnZhbHVlICYmIGlzVmFsaWQgKXtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9IHRoaXMubm9ybWFsaXplKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYoZXZlbnQ/LnRhcmdldD8udmFsdWUgPT09ICcnICYmIGlzVmFsaWQgKXtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmKCBpdGVtLnR5cGUgPT09ICdkYXRlLWxvY2FsJyAmJiBpdGVtLnZhbHVlICl7XG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICBpdGVtLnNlYXJjaFRleHQgPSBgJHt0aGlzLmNvbnZlcnREYXRhVG9OdW1iZXIoIGl0ZW0udmFsdWUgKX1gO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmKCBldmVudCAmJiBldmVudC5yZXN1bHQgJiYgKCBldmVudC5yZXN1bHQuc3RhcnQgfHwgZXZlbnQucmVzdWx0LnN0b3AgKSApe1xuICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIFxuICAgIFxuICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMuZmlyc3RfYWN0aXZlX2ZpbHRlciApeyAgICAgIFxuICAgICAgdGhpcy5zdGFydF9maWx0ZXJfZmMgPSB0aGlzLnN0YXJ0X2ZpbHRlcigpO1xuICAgICAgdGhpcy5maXJzdF9hY3RpdmVfZmlsdGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYoICF0aGlzLnVzZUJ1dHRvblN1Ym1pdCApe1xuICAgICAgdGhpcy5lbWl0U3VibWl0RmlsdGVycygpO1xuICAgIH0gXG4gIH1cblxuICBnZXREYXRlVVRDKGR0OiBhbnkpe1xuICAgIGNvbnN0IGFubyA9IGR0LmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbWVzID0gZHQuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBkaWEgPSBkdC5nZXREYXRlKCk7XG4gICAgY29uc3QgaG9yYXMgPSBkdC5nZXRIb3VycygpO1xuICAgIGNvbnN0IG1pbnV0b3MgPSBkdC5nZXRNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VndW5kb3MgPSBkdC5nZXRTZWNvbmRzKCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGFubywgbWVzLCBkaWEsIGhvcmFzLCBtaW51dG9zLCBzZWd1bmRvcykpO1xuICB9XG5cbiAgXG4gIHN0YXJ0X2ZpbHRlcigpe1xuICAgIGZvciggbGV0IGkgPSAwOyBpIDwgKHRoaXMuZGF0YSkubGVuZ3RoOyBpKysgKXtcblxuICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgdHJ1ZSk7XG5cbiAgICAgIGZvciggbGV0IGogPSAwOyBqIDwgKHRoaXMuZmlsdGVycykubGVuZ3RoOyBqKysgKXsgICAgICAgIFxuICAgICAgICBjb25zdCBmaWx0ZXJfaXRlbSA9IHRoaXMuZmlsdGVyc1tqXTsgICBcblxuICAgICAgICBpZiggZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCAmJiB0eXBlb2YgKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09PSAnc3RyaW5nJyAmJiBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICE9PSAnJyAmJiBmaWx0ZXJfaXRlbS50eXBlICE9PSBUQ0ZpbHRlcnNUeXBlLm51bWJlciAmJiBmaWx0ZXJfaXRlbS50eXBlICE9PSBUQ0ZpbHRlcnNUeXBlLmRhdGUgKXtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ID0gdGhpcy5ub3JtYWxpemUoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCk7ICAgICAgICBcbiAgICAgICAgICBsZXQgaXRlbV92YWx1ZSA9IHRoaXMuY29sbGVjdGlvbkZpbmQodGhpcy5kYXRhW2ldLCBmaWx0ZXJfaXRlbS5zZWFyY2hJbik7XG4gICAgICAgICAgaWYoIGl0ZW1fdmFsdWUgKXtcbiAgICAgICAgICAgIGl0ZW1fdmFsdWUgPSB0aGlzLm5vcm1hbGl6ZShpdGVtX3ZhbHVlKTsgICBcblxuICAgICAgICAgICAgaWYoIHR5cGVvZiBmaWx0ZXJfaXRlbS5ub3RJbiA9PT0gJ2Jvb2xlYW4nICYmIGZpbHRlcl9pdGVtLm5vdEluICl7XG4gICAgICAgICAgICAgIGlmKCAoIGl0ZW1fdmFsdWUgPT09IGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgKSApe1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG5cbiAgICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUuc2VsZWN0ICl7XG4gICAgICAgICAgICAgICAgLy8gRXhjbHVzaXZvIHBhcmEgc2VsZWN0XG4gICAgICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLmRhdGEgJiYgKGZpbHRlcl9pdGVtLmRhdGEpLmxlbmd0aCA+IDAgKXtcblxuICAgICAgICAgICAgICAgICAgLy8gdXNvIGRvIHNlbGVjdCBjb20gbyBub3RWYWx1ZXM6IHN0cmluZ1tdXG4gICAgICAgICAgICAgICAgICBsZXQgY3VycmVudF9vcHRpb24gPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciggbGV0IGsgPSAwOyBrIDwgKGZpbHRlcl9pdGVtLmRhdGEpLmxlbmd0aDsgaysrICl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtfaXRlbSA9IGZpbHRlcl9pdGVtLmRhdGFba107XG4gICAgICAgICAgICAgICAgICAgIGlmKCBgJHtrX2l0ZW0/LnZhbHVlfWAgPT09IGAke2ZpbHRlcl9pdGVtLnNlYXJjaFRleHR9YCAgKXtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X29wdGlvbiA9IGtfaXRlbT8ubm90VmFsdWVzITtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRfb3B0aW9uICYmIChjdXJyZW50X29wdGlvbikubGVuZ3RoID4gMCApe1xuICAgICAgICAgICAgICAgICAgICBmb3IoIGxldCB2ID0gMDsgdiA8IChjdXJyZW50X29wdGlvbikubGVuZ3RoOyB2KysgKXtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2X2l0ZW0gPSBjdXJyZW50X29wdGlvblt2XTsgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgaWYoICggaXRlbV92YWx1ZSA9PT0gdl9pdGVtICkgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1lbHNle1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzbyBub3JtYWwgZG8gc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlmKCAhKCBpdGVtX3ZhbHVlID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICkgKXtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmKCAhKCBpdGVtX3ZhbHVlLmluY2x1ZGVzKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpIHx8IGl0ZW1fdmFsdWUgPT09IGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgKSApe1xuICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBcblxuICAgICAgICBpZiggZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCAmJiBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0IGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQudmFsdWVPZigpKSAmJiBmaWx0ZXJfaXRlbS50eXBlID09PSBUQ0ZpbHRlcnNUeXBlLmRhdGV0aW1lICl7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IGl0ZW1fdmFsdWU6IGFueSA9IHRoaXMuY29sbGVjdGlvbkZpbmQodGhpcy5kYXRhW2ldLCBmaWx0ZXJfaXRlbS5zZWFyY2hJbik7XG5cbiAgICAgICAgICB0cnkgeyBpdGVtX3ZhbHVlID0gbmV3IERhdGUoaXRlbV92YWx1ZSk7IH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgIGlmKCBpdGVtX3ZhbHVlICYmICBpdGVtX3ZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oIGl0ZW1fdmFsdWUudmFsdWVPZigpKSApe1xuICAgICAgICAgICAgbGV0IGlzX2FjY2VwdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBkdF90YXJnZXQgICA9ICggKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpLmdldFRpbWUoKSApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTsgLyogKyAoMyAqIDYwICogNjAgKiAxMDAwKTsgKi9cbiAgICAgICAgICAgIGNvbnN0IGR0X2N1cnJlbnQgID0gKCAoaXRlbV92YWx1ZSkuZ2V0VGltZSgpICkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApO1xuICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLmNvbmRpdGlvbiApe1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbHRlcl9pdGVtLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24uZ3Q6ICAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGR0X3RhcmdldCkgPiAgTnVtYmVyKGR0X2N1cnJlbnQpICk7ICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmx0OiAgICBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpIDwgIE51bWJlcihkdF9jdXJyZW50KSApOyAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5ndGU6ICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA8PSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubHRlOiAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGR0X3RhcmdldCkgPj0gTnVtYmVyKGR0X2N1cnJlbnQpICk7ICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpID09PSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubm90RXF1YWw6IGlzX2FjY2VwdCA9ICggTnVtYmVyKGR0X3RhcmdldCkgIT0gTnVtYmVyKGR0X2N1cnJlbnQpICk7ICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpID09IE51bWJlcihkdF9jdXJyZW50KSApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09IE51bWJlcihpdGVtX3ZhbHVlKSApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoICFpc19hY2NlcHQgKXtcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFxuXG4gICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICYmIHR5cGVvZiBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09ICdudW1iZXInICYmICggZmlsdGVyX2l0ZW0udHlwZSA9PT0gVENGaWx0ZXJzVHlwZS5udW1iZXIgfHwgZmlsdGVyX2l0ZW0udHlwZSA9PT0gVENGaWx0ZXJzVHlwZS5kYXRlICkgKXtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ID0gTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpO1xuICAgICAgICAgIGxldCBpdGVtX3ZhbHVlID0gdGhpcy5jb2xsZWN0aW9uRmluZCh0aGlzLmRhdGFbaV0sIGZpbHRlcl9pdGVtLnNlYXJjaEluKTtcblxuICAgICAgICAgIGlmKCB0eXBlb2YgTnVtYmVyKGl0ZW1fdmFsdWUpID09PSAnbnVtYmVyJyApeyAgIFxuICAgICAgICAgICAgaXRlbV92YWx1ZSA9IE51bWJlcihpdGVtX3ZhbHVlKTsgICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBpc19hY2NlcHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5jb25kaXRpb24gKXtcblxuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbHRlcl9pdGVtLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24uZ3Q6ICAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID4gIE51bWJlcihpdGVtX3ZhbHVlKSApOyAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5sdDogICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPCAgTnVtYmVyKGl0ZW1fdmFsdWUpICk7ICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmd0ZTogICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA8PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5sdGU6ICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPj0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7ICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7IGJyZWFrOyBcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLm5vdEVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSAhPSBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggIWlzX2FjY2VwdCApe1xuICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgaWYoIHR5cGVvZiAoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09ICdib29sZWFuJyAmJiBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ID09PSB0cnVlICl7XG5cbiAgICAgICAgICBsZXQgaXRlbV92YWx1ZTogYW55ID0gdGhpcy5jb2xsZWN0aW9uRmluZCh0aGlzLmRhdGFbaV0sIGZpbHRlcl9pdGVtLnNlYXJjaEluKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiggaXRlbV92YWx1ZSAmJiAoaXRlbV92YWx1ZSkubGVuZ3RoID4gMCApeyAgXG4gICAgICAgICAgICBsZXQgcXRkX2lzX3RydWUgPSAwOyAgICAgICAgICBcbiAgICAgICAgICAgIGZvciggbGV0IGkgPSAwOyBpIDwgKChpdGVtX3ZhbHVlKS5sZW5ndGgpOyBpKysgKXtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1fdmFsdWVbaV07XG4gICAgICAgICAgICAgIGlmKCBpdGVtID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICl7XG4gICAgICAgICAgICAgICAgcXRkX2lzX3RydWUrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHF0ZF9pc190cnVlID09PSAwICl7XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKCAhKCBpdGVtX3ZhbHVlID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICkgKXtcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgIFxuICAgICAgfVxuXG4gICAgfSAvLyBlbmQgZm9yXG4gICAgXG4gICAgdGhpcy50b1Jlc3VsdCgpO1xuICAgICAgXG4gIH1cblxuICBwcml2YXRlIHRvUmVzdWx0KCl7XG5cblxuICAgIGNvbnN0IHNlYXJjaF9kYXRhID0gW107XG5cbiAgICBsZXQgaXNfZmlsdGVyID0gZmFsc2U7XG4gICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyApe1xuICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXS5zZWFyY2hUZXh0ICYmIHRoaXMuZmlsdGVyc1tpXS5zZWFyY2hUZXh0ICE9PSAnJyApe1xuICAgICAgICBpc19maWx0ZXIgPSB0cnVlOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiggaXNfZmlsdGVyICl7XG4gICAgICBmb3IoIGxldCBpID0gMDsgaSA8ICh0aGlzLmRhdGEpLmxlbmd0aDsgaSsrICl7XG4gICAgICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2ldICYmIHRoaXMuZGF0YVtpXVsndGNfZmlsdGVyX2FjY2VwdCddICl7XG4gICAgICAgICAgKHNlYXJjaF9kYXRhKS5wdXNoKHRoaXMuZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN1bHRfYWNjZXB0KHNlYXJjaF9kYXRhKTtcbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7Li4udGhpcy5maWx0ZXJzfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXN1bHRfYWNjZXB0KHRoaXMuZGF0YSk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsuLi50aGlzLmZpbHRlcnN9KTtcbiAgfVxuXG4gIHNldERhdGFJbmRleChpbmRleDogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiApe1xuICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2luZGV4XSApe1xuICAgICAgdGhpcy5kYXRhW2luZGV4XVsndGNfZmlsdGVyX2FjY2VwdCddID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0X2FjY2VwdChkYXRhOiBhbnkpe1xuICAgIGlmKCAhdGhpcy51c2VGaWx0ZXJBY2NlcHQgJiYgZGF0YSAmJiAoZGF0YSkubGVuZ3RoID4gMCApe1xuICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAoZGF0YSkubGVuZ3RoOyBpKysgKXtcbiAgICAgICAgZGVsZXRlIGRhdGFbaV1bJ3RjX2ZpbHRlcl9hY2NlcHQnXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXN1bHQuZW1pdChkYXRhKTtcbiAgfVxuXG59XG4iLCI8ZGl2ICpuZ0lmPVwic2hvd19maWx0ZXJzXCIgY2xhc3M9XCJ0Y2xvdWQtdWktZmlsdGVycyBhcmVhLWZpbHRlclwiIFtjbGFzcy5uby1ib3JkZXJdPVwiIWJvcmRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS50eXBlIHx8IChpdGVtLnR5cGUgJiYgaXRlbS50eXBlICE9PSAnYm9vbGVhbicpXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdkYXRlLWxvY2FsJ1wiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXQgdHlwZS17e2l0ZW0udHlwZX19IGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK2l0ZW0ud2lkdGggOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10eXBlLXt7aXRlbS50eXBlfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Y2xvdWQtdWktZGF0ZXBpY2tlciBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3t7aSsxfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlSW5wdXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hJbihpdGVtLCBfaW5wdXQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RjbG91ZC11aS1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jbGVhci1maWx0ZXItdGV4dFwiIFtjbGFzcy50by1oaWRlXT1cIiEoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgKGNsaWNrKT1cInNlYXJjaEluKGl0ZW0sIG51bGwpOyBpdGVtLnNlYXJjaFRleHQgPSB1bmRlZmluZWQ7IGl0ZW0udmFsdWUgPSAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSAhPT0gJ2RhdGUtbG9jYWwnXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RhdGV0aW1lLWxvY2FsJ1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXRlbS5pZCA9PT0gJ3N0YXJ0JyB8fCBpdGVtLmlkID09PSAnc3RvcCcpICYmIHVzZVJhbmdlRGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQRVJJT0QgUkFOR0UgREFURSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlkID09PSAnc3RhcnQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXQgdHlwZS17e2l0ZW0udHlwZX19IGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK3N0YXJ0X3N0b3Bfd2lkdGgrJycrc3RhcnRfc3RvcF91bmQgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoX3JhbmdlX2RhdGUgJiYgX3JhbmdlX2RhdGUucmVzdWx0ICYmIF9yYW5nZV9kYXRlLnJlc3VsdC5zdGFydCAmJiBfcmFuZ2VfZGF0ZS5yZXN1bHQuc3RvcCApXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwOzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFuZ2UtZGF0ZSAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX3JhbmdlX2RhdGUgbmdNb2RlbCBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcF09XCJpdGVtLmRlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25TdGFydF09XCJkZXNjcmlwdGlvblN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvblN0b3BdPVwiZGVzY3JpcHRpb25TdG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cInNlYXJjaEluUmFuZ2UoX3JhbmdlX2RhdGUpOyBzZWFyY2hJbihpdGVtLCBfcmFuZ2VfZGF0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYW5nZS1kYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJpdGVtLmlkID09PSAnc3RhcnQnXCIgI19pbnB1dCBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIHR5cGU9XCJoaWRkZW5cIiBbKG5nTW9kZWwpXT1cInN0YXJ0X3ZhbHVlXCI+ICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0uaWQgPT09ICdzdG9wJ1wiICNfaW5wdXQgbmFtZT1cImlucHV0X3t7aSsxfX1cIiB0eXBlPVwiaGlkZGVuXCIgWyhuZ01vZGVsKV09XCJzdG9wX3ZhbHVlXCI+ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pZCB8fCAhdXNlUmFuZ2VEYXRlXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytpdGVtLndpZHRoIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNfaW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlT3B0aW9uc0RhdGVUaW1lXT1cIihpdGVtICYmIGl0ZW0udXNlT3B0aW9uc0RhdGVUaW1lKSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRDaGFuZ2UpPVwic2VhcmNoSW4oaXRlbSwgX2lucHV0KVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Y2xvdWQtdWktZGF0ZXBpY2tlci10aW1lPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNsZWFyLWZpbHRlci10ZXh0XCIgW2NsYXNzLnRvLWhpZGVdPVwiIShpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXRlbS52YWx1ZSAhPT0gbnVsbCAmJiBpdGVtLnZhbHVlICE9PSAnJylcIiAoY2xpY2spPVwic2VhcmNoSW4oaXRlbSwgbnVsbCk7IGl0ZW0uc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDsgaXRlbS52YWx1ZSA9ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgIT09ICdzZWxlY3QnICYmIGl0ZW0udHlwZSAhPT0gJ2RhdGV0aW1lLWxvY2FsJyAmJiBpdGVtLnR5cGUgIT09ICdkYXRlLWxvY2FsJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytpdGVtLndpZHRoIDogJydcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCJfaW5wdXQudmFsdWUgIT09ICcnXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10eXBlLXt7aXRlbS50eXBlfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IChpdGVtLnBsYWNlaG9sZGVyICE9PSAnJykgPyBpdGVtLnBsYWNlaG9sZGVyIDogJycgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInt7IChpdGVtLnR5cGUgPT09ICdudW1iZXInKSA/ICd0ZXh0JyA6IGl0ZW0udHlwZSB9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGMtZm9ybS1jb250cm9sXCIgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoSW4oaXRlbSwgJGV2ZW50KVwiPiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNsZWFyLWZpbHRlci10ZXh0XCIgW2NsYXNzLnRvLWhpZGVdPVwiX2lucHV0LnZhbHVlID09PSAnJ1wiIChjbGljayk9XCJzZWFyY2hJbihpdGVtLCBudWxsKTsgX2lucHV0LnZhbHVlID0gJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlID09PSAnc2VsZWN0JyAmJiBpdGVtLmRhdGEgJiYgKGl0ZW0uZGF0YSkubGVuZ3RoID4gMFwiID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dCB0eXBlLXt7aXRlbS50eXBlfX0gYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZGVzY3JpcHRpb24gdGMtdGl0bGUtZWxsaXBzaXMgYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIHRpdGxlPVwie3sgaXRlbS5kZXNjcmlwdGlvbiB9fVwiPjxpIFtjbGFzcy50by1hY3RpdmVdPVwiX2lucHV0LnZhbHVlICE9PSAnJ1wiIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBpY29uLWZpbHRlclwiPjwvaT4mbmJzcDt7eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtdHlwZS17e2l0ZW0udHlwZX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNfaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0Yy1mb3JtLWNvbnRyb2xcIiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VhcmNoSW4oaXRlbSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiXCI+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdiBvZiBpdGVtLmRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidi52YWx1ZVwiPnt7IHYuZGVzY3JpcHRpb24gfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSAmJiBpdGVtLnR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dFwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZGVzY3JpcHRpb24gdGMtdGl0bGUtZWxsaXBzaXNcIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIj48aSBbY2xhc3MudG8tYWN0aXZlXT1cIl9pbnB1dC5jaGVja2VkID09PSB0cnVlXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJlYS1pbnB1dC1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGMtZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5wbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IChpdGVtLnBsYWNlaG9sZGVyICE9PSAnJykgPyBpdGVtLnBsYWNlaG9sZGVyIDogJycgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWFyY2hJbihpdGVtLCBfaW5wdXQuY2hlY2tlZClcIj4gICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodCBtYi0xIG1yLTFcIiAqbmdJZj1cInVzZUJ1dHRvblN1Ym1pdFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRjLWJ0biB7eyBidG5TdWJtaXRDbGFzcyB9fVwiIChjbGljayk9XCJ0b1N1Ym1pdCgpXCIgPnt7IHN1Ym1pdFRleHQgfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuPC9kaXY+XG5cbjwhLS0gPHByZT57eyBpbnB1dHMgfCBqc29uIH19PC9wcmU+IC0tPlxuPCEtLSA8cHJlPiB7eyBkYXRhIHwganNvbiB9fSA8L3ByZT4gLS0+XG5cbjwhLS0gPHA+RklMVEVSUzwvcD48cHJlPiB7eyBmaWx0ZXJzIHwganNvbiB9fTwvcHJlPiAtLT5cblxuPCEtLVxuICAgIDxwcmU+c3RhcnRfc3RvcDoge3sgc3RhcnRfc3RvcCB9fTwvcHJlPlxuICAgIDxwcmU+c3RhcnRfc3RvcF93aWR0aDoge3sgc3RhcnRfc3RvcF93aWR0aCB9fTwvcHJlPlxuICAgIDxwcmU+c3RhcnRfc3RvcF91bmQ6IHt7IHN0YXJ0X3N0b3BfdW5kIH19PC9wcmU+XG4tLT4iXX0=