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,787 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* Generated from: lib/date-tree-filter/date-tree-filter.helper.ts
|
|
4
|
+
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
+
*/
|
|
6
|
+
import moment from "moment";
|
|
7
|
+
/**
|
|
8
|
+
* @record
|
|
9
|
+
*/
|
|
10
|
+
export function DateTreeFilterSetupOptions() { }
|
|
11
|
+
if (false) {
|
|
12
|
+
/** @type {?} */
|
|
13
|
+
DateTreeFilterSetupOptions.prototype.rows;
|
|
14
|
+
/** @type {?} */
|
|
15
|
+
DateTreeFilterSetupOptions.prototype.fields;
|
|
16
|
+
/** @type {?} */
|
|
17
|
+
DateTreeFilterSetupOptions.prototype.hints;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @record
|
|
21
|
+
*/
|
|
22
|
+
export function DateTreeFilterHelperOptions() { }
|
|
23
|
+
if (false) {
|
|
24
|
+
/** @type {?} */
|
|
25
|
+
DateTreeFilterHelperOptions.prototype.getTranslation;
|
|
26
|
+
/** @type {?} */
|
|
27
|
+
DateTreeFilterHelperOptions.prototype.getPopoverElement;
|
|
28
|
+
/** @type {?} */
|
|
29
|
+
DateTreeFilterHelperOptions.prototype.getGridElement;
|
|
30
|
+
/** @type {?} */
|
|
31
|
+
DateTreeFilterHelperOptions.prototype.applyRows;
|
|
32
|
+
/** @type {?|undefined} */
|
|
33
|
+
DateTreeFilterHelperOptions.prototype.parseDateValue;
|
|
34
|
+
/** @type {?|undefined} */
|
|
35
|
+
DateTreeFilterHelperOptions.prototype.dateFormats;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @record
|
|
39
|
+
*/
|
|
40
|
+
export function RsCommonGridDateTreeFactoryHost() { }
|
|
41
|
+
if (false) {
|
|
42
|
+
/** @type {?} */
|
|
43
|
+
RsCommonGridDateTreeFactoryHost.prototype.translation;
|
|
44
|
+
/** @type {?} */
|
|
45
|
+
RsCommonGridDateTreeFactoryHost.prototype.dateTreePopoverRef;
|
|
46
|
+
/** @type {?} */
|
|
47
|
+
RsCommonGridDateTreeFactoryHost.prototype.grid;
|
|
48
|
+
}
|
|
49
|
+
/** @type {?} */
|
|
50
|
+
export var DATE_TREE_DEFAULT_DATE_FORMATS = [
|
|
51
|
+
"YYYY-MM-DD",
|
|
52
|
+
"MM/DD/YYYY",
|
|
53
|
+
"DD/MM/YYYY",
|
|
54
|
+
"YYYY/MM/DD",
|
|
55
|
+
"DD-MMM-YYYY",
|
|
56
|
+
"MMM DD, YYYY",
|
|
57
|
+
];
|
|
58
|
+
var DateTreeFilterHelper = /** @class */ (function () {
|
|
59
|
+
function DateTreeFilterHelper(options) {
|
|
60
|
+
this.popoverVisible = false;
|
|
61
|
+
this.popoverField = "";
|
|
62
|
+
this.popoverStyle = {};
|
|
63
|
+
this.selectedByField = {};
|
|
64
|
+
this.fieldLabelMap = {};
|
|
65
|
+
this.dateFields = [];
|
|
66
|
+
this.sourceRows = [];
|
|
67
|
+
this.defaultDateFormats = [
|
|
68
|
+
"YYYY-MM-DD",
|
|
69
|
+
"MM/DD/YYYY",
|
|
70
|
+
"DD/MM/YYYY",
|
|
71
|
+
"YYYY/MM/DD",
|
|
72
|
+
"DD-MMM-YYYY",
|
|
73
|
+
"DD-MMM-YYYY hh:mm A",
|
|
74
|
+
"MMM DD, YYYY",
|
|
75
|
+
moment.ISO_8601,
|
|
76
|
+
];
|
|
77
|
+
this.options = options;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param {?} config
|
|
81
|
+
* @return {?}
|
|
82
|
+
*/
|
|
83
|
+
DateTreeFilterHelper.prototype.setup = /**
|
|
84
|
+
* @param {?} config
|
|
85
|
+
* @return {?}
|
|
86
|
+
*/
|
|
87
|
+
function (config) {
|
|
88
|
+
var _this = this;
|
|
89
|
+
/** @type {?} */
|
|
90
|
+
var rows = config && config.rows ? config.rows : [];
|
|
91
|
+
/** @type {?} */
|
|
92
|
+
var fields = config && config.fields ? config.fields : [];
|
|
93
|
+
/** @type {?} */
|
|
94
|
+
var hints = config && config.hints ? config.hints : [];
|
|
95
|
+
this.sourceRows = rows;
|
|
96
|
+
this.dateFields = this.resolveDateTreeFieldsByHints(fields, hints);
|
|
97
|
+
this.fieldLabelMap = {};
|
|
98
|
+
(fields || []).forEach((/**
|
|
99
|
+
* @param {?} item
|
|
100
|
+
* @return {?}
|
|
101
|
+
*/
|
|
102
|
+
function (item) {
|
|
103
|
+
if (!item || !item.columnName) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
_this.fieldLabelMap[item.columnName] =
|
|
107
|
+
item.columnDisplayName || item.columnName;
|
|
108
|
+
}));
|
|
109
|
+
this.apply();
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* @param {?} args
|
|
113
|
+
* @return {?}
|
|
114
|
+
*/
|
|
115
|
+
DateTreeFilterHelper.prototype.handleGridActionBegin = /**
|
|
116
|
+
* @param {?} args
|
|
117
|
+
* @return {?}
|
|
118
|
+
*/
|
|
119
|
+
function (args) {
|
|
120
|
+
/** @type {?} */
|
|
121
|
+
var requestType = this.getRequestType(args);
|
|
122
|
+
if (requestType === "filterchoicerequest" ||
|
|
123
|
+
requestType === "filtersearchbegin") {
|
|
124
|
+
args.filterChoiceCount = 15000;
|
|
125
|
+
}
|
|
126
|
+
if (requestType !== "filterbeforeopen") {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
/** @type {?} */
|
|
130
|
+
var columnName = this.resolveActionColumnName(args);
|
|
131
|
+
if (!this.isDateTreeField(columnName)) {
|
|
132
|
+
this.close();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
args.cancel = true;
|
|
136
|
+
this.open(columnName);
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* @param {?} selectionMap
|
|
140
|
+
* @return {?}
|
|
141
|
+
*/
|
|
142
|
+
DateTreeFilterHelper.prototype.updateSelection = /**
|
|
143
|
+
* @param {?} selectionMap
|
|
144
|
+
* @return {?}
|
|
145
|
+
*/
|
|
146
|
+
function (selectionMap) {
|
|
147
|
+
this.selectedByField = selectionMap || {};
|
|
148
|
+
this.apply();
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* @return {?}
|
|
152
|
+
*/
|
|
153
|
+
DateTreeFilterHelper.prototype.close = /**
|
|
154
|
+
* @return {?}
|
|
155
|
+
*/
|
|
156
|
+
function () {
|
|
157
|
+
if (!this.popoverVisible) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.popoverVisible = false;
|
|
161
|
+
this.popoverField = "";
|
|
162
|
+
this.popoverStyle = {};
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* @param {?} event
|
|
166
|
+
* @return {?}
|
|
167
|
+
*/
|
|
168
|
+
DateTreeFilterHelper.prototype.handleDocumentMouseDown = /**
|
|
169
|
+
* @param {?} event
|
|
170
|
+
* @return {?}
|
|
171
|
+
*/
|
|
172
|
+
function (event) {
|
|
173
|
+
if (!this.popoverVisible) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
/** @type {?} */
|
|
177
|
+
var target = (/** @type {?} */ (event.target));
|
|
178
|
+
if (!target) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (this.isInsidePopover(target) || this.isDateFilterMenuItem(target)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.close();
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* @param {?} event
|
|
188
|
+
* @return {?}
|
|
189
|
+
*/
|
|
190
|
+
DateTreeFilterHelper.prototype.handleDocumentMouseOver = /**
|
|
191
|
+
* @param {?} event
|
|
192
|
+
* @return {?}
|
|
193
|
+
*/
|
|
194
|
+
function (event) {
|
|
195
|
+
if (!this.popoverVisible) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
/** @type {?} */
|
|
199
|
+
var target = (/** @type {?} */ (event.target));
|
|
200
|
+
if (!target) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (this.isInsidePopover(target)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
/** @type {?} */
|
|
207
|
+
var menuItem = (/** @type {?} */ (target.closest(".e-menu-item")));
|
|
208
|
+
if (menuItem) {
|
|
209
|
+
if (!this.isDateFilterMenuItem(menuItem)) {
|
|
210
|
+
this.close();
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
/** @type {?} */
|
|
215
|
+
var otherFilterTarget = (/** @type {?} */ (target.closest(".e-filtermenudiv, .e-headercell .e-columnmenu, .e-columnmenu, .e-contextmenu")));
|
|
216
|
+
if (otherFilterTarget && !this.isDateFilterMenuItem(otherFilterTarget)) {
|
|
217
|
+
this.close();
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* @return {?}
|
|
222
|
+
*/
|
|
223
|
+
DateTreeFilterHelper.prototype.updatePosition = /**
|
|
224
|
+
* @return {?}
|
|
225
|
+
*/
|
|
226
|
+
function () {
|
|
227
|
+
if (!this.popoverVisible) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
/** @type {?} */
|
|
231
|
+
var anchor = this.findDateFilterAnchorElement();
|
|
232
|
+
if (anchor) {
|
|
233
|
+
/** @type {?} */
|
|
234
|
+
var rect = anchor.getBoundingClientRect();
|
|
235
|
+
/** @type {?} */
|
|
236
|
+
var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
|
|
237
|
+
/** @type {?} */
|
|
238
|
+
var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
239
|
+
/** @type {?} */
|
|
240
|
+
var popoverElement = this.options.getPopoverElement
|
|
241
|
+
? this.options.getPopoverElement()
|
|
242
|
+
: null;
|
|
243
|
+
/** @type {?} */
|
|
244
|
+
var popoverWidth = popoverElement && popoverElement.offsetWidth
|
|
245
|
+
? popoverElement.offsetWidth
|
|
246
|
+
: 300;
|
|
247
|
+
/** @type {?} */
|
|
248
|
+
var popoverHeight = popoverElement && popoverElement.offsetHeight
|
|
249
|
+
? popoverElement.offsetHeight
|
|
250
|
+
: 420;
|
|
251
|
+
/** @type {?} */
|
|
252
|
+
var edgeGap = 8;
|
|
253
|
+
/** @type {?} */
|
|
254
|
+
var anchorGap = 8;
|
|
255
|
+
/** @type {?} */
|
|
256
|
+
var top = rect.top - 6;
|
|
257
|
+
/** @type {?} */
|
|
258
|
+
var left = rect.right + anchorGap;
|
|
259
|
+
if (left + popoverWidth > viewportWidth - edgeGap) {
|
|
260
|
+
left = rect.left - popoverWidth - anchorGap;
|
|
261
|
+
}
|
|
262
|
+
if (left < edgeGap) {
|
|
263
|
+
left = edgeGap;
|
|
264
|
+
}
|
|
265
|
+
if (left + popoverWidth > viewportWidth - edgeGap) {
|
|
266
|
+
left = Math.max(edgeGap, viewportWidth - popoverWidth - edgeGap);
|
|
267
|
+
}
|
|
268
|
+
if (top + popoverHeight > viewportHeight - edgeGap) {
|
|
269
|
+
top = Math.max(edgeGap, viewportHeight - popoverHeight - edgeGap);
|
|
270
|
+
}
|
|
271
|
+
this.popoverStyle = {
|
|
272
|
+
position: "fixed",
|
|
273
|
+
left: left + "px",
|
|
274
|
+
top: top + "px",
|
|
275
|
+
};
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
/** @type {?} */
|
|
279
|
+
var gridElement = this.options.getGridElement
|
|
280
|
+
? this.options.getGridElement()
|
|
281
|
+
: null;
|
|
282
|
+
if (gridElement && gridElement.getBoundingClientRect) {
|
|
283
|
+
/** @type {?} */
|
|
284
|
+
var fallbackRect = gridElement.getBoundingClientRect();
|
|
285
|
+
this.popoverStyle = {
|
|
286
|
+
position: "fixed",
|
|
287
|
+
left: Math.max(8, fallbackRect.right - 312) + "px",
|
|
288
|
+
top: Math.max(8, fallbackRect.top + 8) + "px",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* @private
|
|
294
|
+
* @param {?} field
|
|
295
|
+
* @return {?}
|
|
296
|
+
*/
|
|
297
|
+
DateTreeFilterHelper.prototype.open = /**
|
|
298
|
+
* @private
|
|
299
|
+
* @param {?} field
|
|
300
|
+
* @return {?}
|
|
301
|
+
*/
|
|
302
|
+
function (field) {
|
|
303
|
+
var _this = this;
|
|
304
|
+
this.popoverField = field;
|
|
305
|
+
this.popoverVisible = true;
|
|
306
|
+
this.updatePosition();
|
|
307
|
+
setTimeout((/**
|
|
308
|
+
* @return {?}
|
|
309
|
+
*/
|
|
310
|
+
function () { return _this.updatePosition(); }), 50);
|
|
311
|
+
setTimeout((/**
|
|
312
|
+
* @return {?}
|
|
313
|
+
*/
|
|
314
|
+
function () { return _this.updatePosition(); }), 150);
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* @private
|
|
318
|
+
* @return {?}
|
|
319
|
+
*/
|
|
320
|
+
DateTreeFilterHelper.prototype.apply = /**
|
|
321
|
+
* @private
|
|
322
|
+
* @return {?}
|
|
323
|
+
*/
|
|
324
|
+
function () {
|
|
325
|
+
/** @type {?} */
|
|
326
|
+
var filteredRows = this.filterRowsBySelectedDateTree(this.sourceRows || []);
|
|
327
|
+
this.options.applyRows(filteredRows);
|
|
328
|
+
};
|
|
329
|
+
/**
|
|
330
|
+
* @private
|
|
331
|
+
* @param {?} args
|
|
332
|
+
* @return {?}
|
|
333
|
+
*/
|
|
334
|
+
DateTreeFilterHelper.prototype.getRequestType = /**
|
|
335
|
+
* @private
|
|
336
|
+
* @param {?} args
|
|
337
|
+
* @return {?}
|
|
338
|
+
*/
|
|
339
|
+
function (args) {
|
|
340
|
+
if (!args || !args.requestType) {
|
|
341
|
+
return "";
|
|
342
|
+
}
|
|
343
|
+
return String(args.requestType).trim().toLowerCase();
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* @private
|
|
347
|
+
* @param {?} args
|
|
348
|
+
* @return {?}
|
|
349
|
+
*/
|
|
350
|
+
DateTreeFilterHelper.prototype.resolveActionColumnName = /**
|
|
351
|
+
* @private
|
|
352
|
+
* @param {?} args
|
|
353
|
+
* @return {?}
|
|
354
|
+
*/
|
|
355
|
+
function (args) {
|
|
356
|
+
if (!args) {
|
|
357
|
+
return "";
|
|
358
|
+
}
|
|
359
|
+
return (args.columnName ||
|
|
360
|
+
args.field ||
|
|
361
|
+
args.currentFilteringColumn ||
|
|
362
|
+
(args.column && (args.column.field || args.column.columnName)) ||
|
|
363
|
+
"");
|
|
364
|
+
};
|
|
365
|
+
/**
|
|
366
|
+
* @private
|
|
367
|
+
* @param {?} fields
|
|
368
|
+
* @param {?} hints
|
|
369
|
+
* @return {?}
|
|
370
|
+
*/
|
|
371
|
+
DateTreeFilterHelper.prototype.resolveDateTreeFieldsByHints = /**
|
|
372
|
+
* @private
|
|
373
|
+
* @param {?} fields
|
|
374
|
+
* @param {?} hints
|
|
375
|
+
* @return {?}
|
|
376
|
+
*/
|
|
377
|
+
function (fields, hints) {
|
|
378
|
+
/** @type {?} */
|
|
379
|
+
var normalizedHints = (hints || [])
|
|
380
|
+
.filter((/**
|
|
381
|
+
* @param {?} item
|
|
382
|
+
* @return {?}
|
|
383
|
+
*/
|
|
384
|
+
function (item) { return !!item; }))
|
|
385
|
+
.map((/**
|
|
386
|
+
* @param {?} item
|
|
387
|
+
* @return {?}
|
|
388
|
+
*/
|
|
389
|
+
function (item) { return String(item).trim().toLowerCase(); }));
|
|
390
|
+
if (!fields || !fields.length || !normalizedHints.length) {
|
|
391
|
+
return [];
|
|
392
|
+
}
|
|
393
|
+
return fields
|
|
394
|
+
.filter((/**
|
|
395
|
+
* @param {?} item
|
|
396
|
+
* @return {?}
|
|
397
|
+
*/
|
|
398
|
+
function (item) {
|
|
399
|
+
if (!item || !item.columnName) {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
/** @type {?} */
|
|
403
|
+
var columnName = String(item.columnName || "").toLowerCase();
|
|
404
|
+
/** @type {?} */
|
|
405
|
+
var displayName = String(item.columnDisplayName || "").toLowerCase();
|
|
406
|
+
return normalizedHints.some((/**
|
|
407
|
+
* @param {?} hint
|
|
408
|
+
* @return {?}
|
|
409
|
+
*/
|
|
410
|
+
function (hint) {
|
|
411
|
+
return (columnName === hint ||
|
|
412
|
+
displayName === hint ||
|
|
413
|
+
(hint.length >= 3 &&
|
|
414
|
+
(columnName.indexOf(hint) > -1 ||
|
|
415
|
+
displayName.indexOf(hint) > -1)));
|
|
416
|
+
}));
|
|
417
|
+
}))
|
|
418
|
+
.map((/**
|
|
419
|
+
* @param {?} item
|
|
420
|
+
* @return {?}
|
|
421
|
+
*/
|
|
422
|
+
function (item) { return item.columnName; }));
|
|
423
|
+
};
|
|
424
|
+
/**
|
|
425
|
+
* @private
|
|
426
|
+
* @param {?} field
|
|
427
|
+
* @return {?}
|
|
428
|
+
*/
|
|
429
|
+
DateTreeFilterHelper.prototype.isDateTreeField = /**
|
|
430
|
+
* @private
|
|
431
|
+
* @param {?} field
|
|
432
|
+
* @return {?}
|
|
433
|
+
*/
|
|
434
|
+
function (field) {
|
|
435
|
+
return this.dateFields.indexOf(field) > -1;
|
|
436
|
+
};
|
|
437
|
+
/**
|
|
438
|
+
* @private
|
|
439
|
+
* @param {?} field
|
|
440
|
+
* @return {?}
|
|
441
|
+
*/
|
|
442
|
+
DateTreeFilterHelper.prototype.getFieldDaySelectionMap = /**
|
|
443
|
+
* @private
|
|
444
|
+
* @param {?} field
|
|
445
|
+
* @return {?}
|
|
446
|
+
*/
|
|
447
|
+
function (field) {
|
|
448
|
+
if (!this.selectedByField[field]) {
|
|
449
|
+
this.selectedByField[field] = {};
|
|
450
|
+
}
|
|
451
|
+
return this.selectedByField[field];
|
|
452
|
+
};
|
|
453
|
+
/**
|
|
454
|
+
* @private
|
|
455
|
+
* @param {?} rows
|
|
456
|
+
* @param {?=} excludeField
|
|
457
|
+
* @return {?}
|
|
458
|
+
*/
|
|
459
|
+
DateTreeFilterHelper.prototype.filterRowsBySelectedDateTree = /**
|
|
460
|
+
* @private
|
|
461
|
+
* @param {?} rows
|
|
462
|
+
* @param {?=} excludeField
|
|
463
|
+
* @return {?}
|
|
464
|
+
*/
|
|
465
|
+
function (rows, excludeField) {
|
|
466
|
+
var _this = this;
|
|
467
|
+
/** @type {?} */
|
|
468
|
+
var filteredRows = rows ? rows.slice() : [];
|
|
469
|
+
this.dateFields.forEach((/**
|
|
470
|
+
* @param {?} field
|
|
471
|
+
* @return {?}
|
|
472
|
+
*/
|
|
473
|
+
function (field) {
|
|
474
|
+
if (excludeField && field === excludeField) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
/** @type {?} */
|
|
478
|
+
var selectedMap = _this.getFieldDaySelectionMap(field);
|
|
479
|
+
/** @type {?} */
|
|
480
|
+
var selectedKeys = Object.keys(selectedMap);
|
|
481
|
+
if (!selectedKeys.length) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
filteredRows = filteredRows.filter((/**
|
|
485
|
+
* @param {?} row
|
|
486
|
+
* @return {?}
|
|
487
|
+
*/
|
|
488
|
+
function (row) {
|
|
489
|
+
/** @type {?} */
|
|
490
|
+
var dayKey = _this.getDayKeyByRowValue(row[field]);
|
|
491
|
+
return dayKey ? !!selectedMap[dayKey] : false;
|
|
492
|
+
}));
|
|
493
|
+
}));
|
|
494
|
+
return filteredRows;
|
|
495
|
+
};
|
|
496
|
+
/**
|
|
497
|
+
* @private
|
|
498
|
+
* @param {?} value
|
|
499
|
+
* @return {?}
|
|
500
|
+
*/
|
|
501
|
+
DateTreeFilterHelper.prototype.getDayKeyByRowValue = /**
|
|
502
|
+
* @private
|
|
503
|
+
* @param {?} value
|
|
504
|
+
* @return {?}
|
|
505
|
+
*/
|
|
506
|
+
function (value) {
|
|
507
|
+
/** @type {?} */
|
|
508
|
+
var date = this.parseDateValue(value);
|
|
509
|
+
if (!date) {
|
|
510
|
+
return "";
|
|
511
|
+
}
|
|
512
|
+
return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
|
|
513
|
+
};
|
|
514
|
+
/**
|
|
515
|
+
* @private
|
|
516
|
+
* @param {?} value
|
|
517
|
+
* @return {?}
|
|
518
|
+
*/
|
|
519
|
+
DateTreeFilterHelper.prototype.parseDateValue = /**
|
|
520
|
+
* @private
|
|
521
|
+
* @param {?} value
|
|
522
|
+
* @return {?}
|
|
523
|
+
*/
|
|
524
|
+
function (value) {
|
|
525
|
+
if (this.options.parseDateValue) {
|
|
526
|
+
return this.options.parseDateValue(value);
|
|
527
|
+
}
|
|
528
|
+
if (!value) {
|
|
529
|
+
return null;
|
|
530
|
+
}
|
|
531
|
+
if (value instanceof Date) {
|
|
532
|
+
return value;
|
|
533
|
+
}
|
|
534
|
+
/** @type {?} */
|
|
535
|
+
var formats = this.options && this.options.dateFormats && this.options.dateFormats.length
|
|
536
|
+
? this.options.dateFormats
|
|
537
|
+
: this.defaultDateFormats;
|
|
538
|
+
/** @type {?} */
|
|
539
|
+
var parsed = moment(value, formats, true);
|
|
540
|
+
if (parsed.isValid()) {
|
|
541
|
+
return parsed.toDate();
|
|
542
|
+
}
|
|
543
|
+
/** @type {?} */
|
|
544
|
+
var fallback = new Date(value);
|
|
545
|
+
return isNaN(fallback.getTime()) ? null : fallback;
|
|
546
|
+
};
|
|
547
|
+
/**
|
|
548
|
+
* @private
|
|
549
|
+
* @param {?} year
|
|
550
|
+
* @param {?} month
|
|
551
|
+
* @param {?} day
|
|
552
|
+
* @return {?}
|
|
553
|
+
*/
|
|
554
|
+
DateTreeFilterHelper.prototype.toDayKey = /**
|
|
555
|
+
* @private
|
|
556
|
+
* @param {?} year
|
|
557
|
+
* @param {?} month
|
|
558
|
+
* @param {?} day
|
|
559
|
+
* @return {?}
|
|
560
|
+
*/
|
|
561
|
+
function (year, month, day) {
|
|
562
|
+
return year + "-" + this.pad2(month) + "-" + this.pad2(day);
|
|
563
|
+
};
|
|
564
|
+
/**
|
|
565
|
+
* @private
|
|
566
|
+
* @param {?} value
|
|
567
|
+
* @return {?}
|
|
568
|
+
*/
|
|
569
|
+
DateTreeFilterHelper.prototype.pad2 = /**
|
|
570
|
+
* @private
|
|
571
|
+
* @param {?} value
|
|
572
|
+
* @return {?}
|
|
573
|
+
*/
|
|
574
|
+
function (value) {
|
|
575
|
+
return value < 10 ? "0" + value : String(value);
|
|
576
|
+
};
|
|
577
|
+
/**
|
|
578
|
+
* @private
|
|
579
|
+
* @param {?} target
|
|
580
|
+
* @return {?}
|
|
581
|
+
*/
|
|
582
|
+
DateTreeFilterHelper.prototype.isInsidePopover = /**
|
|
583
|
+
* @private
|
|
584
|
+
* @param {?} target
|
|
585
|
+
* @return {?}
|
|
586
|
+
*/
|
|
587
|
+
function (target) {
|
|
588
|
+
/** @type {?} */
|
|
589
|
+
var popoverElement = this.options.getPopoverElement
|
|
590
|
+
? this.options.getPopoverElement()
|
|
591
|
+
: null;
|
|
592
|
+
if (!target || !popoverElement) {
|
|
593
|
+
return false;
|
|
594
|
+
}
|
|
595
|
+
return popoverElement.contains(target);
|
|
596
|
+
};
|
|
597
|
+
/**
|
|
598
|
+
* @private
|
|
599
|
+
* @param {?} element
|
|
600
|
+
* @return {?}
|
|
601
|
+
*/
|
|
602
|
+
DateTreeFilterHelper.prototype.isDateFilterMenuItem = /**
|
|
603
|
+
* @private
|
|
604
|
+
* @param {?} element
|
|
605
|
+
* @return {?}
|
|
606
|
+
*/
|
|
607
|
+
function (element) {
|
|
608
|
+
if (!element) {
|
|
609
|
+
return false;
|
|
610
|
+
}
|
|
611
|
+
/** @type {?} */
|
|
612
|
+
var menuItem = (/** @type {?} */ (element.closest(".e-menu-item")));
|
|
613
|
+
if (!menuItem) {
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
/** @type {?} */
|
|
617
|
+
var text = (menuItem.textContent || "").trim().toLowerCase();
|
|
618
|
+
/** @type {?} */
|
|
619
|
+
var translation = this.options.getTranslation
|
|
620
|
+
? this.options.getTranslation()
|
|
621
|
+
: null;
|
|
622
|
+
/** @type {?} */
|
|
623
|
+
var filterText = String((translation && translation.FILTER) || "filter")
|
|
624
|
+
.trim()
|
|
625
|
+
.toLowerCase();
|
|
626
|
+
if (!text) {
|
|
627
|
+
return false;
|
|
628
|
+
}
|
|
629
|
+
if (text.indexOf(filterText) > -1 || text.indexOf("filter") > -1) {
|
|
630
|
+
return true;
|
|
631
|
+
}
|
|
632
|
+
/** @type {?} */
|
|
633
|
+
var cls = (menuItem.className || "").toLowerCase();
|
|
634
|
+
return cls.indexOf("filter") > -1;
|
|
635
|
+
};
|
|
636
|
+
/**
|
|
637
|
+
* @private
|
|
638
|
+
* @return {?}
|
|
639
|
+
*/
|
|
640
|
+
DateTreeFilterHelper.prototype.findDateFilterAnchorElement = /**
|
|
641
|
+
* @private
|
|
642
|
+
* @return {?}
|
|
643
|
+
*/
|
|
644
|
+
function () {
|
|
645
|
+
var _this = this;
|
|
646
|
+
/** @type {?} */
|
|
647
|
+
var menuContainers = (/** @type {?} */ (Array.from(document.querySelectorAll(".e-columnmenu, .e-contextmenu"))));
|
|
648
|
+
/** @type {?} */
|
|
649
|
+
var visibleContainers = menuContainers.filter((/**
|
|
650
|
+
* @param {?} container
|
|
651
|
+
* @return {?}
|
|
652
|
+
*/
|
|
653
|
+
function (container) {
|
|
654
|
+
if (!container || !container.getBoundingClientRect) {
|
|
655
|
+
return false;
|
|
656
|
+
}
|
|
657
|
+
/** @type {?} */
|
|
658
|
+
var rect = container.getBoundingClientRect();
|
|
659
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
660
|
+
return false;
|
|
661
|
+
}
|
|
662
|
+
/** @type {?} */
|
|
663
|
+
var style = window.getComputedStyle(container);
|
|
664
|
+
if (!style || style.display === "none" || style.visibility === "hidden") {
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
return true;
|
|
668
|
+
}));
|
|
669
|
+
if (!visibleContainers.length) {
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
/** @type {?} */
|
|
673
|
+
var currentContainer = visibleContainers[visibleContainers.length - 1];
|
|
674
|
+
/** @type {?} */
|
|
675
|
+
var menuItems = (/** @type {?} */ (Array.from(currentContainer.querySelectorAll(".e-menu-item"))));
|
|
676
|
+
/** @type {?} */
|
|
677
|
+
var visibleFilterItems = menuItems.filter((/**
|
|
678
|
+
* @param {?} item
|
|
679
|
+
* @return {?}
|
|
680
|
+
*/
|
|
681
|
+
function (item) {
|
|
682
|
+
if (!_this.isDateFilterMenuItem(item)) {
|
|
683
|
+
return false;
|
|
684
|
+
}
|
|
685
|
+
if (!item.getBoundingClientRect) {
|
|
686
|
+
return false;
|
|
687
|
+
}
|
|
688
|
+
/** @type {?} */
|
|
689
|
+
var rect = item.getBoundingClientRect();
|
|
690
|
+
return rect.width > 0 && rect.height > 0;
|
|
691
|
+
}));
|
|
692
|
+
if (!visibleFilterItems.length) {
|
|
693
|
+
return null;
|
|
694
|
+
}
|
|
695
|
+
/** @type {?} */
|
|
696
|
+
var focusedItem = visibleFilterItems.find((/**
|
|
697
|
+
* @param {?} item
|
|
698
|
+
* @return {?}
|
|
699
|
+
*/
|
|
700
|
+
function (item) {
|
|
701
|
+
return (item.classList.contains("e-focused") ||
|
|
702
|
+
item.classList.contains("e-selected") ||
|
|
703
|
+
item.classList.contains("e-hover"));
|
|
704
|
+
}));
|
|
705
|
+
return focusedItem || visibleFilterItems[visibleFilterItems.length - 1];
|
|
706
|
+
};
|
|
707
|
+
return DateTreeFilterHelper;
|
|
708
|
+
}());
|
|
709
|
+
export { DateTreeFilterHelper };
|
|
710
|
+
if (false) {
|
|
711
|
+
/** @type {?} */
|
|
712
|
+
DateTreeFilterHelper.prototype.popoverVisible;
|
|
713
|
+
/** @type {?} */
|
|
714
|
+
DateTreeFilterHelper.prototype.popoverField;
|
|
715
|
+
/** @type {?} */
|
|
716
|
+
DateTreeFilterHelper.prototype.popoverStyle;
|
|
717
|
+
/** @type {?} */
|
|
718
|
+
DateTreeFilterHelper.prototype.selectedByField;
|
|
719
|
+
/** @type {?} */
|
|
720
|
+
DateTreeFilterHelper.prototype.fieldLabelMap;
|
|
721
|
+
/** @type {?} */
|
|
722
|
+
DateTreeFilterHelper.prototype.dateFields;
|
|
723
|
+
/**
|
|
724
|
+
* @type {?}
|
|
725
|
+
* @private
|
|
726
|
+
*/
|
|
727
|
+
DateTreeFilterHelper.prototype.sourceRows;
|
|
728
|
+
/**
|
|
729
|
+
* @type {?}
|
|
730
|
+
* @private
|
|
731
|
+
*/
|
|
732
|
+
DateTreeFilterHelper.prototype.options;
|
|
733
|
+
/**
|
|
734
|
+
* @type {?}
|
|
735
|
+
* @private
|
|
736
|
+
*/
|
|
737
|
+
DateTreeFilterHelper.prototype.defaultDateFormats;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* @param {?} host
|
|
741
|
+
* @return {?}
|
|
742
|
+
*/
|
|
743
|
+
function resolveGridElement(host) {
|
|
744
|
+
if (!host || !host.grid) {
|
|
745
|
+
return null;
|
|
746
|
+
}
|
|
747
|
+
/** @type {?} */
|
|
748
|
+
var gridRef = host.grid;
|
|
749
|
+
if (gridRef.grid && gridRef.grid.element) {
|
|
750
|
+
return gridRef.grid.element;
|
|
751
|
+
}
|
|
752
|
+
if (gridRef.element) {
|
|
753
|
+
return gridRef.element;
|
|
754
|
+
}
|
|
755
|
+
return null;
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* @param {?} host
|
|
759
|
+
* @param {?} applyRows
|
|
760
|
+
* @param {?=} dateFormats
|
|
761
|
+
* @return {?}
|
|
762
|
+
*/
|
|
763
|
+
export function createRsCommonGridDateTreeHelper(host, applyRows, dateFormats) {
|
|
764
|
+
return new DateTreeFilterHelper({
|
|
765
|
+
getTranslation: (/**
|
|
766
|
+
* @return {?}
|
|
767
|
+
*/
|
|
768
|
+
function () { return (host ? host.translation : null); }),
|
|
769
|
+
getPopoverElement: (/**
|
|
770
|
+
* @return {?}
|
|
771
|
+
*/
|
|
772
|
+
function () {
|
|
773
|
+
return host && host.dateTreePopoverRef
|
|
774
|
+
? host.dateTreePopoverRef.nativeElement
|
|
775
|
+
: null;
|
|
776
|
+
}),
|
|
777
|
+
getGridElement: (/**
|
|
778
|
+
* @return {?}
|
|
779
|
+
*/
|
|
780
|
+
function () { return resolveGridElement(host); }),
|
|
781
|
+
applyRows: applyRows,
|
|
782
|
+
dateFormats: dateFormats && dateFormats.length
|
|
783
|
+
? dateFormats
|
|
784
|
+
: DATE_TREE_DEFAULT_DATE_FORMATS,
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9yYWlzZS1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGUtdHJlZS1maWx0ZXIvZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsZ0RBSUM7OztJQUhDLDBDQUFZOztJQUNaLDRDQUFjOztJQUNkLDJDQUFnQjs7Ozs7QUFHbEIsaURBT0M7OztJQU5DLHFEQUEwQjs7SUFDMUIsd0RBQXFDOztJQUNyQyxxREFBa0M7O0lBQ2xDLGdEQUFpQzs7SUFDakMscURBQXNDOztJQUN0QyxrREFBdUI7Ozs7O0FBR3pCLHFEQUlDOzs7SUFIQyxzREFBaUI7O0lBQ2pCLDZEQUF3Qjs7SUFDeEIsK0NBQVU7OztBQUdaLE1BQU0sS0FBTyw4QkFBOEIsR0FBRztJQUM1QyxZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osYUFBYTtJQUNiLGNBQWM7Q0FDZjtBQUVEO0lBcUJFLDhCQUFZLE9BQW9DO1FBcEJ6QyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWYsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQix1QkFBa0IsR0FBRztZQUMzQixZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixZQUFZO1lBQ1osYUFBYTtZQUNiLHFCQUFxQjtZQUNyQixjQUFjO1lBQ2QsTUFBTSxDQUFDLFFBQVE7U0FDaEIsQ0FBQztRQUdBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7Ozs7O0lBRU0s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LElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFoQyxDQUFnQyxDQUFBO1FBQ3RELGlCQUFpQjs7O1FBQUU7WUFDakIsT0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQjtnQkFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhO2dCQUN2QyxDQUFDLENBQUMsSUFBSTtRQUZSLENBRVEsQ0FBQTtRQUNWLGNBQWM7OztRQUFFLGNBQU0sT0FBQSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQTtRQUM5QyxTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQ1QsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNO1lBQy9CLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLDhCQUE4QjtLQUNyQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUcmVlRmlsdGVyU2V0dXBPcHRpb25zIHtcclxuICByb3dzOiBhbnlbXTtcclxuICBmaWVsZHM6IGFueVtdO1xyXG4gIGhpbnRzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRlVHJlZUZpbHRlckhlbHBlck9wdGlvbnMge1xyXG4gIGdldFRyYW5zbGF0aW9uOiAoKSA9PiBhbnk7XHJcbiAgZ2V0UG9wb3ZlckVsZW1lbnQ6ICgpID0+IEhUTUxFbGVtZW50O1xyXG4gIGdldEdyaWRFbGVtZW50OiAoKSA9PiBIVE1MRWxlbWVudDtcclxuICBhcHBseVJvd3M6IChyb3dzOiBhbnlbXSkgPT4gdm9pZDtcclxuICBwYXJzZURhdGVWYWx1ZT86ICh2YWx1ZTogYW55KSA9PiBEYXRlO1xyXG4gIGRhdGVGb3JtYXRzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUnNDb21tb25HcmlkRGF0ZVRyZWVGYWN0b3J5SG9zdCB7XHJcbiAgdHJhbnNsYXRpb246IGFueTtcclxuICBkYXRlVHJlZVBvcG92ZXJSZWY6IGFueTtcclxuICBncmlkOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBEQVRFX1RSRUVfREVGQVVMVF9EQVRFX0ZPUk1BVFMgPSBbXHJcbiAgXCJZWVlZLU1NLUREXCIsXHJcbiAgXCJNTS9ERC9ZWVlZXCIsXHJcbiAgXCJERC9NTS9ZWVlZXCIsXHJcbiAgXCJZWVlZL01NL0REXCIsXHJcbiAgXCJERC1NTU0tWVlZWVwiLFxyXG4gIFwiTU1NIERELCBZWVlZXCIsXHJcbl07XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZVRyZWVGaWx0ZXJIZWxwZXIge1xyXG4gIHB1YmxpYyBwb3BvdmVyVmlzaWJsZSA9IGZhbHNlO1xyXG4gIHB1YmxpYyBwb3BvdmVyRmllbGQgPSBcIlwiO1xyXG4gIHB1YmxpYyBwb3BvdmVyU3R5bGUgPSB7fTtcclxuICBwdWJsaWMgc2VsZWN0ZWRCeUZpZWxkID0ge307XHJcbiAgcHVibGljIGZpZWxkTGFiZWxNYXAgPSB7fTtcclxuICBwdWJsaWMgZGF0ZUZpZWxkcyA9IFtdO1xyXG5cclxuICBwcml2YXRlIHNvdXJjZVJvd3MgPSBbXTtcclxuICBwcml2YXRlIG9wdGlvbnM6IERhdGVUcmVlRmlsdGVySGVscGVyT3B0aW9ucztcclxuICBwcml2YXRlIGRlZmF1bHREYXRlRm9ybWF0cyA9IFtcclxuICAgIFwiWVlZWS1NTS1ERFwiLFxyXG4gICAgXCJNTS9ERC9ZWVlZXCIsXHJcbiAgICBcIkREL01NL1lZWVlcIixcclxuICAgIFwiWVlZWS9NTS9ERFwiLFxyXG4gICAgXCJERC1NTU0tWVlZWVwiLFxyXG4gICAgXCJERC1NTU0tWVlZWSBoaDptbSBBXCIsXHJcbiAgICBcIk1NTSBERCwgWVlZWVwiLFxyXG4gICAgbW9tZW50LklTT184NjAxLFxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGVUcmVlRmlsdGVySGVscGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXR1cChjb25maWc6IERhdGVUcmVlRmlsdGVyU2V0dXBPcHRpb25zKSB7XHJcbiAgICB2YXIgcm93cyA9IGNvbmZpZyAmJiBjb25maWcucm93cyA/IGNvbmZpZy5yb3dzIDogW107XHJcbiAgICB2YXIgZmllbGRzID0gY29uZmlnICYmIGNvbmZpZy5maWVsZHMgPyBjb25maWcuZmllbGRzIDogW107XHJcbiAgICB2YXIgaGludHMgPSBjb25maWcgJiYgY29uZmlnLmhpbnRzID8gY29uZmlnLmhpbnRzIDogW107XHJcbiAgICB0aGlzLnNvdXJjZVJvd3MgPSByb3dzO1xyXG4gICAgdGhpcy5kYXRlRmllbGRzID0gdGhpcy5yZXNvbHZlRGF0ZVRyZWVGaWVsZHNCeUhpbnRzKGZpZWxkcywgaGludHMpO1xyXG4gICAgdGhpcy5maWVsZExhYmVsTWFwID0ge307XHJcbiAgICAoZmllbGRzIHx8IFtdKS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5jb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmllbGRMYWJlbE1hcFtpdGVtLmNvbHVtbk5hbWVdID1cclxuICAgICAgICBpdGVtLmNvbHVtbkRpc3BsYXlOYW1lIHx8IGl0ZW0uY29sdW1uTmFtZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hcHBseSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUdyaWRBY3Rpb25CZWdpbihhcmdzOiBhbnkpIHtcclxuICAgIHZhciByZXF1ZXN0VHlwZSA9IHRoaXMuZ2V0UmVxdWVzdFR5cGUoYXJncyk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHJlcXVlc3RUeXBlID09PSBcImZpbHRlcmNob2ljZXJlcXVlc3RcIiB8fFxyXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gXCJmaWx0ZXJzZWFyY2hiZWdpblwiXHJcbiAgICApIHtcclxuICAgICAgYXJncy5maWx0ZXJDaG9pY2VDb3VudCA9IDE1MDAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlcXVlc3RUeXBlICE9PSBcImZpbHRlcmJlZm9yZW9wZW5cIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgY29sdW1uTmFtZSA9IHRoaXMucmVzb2x2ZUFjdGlvbkNvbHVtbk5hbWUoYXJncyk7XHJcbiAgICBpZiAoIXRoaXMuaXNEYXRlVHJlZUZpZWxkKGNvbHVtbk5hbWUpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXJncy5jYW5jZWwgPSB0cnVlO1xyXG4gICAgdGhpcy5vcGVuKGNvbHVtbk5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb25NYXA6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEJ5RmllbGQgPSBzZWxlY3Rpb25NYXAgfHwge307XHJcbiAgICB0aGlzLmFwcGx5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKSB7XHJcbiAgICBpZiAoIXRoaXMucG9wb3ZlclZpc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3BvdmVyVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5wb3BvdmVyRmllbGQgPSBcIlwiO1xyXG4gICAgdGhpcy5wb3BvdmVyU3R5bGUgPSB7fTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVEb2N1bWVudE1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLnBvcG92ZXJWaXNpYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc0luc2lkZVBvcG92ZXIodGFyZ2V0KSB8fCB0aGlzLmlzRGF0ZUZpbHRlck1lbnVJdGVtKHRhcmdldCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZURvY3VtZW50TW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMucG9wb3ZlclZpc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzSW5zaWRlUG9wb3Zlcih0YXJnZXQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBtZW51SXRlbSA9IHRhcmdldC5jbG9zZXN0KFwiLmUtbWVudS1pdGVtXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKG1lbnVJdGVtKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc0RhdGVGaWx0ZXJNZW51SXRlbShtZW51SXRlbSkpIHtcclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIG90aGVyRmlsdGVyVGFyZ2V0ID0gdGFyZ2V0LmNsb3Nlc3QoXHJcbiAgICAgIFwiLmUtZmlsdGVybWVudWRpdiwgLmUtaGVhZGVyY2VsbCAuZS1jb2x1bW5tZW51LCAuZS1jb2x1bW5tZW51LCAuZS1jb250ZXh0bWVudVwiXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKG90aGVyRmlsdGVyVGFyZ2V0ICYmICF0aGlzLmlzRGF0ZUZpbHRlck1lbnVJdGVtKG90aGVyRmlsdGVyVGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlUG9zaXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMucG9wb3ZlclZpc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGFuY2hvciA9IHRoaXMuZmluZERhdGVGaWx0ZXJBbmNob3JFbGVtZW50KCk7XHJcbiAgICBpZiAoYW5jaG9yKSB7XHJcbiAgICAgIHZhciByZWN0ID0gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB2YXIgdmlld3BvcnRXaWR0aCA9XHJcbiAgICAgICAgd2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgICB2YXIgdmlld3BvcnRIZWlnaHQgPVxyXG4gICAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICB2YXIgcG9wb3ZlckVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuZ2V0UG9wb3ZlckVsZW1lbnRcclxuICAgICAgICA/IHRoaXMub3B0aW9ucy5nZXRQb3BvdmVyRWxlbWVudCgpXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgICB2YXIgcG9wb3ZlcldpZHRoID1cclxuICAgICAgICBwb3BvdmVyRWxlbWVudCAmJiBwb3BvdmVyRWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgPyBwb3BvdmVyRWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgOiAzMDA7XHJcbiAgICAgIHZhciBwb3BvdmVySGVpZ2h0ID1cclxuICAgICAgICBwb3BvdmVyRWxlbWVudCAmJiBwb3BvdmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgID8gcG9wb3ZlckVsZW1lbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICA6IDQyMDtcclxuICAgICAgdmFyIGVkZ2VHYXAgPSA4O1xyXG4gICAgICB2YXIgYW5jaG9yR2FwID0gODtcclxuICAgICAgdmFyIHRvcCA9IHJlY3QudG9wIC0gNjtcclxuICAgICAgdmFyIGxlZnQgPSByZWN0LnJpZ2h0ICsgYW5jaG9yR2FwO1xyXG5cclxuICAgICAgaWYgKGxlZnQgKyBwb3BvdmVyV2lkdGggPiB2aWV3cG9ydFdpZHRoIC0gZWRnZUdhcCkge1xyXG4gICAgICAgIGxlZnQgPSByZWN0LmxlZnQgLSBwb3BvdmVyV2lkdGggLSBhbmNob3JHYXA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGxlZnQgPCBlZGdlR2FwKSB7XHJcbiAgICAgICAgbGVmdCA9IGVkZ2VHYXA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGxlZnQgKyBwb3BvdmVyV2lkdGggPiB2aWV3cG9ydFdpZHRoIC0gZWRnZUdhcCkge1xyXG4gICAgICAgIGxlZnQgPSBNYXRoLm1heChlZGdlR2FwLCB2aWV3cG9ydFdpZHRoIC0gcG9wb3ZlcldpZHRoIC0gZWRnZUdhcCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRvcCArIHBvcG92ZXJIZWlnaHQgPiB2aWV3cG9ydEhlaWdodCAtIGVkZ2VHYXApIHtcclxuICAgICAgICB0b3AgPSBNYXRoLm1heChlZGdlR2FwLCB2aWV3cG9ydEhlaWdodCAtIHBvcG92ZXJIZWlnaHQgLSBlZGdlR2FwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvcG92ZXJTdHlsZSA9IHtcclxuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxyXG4gICAgICAgIGxlZnQ6IGxlZnQgKyBcInB4XCIsXHJcbiAgICAgICAgdG9wOiB0b3AgKyBcInB4XCIsXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBncmlkRWxlbWVudCA9IHRoaXMub3B0aW9ucy5nZXRHcmlkRWxlbWVudFxyXG4gICAgICA/IHRoaXMub3B0aW9ucy5nZXRHcmlkRWxlbWVudCgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGlmIChncmlkRWxlbWVudCAmJiBncmlkRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcclxuICAgICAgdmFyIGZhbGxiYWNrUmVjdCA9IGdyaWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB0aGlzLnBvcG92ZXJTdHlsZSA9IHtcclxuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxyXG4gICAgICAgIGxlZnQ6IE1hdGgubWF4KDgsIGZhbGxiYWNrUmVjdC5yaWdodCAtIDMxMikgKyBcInB4XCIsXHJcbiAgICAgICAgdG9wOiBNYXRoLm1heCg4LCBmYWxsYmFja1JlY3QudG9wICsgOCkgKyBcInB4XCIsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW4oZmllbGQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5wb3BvdmVyRmllbGQgPSBmaWVsZDtcclxuICAgIHRoaXMucG9wb3ZlclZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDUwKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAxNTApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseSgpIHtcclxuICAgIHZhciBmaWx0ZXJlZFJvd3MgPSB0aGlzLmZpbHRlclJvd3NCeVNlbGVjdGVkRGF0ZVRyZWUoXHJcbiAgICAgIHRoaXMuc291cmNlUm93cyB8fCBbXVxyXG4gICAgKTtcclxuICAgIHRoaXMub3B0aW9ucy5hcHBseVJvd3MoZmlsdGVyZWRSb3dzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmVxdWVzdFR5cGUoYXJncykge1xyXG4gICAgaWYgKCFhcmdzIHx8ICFhcmdzLnJlcXVlc3RUeXBlKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFN0cmluZyhhcmdzLnJlcXVlc3RUeXBlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZUFjdGlvbkNvbHVtbk5hbWUoYXJncykge1xyXG4gICAgaWYgKCFhcmdzKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgYXJncy5jb2x1bW5OYW1lIHx8XHJcbiAgICAgIGFyZ3MuZmllbGQgfHxcclxuICAgICAgYXJncy5jdXJyZW50RmlsdGVyaW5nQ29sdW1uIHx8XHJcbiAgICAgIChhcmdzLmNvbHVtbiAmJiAoYXJncy5jb2x1bW4uZmllbGQgfHwgYXJncy5jb2x1bW4uY29sdW1uTmFtZSkpIHx8XHJcbiAgICAgIFwiXCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc29sdmVEYXRlVHJlZUZpZWxkc0J5SGludHMoZmllbGRzOiBhbnlbXSwgaGludHM6IHN0cmluZ1tdKSB7XHJcbiAgICB2YXIgbm9ybWFsaXplZEhpbnRzID0gKGhpbnRzIHx8IFtdKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpZiAoIWZpZWxkcyB8fCAhZmllbGRzLmxlbmd0aCB8fCAhbm9ybWFsaXplZEhpbnRzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRzXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uY29sdW1uTmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29sdW1uTmFtZSA9IFN0cmluZyhpdGVtLmNvbHVtbk5hbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSBTdHJpbmcoaXRlbS5jb2x1bW5EaXNwbGF5TmFtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSGludHMuc29tZSgoaGludCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgY29sdW1uTmFtZSA9PT0gaGludCB8fFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSA9PT0gaGludCB8fFxyXG4gICAgICAgICAgICAoaGludC5sZW5ndGggPj0gMyAmJlxyXG4gICAgICAgICAgICAgIChjb2x1bW5OYW1lLmluZGV4T2YoaGludCkgPiAtMSB8fFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWUuaW5kZXhPZihoaW50KSA+IC0xKSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRGF0ZVRyZWVGaWVsZChmaWVsZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlRmllbGRzLmluZGV4T2YoZmllbGQpID4gLTE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZEJ5RmllbGRbZmllbGRdKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyUm93c0J5U2VsZWN0ZWREYXRlVHJlZShyb3dzOiBhbnlbXSwgZXhjbHVkZUZpZWxkPzogc3RyaW5nKSB7XHJcbiAgICB2YXIgZmlsdGVyZWRSb3dzID0gcm93cyA/IHJvd3Muc2xpY2UoKSA6IFtdO1xyXG4gICAgdGhpcy5kYXRlRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGlmIChleGNsdWRlRmllbGQgJiYgZmllbGQgPT09IGV4Y2x1ZGVGaWVsZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB2YXIgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKGZpZWxkKTtcclxuICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkTWFwKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cy5maWx0ZXIoKHJvdykgPT4ge1xyXG4gICAgICAgIHZhciBkYXlLZXkgPSB0aGlzLmdldERheUtleUJ5Um93VmFsdWUocm93W2ZpZWxkXSk7XHJcbiAgICAgICAgcmV0dXJuIGRheUtleSA/ICEhc2VsZWN0ZWRNYXBbZGF5S2V5XSA6IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkUm93cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF5S2V5QnlSb3dWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB2YXIgZGF0ZSA9IHRoaXMucGFyc2VEYXRlVmFsdWUodmFsdWUpO1xyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudG9EYXlLZXkoXHJcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSxcclxuICAgICAgZGF0ZS5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlRGF0ZVZhbHVlKHZhbHVlOiBhbnkpOiBEYXRlIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFyc2VEYXRlVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICB2YXIgZm9ybWF0cyA9XHJcbiAgICAgIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdHMgJiYgdGhpcy5vcHRpb25zLmRhdGVGb3JtYXRzLmxlbmd0aFxyXG4gICAgICAgID8gdGhpcy5vcHRpb25zLmRhdGVGb3JtYXRzXHJcbiAgICAgICAgOiB0aGlzLmRlZmF1bHREYXRlRm9ybWF0cztcclxuICAgIHZhciBwYXJzZWQgPSBtb21lbnQodmFsdWUsIGZvcm1hdHMsIHRydWUpO1xyXG4gICAgaWYgKHBhcnNlZC5pc1ZhbGlkKCkpIHtcclxuICAgICAgcmV0dXJuIHBhcnNlZC50b0RhdGUoKTtcclxuICAgIH1cclxuICAgIHZhciBmYWxsYmFjayA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgIHJldHVybiBpc05hTihmYWxsYmFjay5nZXRUaW1lKCkpID8gbnVsbCA6IGZhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0RheUtleSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4geWVhciArIFwiLVwiICsgdGhpcy5wYWQyKG1vbnRoKSArIFwiLVwiICsgdGhpcy5wYWQyKGRheSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhZDIodmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHZhbHVlIDwgMTAgPyBcIjBcIiArIHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnNpZGVQb3BvdmVyKHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIHZhciBwb3BvdmVyRWxlbWVudCA9IHRoaXMub3B0aW9ucy5nZXRQb3BvdmVyRWxlbWVudFxyXG4gICAgICA/IHRoaXMub3B0aW9ucy5nZXRQb3BvdmVyRWxlbWVudCgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGlmICghdGFyZ2V0IHx8ICFwb3BvdmVyRWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9wb3ZlckVsZW1lbnQuY29udGFpbnModGFyZ2V0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlRmlsdGVyTWVudUl0ZW0oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB2YXIgbWVudUl0ZW0gPSBlbGVtZW50LmNsb3Nlc3QoXCIuZS1tZW51LWl0ZW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIW1lbnVJdGVtKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHZhciB0ZXh0ID0gKG1lbnVJdGVtLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdmFyIHRyYW5zbGF0aW9uID0gdGhpcy5vcHRpb25zLmdldFRyYW5zbGF0aW9uXHJcbiAgICAgID8gdGhpcy5vcHRpb25zLmdldFRyYW5zbGF0aW9uKClcclxuICAgICAgOiBudWxsO1xyXG4gICAgdmFyIGZpbHRlclRleHQgPSBTdHJpbmcoKHRyYW5zbGF0aW9uICYmIHRyYW5zbGF0aW9uLkZJTFRFUikgfHwgXCJmaWx0ZXJcIilcclxuICAgICAgLnRyaW0oKVxyXG4gICAgICAudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmICghdGV4dCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGV4dC5pbmRleE9mKGZpbHRlclRleHQpID4gLTEgfHwgdGV4dC5pbmRleE9mKFwiZmlsdGVyXCIpID4gLTEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICB2YXIgY2xzID0gKG1lbnVJdGVtLmNsYXNzTmFtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIGNscy5pbmRleE9mKFwiZmlsdGVyXCIpID4gLTE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmREYXRlRmlsdGVyQW5jaG9yRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICB2YXIgbWVudUNvbnRhaW5lcnMgPSBBcnJheS5mcm9tKFxyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmUtY29sdW1ubWVudSwgLmUtY29udGV4dG1lbnVcIilcclxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcclxuICAgIHZhciB2aXNpYmxlQ29udGFpbmVycyA9IG1lbnVDb250YWluZXJzLmZpbHRlcigoY29udGFpbmVyKSA9PiB7XHJcbiAgICAgIGlmICghY29udGFpbmVyIHx8ICFjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAocmVjdC53aWR0aCA8PSAwIHx8IHJlY3QuaGVpZ2h0IDw9IDApIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcclxuICAgICAgaWYgKCFzdHlsZSB8fCBzdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fCBzdHlsZS52aXNpYmlsaXR5ID09PSBcImhpZGRlblwiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXZpc2libGVDb250YWluZXJzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHZhciBjdXJyZW50Q29udGFpbmVyID0gdmlzaWJsZUNvbnRhaW5lcnNbdmlzaWJsZUNvbnRhaW5lcnMubGVuZ3RoIC0gMV07XHJcbiAgICB2YXIgbWVudUl0ZW1zID0gQXJyYXkuZnJvbShcclxuICAgICAgY3VycmVudENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiLmUtbWVudS1pdGVtXCIpXHJcbiAgICApIGFzIEhUTUxFbGVtZW50W107XHJcbiAgICB2YXIgdmlzaWJsZUZpbHRlckl0ZW1zID0gbWVudUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNEYXRlRmlsdGVyTWVudUl0ZW0oaXRlbSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHJldHVybiByZWN0LndpZHRoID4gMCAmJiByZWN0LmhlaWdodCA+IDA7XHJcbiAgICB9KTtcclxuICAgIGlmICghdmlzaWJsZUZpbHRlckl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHZhciBmb2N1c2VkSXRlbSA9IHZpc2libGVGaWx0ZXJJdGVtcy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoXCJlLWZvY3VzZWRcIikgfHxcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5jb250YWlucyhcImUtc2VsZWN0ZWRcIikgfHxcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5jb250YWlucyhcImUtaG92ZXJcIilcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvY3VzZWRJdGVtIHx8IHZpc2libGVGaWx0ZXJJdGVtc1t2aXNpYmxlRmlsdGVySXRlbXMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlR3JpZEVsZW1lbnQoaG9zdDogUnNDb21tb25HcmlkRGF0ZVRyZWVGYWN0b3J5SG9zdCk6IEhUTUxFbGVtZW50IHtcclxuICBpZiAoIWhvc3QgfHwgIWhvc3QuZ3JpZCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHZhciBncmlkUmVmID0gaG9zdC5ncmlkO1xyXG4gIGlmIChncmlkUmVmLmdyaWQgJiYgZ3JpZFJlZi5ncmlkLmVsZW1lbnQpIHtcclxuICAgIHJldHVybiBncmlkUmVmLmdyaWQuZWxlbWVudDtcclxuICB9XHJcbiAgaWYgKGdyaWRSZWYuZWxlbWVudCkge1xyXG4gICAgcmV0dXJuIGdyaWRSZWYuZWxlbWVudDtcclxuICB9XHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSc0NvbW1vbkdyaWREYXRlVHJlZUhlbHBlcihcclxuICBob3N0OiBSc0NvbW1vbkdyaWREYXRlVHJlZUZhY3RvcnlIb3N0LFxyXG4gIGFwcGx5Um93czogKHJvd3M6IGFueVtdKSA9PiB2b2lkLFxyXG4gIGRhdGVGb3JtYXRzPzogc3RyaW5nW11cclxuKSB7XHJcbiAgcmV0dXJuIG5ldyBEYXRlVHJlZUZpbHRlckhlbHBlcih7XHJcbiAgICBnZXRUcmFuc2xhdGlvbjogKCkgPT4gKGhvc3QgPyBob3N0LnRyYW5zbGF0aW9uIDogbnVsbCksXHJcbiAgICBnZXRQb3BvdmVyRWxlbWVudDogKCkgPT5cclxuICAgICAgaG9zdCAmJiBob3N0LmRhdGVUcmVlUG9wb3ZlclJlZlxyXG4gICAgICAgID8gaG9zdC5kYXRlVHJlZVBvcG92ZXJSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAgIDogbnVsbCxcclxuICAgIGdldEdyaWRFbGVtZW50OiAoKSA9PiByZXNvbHZlR3JpZEVsZW1lbnQoaG9zdCksXHJcbiAgICBhcHBseVJvd3M6IGFwcGx5Um93cyxcclxuICAgIGRhdGVGb3JtYXRzOlxyXG4gICAgICBkYXRlRm9ybWF0cyAmJiBkYXRlRm9ybWF0cy5sZW5ndGhcclxuICAgICAgICA/IGRhdGVGb3JtYXRzXHJcbiAgICAgICAgOiBEQVRFX1RSRUVfREVGQVVMVF9EQVRFX0ZPUk1BVFMsXHJcbiAgfSk7XHJcbn1cclxuIl19
|