raise-common-lib 0.0.248 → 0.0.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -57
- package/bundles/raise-common-lib.umd.js +1937 -12
- package/bundles/raise-common-lib.umd.js.map +1 -1
- package/bundles/raise-common-lib.umd.min.js +1 -1
- package/bundles/raise-common-lib.umd.min.js.map +1 -1
- package/esm2015/lib/common-grid/index.component.js +210 -8
- package/esm2015/lib/date-tree-filter/date-tree-filter-popover/index.component.js +761 -0
- package/esm2015/lib/date-tree-filter/date-tree-filter.helper.js +679 -0
- package/esm2015/lib/raise-common-lib.module.js +4 -1
- package/esm2015/public-api.js +3 -1
- package/esm2015/raise-common-lib.js +2 -2
- package/esm5/lib/common-grid/index.component.js +244 -8
- package/esm5/lib/date-tree-filter/date-tree-filter-popover/index.component.js +902 -0
- package/esm5/lib/date-tree-filter/date-tree-filter.helper.js +787 -0
- package/esm5/lib/raise-common-lib.module.js +4 -1
- package/esm5/public-api.js +3 -1
- package/esm5/raise-common-lib.js +2 -2
- package/fesm2015/raise-common-lib.js +1649 -9
- package/fesm2015/raise-common-lib.js.map +1 -1
- package/fesm5/raise-common-lib.js +1931 -10
- package/fesm5/raise-common-lib.js.map +1 -1
- package/lib/common-grid/index.component.d.ts +30 -1
- package/lib/date-tree-filter/date-tree-filter-popover/index.component.d.ts +46 -0
- package/lib/date-tree-filter/date-tree-filter.helper.d.ts +54 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/raise-common-lib.metadata.json +1 -1
- package/src/assets/img/arrow_right.svg +4 -4
- package/src/assets/img/calendar-disabled.svg +6 -6
- package/src/assets/img/calendar.svg +6 -6
- package/src/assets/img/calendar_arrow_left.svg +3 -3
- package/src/assets/img/calendar_arrow_right.svg +3 -3
- package/src/assets/img/checked-vector.svg +3 -3
- package/src/assets/img/dialog-close.svg +4 -4
- package/src/assets/img/dialog-grow.svg +6 -6
- package/src/assets/img/dialog-shrink.svg +6 -6
- package/src/assets/img/plus.svg +4 -4
- package/src/assets/img/raise_logo_main_new.svg +27 -27
- package/src/assets/img/search.svg +4 -4
- package/src/assets/img/shrink-icon.svg +6 -6
- package/src/assets/img/time-disabled.svg +4 -4
- package/src/assets/img/time.svg +4 -4
- package/src/assets/img/toolbar-action-addFolder.svg +17 -17
- package/src/assets/img/toolbar-action-calculator.svg +11 -11
- package/src/assets/img/toolbar-action-collapse.svg +7 -7
- package/src/assets/img/toolbar-action-combine.svg +4 -4
- package/src/assets/img/toolbar-action-edit.svg +4 -4
- package/src/assets/img/toolbar-action-expand.svg +7 -7
- package/src/assets/img/toolbar-action-folderMove.svg +8 -8
- package/src/assets/img/toolbar-action-lock.svg +6 -6
- package/src/assets/img/toolbar-action-preview.svg +7 -7
- package/src/assets/img/toolbar-action-publish.svg +5 -5
- package/src/assets/img/toolbar-action-reminders.svg +10 -10
- package/src/assets/img/toolbar-action-rename.svg +7 -7
- package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
- package/src/assets/img/toolbar-action-send-file.svg +5 -5
- package/src/assets/img/toolbar-action-settle.svg +7 -7
- package/src/assets/img/toolbar-action-share.svg +5 -5
- package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
- package/src/assets/img/toolbar-action-sync.svg +4 -4
- package/src/assets/img/toolbar-action-template.svg +6 -6
- package/src/assets/img/toolbar-action-workflow.svg +9 -9
|
@@ -0,0 +1,761 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* Generated from: lib/date-tree-filter/date-tree-filter-popover/index.component.ts
|
|
4
|
+
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
+
*/
|
|
6
|
+
import { Component, EventEmitter, Input, Output, } from "@angular/core";
|
|
7
|
+
import moment from "moment";
|
|
8
|
+
export class DateTreeFilterPopoverComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.field = "";
|
|
11
|
+
this.sourceRows = [];
|
|
12
|
+
this.dateFields = [];
|
|
13
|
+
this.selectedByField = {};
|
|
14
|
+
this.fieldLabelMap = {};
|
|
15
|
+
this.apply = new EventEmitter();
|
|
16
|
+
this.close = new EventEmitter();
|
|
17
|
+
this.keyword = "";
|
|
18
|
+
this.years = [];
|
|
19
|
+
this.expandStateByField = {};
|
|
20
|
+
this.workingSelectedByField = {};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @param {?} changes
|
|
24
|
+
* @return {?}
|
|
25
|
+
*/
|
|
26
|
+
ngOnChanges(changes) {
|
|
27
|
+
if (changes.field ||
|
|
28
|
+
changes.sourceRows ||
|
|
29
|
+
changes.selectedByField ||
|
|
30
|
+
changes.dateFields) {
|
|
31
|
+
this.keyword = "";
|
|
32
|
+
this.workingSelectedByField = this.cloneSelectionMap(this.selectedByField);
|
|
33
|
+
this.rebuildTree();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @return {?}
|
|
38
|
+
*/
|
|
39
|
+
closePopover() {
|
|
40
|
+
this.close.emit();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @param {?} value
|
|
44
|
+
* @return {?}
|
|
45
|
+
*/
|
|
46
|
+
onKeywordChange(value) {
|
|
47
|
+
this.keyword = value || "";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @return {?}
|
|
51
|
+
*/
|
|
52
|
+
getVisibleYears() {
|
|
53
|
+
/** @type {?} */
|
|
54
|
+
const searchText = (this.keyword || "").trim().toLowerCase();
|
|
55
|
+
if (!searchText) {
|
|
56
|
+
return this.years;
|
|
57
|
+
}
|
|
58
|
+
return this.years
|
|
59
|
+
.map((/**
|
|
60
|
+
* @param {?} yearNode
|
|
61
|
+
* @return {?}
|
|
62
|
+
*/
|
|
63
|
+
(yearNode) => {
|
|
64
|
+
/** @type {?} */
|
|
65
|
+
const yearMatched = String(yearNode.year).toLowerCase().indexOf(searchText) > -1;
|
|
66
|
+
/** @type {?} */
|
|
67
|
+
const months = yearNode.months
|
|
68
|
+
.map((/**
|
|
69
|
+
* @param {?} monthNode
|
|
70
|
+
* @return {?}
|
|
71
|
+
*/
|
|
72
|
+
(monthNode) => {
|
|
73
|
+
/** @type {?} */
|
|
74
|
+
const monthMatched = String(monthNode.label)
|
|
75
|
+
.toLowerCase()
|
|
76
|
+
.indexOf(searchText) > -1;
|
|
77
|
+
/** @type {?} */
|
|
78
|
+
const days = monthNode.days.filter((/**
|
|
79
|
+
* @param {?} dayNode
|
|
80
|
+
* @return {?}
|
|
81
|
+
*/
|
|
82
|
+
(dayNode) => {
|
|
83
|
+
return (String(dayNode.label)
|
|
84
|
+
.toLowerCase()
|
|
85
|
+
.indexOf(searchText) > -1);
|
|
86
|
+
}));
|
|
87
|
+
if (yearMatched || monthMatched) {
|
|
88
|
+
return monthNode;
|
|
89
|
+
}
|
|
90
|
+
return Object.assign({}, monthNode, { days: days });
|
|
91
|
+
}))
|
|
92
|
+
.filter((/**
|
|
93
|
+
* @param {?} monthNode
|
|
94
|
+
* @return {?}
|
|
95
|
+
*/
|
|
96
|
+
(monthNode) => monthNode.days.length > 0));
|
|
97
|
+
if (yearMatched) {
|
|
98
|
+
return yearNode;
|
|
99
|
+
}
|
|
100
|
+
return Object.assign({}, yearNode, { months: months });
|
|
101
|
+
}))
|
|
102
|
+
.filter((/**
|
|
103
|
+
* @param {?} yearNode
|
|
104
|
+
* @return {?}
|
|
105
|
+
*/
|
|
106
|
+
(yearNode) => yearNode.months.length > 0));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @param {?} yearNode
|
|
110
|
+
* @return {?}
|
|
111
|
+
*/
|
|
112
|
+
toggleYearExpanded(yearNode) {
|
|
113
|
+
/** @type {?} */
|
|
114
|
+
const state = this.getOrCreateExpandState(this.field);
|
|
115
|
+
state.years[yearNode.key] = !state.years[yearNode.key];
|
|
116
|
+
yearNode.expanded = !!state.years[yearNode.key];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @param {?} monthNode
|
|
120
|
+
* @return {?}
|
|
121
|
+
*/
|
|
122
|
+
toggleMonthExpanded(monthNode) {
|
|
123
|
+
/** @type {?} */
|
|
124
|
+
const state = this.getOrCreateExpandState(this.field);
|
|
125
|
+
state.months[monthNode.key] = !state.months[monthNode.key];
|
|
126
|
+
monthNode.expanded = !!state.months[monthNode.key];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @return {?}
|
|
130
|
+
*/
|
|
131
|
+
isAllChecked() {
|
|
132
|
+
/** @type {?} */
|
|
133
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
134
|
+
/** @type {?} */
|
|
135
|
+
const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
|
|
136
|
+
if (!enabledDayKeys.length) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return enabledDayKeys.every((/**
|
|
140
|
+
* @param {?} key
|
|
141
|
+
* @return {?}
|
|
142
|
+
*/
|
|
143
|
+
(key) => !!selectedMap[key]));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* @return {?}
|
|
147
|
+
*/
|
|
148
|
+
isAllIndeterminate() {
|
|
149
|
+
/** @type {?} */
|
|
150
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
151
|
+
/** @type {?} */
|
|
152
|
+
const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
|
|
153
|
+
if (!enabledDayKeys.length) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
/** @type {?} */
|
|
157
|
+
const selectedCount = enabledDayKeys.filter((/**
|
|
158
|
+
* @param {?} key
|
|
159
|
+
* @return {?}
|
|
160
|
+
*/
|
|
161
|
+
(key) => !!selectedMap[key]))
|
|
162
|
+
.length;
|
|
163
|
+
return selectedCount > 0 && selectedCount < enabledDayKeys.length;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @param {?} checked
|
|
167
|
+
* @return {?}
|
|
168
|
+
*/
|
|
169
|
+
toggleAllDays(checked) {
|
|
170
|
+
/** @type {?} */
|
|
171
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
172
|
+
/** @type {?} */
|
|
173
|
+
const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
|
|
174
|
+
enabledDayKeys.forEach((/**
|
|
175
|
+
* @param {?} key
|
|
176
|
+
* @return {?}
|
|
177
|
+
*/
|
|
178
|
+
(key) => {
|
|
179
|
+
if (checked) {
|
|
180
|
+
selectedMap[key] = true;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
delete selectedMap[key];
|
|
184
|
+
}
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* @param {?} dayNode
|
|
189
|
+
* @return {?}
|
|
190
|
+
*/
|
|
191
|
+
isDayChecked(dayNode) {
|
|
192
|
+
/** @type {?} */
|
|
193
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
194
|
+
return !!selectedMap[dayNode.key];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* @param {?} dayNode
|
|
198
|
+
* @param {?} checked
|
|
199
|
+
* @return {?}
|
|
200
|
+
*/
|
|
201
|
+
toggleDay(dayNode, checked) {
|
|
202
|
+
if (dayNode.disabled) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
/** @type {?} */
|
|
206
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
207
|
+
if (checked) {
|
|
208
|
+
selectedMap[dayNode.key] = true;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
delete selectedMap[dayNode.key];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* @param {?} monthNode
|
|
216
|
+
* @return {?}
|
|
217
|
+
*/
|
|
218
|
+
isMonthDisabled(monthNode) {
|
|
219
|
+
return monthNode.days.every((/**
|
|
220
|
+
* @param {?} dayNode
|
|
221
|
+
* @return {?}
|
|
222
|
+
*/
|
|
223
|
+
(dayNode) => dayNode.disabled));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* @param {?} monthNode
|
|
227
|
+
* @return {?}
|
|
228
|
+
*/
|
|
229
|
+
isMonthChecked(monthNode) {
|
|
230
|
+
if (this.isMonthDisabled(monthNode)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
/** @type {?} */
|
|
234
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
235
|
+
/** @type {?} */
|
|
236
|
+
const enabledDays = monthNode.days.filter((/**
|
|
237
|
+
* @param {?} dayNode
|
|
238
|
+
* @return {?}
|
|
239
|
+
*/
|
|
240
|
+
(dayNode) => !dayNode.disabled));
|
|
241
|
+
return enabledDays.every((/**
|
|
242
|
+
* @param {?} dayNode
|
|
243
|
+
* @return {?}
|
|
244
|
+
*/
|
|
245
|
+
(dayNode) => !!selectedMap[dayNode.key]));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* @param {?} monthNode
|
|
249
|
+
* @return {?}
|
|
250
|
+
*/
|
|
251
|
+
isMonthIndeterminate(monthNode) {
|
|
252
|
+
if (this.isMonthDisabled(monthNode)) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
/** @type {?} */
|
|
256
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
257
|
+
/** @type {?} */
|
|
258
|
+
const enabledDays = monthNode.days.filter((/**
|
|
259
|
+
* @param {?} dayNode
|
|
260
|
+
* @return {?}
|
|
261
|
+
*/
|
|
262
|
+
(dayNode) => !dayNode.disabled));
|
|
263
|
+
/** @type {?} */
|
|
264
|
+
const selectedCount = enabledDays.filter((/**
|
|
265
|
+
* @param {?} dayNode
|
|
266
|
+
* @return {?}
|
|
267
|
+
*/
|
|
268
|
+
(dayNode) => {
|
|
269
|
+
return !!selectedMap[dayNode.key];
|
|
270
|
+
})).length;
|
|
271
|
+
return selectedCount > 0 && selectedCount < enabledDays.length;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* @param {?} monthNode
|
|
275
|
+
* @param {?} checked
|
|
276
|
+
* @return {?}
|
|
277
|
+
*/
|
|
278
|
+
toggleMonth(monthNode, checked) {
|
|
279
|
+
if (this.isMonthDisabled(monthNode)) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
/** @type {?} */
|
|
283
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
284
|
+
monthNode.days.forEach((/**
|
|
285
|
+
* @param {?} dayNode
|
|
286
|
+
* @return {?}
|
|
287
|
+
*/
|
|
288
|
+
(dayNode) => {
|
|
289
|
+
if (dayNode.disabled) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (checked) {
|
|
293
|
+
selectedMap[dayNode.key] = true;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
delete selectedMap[dayNode.key];
|
|
297
|
+
}
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* @param {?} yearNode
|
|
302
|
+
* @return {?}
|
|
303
|
+
*/
|
|
304
|
+
isYearDisabled(yearNode) {
|
|
305
|
+
return yearNode.months.every((/**
|
|
306
|
+
* @param {?} monthNode
|
|
307
|
+
* @return {?}
|
|
308
|
+
*/
|
|
309
|
+
(monthNode) => this.isMonthDisabled(monthNode)));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* @param {?} yearNode
|
|
313
|
+
* @return {?}
|
|
314
|
+
*/
|
|
315
|
+
isYearChecked(yearNode) {
|
|
316
|
+
if (this.isYearDisabled(yearNode)) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
/** @type {?} */
|
|
320
|
+
const enabledMonths = yearNode.months.filter((/**
|
|
321
|
+
* @param {?} monthNode
|
|
322
|
+
* @return {?}
|
|
323
|
+
*/
|
|
324
|
+
(monthNode) => !this.isMonthDisabled(monthNode)));
|
|
325
|
+
return enabledMonths.every((/**
|
|
326
|
+
* @param {?} monthNode
|
|
327
|
+
* @return {?}
|
|
328
|
+
*/
|
|
329
|
+
(monthNode) => this.isMonthChecked(monthNode)));
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* @param {?} yearNode
|
|
333
|
+
* @return {?}
|
|
334
|
+
*/
|
|
335
|
+
isYearIndeterminate(yearNode) {
|
|
336
|
+
if (this.isYearDisabled(yearNode)) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
/** @type {?} */
|
|
340
|
+
const selectedMap = this.getFieldDaySelectionMap(this.field);
|
|
341
|
+
/** @type {?} */
|
|
342
|
+
const enabledDays = [];
|
|
343
|
+
yearNode.months.forEach((/**
|
|
344
|
+
* @param {?} monthNode
|
|
345
|
+
* @return {?}
|
|
346
|
+
*/
|
|
347
|
+
(monthNode) => {
|
|
348
|
+
monthNode.days.forEach((/**
|
|
349
|
+
* @param {?} dayNode
|
|
350
|
+
* @return {?}
|
|
351
|
+
*/
|
|
352
|
+
(dayNode) => {
|
|
353
|
+
if (!dayNode.disabled) {
|
|
354
|
+
enabledDays.push(dayNode.key);
|
|
355
|
+
}
|
|
356
|
+
}));
|
|
357
|
+
}));
|
|
358
|
+
/** @type {?} */
|
|
359
|
+
const selectedCount = enabledDays.filter((/**
|
|
360
|
+
* @param {?} key
|
|
361
|
+
* @return {?}
|
|
362
|
+
*/
|
|
363
|
+
(key) => !!selectedMap[key])).length;
|
|
364
|
+
return selectedCount > 0 && selectedCount < enabledDays.length;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* @param {?} yearNode
|
|
368
|
+
* @param {?} checked
|
|
369
|
+
* @return {?}
|
|
370
|
+
*/
|
|
371
|
+
toggleYear(yearNode, checked) {
|
|
372
|
+
if (this.isYearDisabled(yearNode)) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
yearNode.months.forEach((/**
|
|
376
|
+
* @param {?} monthNode
|
|
377
|
+
* @return {?}
|
|
378
|
+
*/
|
|
379
|
+
(monthNode) => {
|
|
380
|
+
this.toggleMonth(monthNode, checked);
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* @return {?}
|
|
385
|
+
*/
|
|
386
|
+
clearSelection() {
|
|
387
|
+
if (this.field) {
|
|
388
|
+
this.workingSelectedByField[this.field] = {};
|
|
389
|
+
}
|
|
390
|
+
this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
|
|
391
|
+
this.rebuildTree();
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* @return {?}
|
|
395
|
+
*/
|
|
396
|
+
applySelection() {
|
|
397
|
+
this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
|
|
398
|
+
this.closePopover();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* @private
|
|
402
|
+
* @return {?}
|
|
403
|
+
*/
|
|
404
|
+
rebuildTree() {
|
|
405
|
+
if (!this.field) {
|
|
406
|
+
this.years = [];
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
/** @type {?} */
|
|
410
|
+
const sourceRows = this.sourceRows || [];
|
|
411
|
+
/** @type {?} */
|
|
412
|
+
const rowsByOtherFilters = this.filterRowsBySelectedDateTree(sourceRows, this.field);
|
|
413
|
+
/** @type {?} */
|
|
414
|
+
const availableDayKeyMap = {};
|
|
415
|
+
rowsByOtherFilters.forEach((/**
|
|
416
|
+
* @param {?} row
|
|
417
|
+
* @return {?}
|
|
418
|
+
*/
|
|
419
|
+
(row) => {
|
|
420
|
+
/** @type {?} */
|
|
421
|
+
const dayKey = this.getDayKeyByRowValue(row[this.field]);
|
|
422
|
+
if (dayKey) {
|
|
423
|
+
availableDayKeyMap[dayKey] = true;
|
|
424
|
+
}
|
|
425
|
+
}));
|
|
426
|
+
/** @type {?} */
|
|
427
|
+
const groupedMap = {};
|
|
428
|
+
sourceRows.forEach((/**
|
|
429
|
+
* @param {?} row
|
|
430
|
+
* @return {?}
|
|
431
|
+
*/
|
|
432
|
+
(row) => {
|
|
433
|
+
/** @type {?} */
|
|
434
|
+
const date = this.parseDateValue(row[this.field]);
|
|
435
|
+
if (!date) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
/** @type {?} */
|
|
439
|
+
const year = date.getFullYear();
|
|
440
|
+
/** @type {?} */
|
|
441
|
+
const month = date.getMonth() + 1;
|
|
442
|
+
/** @type {?} */
|
|
443
|
+
const day = date.getDate();
|
|
444
|
+
if (!groupedMap[year]) {
|
|
445
|
+
groupedMap[year] = {};
|
|
446
|
+
}
|
|
447
|
+
if (!groupedMap[year][month]) {
|
|
448
|
+
groupedMap[year][month] = {};
|
|
449
|
+
}
|
|
450
|
+
if (!groupedMap[year][month][day]) {
|
|
451
|
+
groupedMap[year][month][day] = 0;
|
|
452
|
+
}
|
|
453
|
+
groupedMap[year][month][day] += 1;
|
|
454
|
+
}));
|
|
455
|
+
/** @type {?} */
|
|
456
|
+
const expandState = this.getOrCreateExpandState(this.field);
|
|
457
|
+
this.years = Object.keys(groupedMap)
|
|
458
|
+
.map((/**
|
|
459
|
+
* @param {?} key
|
|
460
|
+
* @return {?}
|
|
461
|
+
*/
|
|
462
|
+
(key) => Number(key)))
|
|
463
|
+
.sort((/**
|
|
464
|
+
* @param {?} a
|
|
465
|
+
* @param {?} b
|
|
466
|
+
* @return {?}
|
|
467
|
+
*/
|
|
468
|
+
(a, b) => b - a))
|
|
469
|
+
.map((/**
|
|
470
|
+
* @param {?} year
|
|
471
|
+
* @return {?}
|
|
472
|
+
*/
|
|
473
|
+
(year) => {
|
|
474
|
+
/** @type {?} */
|
|
475
|
+
const months = Object.keys(groupedMap[year])
|
|
476
|
+
.map((/**
|
|
477
|
+
* @param {?} key
|
|
478
|
+
* @return {?}
|
|
479
|
+
*/
|
|
480
|
+
(key) => Number(key)))
|
|
481
|
+
.sort((/**
|
|
482
|
+
* @param {?} a
|
|
483
|
+
* @param {?} b
|
|
484
|
+
* @return {?}
|
|
485
|
+
*/
|
|
486
|
+
(a, b) => a - b))
|
|
487
|
+
.map((/**
|
|
488
|
+
* @param {?} month
|
|
489
|
+
* @return {?}
|
|
490
|
+
*/
|
|
491
|
+
(month) => {
|
|
492
|
+
/** @type {?} */
|
|
493
|
+
const monthKey = year + "-" + this.pad2(month);
|
|
494
|
+
if (expandState.months[monthKey] === undefined) {
|
|
495
|
+
expandState.months[monthKey] = true;
|
|
496
|
+
}
|
|
497
|
+
/** @type {?} */
|
|
498
|
+
const days = Object.keys(groupedMap[year][month])
|
|
499
|
+
.map((/**
|
|
500
|
+
* @param {?} key
|
|
501
|
+
* @return {?}
|
|
502
|
+
*/
|
|
503
|
+
(key) => Number(key)))
|
|
504
|
+
.sort((/**
|
|
505
|
+
* @param {?} a
|
|
506
|
+
* @param {?} b
|
|
507
|
+
* @return {?}
|
|
508
|
+
*/
|
|
509
|
+
(a, b) => a - b))
|
|
510
|
+
.map((/**
|
|
511
|
+
* @param {?} day
|
|
512
|
+
* @return {?}
|
|
513
|
+
*/
|
|
514
|
+
(day) => {
|
|
515
|
+
/** @type {?} */
|
|
516
|
+
const dayKey = this.toDayKey(year, month, day);
|
|
517
|
+
/** @type {?} */
|
|
518
|
+
const dayDate = new Date(year, month - 1, day);
|
|
519
|
+
return {
|
|
520
|
+
key: dayKey,
|
|
521
|
+
day: day,
|
|
522
|
+
label: moment(dayDate).format("D MMM YYYY"),
|
|
523
|
+
count: groupedMap[year][month][day],
|
|
524
|
+
disabled: !availableDayKeyMap[dayKey],
|
|
525
|
+
};
|
|
526
|
+
}));
|
|
527
|
+
return {
|
|
528
|
+
key: monthKey,
|
|
529
|
+
month: month,
|
|
530
|
+
label: moment()
|
|
531
|
+
.month(month - 1)
|
|
532
|
+
.format("MMM"),
|
|
533
|
+
expanded: !!expandState.months[monthKey],
|
|
534
|
+
days: days,
|
|
535
|
+
};
|
|
536
|
+
}));
|
|
537
|
+
/** @type {?} */
|
|
538
|
+
const yearKey = String(year);
|
|
539
|
+
if (expandState.years[yearKey] === undefined) {
|
|
540
|
+
expandState.years[yearKey] = true;
|
|
541
|
+
}
|
|
542
|
+
return {
|
|
543
|
+
key: yearKey,
|
|
544
|
+
year: year,
|
|
545
|
+
expanded: !!expandState.years[yearKey],
|
|
546
|
+
months: months,
|
|
547
|
+
};
|
|
548
|
+
}));
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* @private
|
|
552
|
+
* @param {?} rows
|
|
553
|
+
* @param {?=} excludeField
|
|
554
|
+
* @return {?}
|
|
555
|
+
*/
|
|
556
|
+
filterRowsBySelectedDateTree(rows, excludeField) {
|
|
557
|
+
/** @type {?} */
|
|
558
|
+
let filteredRows = rows ? rows.slice() : [];
|
|
559
|
+
(this.dateFields || []).forEach((/**
|
|
560
|
+
* @param {?} field
|
|
561
|
+
* @return {?}
|
|
562
|
+
*/
|
|
563
|
+
(field) => {
|
|
564
|
+
if (excludeField && field === excludeField) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
/** @type {?} */
|
|
568
|
+
const selectedMap = this.getFieldDaySelectionMap(field);
|
|
569
|
+
/** @type {?} */
|
|
570
|
+
const selectedKeys = Object.keys(selectedMap);
|
|
571
|
+
if (!selectedKeys.length) {
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
filteredRows = filteredRows.filter((/**
|
|
575
|
+
* @param {?} row
|
|
576
|
+
* @return {?}
|
|
577
|
+
*/
|
|
578
|
+
(row) => {
|
|
579
|
+
/** @type {?} */
|
|
580
|
+
const dayKey = this.getDayKeyByRowValue(row[field]);
|
|
581
|
+
return dayKey ? !!selectedMap[dayKey] : false;
|
|
582
|
+
}));
|
|
583
|
+
}));
|
|
584
|
+
return filteredRows;
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* @private
|
|
588
|
+
* @param {?} value
|
|
589
|
+
* @return {?}
|
|
590
|
+
*/
|
|
591
|
+
parseDateValue(value) {
|
|
592
|
+
if (!value) {
|
|
593
|
+
return null;
|
|
594
|
+
}
|
|
595
|
+
if (value instanceof Date) {
|
|
596
|
+
return value;
|
|
597
|
+
}
|
|
598
|
+
/** @type {?} */
|
|
599
|
+
const parsed = moment(value, [
|
|
600
|
+
"YYYY-MM-DD",
|
|
601
|
+
"MM/DD/YYYY",
|
|
602
|
+
"DD/MM/YYYY",
|
|
603
|
+
"YYYY/MM/DD",
|
|
604
|
+
"DD-MMM-YYYY",
|
|
605
|
+
"MMM DD, YYYY",
|
|
606
|
+
moment.ISO_8601,
|
|
607
|
+
], true);
|
|
608
|
+
if (parsed.isValid()) {
|
|
609
|
+
return parsed.toDate();
|
|
610
|
+
}
|
|
611
|
+
/** @type {?} */
|
|
612
|
+
const fallback = new Date(value);
|
|
613
|
+
return isNaN(fallback.getTime()) ? null : fallback;
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* @private
|
|
617
|
+
* @param {?} field
|
|
618
|
+
* @return {?}
|
|
619
|
+
*/
|
|
620
|
+
getOrCreateExpandState(field) {
|
|
621
|
+
if (!this.expandStateByField[field]) {
|
|
622
|
+
this.expandStateByField[field] = { years: {}, months: {} };
|
|
623
|
+
}
|
|
624
|
+
return this.expandStateByField[field];
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* @private
|
|
628
|
+
* @param {?} field
|
|
629
|
+
* @return {?}
|
|
630
|
+
*/
|
|
631
|
+
getFieldDaySelectionMap(field) {
|
|
632
|
+
if (!this.workingSelectedByField[field]) {
|
|
633
|
+
this.workingSelectedByField[field] = {};
|
|
634
|
+
}
|
|
635
|
+
return this.workingSelectedByField[field];
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* @private
|
|
639
|
+
* @param {?} year
|
|
640
|
+
* @param {?} month
|
|
641
|
+
* @param {?} day
|
|
642
|
+
* @return {?}
|
|
643
|
+
*/
|
|
644
|
+
toDayKey(year, month, day) {
|
|
645
|
+
return year + "-" + this.pad2(month) + "-" + this.pad2(day);
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* @private
|
|
649
|
+
* @param {?} value
|
|
650
|
+
* @return {?}
|
|
651
|
+
*/
|
|
652
|
+
pad2(value) {
|
|
653
|
+
return value < 10 ? "0" + value : String(value);
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* @private
|
|
657
|
+
* @param {?} value
|
|
658
|
+
* @return {?}
|
|
659
|
+
*/
|
|
660
|
+
getDayKeyByRowValue(value) {
|
|
661
|
+
/** @type {?} */
|
|
662
|
+
const date = this.parseDateValue(value);
|
|
663
|
+
if (!date) {
|
|
664
|
+
return "";
|
|
665
|
+
}
|
|
666
|
+
return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* @private
|
|
670
|
+
* @return {?}
|
|
671
|
+
*/
|
|
672
|
+
getEnabledDayKeysInCurrentField() {
|
|
673
|
+
/** @type {?} */
|
|
674
|
+
const keys = [];
|
|
675
|
+
this.years.forEach((/**
|
|
676
|
+
* @param {?} yearNode
|
|
677
|
+
* @return {?}
|
|
678
|
+
*/
|
|
679
|
+
(yearNode) => {
|
|
680
|
+
yearNode.months.forEach((/**
|
|
681
|
+
* @param {?} monthNode
|
|
682
|
+
* @return {?}
|
|
683
|
+
*/
|
|
684
|
+
(monthNode) => {
|
|
685
|
+
monthNode.days.forEach((/**
|
|
686
|
+
* @param {?} dayNode
|
|
687
|
+
* @return {?}
|
|
688
|
+
*/
|
|
689
|
+
(dayNode) => {
|
|
690
|
+
if (!dayNode.disabled) {
|
|
691
|
+
keys.push(dayNode.key);
|
|
692
|
+
}
|
|
693
|
+
}));
|
|
694
|
+
}));
|
|
695
|
+
}));
|
|
696
|
+
return keys;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* @private
|
|
700
|
+
* @param {?} source
|
|
701
|
+
* @return {?}
|
|
702
|
+
*/
|
|
703
|
+
cloneSelectionMap(source) {
|
|
704
|
+
try {
|
|
705
|
+
return source ? JSON.parse(JSON.stringify(source)) : {};
|
|
706
|
+
}
|
|
707
|
+
catch (e) {
|
|
708
|
+
return {};
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
DateTreeFilterPopoverComponent.decorators = [
|
|
713
|
+
{ type: Component, args: [{
|
|
714
|
+
selector: "rs-date-tree-filter-popover",
|
|
715
|
+
template: "<div class=\"date-tree-filter-popover\">\r\n <div class=\"popover-search\">\r\n <span class=\"search-icon\"><img src=\"/assets/img/search.svg\" alt=\"\" /></span>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"translation.SEARCH || '.SEARCH'\"\r\n [value]=\"keyword\"\r\n (input)=\"onKeywordChange($event.target.value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"popover-tree\">\r\n <label class=\"tree-row all-row\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllChecked()\"\r\n [indeterminate]=\"isAllIndeterminate()\"\r\n (change)=\"toggleAllDays($event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ translation.ALL || '.ALL' }}</span>\r\n </label>\r\n\r\n <div class=\"year-block\" *ngFor=\"let yearNode of getVisibleYears()\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleYearExpanded(yearNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: yearNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isYearDisabled(yearNode)\"\r\n [checked]=\"isYearChecked(yearNode)\"\r\n [indeterminate]=\"isYearIndeterminate(yearNode)\"\r\n (change)=\"toggleYear(yearNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ yearNode.year }}</span>\r\n </div>\r\n\r\n <div class=\"month-block\" *ngIf=\"yearNode.expanded\">\r\n <div class=\"month-item\" *ngFor=\"let monthNode of yearNode.months\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleMonthExpanded(monthNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: monthNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isMonthDisabled(monthNode)\"\r\n [checked]=\"isMonthChecked(monthNode)\"\r\n [indeterminate]=\"isMonthIndeterminate(monthNode)\"\r\n (change)=\"toggleMonth(monthNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ monthNode.label }}</span>\r\n </div>\r\n\r\n <div class=\"day-block\" *ngIf=\"monthNode.expanded\">\r\n <label\r\n class=\"tree-row day-row\"\r\n *ngFor=\"let dayNode of monthNode.days\"\r\n [ngClass]=\"{ disabled: dayNode.disabled }\"\r\n >\r\n <span class=\"tree-toggle-spacer\"></span>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"dayNode.disabled\"\r\n [checked]=\"isDayChecked(dayNode)\"\r\n (change)=\"toggleDay(dayNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ dayNode.label }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"popover-footer\">\r\n <button type=\"button\" (click)=\"clearSelection()\">\r\n {{ translation.CLEAR || '.CLEAR' }}\r\n </button>\r\n <button type=\"button\" class=\"primary-btn\" (click)=\"applySelection()\">\r\n {{ translation.APPLY || '.APPLY' }}\r\n </button>\r\n </div>\r\n</div>\r\n",
|
|
716
|
+
styles: [":host{position:fixed;left:12px;top:12px;z-index:20;width:300px}.date-tree-filter-popover{background:#fff;border:1px solid #eaedf0;border-radius:10px;box-shadow:0 0 4px rgba(0,0,0,.25);padding:4px 8px;display:flex;flex-direction:column;color:#44566c;font-family:Arial}.popover-search{position:relative;padding:4px 0 8px}.popover-search .search-icon{position:absolute;left:10px;top:10px;color:#929dab;font-size:12px;line-height:12px}.popover-search input{width:100%;height:28px;border:1px solid #eaedf0;border-radius:16px;padding:0 10px 0 28px;outline:0;font-size:12px;color:#44566c}.popover-tree{max-height:320px;overflow:auto;padding-right:2px}.tree-row{display:flex;align-items:center;min-height:24px;font-size:11px;line-height:14px;color:#44566c}.tree-row input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;margin:0 6px 0 0;box-sizing:border-box;border:1px solid #d8d8d8;border-radius:3px;background-color:#fff;cursor:pointer;vertical-align:middle;flex-shrink:0}.tree-row input[type=checkbox]:checked{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M0.5 4.31818L3 7.5L5.75 4L8.5 0.5' stroke='white' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:indeterminate{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M1.5 4.5H7.5' stroke='white' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.all-row{padding-left:20px;margin-bottom:2px}.year-block{margin-bottom:2px}.month-block{padding-left:20px}.day-block{padding-left:24px}.tree-toggle-btn{width:16px;height:16px;padding:0;margin-right:4px;border:none;background:0 0;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.tree-arrow{display:inline-block;width:6px;height:6px;border-right:1px solid #6c7c90;border-bottom:1px solid #6c7c90;transform:rotate(-45deg);transition:transform .15s}.tree-arrow.expanded{transform:rotate(45deg)}.tree-toggle-spacer{width:20px;display:inline-block}.row-label{color:#44566c}.day-row.disabled .row-label{color:#adb5bd}.popover-footer{margin-top:8px;padding:12px 0 8px;border-top:1px solid #eaedf0;display:flex;justify-content:flex-end;gap:12px}.popover-footer button{min-width:56px;height:26px;padding:0 8px;border-radius:4px;border:1px solid #dbe1e7;background:#fff;font-size:11px;color:#44566c;cursor:pointer}.popover-footer .primary-btn{background:#1364b3;border-color:#1364b3;color:#fff}"]
|
|
717
|
+
}] }
|
|
718
|
+
];
|
|
719
|
+
DateTreeFilterPopoverComponent.propDecorators = {
|
|
720
|
+
field: [{ type: Input }],
|
|
721
|
+
translation: [{ type: Input }],
|
|
722
|
+
sourceRows: [{ type: Input }],
|
|
723
|
+
dateFields: [{ type: Input }],
|
|
724
|
+
selectedByField: [{ type: Input }],
|
|
725
|
+
fieldLabelMap: [{ type: Input }],
|
|
726
|
+
apply: [{ type: Output }],
|
|
727
|
+
close: [{ type: Output }]
|
|
728
|
+
};
|
|
729
|
+
if (false) {
|
|
730
|
+
/** @type {?} */
|
|
731
|
+
DateTreeFilterPopoverComponent.prototype.field;
|
|
732
|
+
/** @type {?} */
|
|
733
|
+
DateTreeFilterPopoverComponent.prototype.translation;
|
|
734
|
+
/** @type {?} */
|
|
735
|
+
DateTreeFilterPopoverComponent.prototype.sourceRows;
|
|
736
|
+
/** @type {?} */
|
|
737
|
+
DateTreeFilterPopoverComponent.prototype.dateFields;
|
|
738
|
+
/** @type {?} */
|
|
739
|
+
DateTreeFilterPopoverComponent.prototype.selectedByField;
|
|
740
|
+
/** @type {?} */
|
|
741
|
+
DateTreeFilterPopoverComponent.prototype.fieldLabelMap;
|
|
742
|
+
/** @type {?} */
|
|
743
|
+
DateTreeFilterPopoverComponent.prototype.apply;
|
|
744
|
+
/** @type {?} */
|
|
745
|
+
DateTreeFilterPopoverComponent.prototype.close;
|
|
746
|
+
/** @type {?} */
|
|
747
|
+
DateTreeFilterPopoverComponent.prototype.keyword;
|
|
748
|
+
/** @type {?} */
|
|
749
|
+
DateTreeFilterPopoverComponent.prototype.years;
|
|
750
|
+
/**
|
|
751
|
+
* @type {?}
|
|
752
|
+
* @private
|
|
753
|
+
*/
|
|
754
|
+
DateTreeFilterPopoverComponent.prototype.expandStateByField;
|
|
755
|
+
/**
|
|
756
|
+
* @type {?}
|
|
757
|
+
* @private
|
|
758
|
+
*/
|
|
759
|
+
DateTreeFilterPopoverComponent.prototype.workingSelectedByField;
|
|
760
|
+
}
|
|
761
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXRyZWUtZmlsdGVyL2RhdGUtdHJlZS1maWx0ZXItcG9wb3Zlci9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU81QixNQUFNLE9BQU8sOEJBQThCO0lBTDNDO1FBTVcsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV2QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVwQyxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVqQix1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsMkJBQXNCLEdBQVEsRUFBRSxDQUFDO0lBeVozQyxDQUFDOzs7OztJQXZaQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFDRSxPQUFPLENBQUMsS0FBSztZQUNiLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxlQUFlO1lBQ3ZCLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCO1lBQ0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEQsSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztT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QTBDOztJQUMxQywrQ0FBMkM7O0lBRTNDLGlEQUFvQjs7SUFDcEIsK0NBQXlCOzs7OztJQUV6Qiw0REFBcUM7Ozs7O0lBQ3JDLGdFQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJycy1kYXRlLXRyZWUtZmlsdGVyLXBvcG92ZXJcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2luZGV4LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2luZGV4LmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVRyZWVGaWx0ZXJQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IFwiXCI7XHJcbiAgQElucHV0KCkgdHJhbnNsYXRpb246IGFueTtcclxuICBASW5wdXQoKSBzb3VyY2VSb3dzOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRhdGVGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRCeUZpZWxkOiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBmaWVsZExhYmVsTWFwOiBhbnkgPSB7fTtcclxuXHJcbiAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMga2V5d29yZCA9IFwiXCI7XHJcbiAgcHVibGljIHllYXJzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGV4cGFuZFN0YXRlQnlGaWVsZDogYW55ID0ge307XHJcbiAgcHJpdmF0ZSB3b3JraW5nU2VsZWN0ZWRCeUZpZWxkOiBhbnkgPSB7fTtcclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICBjaGFuZ2VzLmZpZWxkIHx8XHJcbiAgICAgIGNoYW5nZXMuc291cmNlUm93cyB8fFxyXG4gICAgICBjaGFuZ2VzLnNlbGVjdGVkQnlGaWVsZCB8fFxyXG4gICAgICBjaGFuZ2VzLmRhdGVGaWVsZHNcclxuICAgICkge1xyXG4gICAgICB0aGlzLmtleXdvcmQgPSBcIlwiO1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGQgPSB0aGlzLmNsb25lU2VsZWN0aW9uTWFwKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCeUZpZWxkXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVidWlsZFRyZWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZVBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleXdvcmRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5rZXl3b3JkID0gdmFsdWUgfHwgXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaXNpYmxlWWVhcnMoKTogYW55W10ge1xyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9ICh0aGlzLmtleXdvcmQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXNlYXJjaFRleHQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMueWVhcnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy55ZWFyc1xyXG4gICAgICAubWFwKCh5ZWFyTm9kZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHllYXJNYXRjaGVkID1cclxuICAgICAgICAgIFN0cmluZyh5ZWFyTm9kZS55ZWFyKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMTtcclxuICAgICAgICBjb25zdCBtb250aHMgPSB5ZWFyTm9kZS5tb250aHNcclxuICAgICAgICAgIC5tYXAoKG1vbnRoTm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb250aE1hdGNoZWQgPVxyXG4gICAgICAgICAgICAgIFN0cmluZyhtb250aE5vZGUubGFiZWwpXHJcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgZGF5cyA9IG1vbnRoTm9kZS5kYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBTdHJpbmcoZGF5Tm9kZS5sYWJlbClcclxuICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoeWVhck1hdGNoZWQgfHwgbW9udGhNYXRjaGVkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgbW9udGhOb2RlLCB7IGRheXM6IGRheXMgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZpbHRlcigobW9udGhOb2RlKSA9PiBtb250aE5vZGUuZGF5cy5sZW5ndGggPiAwKTtcclxuICAgICAgICBpZiAoeWVhck1hdGNoZWQpIHtcclxuICAgICAgICAgIHJldHVybiB5ZWFyTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHllYXJOb2RlLCB7IG1vbnRoczogbW9udGhzIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKCh5ZWFyTm9kZSkgPT4geWVhck5vZGUubW9udGhzLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVllYXJFeHBhbmRlZCh5ZWFyTm9kZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0T3JDcmVhdGVFeHBhbmRTdGF0ZSh0aGlzLmZpZWxkKTtcclxuICAgIHN0YXRlLnllYXJzW3llYXJOb2RlLmtleV0gPSAhc3RhdGUueWVhcnNbeWVhck5vZGUua2V5XTtcclxuICAgIHllYXJOb2RlLmV4cGFuZGVkID0gISFzdGF0ZS55ZWFyc1t5ZWFyTm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZU1vbnRoRXhwYW5kZWQobW9udGhOb2RlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRPckNyZWF0ZUV4cGFuZFN0YXRlKHRoaXMuZmllbGQpO1xyXG4gICAgc3RhdGUubW9udGhzW21vbnRoTm9kZS5rZXldID0gIXN0YXRlLm1vbnRoc1ttb250aE5vZGUua2V5XTtcclxuICAgIG1vbnRoTm9kZS5leHBhbmRlZCA9ICEhc3RhdGUubW9udGhzW21vbnRoTm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlLZXlzID0gdGhpcy5nZXRFbmFibGVkRGF5S2V5c0luQ3VycmVudEZpZWxkKCk7XHJcbiAgICBpZiAoIWVuYWJsZWREYXlLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW5hYmxlZERheUtleXMuZXZlcnkoKGtleSkgPT4gISFzZWxlY3RlZE1hcFtrZXldKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0FsbEluZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5S2V5cyA9IHRoaXMuZ2V0RW5hYmxlZERheUtleXNJbkN1cnJlbnRGaWVsZCgpO1xyXG4gICAgaWYgKCFlbmFibGVkRGF5S2V5cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlLZXlzLmZpbHRlcigoa2V5KSA9PiAhIXNlbGVjdGVkTWFwW2tleV0pXHJcbiAgICAgIC5sZW5ndGg7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGVuYWJsZWREYXlLZXlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVBbGxEYXlzKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlLZXlzID0gdGhpcy5nZXRFbmFibGVkRGF5S2V5c0luQ3VycmVudEZpZWxkKCk7XHJcbiAgICBlbmFibGVkRGF5S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICBzZWxlY3RlZE1hcFtrZXldID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWxldGUgc2VsZWN0ZWRNYXBba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXlDaGVja2VkKGRheU5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgcmV0dXJuICEhc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZURheShkYXlOb2RlOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChkYXlOb2RlLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XSA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkZWxldGUgc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTW9udGhEaXNhYmxlZChtb250aE5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG1vbnRoTm9kZS5kYXlzLmV2ZXJ5KChkYXlOb2RlKSA9PiBkYXlOb2RlLmRpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vbnRoQ2hlY2tlZChtb250aE5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheXMgPSBtb250aE5vZGUuZGF5cy5maWx0ZXIoKGRheU5vZGUpID0+ICFkYXlOb2RlLmRpc2FibGVkKTtcclxuICAgIHJldHVybiBlbmFibGVkRGF5cy5ldmVyeSgoZGF5Tm9kZSkgPT4gISFzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTW9udGhJbmRldGVybWluYXRlKG1vbnRoTm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhOb2RlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5cyA9IG1vbnRoTm9kZS5kYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4gIWRheU5vZGUuZGlzYWJsZWQpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gISFzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV07XHJcbiAgICB9KS5sZW5ndGg7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGVuYWJsZWREYXlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVNb250aChtb250aE5vZGU6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgbW9udGhOb2RlLmRheXMuZm9yRWFjaCgoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICBpZiAoZGF5Tm9kZS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNZZWFyRGlzYWJsZWQoeWVhck5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHllYXJOb2RlLm1vbnRocy5ldmVyeSgobW9udGhOb2RlKSA9PlxyXG4gICAgICB0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aE5vZGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzWWVhckNoZWNrZWQoeWVhck5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhck5vZGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVuYWJsZWRNb250aHMgPSB5ZWFyTm9kZS5tb250aHMuZmlsdGVyKFxyXG4gICAgICAobW9udGhOb2RlKSA9PiAhdGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhOb2RlKVxyXG4gICAgKTtcclxuICAgIHJldHVybiBlbmFibGVkTW9udGhzLmV2ZXJ5KChtb250aE5vZGUpID0+IHRoaXMuaXNNb250aENoZWNrZWQobW9udGhOb2RlKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNZZWFySW5kZXRlcm1pbmF0ZSh5ZWFyTm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyTm9kZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheXMgPSBbXTtcclxuICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgbW9udGhOb2RlLmRheXMuZm9yRWFjaCgoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF5Tm9kZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgZW5hYmxlZERheXMucHVzaChkYXlOb2RlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlzLmZpbHRlcigoa2V5KSA9PiAhIXNlbGVjdGVkTWFwW2tleV0pLmxlbmd0aDtcclxuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID4gMCAmJiBzZWxlY3RlZENvdW50IDwgZW5hYmxlZERheXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVllYXIoeWVhck5vZGU6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhck5vZGUpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgdGhpcy50b2dnbGVNb250aChtb250aE5vZGUsIGNoZWNrZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZCkge1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGRbdGhpcy5maWVsZF0gPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHkuZW1pdCh0aGlzLmNsb25lU2VsZWN0aW9uTWFwKHRoaXMud29ya2luZ1NlbGVjdGVkQnlGaWVsZCkpO1xyXG4gICAgdGhpcy5yZWJ1aWxkVHJlZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFwcGx5U2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHBseS5lbWl0KHRoaXMuY2xvbmVTZWxlY3Rpb25NYXAodGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkKSk7XHJcbiAgICB0aGlzLmNsb3NlUG9wb3ZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWJ1aWxkVHJlZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZCkge1xyXG4gICAgICB0aGlzLnllYXJzID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNvdXJjZVJvd3MgPSB0aGlzLnNvdXJjZVJvd3MgfHwgW107XHJcbiAgICBjb25zdCByb3dzQnlPdGhlckZpbHRlcnMgPSB0aGlzLmZpbHRlclJvd3NCeVNlbGVjdGVkRGF0ZVRyZWUoXHJcbiAgICAgIHNvdXJjZVJvd3MsXHJcbiAgICAgIHRoaXMuZmllbGRcclxuICAgICk7XHJcbiAgICBjb25zdCBhdmFpbGFibGVEYXlLZXlNYXAgPSB7fTtcclxuICAgIHJvd3NCeU90aGVyRmlsdGVycy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgY29uc3QgZGF5S2V5ID0gdGhpcy5nZXREYXlLZXlCeVJvd1ZhbHVlKHJvd1t0aGlzLmZpZWxkXSk7XHJcbiAgICAgIGlmIChkYXlLZXkpIHtcclxuICAgICAgICBhdmFpbGFibGVEYXlLZXlNYXBbZGF5S2V5XSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwZWRNYXAgPSB7fTtcclxuICAgIHNvdXJjZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZVZhbHVlKHJvd1t0aGlzLmZpZWxkXSk7XHJcbiAgICAgIGlmICghZGF0ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICBpZiAoIWdyb3VwZWRNYXBbeWVhcl0pIHtcclxuICAgICAgICBncm91cGVkTWFwW3llYXJdID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncm91cGVkTWFwW3llYXJdW21vbnRoXSkge1xyXG4gICAgICAgIGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncm91cGVkTWFwW3llYXJdW21vbnRoXVtkYXldKSB7XHJcbiAgICAgICAgZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSArPSAxO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZXhwYW5kU3RhdGUgPSB0aGlzLmdldE9yQ3JlYXRlRXhwYW5kU3RhdGUodGhpcy5maWVsZCk7XHJcbiAgICB0aGlzLnllYXJzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcClcclxuICAgICAgLm1hcCgoa2V5KSA9PiBOdW1iZXIoa2V5KSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKVxyXG4gICAgICAubWFwKCh5ZWFyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9udGhzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcFt5ZWFyXSlcclxuICAgICAgICAgIC5tYXAoKGtleSkgPT4gTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXHJcbiAgICAgICAgICAubWFwKChtb250aCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb250aEtleSA9IHllYXIgKyBcIi1cIiArIHRoaXMucGFkMihtb250aCk7XHJcbiAgICAgICAgICAgIGlmIChleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBkYXlzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcFt5ZWFyXVttb250aF0pXHJcbiAgICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXHJcbiAgICAgICAgICAgICAgLm1hcCgoZGF5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXlLZXkgPSB0aGlzLnRvRGF5S2V5KHllYXIsIG1vbnRoLCBkYXkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIGtleTogZGF5S2V5LFxyXG4gICAgICAgICAgICAgICAgICBkYXk6IGRheSxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IG1vbWVudChkYXlEYXRlKS5mb3JtYXQoXCJEIE1NTSBZWVlZXCIpLFxyXG4gICAgICAgICAgICAgICAgICBjb3VudDogZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFhdmFpbGFibGVEYXlLZXlNYXBbZGF5S2V5XSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAga2V5OiBtb250aEtleSxcclxuICAgICAgICAgICAgICBtb250aDogbW9udGgsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IG1vbWVudCgpXHJcbiAgICAgICAgICAgICAgICAubW9udGgobW9udGggLSAxKVxyXG4gICAgICAgICAgICAgICAgLmZvcm1hdChcIk1NTVwiKSxcclxuICAgICAgICAgICAgICBleHBhbmRlZDogISFleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldLFxyXG4gICAgICAgICAgICAgIGRheXM6IGRheXMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCB5ZWFyS2V5ID0gU3RyaW5nKHllYXIpO1xyXG4gICAgICAgIGlmIChleHBhbmRTdGF0ZS55ZWFyc1t5ZWFyS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBleHBhbmRTdGF0ZS55ZWFyc1t5ZWFyS2V5XSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBrZXk6IHllYXJLZXksXHJcbiAgICAgICAgICB5ZWFyOiB5ZWFyLFxyXG4gICAgICAgICAgZXhwYW5kZWQ6ICEhZXhwYW5kU3RhdGUueWVhcnNbeWVhcktleV0sXHJcbiAgICAgICAgICBtb250aHM6IG1vbnRocyxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyUm93c0J5U2VsZWN0ZWREYXRlVHJlZShyb3dzOiBhbnlbXSwgZXhjbHVkZUZpZWxkPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgZmlsdGVyZWRSb3dzID0gcm93cyA/IHJvd3Muc2xpY2UoKSA6IFtdO1xyXG4gICAgKHRoaXMuZGF0ZUZpZWxkcyB8fCBbXSkuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGV4Y2x1ZGVGaWVsZCAmJiBmaWVsZCA9PT0gZXhjbHVkZUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcChmaWVsZCk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkTWFwKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cy5maWx0ZXIoKHJvdykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRheUtleSA9IHRoaXMuZ2V0RGF5S2V5QnlSb3dWYWx1ZShyb3dbZmllbGRdKTtcclxuICAgICAgICByZXR1cm4gZGF5S2V5ID8gISFzZWxlY3RlZE1hcFtkYXlLZXldIDogZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZURhdGVWYWx1ZSh2YWx1ZTogYW55KTogRGF0ZSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJzZWQgPSBtb21lbnQoXHJcbiAgICAgIHZhbHVlLFxyXG4gICAgICBbXHJcbiAgICAgICAgXCJZWVlZLU1NLUREXCIsXHJcbiAgICAgICAgXCJNTS9ERC9ZWVlZXCIsXHJcbiAgICAgICAgXCJERC9NTS9ZWVlZXCIsXHJcbiAgICAgICAgXCJZWVlZL01NL0REXCIsXHJcbiAgICAgICAgXCJERC1NTU0tWVlZWVwiLFxyXG4gICAgICAgIFwiTU1NIERELCBZWVlZXCIsXHJcbiAgICAgICAgbW9tZW50LklTT184NjAxLFxyXG4gICAgICBdLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gICAgaWYgKHBhcnNlZC5pc1ZhbGlkKCkpIHtcclxuICAgICAgcmV0dXJuIHBhcnNlZC50b0RhdGUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZhbGxiYWNrID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgcmV0dXJuIGlzTmFOKGZhbGxiYWNrLmdldFRpbWUoKSkgPyBudWxsIDogZmFsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9yQ3JlYXRlRXhwYW5kU3RhdGUoZmllbGQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmV4cGFuZFN0YXRlQnlGaWVsZFtmaWVsZF0pIHtcclxuICAgICAgdGhpcy5leHBhbmRTdGF0ZUJ5RmllbGRbZmllbGRdID0geyB5ZWFyczoge30sIG1vbnRoczoge30gfTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmV4cGFuZFN0YXRlQnlGaWVsZFtmaWVsZF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXSkge1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGRbZmllbGRdID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9EYXlLZXkoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHllYXIgKyBcIi1cIiArIHRoaXMucGFkMihtb250aCkgKyBcIi1cIiArIHRoaXMucGFkMihkYXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWQyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB2YWx1ZSA8IDEwID8gXCIwXCIgKyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERheUtleUJ5Um93VmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucGFyc2VEYXRlVmFsdWUodmFsdWUpO1xyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudG9EYXlLZXkoXHJcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSxcclxuICAgICAgZGF0ZS5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVuYWJsZWREYXlLZXlzSW5DdXJyZW50RmllbGQoKSB7XHJcbiAgICBjb25zdCBrZXlzID0gW107XHJcbiAgICB0aGlzLnllYXJzLmZvckVhY2goKHllYXJOb2RlKSA9PiB7XHJcbiAgICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgICBtb250aE5vZGUuZGF5cy5mb3JFYWNoKChkYXlOb2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRheU5vZGUuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAga2V5cy5wdXNoKGRheU5vZGUua2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9uZVNlbGVjdGlvbk1hcChzb3VyY2U6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHNvdXJjZSA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlKSkgOiB7fTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|