@schneideress/dashboardframework 13.0.0 → 17.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +7 -7
  2. package/esm2022/gridster/index.mjs +12 -0
  3. package/esm2022/gridster/lib/gridster.component.mjs +627 -0
  4. package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
  5. package/esm2022/gridster/lib/gridster.module.mjs +17 -0
  6. package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
  7. package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
  8. package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
  9. package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
  10. package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
  11. package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
  12. package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
  13. package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
  14. package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
  15. package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
  16. package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
  17. package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
  18. package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
  19. package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
  20. package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
  21. package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
  22. package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
  23. package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
  24. package/esm2022/lib/custom.notifier.options.mjs +41 -0
  25. package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
  26. package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
  27. package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
  28. package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
  29. package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
  30. package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
  31. package/esm2022/lib/ra.dashboard.module.mjs +55 -0
  32. package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
  33. package/esm2022/lib/ra.dashboard.service.mjs +77 -0
  34. package/esm2022/lib/ra.event.enum.mjs +60 -0
  35. package/esm2022/lib/ra.gridster.config.mjs +56 -0
  36. package/esm2022/public-api.mjs +13 -0
  37. package/esm2022/schneideress-dashboardframework.mjs +5 -0
  38. package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
  39. package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
  40. package/gridster/index.d.ts +9 -0
  41. package/gridster/lib/gridster.component.d.ts +79 -0
  42. package/gridster/lib/gridster.interface.d.ts +49 -0
  43. package/gridster/lib/gridster.module.d.ts +8 -0
  44. package/gridster/lib/gridsterCompact.service.d.ts +11 -0
  45. package/gridster/lib/gridsterConfig.constant.d.ts +2 -0
  46. package/gridster/lib/gridsterConfig.interface.d.ts +155 -0
  47. package/gridster/lib/gridsterConfigS.interface.d.ts +107 -0
  48. package/gridster/lib/gridsterDraggable.service.d.ts +68 -0
  49. package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -0
  50. package/gridster/lib/gridsterItem.component.d.ts +61 -0
  51. package/gridster/lib/gridsterItem.interface.d.ts +67 -0
  52. package/gridster/lib/gridsterPreview.component.d.ts +17 -0
  53. package/gridster/lib/gridsterPush.service.d.ts +34 -0
  54. package/gridster/lib/gridsterPushResize.service.d.ts +26 -0
  55. package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
  56. package/gridster/lib/gridsterRenderer.service.d.ts +37 -0
  57. package/gridster/lib/gridsterResizable.service.d.ts +86 -0
  58. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -0
  59. package/gridster/lib/gridsterScroll.service.d.ts +7 -0
  60. package/gridster/lib/gridsterSwap.service.d.ts +13 -0
  61. package/gridster/lib/gridsterUtils.service.d.ts +16 -0
  62. package/{schneideress-dashboardframework.d.ts → index.d.ts} +5 -5
  63. package/lib/custom.notifier.options.d.ts +2 -2
  64. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -88
  65. package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -20
  66. package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -142
  67. package/lib/ra.base.dashboard.filter.d.ts +17 -17
  68. package/lib/ra.base.dashboard.template.d.ts +18 -18
  69. package/lib/ra.dashbard.event.bus.d.ts +23 -23
  70. package/lib/ra.dashboard.module.d.ts +16 -17
  71. package/lib/ra.dashboard.responsive.service.d.ts +24 -24
  72. package/lib/ra.dashboard.service.d.ts +25 -25
  73. package/lib/ra.event.enum.d.ts +57 -57
  74. package/lib/ra.gridster.config.d.ts +2 -2
  75. package/package.json +11 -17
  76. package/public-api.d.ts +9 -9
  77. package/esm2020/lib/custom.notifier.options.mjs +0 -41
  78. package/esm2020/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -445
  79. package/esm2020/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
  80. package/esm2020/lib/ra-widget-container/ra.widget.container.component.mjs +0 -767
  81. package/esm2020/lib/ra.base.dashboard.filter.mjs +0 -44
  82. package/esm2020/lib/ra.base.dashboard.template.mjs +0 -36
  83. package/esm2020/lib/ra.dashbard.event.bus.mjs +0 -46
  84. package/esm2020/lib/ra.dashboard.module.mjs +0 -64
  85. package/esm2020/lib/ra.dashboard.responsive.service.mjs +0 -136
  86. package/esm2020/lib/ra.dashboard.service.mjs +0 -77
  87. package/esm2020/lib/ra.event.enum.mjs +0 -60
  88. package/esm2020/lib/ra.gridster.config.mjs +0 -56
  89. package/esm2020/public-api.mjs +0 -15
  90. package/esm2020/schneideress-dashboardframework.mjs +0 -5
  91. package/fesm2015/schneideress-dashboardframework.mjs +0 -1800
  92. package/fesm2015/schneideress-dashboardframework.mjs.map +0 -1
  93. package/fesm2020/schneideress-dashboardframework.mjs +0 -1790
  94. package/fesm2020/schneideress-dashboardframework.mjs.map +0 -1
@@ -1,767 +0,0 @@
1
- import { Component, Input, ViewChild, EventEmitter, Output } from '@angular/core';
2
- import { RAEvent, RAEventKey } from '../ra.event.enum';
3
- import { RADownloadType, RADownloadOption, RaWidgetlockStatus, WidgetViewState } from '@schneideress/widgetframework';
4
- import { LockTooltip } from './lock-tooltip/lock.tooltip.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./../ra.dashboard.service";
7
- import * as i2 from "ngx-ui-loader";
8
- import * as i3 from "@schneideress/ra-common";
9
- import * as i4 from "angular-notifier";
10
- import * as i5 from "@schneideress/common-controls";
11
- import * as i6 from "@angular/common";
12
- export class RAWidgetContainer {
13
- constructor(dashboardService, ngxService, translateService, ngZone, notifier, renderer, raPermissionService, domService) {
14
- this.dashboardService = dashboardService;
15
- this.ngxService = ngxService;
16
- this.translateService = translateService;
17
- this.ngZone = ngZone;
18
- this.notifier = notifier;
19
- this.renderer = renderer;
20
- this.raPermissionService = raPermissionService;
21
- this.domService = domService;
22
- this.showPanel = true;
23
- this.isWidgetLoaded = false;
24
- this.lockClass = "unlocked";
25
- this.lockStatus = RaWidgetlockStatus.Unlocked;
26
- this.isDownloadIconVisible = false;
27
- this.isChartDownloadVisible = false;
28
- this.isGridDownloadVisible = false;
29
- this.enableTitleLine = false;
30
- this.isGlobalFilterApplied = false;
31
- this.toolTipValue = ' ';
32
- this.toolTipWidth = '0px';
33
- this.editToolTipValue = ' ';
34
- this.copyToolTipValue = ' ';
35
- this.moveToolTipValue = ' ';
36
- this.excelToolTipValue = ' ';
37
- this.deleteToolTipValue = ' ';
38
- this.editText = '';
39
- this.copyText = '';
40
- this.moveText = '';
41
- this.excelText = '';
42
- this.deleteText = '';
43
- this.editToolTipWidth = '0px';
44
- this.copyToolTipWidth = '0px';
45
- this.moveToolTipWidth = '0px';
46
- this.excelToolTipWidth = '0px';
47
- this.deleteToolTipWidth = '0px';
48
- this.noPadding = false;
49
- this.isMouseHover = false;
50
- this.showSettingsLink = true;
51
- this.isKpiView = false;
52
- this.showExcell = true;
53
- this.hideTitle = false;
54
- this.inapplicableFilters = [];
55
- this.widgetDeleted = new EventEmitter();
56
- this.updateAppliedFilters = new EventEmitter();
57
- this.isWidgetStateApplicable = false;
58
- this.widgetEmptyState = '';
59
- this.lockVisible = false;
60
- this.isWidgetMgmnt = false;
61
- this.enableTitleLineActual = false;
62
- this.renderer.listen('window', 'click', (e) => {
63
- if (e.target.className) {
64
- if (e.target.className != 'fal fa-ellipsis-v widget-menu-ellipse') {
65
- this.removeMenu();
66
- }
67
- }
68
- else {
69
- this.removeMenu();
70
- }
71
- });
72
- }
73
- set setResized(resized) {
74
- this.invokeWidgetResizedEvent();
75
- }
76
- ngOnInit() {
77
- this.WidgetDisplayName = this.translateService.translate('Common.' + this.data.widgetInfo.widgetTitle, true);
78
- this.lockIconTitle = this.translateService.translate('Common.lockedfields');
79
- this.lockIconFooter = this.translateService.translate('Common.lockedfieldseditinfo');
80
- this.inapplicableIconTitle = this.translateService.translate('Common.InapplicableFilters');
81
- this.inapplicableIconFooter = this.translateService.translate('Common.InapplicableFiltersDesc');
82
- }
83
- get widgetViewState() { return WidgetViewState; }
84
- ngOnChanges(changes) {
85
- this.isWidgetMgmnt = this.raPermissionService.hasPermission('ra.widgetmanagement');
86
- if (changes['raDashboardEventBus'] && changes['raDashboardEventBus'].currentValue != changes['raDashboardEventBus'].previousValue) {
87
- this.configChanged = this.raDashboardEventBus.subscribeWithKey(RAEvent.ConfigChanged, RAEventKey.WidgetInstanceId, this.data.widgetInfo.widgetInstanceId.toString()).subscribe((e) => {
88
- this.ngZone.run(() => {
89
- this.configChangeEventHandler(e);
90
- });
91
- });
92
- }
93
- if (this.widgetElement && changes['globalFilter'] && changes['globalFilter'].currentValue != changes['globalFilter'].previousValue) {
94
- let filterObj = this.getParsedConfig(this.globalFilter);
95
- if (filterObj.WidgetInstanceId) {
96
- if (this.data.widgetInfo.widgetInstanceId != filterObj.WidgetInstanceId)
97
- this.refreshWidget(this.data.widgetInfo);
98
- }
99
- else {
100
- this.refreshWidget(this.data.widgetInfo);
101
- }
102
- }
103
- if (changes['width'] && changes['width'].currentValue != changes['width'].previousValue ||
104
- (changes['height'] && changes['height'].currentValue != changes['height'].previousValue)) {
105
- this.invokeWidgetResizedEvent();
106
- }
107
- }
108
- invokeWidgetResizedEvent() {
109
- if (this.widgetElement) {
110
- if (typeof this.widgetElement.widgetResized === "function") {
111
- let size = {};
112
- size.height = this.height;
113
- size.width = this.width;
114
- size.cellHeight = this.gridCellHeight;
115
- this.widgetElement.widgetResized(size);
116
- if (this.height == 1 || this.width == 1)
117
- this.isKpiView = true;
118
- else
119
- this.isKpiView = false;
120
- }
121
- }
122
- }
123
- mouseHover(isHover = true) {
124
- this.isMouseHover = isHover;
125
- if (this.widgetElement) {
126
- if (typeof this.widgetElement.hoverStatus === "function") {
127
- this.widgetElement.hoverStatus(isHover);
128
- }
129
- else {
130
- console.warn('widget framework outdated, please update to version 0.0.96');
131
- }
132
- }
133
- }
134
- ngAfterViewInit() {
135
- setTimeout(() => {
136
- this.loadWidget(this.data.widgetInfo);
137
- });
138
- document.addEventListener("scroll", () => {
139
- this.removeMenu();
140
- this.closePopup();
141
- });
142
- setTimeout(() => {
143
- let item = jQuery(this.wcWrapper.nativeElement).closest('gridster-item');
144
- item.bind('mouseenter', () => {
145
- window.gridsterItemEnter = true;
146
- });
147
- item.bind('mouseleave', () => {
148
- window.gridsterItemEnter = false;
149
- setTimeout(() => {
150
- if (!window.mouseOverWidgetMenu) {
151
- this.removeMenu();
152
- }
153
- });
154
- });
155
- });
156
- }
157
- ngOnDestroy() {
158
- if (this.configChanged)
159
- this.configChanged.unsubscribe();
160
- if (this.widgetElementHandler && this.data && this.data.widgetInfo && this.data.widgetInfo.widgetInstanceId) {
161
- document.body.removeEventListener('widgetinitiated' + this.data.widgetInfo.widgetInstanceId, this.widgetElementHandler);
162
- }
163
- }
164
- /** To Edit current widget configuration*/
165
- editWidget() {
166
- let widgetConfigFilter = null;
167
- if (this.widgetElement && typeof (this.widgetElement.getConfigFilter) == 'function') {
168
- let configData = this.widgetElement.getConfigFilter();
169
- if (configData) {
170
- widgetConfigFilter = configData;
171
- }
172
- }
173
- if (widgetConfigFilter) {
174
- this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, widgetConfigFilter);
175
- }
176
- else {
177
- let widgetConfigFilterData = this.generateConfigFilter(false);
178
- this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, widgetConfigFilterData);
179
- }
180
- }
181
- /** To Delete current widget from DOM*/
182
- deleteWidget() {
183
- let widgetContainerContext = this;
184
- widgetContainerContext.ngxService.start();
185
- widgetContainerContext.dashboardService.deleteWidget(this.data.widgetInfo, this.appConfig).subscribe(status => {
186
- widgetContainerContext.ngxService.stop();
187
- if (status) {
188
- widgetContainerContext.widgetDeleted.emit(this.data.widgetInfo.widgetInstanceId);
189
- this.setInapplicableFilters(undefined, this.data.widgetInfo.widgetInstanceId);
190
- }
191
- else {
192
- widgetContainerContext.notifier.notify('error', " " + this.translateService.translate('FailedToRemoveWidget') + " (" + this.translateService.translate('Common.' + this.data.widgetInfo.widgetTitle, true) + ")!");
193
- }
194
- });
195
- }
196
- /** To Move or change position if current widget container*/
197
- moveWidget() {
198
- this.raDashboardEventBus.publish(RAEvent.MoveWidget, this.data.widgetInfo);
199
- this.setInapplicableFilters(undefined, this.data.widgetInfo.widgetInstanceId);
200
- // this.dashboardService.moveWidget(widgetInfo);
201
- }
202
- /** To Copy Current widget with same configuration*/
203
- copyWidget() {
204
- this.raDashboardEventBus.publish(RAEvent.CopyWidget, this.data.widgetInfo);
205
- //this.dashboardService.copyWidget(widgetInfo);
206
- }
207
- visitPage() {
208
- this.baseUrl = this.getHostUrl();
209
- let url = this.baseUrl + this.detailPageUrl;
210
- if (this.data.widgetInfo && this.data.widgetInfo.widgetSettings) {
211
- this.widgetSettings = this.getParsedConfig(this.data.widgetInfo.widgetSettings);
212
- if (this.widgetSettings.customPageParams || this.widgetSettings.customPageURL) {
213
- let params = this.widgetElement.getPageParamsClicked();
214
- if (params) {
215
- if (this.data.widgetInfo.widgetType == 'AV Widget' || this.widgetSettings.customPageURL)
216
- url = url + params;
217
- else
218
- url = url + '?' + params;
219
- }
220
- }
221
- }
222
- window.open(url, '_blank');
223
- }
224
- getHostUrl() {
225
- return window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
226
- }
227
- configChangeEventHandler(widgetInfo) {
228
- this.data.widgetInfo = widgetInfo;
229
- if (this.gridCellHeight > 0) {
230
- this.data.widgetInfo.rowHeight = this.gridCellHeight;
231
- }
232
- if (this.widgetElement && typeof (this.widgetElement.setConfigFilter) == 'function') {
233
- this.widgetElement.setConfigFilter(this.generateConfigFilter(true));
234
- }
235
- else {
236
- console.warn('widget framework outdated, please update to version 0.0.98');
237
- }
238
- this.refreshWidget(this.data.widgetInfo, true);
239
- }
240
- generateConfigFilter(configChanged = false) {
241
- let widgetConfigFilterData = {
242
- appConfig: this.appConfig,
243
- globalFilter: this.globalFilter,
244
- widgetInfo: this.data.widgetInfo,
245
- config: this.data.widgetInfo.widgetConfigInfo.config,
246
- configChanges: this.getConfigChanges(configChanged)
247
- };
248
- return widgetConfigFilterData;
249
- }
250
- /** To load external custom element to the widget container*/
251
- async loadWidget(widgetInfo) {
252
- widgetInfo.rowHeight = this.gridCellHeight;
253
- let widgetConfigFilter = {
254
- config: widgetInfo.widgetConfigInfo.config,
255
- globalFilter: this.globalFilter,
256
- configChanges: this.getConfigChanges(false)
257
- };
258
- if (widgetInfo.widgetSettings) {
259
- this.widgetSettings = this.getParsedConfig(widgetInfo.widgetSettings);
260
- this.applayWidgetSettings(this.widgetSettings);
261
- }
262
- this.detailPageUrl = widgetInfo.detailPageUrl;
263
- let me = this;
264
- this.dashboardService.loadExternalScript(widgetInfo.scriptUrl, () => {
265
- this.setNotConfiguredState(widgetInfo);
266
- let appModule = this.data.widgetInfo.widgetName;
267
- if (this.data.widgetInfo.applicationModule && this.data.widgetInfo.applicationModule.length > 0) {
268
- appModule = this.data.widgetInfo.applicationModule;
269
- }
270
- this.translateService.loadTranslations(this.appConfig.appManagementBaseUrl, appModule, false).then(() => {
271
- me.widgetElement = document.createElement(widgetInfo.customTag);
272
- me.widgetElement.setAttribute("widget-instance-id", widgetInfo.widgetInstanceId);
273
- let handler = (event) => {
274
- setTimeout(async () => {
275
- this.widgetElement.addEventListener('on-widget-respond', (e) => {
276
- var type = e.detail.type;
277
- switch (type) {
278
- case 'onDataLoad':
279
- if (e.detail.data)
280
- this.showPanel = true;
281
- else
282
- this.showPanel = false;
283
- break;
284
- case 'onConfigEditClicked':
285
- this.editWidget();
286
- break;
287
- case 'onEnableDefaultState':
288
- this.setEmptyState(e.detail.data);
289
- break;
290
- case 'onSetTitleUnderline':
291
- if (e.detail.data == true)
292
- this.enableTitleLine = true;
293
- else
294
- this.enableTitleLine = this.enableTitleLineActual;
295
- break;
296
- case 'onWidgetTitleHidden':
297
- if (e.detail.data == true)
298
- this.hideTitle = true;
299
- else
300
- this.hideTitle = false;
301
- break;
302
- case 'onUpdateLockData':
303
- this.setLock(e.detail.data);
304
- break;
305
- case 'onGlobalFilterApplicableCheck':
306
- this.setInapplicableFilters(e.detail.data, widgetInfo.widgetInstanceId);
307
- break;
308
- default:
309
- break;
310
- }
311
- });
312
- if (typeof (this.widgetElement.titleLineEnabled) != 'undefined') {
313
- let titleLineEnabled = this.widgetElement.titleLineEnabled();
314
- if (titleLineEnabled) {
315
- this.enableTitleLine = titleLineEnabled;
316
- this.enableTitleLineActual = titleLineEnabled;
317
- }
318
- }
319
- this.editText = this.translateService.translate('Common.edit');
320
- if (this.translateService.translate('Common.edit').length > 6) {
321
- this.editText = (this.translateService.translate('Common.edit').substring(0, 6) + '...');
322
- this.editToolTipValue = this.translateService.translate('Common.edit');
323
- this.editToolTipWidth = "300px";
324
- }
325
- this.copyText = this.translateService.translate('Common.copy');
326
- if (this.translateService.translate('Common.copy').length > 6) {
327
- this.copyText = (this.translateService.translate('Common.copy').substring(0, 6) + '...');
328
- this.copyToolTipValue = this.translateService.translate('Common.copy');
329
- this.copyToolTipWidth = "300px";
330
- }
331
- this.moveText = this.translateService.translate('Common.move');
332
- if (this.translateService.translate('Common.move').length > 6) {
333
- this.moveText = (this.translateService.translate('Common.move').substring(0, 6) + '...');
334
- this.moveToolTipValue = this.translateService.translate('Common.move');
335
- this.moveToolTipWidth = "300px";
336
- }
337
- this.excelText = this.translateService.translate('Common.excel');
338
- if (this.translateService.translate('Common.excel').length > 6) {
339
- this.excelText = (this.translateService.translate('Common.excel').substring(0, 6) + '...');
340
- this.excelToolTipValue = this.translateService.translate('Common.excel');
341
- this.excelToolTipWidth = "300px";
342
- }
343
- this.deleteText = this.translateService.translate('Common.delete');
344
- if (this.translateService.translate('Common.delete').length > 6) {
345
- this.deleteText = (this.translateService.translate('Common.delete').substring(0, 6) + '...');
346
- this.deleteToolTipValue = this.translateService.translate('Common.delete');
347
- this.deleteToolTipWidth = "300px";
348
- }
349
- this.isWidgetLoaded = true;
350
- widgetConfigFilter.appConfig = this.appConfig;
351
- widgetConfigFilter.widgetInfo = widgetInfo;
352
- widgetConfigFilter.configChanges = this.getConfigChanges(false);
353
- widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
354
- widgetConfigFilter.globalFilter = this.globalFilter;
355
- this.widgetElement.loadContent(widgetConfigFilter);
356
- await this.setLock(widgetConfigFilter.config);
357
- await this.setDownloadIcon();
358
- });
359
- };
360
- this.widgetElementHandler = handler;
361
- document.body.addEventListener('widgetinitiated' + widgetInfo.widgetInstanceId, handler);
362
- this.ctlWidget.nativeElement.appendChild(this.widgetElement);
363
- });
364
- });
365
- }
366
- /**To set Default State for the widget when it is not configured */
367
- setNotConfiguredState(widgetInfo, forceEnable = false) {
368
- if ((widgetInfo.showDefaultState && (widgetInfo.widgetConfigInfo.config == "" || Object.keys(JSON.parse(widgetInfo.widgetConfigInfo.config)).length == 0)) || (forceEnable)) {
369
- this.isWidgetStateApplicable = true;
370
- this.widgetEmptyState = WidgetViewState.emptyConfig.toString();
371
- }
372
- else {
373
- this.widgetEmptyState = '';
374
- this.isWidgetStateApplicable = false;
375
- }
376
- }
377
- /**To configure empty state for the widget */
378
- setEmptyState(widgetState) {
379
- if (this.height == 1 || this.width == 1)
380
- this.isKpiView = true;
381
- else
382
- this.isKpiView = false;
383
- this.widgetEmptyState = widgetState.widgetViewState;
384
- this.isGlobalFilterApplied = widgetState.isGlobalFilterApplied;
385
- if (widgetState != WidgetViewState.normal) {
386
- this.isWidgetStateApplicable = true;
387
- this.isDownloadIconVisible = false;
388
- }
389
- else {
390
- this.isWidgetStateApplicable = false;
391
- }
392
- switch (widgetState) {
393
- case WidgetViewState.emptyConfig:
394
- this.setNotConfiguredState(this.data.widgetInfo, true);
395
- break;
396
- case WidgetViewState.emptyData:
397
- break;
398
- case WidgetViewState.error:
399
- break;
400
- }
401
- }
402
- getConfigChanges(configChanged = false) {
403
- let configChanges = {
404
- isConfigUpdated: configChanged,
405
- updatedConfigProperty: []
406
- };
407
- return configChanges;
408
- }
409
- /** To refresh widget on input config changes */
410
- async refreshWidget(widgetInfo, configChanged = false) {
411
- this.WidgetDisplayName = this.translateService.translate('Common.' + this.data.widgetInfo.widgetTitle, true);
412
- widgetInfo.rowHeight = this.gridCellHeight;
413
- this.setNotConfiguredState(widgetInfo);
414
- let widgetContainerContext = this;
415
- let widgetConfigFilter = {
416
- config: widgetInfo.widgetConfigInfo.config,
417
- globalFilter: this.globalFilter,
418
- appConfig: this.appConfig,
419
- widgetInfo: widgetInfo,
420
- configChanges: this.getConfigChanges(configChanged)
421
- };
422
- if (widgetContainerContext.isWidgetLoaded) {
423
- if (this.widgetElement && typeof (this.widgetElement.setConfigFilter) == 'function') {
424
- widgetContainerContext.widgetElement.setConfigFilter(widgetConfigFilter);
425
- }
426
- widgetContainerContext.widgetElement.loadContent(widgetConfigFilter);
427
- await this.setLock(widgetConfigFilter.config);
428
- await this.setDownloadIcon();
429
- }
430
- }
431
- mouseOver(event) {
432
- this.toolTipValue = ' ';
433
- this.toolTipWidth = '0px';
434
- let element = this.searchInput.nativeElement;
435
- if (element.offsetWidth < element.scrollWidth) {
436
- this.toolTipValue = element.innerHTML;
437
- this.toolTipWidth = '300px';
438
- }
439
- else {
440
- this.toolTipWidth = '0px';
441
- }
442
- }
443
- async setLock(config) {
444
- this.lockTemplateInfo = this.widgetElement.loadLockInfo();
445
- var configObj;
446
- if (config) {
447
- configObj = JSON.parse(config);
448
- if (configObj && configObj.Locks != undefined) {
449
- if (configObj.Locks.IsDateLocked || configObj.Locks.IsDatesLocked || configObj.Locks.IsParticipantLocked || configObj.Locks.IsSourceLocked) {
450
- this.lockDetails = [];
451
- if (configObj.Locks.IsDateLocked || configObj.Locks.IsDatesLocked)
452
- this.lockDetails.push(this.translateService.translate('Common.DateRange'));
453
- if (configObj.Locks.IsParticipantLocked) {
454
- this.lockDetails.push(this.translateService.translate('Common.DivisionOrGrouporSite'));
455
- }
456
- if (configObj.Locks.IsSourceLocked)
457
- this.lockDetails.push(this.translateService.translate('Common.DataStream'));
458
- }
459
- else {
460
- this.lockDetails = undefined;
461
- }
462
- }
463
- else {
464
- this.lockDetails = undefined;
465
- }
466
- }
467
- }
468
- async setDownloadIcon() {
469
- let downloadType = await this.widgetElement.getDownloadType();
470
- this.downloadIconType = downloadType;
471
- this.isDownloadIconVisible = false;
472
- this.isChartDownloadVisible = false;
473
- this.isGridDownloadVisible = false;
474
- this.showExcell = true;
475
- if (downloadType != RADownloadType.None) {
476
- this.isDownloadIconVisible = true;
477
- }
478
- else {
479
- if (!this.isWidgetMgmnt && !this.detailPageUrl) {
480
- this.showSettingsLink = false;
481
- }
482
- }
483
- if (downloadType == RADownloadType.Chart) {
484
- this.isChartDownloadVisible = true;
485
- }
486
- if (downloadType == RADownloadType.Grid) {
487
- this.isGridDownloadVisible = true;
488
- }
489
- if (downloadType == RADownloadType.Statistics) {
490
- this.isGridDownloadVisible = true;
491
- this.showExcell = false;
492
- }
493
- }
494
- downloadIconClicked(type) {
495
- switch (type) {
496
- case "CSV":
497
- this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.CSV);
498
- break;
499
- case "PNG":
500
- this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PNG);
501
- break;
502
- case "PDF":
503
- this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PDF);
504
- break;
505
- case "SVG":
506
- this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.SVG);
507
- break;
508
- case "JPEG":
509
- this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.JPEG);
510
- break;
511
- }
512
- }
513
- removeMenu() {
514
- jQuery('#ra-db-widget-menu').remove();
515
- }
516
- checkVisitLinkVisiblity() {
517
- let isVisitApplicable = true;
518
- if (this.widgetElement && typeof this.widgetElement.getVisitLinkVisibilityStatus === "function") {
519
- isVisitApplicable = this.widgetElement.getVisitLinkVisibilityStatus();
520
- }
521
- return isVisitApplicable;
522
- }
523
- /**Show dropdown on gear icon click */
524
- showDropDown(e) {
525
- this.setDownloadIcon();
526
- this.removeMenu();
527
- setTimeout(() => {
528
- let targetPos = e.target.getBoundingClientRect();
529
- let style = "position:fixed;top:" + (targetPos.y + 15) + 'px' + ';left:' + (e.pageX - 122) + 'px;z-index:1000;';
530
- let html = this.getContenxtHtml(style);
531
- jQuery(html).appendTo('body');
532
- if (this.isWidgetMgmnt) {
533
- this.addEventListener('wcEditWidget', this.editWidget);
534
- this.addEventListener('wcCopyWidget', this.copyWidget);
535
- this.addEventListener('wcMoveWidget', this.moveWidget);
536
- this.addEventListener('wcWidgetDelete', this.deleteWidget);
537
- }
538
- let customPageParams = false;
539
- if (this.data.widgetInfo && this.data.widgetInfo.widgetSettings) {
540
- this.widgetSettings = this.getParsedConfig(this.data.widgetInfo.widgetSettings);
541
- if (this.widgetSettings.customPageParams || this.widgetSettings.customPageURL) {
542
- customPageParams = true;
543
- }
544
- }
545
- if ((this.detailPageUrl || customPageParams) && this.checkVisitLinkVisiblity()) {
546
- this.addEventListener('wcVisitWidget', this.visitPage);
547
- }
548
- if (this.isChartDownloadVisible) {
549
- this.addEventListener('wcDownloadPng', this.downloadIconClicked, 'PNG');
550
- this.addEventListener('wcDownloadJpg', this.downloadIconClicked, 'JPEG');
551
- this.addEventListener('wcDownloadPdf', this.downloadIconClicked, 'PDF');
552
- this.addEventListener('wcDownloadSvg', this.downloadIconClicked, 'SVG');
553
- }
554
- if (this.isGridDownloadVisible && this.showExcell) {
555
- this.addEventListener('wcDownloadExcel', this.downloadIconClicked, 'CSV');
556
- }
557
- document.getElementById('ra-db-widget-menu')?.addEventListener('mouseenter', () => {
558
- window.mouseOverWidgetMenu = true;
559
- });
560
- document.getElementById('ra-db-widget-menu')?.addEventListener('mouseleave', () => {
561
- window.mouseOverWidgetMenu = false;
562
- setTimeout(() => {
563
- if (!window.gridsterItemEnter) {
564
- this.removeMenu();
565
- }
566
- });
567
- });
568
- });
569
- }
570
- addEventListener(id, event, params) {
571
- let element = document.getElementById(id);
572
- if (element) {
573
- element.addEventListener('click', () => {
574
- event.call(this, params);
575
- });
576
- }
577
- }
578
- getContenxtHtml(style) {
579
- let html = '<div id="ra-db-widget-menu"' + 'style="' + style + '" class="download-content dropdown-content widget-config-item dropdown-click" style="z-index: 1002;">';
580
- let settings = '';
581
- if (this.isWidgetMgmnt) {
582
- settings += this.getHtmlForButton('wcEditWidget', 'fal fa-edit', this.editText);
583
- settings += this.getHtmlForButton('wcCopyWidget', 'fal fa-copy', this.copyText);
584
- settings += this.getHtmlForButton('wcMoveWidget', 'fal fa-arrows-alt', this.moveText);
585
- }
586
- let customPageParams = false;
587
- if (this.data.widgetInfo && this.data.widgetInfo.widgetSettings) {
588
- this.widgetSettings = this.getParsedConfig(this.data.widgetInfo.widgetSettings);
589
- if (this.widgetSettings.customPageParams || this.widgetSettings.customPageURL) {
590
- customPageParams = true;
591
- }
592
- }
593
- if ((this.detailPageUrl || customPageParams) && this.checkVisitLinkVisiblity()) {
594
- settings += '<a style="max-height: 30px;align-items: center;align-content: center; display: flex;" id="wcVisitWidget">';
595
- settings += '<i style="padding-left: 4px;font-size: 27px !important;" class="fal fa-angle-right"></i> ';
596
- settings += '<span style="padding-left: 11px;margin-top: 2px;" style="padding-left: 6px;">';
597
- settings += this.translateService.translate('Common.visitpage');
598
- settings += '</span></a>';
599
- }
600
- if ((this.detailPageUrl && this.checkVisitLinkVisiblity()) || this.isWidgetMgmnt) {
601
- html += '<div style="color: #9FA0A4;font-size: 12px;padding-top: 8px;padding-left: 12px;">';
602
- html += this.translateService.translate('Common.settings') + '</div>';
603
- html += settings;
604
- html += this.getHr();
605
- }
606
- if (this.isDownloadIconVisible) {
607
- if (this.showExcell) {
608
- if (this.detailPageUrl || this.isWidgetMgmnt)
609
- html += '<span style="color: #9FA0A4;font-size: 12px;">';
610
- else
611
- html += '<span style="color: #9FA0A4;font-size: 12px;padding-top:5px;display:block;">';
612
- html += this.translateService.translate('Common.downloads');
613
- html += '</span>';
614
- }
615
- if (this.isChartDownloadVisible) {
616
- html += '<div style="padding-top: 10px;" class="chartDownload">';
617
- html += this.getHtmlForButton('wcDownloadPng', 'fal fa-file-image', this.translateService.translate('Common.png'));
618
- html += this.getHtmlForButton('wcDownloadJpg', 'fal fa-file-image', this.translateService.translate('Common.jpeg'));
619
- html += this.getHtmlForButton('wcDownloadPdf', 'fal fa-file-pdf', this.translateService.translate('Common.pdf'));
620
- html += this.getHtmlForButton('wcDownloadSvg', 'fal fa-file-alt', this.translateService.translate('Common.svg'));
621
- html += '</div>';
622
- }
623
- if (this.isGridDownloadVisible && this.showExcell) {
624
- html += '<div class="gridDownload">';
625
- html += this.getHtmlForButton('wcDownloadExcel', 'fal fa-download', this.excelText);
626
- html += '</div>';
627
- }
628
- }
629
- if (this.isDownloadIconVisible && this.isWidgetMgmnt && this.showExcell) {
630
- html += this.getHr();
631
- }
632
- if (this.isWidgetMgmnt) {
633
- html += '<a id="wcWidgetDelete"><i class="fal fa-times" style="padding-left: 3px;color: red;"></i><span>';
634
- html += this.deleteText;
635
- html += '</span></a>';
636
- }
637
- html += '</div>';
638
- return html;
639
- }
640
- getHr() {
641
- return '<hr class="hr" style="margin-top: 5px;margin-bottom: 5px;">';
642
- }
643
- getHtmlForButton(id, fontClass, text) {
644
- let html = '<a id="' + id + '"><i style="width:16px" class="' + fontClass + '"></i> <span style="padding-left: 6px;">';
645
- html += text;
646
- html += '</span></a>';
647
- return html;
648
- }
649
- getParsedConfig(config) {
650
- let parsedConfig;
651
- if (config) {
652
- if (typeof config === 'string') {
653
- try {
654
- parsedConfig = JSON.parse(config);
655
- }
656
- catch {
657
- parsedConfig = {};
658
- }
659
- return parsedConfig;
660
- }
661
- }
662
- return config;
663
- }
664
- applayWidgetSettings(settings) {
665
- if (settings.NoPadding)
666
- this.noPadding = true;
667
- else
668
- this.noPadding = false;
669
- }
670
- setInapplicableFilters(data, instanceId) {
671
- var widgetData = {};
672
- this.inapplicableFilters = [];
673
- widgetData.instanceId = instanceId;
674
- if (data && data.length > 0) {
675
- data.forEach((element) => {
676
- if (element == 'dateRange')
677
- this.inapplicableFilters.push(this.translateService.translate('Common.DateRange'));
678
- else if (element == 'participant') {
679
- this.inapplicableFilters.push(this.translateService.translate('Common.DivisionGroup'));
680
- }
681
- else if (element == 'source')
682
- this.inapplicableFilters.push(this.translateService.translate('Common.DataStream'));
683
- else
684
- this.inapplicableFilters.push(element);
685
- });
686
- widgetData.data = data;
687
- }
688
- else {
689
- widgetData.data = undefined;
690
- }
691
- this.updateAppliedFilters.emit(widgetData);
692
- }
693
- openPopup(title, data, footer, type, template = undefined) {
694
- let props = {};
695
- if (type == 'innaplicable' && this.banPopupDiv)
696
- props.element = this.banPopupDiv.nativeElement;
697
- if (type == 'lock' && this.lockPopupDiv)
698
- props.element = this.lockPopupDiv.nativeElement;
699
- props.title = title;
700
- props.data = data;
701
- props.footer = footer;
702
- if (template)
703
- props.template = template;
704
- this.currentComponent = this.domService.appendComponent(LockTooltip, document.body, props);
705
- this.popupInstance = this.currentComponent.instance;
706
- }
707
- closePopup() {
708
- if (this.currentComponent)
709
- this.popupInstance.removeMe(this.currentComponent);
710
- }
711
- }
712
- RAWidgetContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: RAWidgetContainer, deps: [{ token: i1.RaDashboardService }, { token: i2.NgxUiLoaderService }, { token: i3.RATranslateService }, { token: i0.NgZone }, { token: i4.NotifierService }, { token: i0.Renderer2 }, { token: i3.RAPermissionService }, { token: i3.DomService }], target: i0.ɵɵFactoryTarget.Component });
713
- RAWidgetContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: RAWidgetContainer, selector: "ra-widget-container", inputs: { widgetInstanceId: ["widget-instance-id", "widgetInstanceId"], globalFilter: ["global-filter", "globalFilter"], data: "data", raDashboardEventBus: ["event-bus", "raDashboardEventBus"], appConfig: ["app-config", "appConfig"], width: ["widget-width", "width"], height: ["widget-height", "height"], gridCellHeight: ["grid-cell-height", "gridCellHeight"], setResized: ["dom-resized", "setResized"] }, outputs: { widgetDeleted: "widgetDeleted", updateAppliedFilters: "updateAppliedFilters" }, viewQueries: [{ propertyName: "ctlWidget", first: true, predicate: ["ctlWidget"], descendants: true }, { propertyName: "widgetDropdown", first: true, predicate: ["widgetDropdown"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "wcWrapper", first: true, predicate: ["wcWrapper"], descendants: true }, { propertyName: "banPopupDiv", first: true, predicate: ["banPopupDiv"], descendants: true }, { propertyName: "lockPopupDiv", first: true, predicate: ["lockPopupDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #wcWrapper class=\"wc-wrapper\" (mouseenter)=\"mouseHover(true)\" (mouseleave)=\"mouseHover(false)\"\r\n [ngStyle]=\"{'margin-left': noPadding?'0px':'15px','margin-right': noPadding?'0px':'15px'}\">\r\n <div class=\"wcheader widget-move\" *ngIf=\"!hideTitle\"\r\n [ngClass]=\"{'underLine': enableTitleLine || isWidgetStateApplicable}\">\r\n <div class=\"col-md-12 wc-mover\" style=\"padding-left: 0px;height:inherit;padding-right: 0px;\">\r\n <div style=\"display:flex;margin-top:10px;\"\r\n [ngStyle]=\"{'margin-left': noPadding?'15px':'0px','margin-right': noPadding?'15px':'0px'}\">\r\n <div class=\"col-9 float-left title-label\">\r\n <ra-tooltip [value]=\"toolTipValue\" [width]=\"toolTipWidth\">\r\n <div [hidden]=\"hideTitle\" style=\"text-overflow: ellipsis;white-space: nowrap;overflow: hidden;\"\r\n (mouseover)=\"mouseOver($event)\" #searchInput>{{WidgetDisplayName}}</div>\r\n </ra-tooltip>\r\n </div>\r\n <div class=\"col-3\" style=\"cursor:default;padding-right: 0px;\"> \r\n <div class=\"float-right\" style=\"display: flex;\">\r\n <div #banPopupDiv (mouseover)=\"openPopup(inapplicableIconTitle,inapplicableFilters,inapplicableIconFooter,'innaplicable')\" (mouseout)=\"closePopup()\" class=\"title-bar-lock-icon lock-dropdown\" [hidden]=\"!inapplicableFilters || inapplicableFilters.length == 0 || !globalFilter || globalFilter == '{}'\">\r\n <i class=\"fal fa-ban lock\"></i> \r\n </div>\r\n <div #lockPopupDiv (mouseover)=\"openPopup(lockIconTitle,lockDetails,lockIconFooter,'lock',lockTemplateInfo)\" (mouseout)=\"closePopup()\" class=\"title-bar-lock-icon lock-dropdown\" [hidden]=\"!lockDetails && !lockTemplateInfo\">\r\n <i class=\"fal fa-lock lock\"></i> \r\n </div>\r\n <div class=\"widget-menu\" style=\"width:10px;\"\r\n [ngClass]=\"{'widget-menu-show': isMouseHover && showSettingsLink}\">\r\n <div class=\"dropbtn title-bar-icon\">\r\n <i (click)=\"showDropDown($event)\" #widgetDropdown class=\"fal fa-ellipsis-v widget-menu-ellipse\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hideTitle\" class=\"wcheader widget-move\"\r\n style=\"height: 45px;width: 95%;cursor: move;z-index: 99;opacity: 0;\">\r\n </div>\r\n <div *ngIf=\"hideTitle\" class=\"widget-menu widget-menu-title-hidden\" [ngClass]=\"{'widget-menu-show': isMouseHover && showSettingsLink}\">\r\n <div class=\"dropbtn title-bar-icon\">\r\n <i (click)=\"showDropDown($event)\" class=\"fal fa-ellipsis-v\" style=\"text-align: center;\"></i>\r\n </div>\r\n </div>\r\n <div class=\"wcBody\" [ngStyle]=\"{'bottom': noPadding?'0px':'10px','top':hideTitle?'10px':'46px'}\">\r\n <div [hidden]=\"isWidgetStateApplicable\" class=\"m-fadeOut widget-overlay\" [ngClass]=\"{'m-fadeIn': showPanel}\">\r\n <div class=\"lds-roller\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n <div class=\"wc\" [hidden]=\"isWidgetStateApplicable\">\r\n <div #ctlWidget></div>\r\n </div>\r\n <div *ngIf=\"isWidgetStateApplicable\" class=\"defaultConfig\">\r\n <ra-widget-state style=\"width: 100%;height: 100%;\" [isWidgetStateApplicable]=\"isWidgetStateApplicable\"\r\n [isGlobalFilterApplied]=\"isGlobalFilterApplied\" [widgetEmptyState]=\"widgetEmptyState\"\r\n (editWidgetClicked)=editWidget() [widthCol]=\"width\" [heightCol]=\"height\">\r\n </ra-widget-state>\r\n </div>\r\n <div>\r\n </div>\r\n </div>\r\n</div>", components: [{ type: i5.TooltipControl, selector: "ra-tooltip", inputs: ["data", "url", "value", "key", "dataField", "position", "width", "count", "moreItemText", "reset", "disable-tooltip", "set-top-padding"], outputs: ["dataLoaded"] }, { type: i5.WidgetStateControl, selector: "ra-widget-state", inputs: ["isWidgetStateApplicable", "isGlobalFilterApplied", "widgetEmptyState", "widgetEmptyDataText", "widthCol", "heightCol"], outputs: ["editWidgetClicked"] }], directives: [{ type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
714
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: RAWidgetContainer, decorators: [{
715
- type: Component,
716
- args: [{ selector: 'ra-widget-container', template: "<div #wcWrapper class=\"wc-wrapper\" (mouseenter)=\"mouseHover(true)\" (mouseleave)=\"mouseHover(false)\"\r\n [ngStyle]=\"{'margin-left': noPadding?'0px':'15px','margin-right': noPadding?'0px':'15px'}\">\r\n <div class=\"wcheader widget-move\" *ngIf=\"!hideTitle\"\r\n [ngClass]=\"{'underLine': enableTitleLine || isWidgetStateApplicable}\">\r\n <div class=\"col-md-12 wc-mover\" style=\"padding-left: 0px;height:inherit;padding-right: 0px;\">\r\n <div style=\"display:flex;margin-top:10px;\"\r\n [ngStyle]=\"{'margin-left': noPadding?'15px':'0px','margin-right': noPadding?'15px':'0px'}\">\r\n <div class=\"col-9 float-left title-label\">\r\n <ra-tooltip [value]=\"toolTipValue\" [width]=\"toolTipWidth\">\r\n <div [hidden]=\"hideTitle\" style=\"text-overflow: ellipsis;white-space: nowrap;overflow: hidden;\"\r\n (mouseover)=\"mouseOver($event)\" #searchInput>{{WidgetDisplayName}}</div>\r\n </ra-tooltip>\r\n </div>\r\n <div class=\"col-3\" style=\"cursor:default;padding-right: 0px;\"> \r\n <div class=\"float-right\" style=\"display: flex;\">\r\n <div #banPopupDiv (mouseover)=\"openPopup(inapplicableIconTitle,inapplicableFilters,inapplicableIconFooter,'innaplicable')\" (mouseout)=\"closePopup()\" class=\"title-bar-lock-icon lock-dropdown\" [hidden]=\"!inapplicableFilters || inapplicableFilters.length == 0 || !globalFilter || globalFilter == '{}'\">\r\n <i class=\"fal fa-ban lock\"></i> \r\n </div>\r\n <div #lockPopupDiv (mouseover)=\"openPopup(lockIconTitle,lockDetails,lockIconFooter,'lock',lockTemplateInfo)\" (mouseout)=\"closePopup()\" class=\"title-bar-lock-icon lock-dropdown\" [hidden]=\"!lockDetails && !lockTemplateInfo\">\r\n <i class=\"fal fa-lock lock\"></i> \r\n </div>\r\n <div class=\"widget-menu\" style=\"width:10px;\"\r\n [ngClass]=\"{'widget-menu-show': isMouseHover && showSettingsLink}\">\r\n <div class=\"dropbtn title-bar-icon\">\r\n <i (click)=\"showDropDown($event)\" #widgetDropdown class=\"fal fa-ellipsis-v widget-menu-ellipse\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hideTitle\" class=\"wcheader widget-move\"\r\n style=\"height: 45px;width: 95%;cursor: move;z-index: 99;opacity: 0;\">\r\n </div>\r\n <div *ngIf=\"hideTitle\" class=\"widget-menu widget-menu-title-hidden\" [ngClass]=\"{'widget-menu-show': isMouseHover && showSettingsLink}\">\r\n <div class=\"dropbtn title-bar-icon\">\r\n <i (click)=\"showDropDown($event)\" class=\"fal fa-ellipsis-v\" style=\"text-align: center;\"></i>\r\n </div>\r\n </div>\r\n <div class=\"wcBody\" [ngStyle]=\"{'bottom': noPadding?'0px':'10px','top':hideTitle?'10px':'46px'}\">\r\n <div [hidden]=\"isWidgetStateApplicable\" class=\"m-fadeOut widget-overlay\" [ngClass]=\"{'m-fadeIn': showPanel}\">\r\n <div class=\"lds-roller\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n <div class=\"wc\" [hidden]=\"isWidgetStateApplicable\">\r\n <div #ctlWidget></div>\r\n </div>\r\n <div *ngIf=\"isWidgetStateApplicable\" class=\"defaultConfig\">\r\n <ra-widget-state style=\"width: 100%;height: 100%;\" [isWidgetStateApplicable]=\"isWidgetStateApplicable\"\r\n [isGlobalFilterApplied]=\"isGlobalFilterApplied\" [widgetEmptyState]=\"widgetEmptyState\"\r\n (editWidgetClicked)=editWidget() [widthCol]=\"width\" [heightCol]=\"height\">\r\n </ra-widget-state>\r\n </div>\r\n <div>\r\n </div>\r\n </div>\r\n</div>" }]
717
- }], ctorParameters: function () { return [{ type: i1.RaDashboardService }, { type: i2.NgxUiLoaderService }, { type: i3.RATranslateService }, { type: i0.NgZone }, { type: i4.NotifierService }, { type: i0.Renderer2 }, { type: i3.RAPermissionService }, { type: i3.DomService }]; }, propDecorators: { ctlWidget: [{
718
- type: ViewChild,
719
- args: ['ctlWidget', { static: false }]
720
- }], widgetDropdown: [{
721
- type: ViewChild,
722
- args: ['widgetDropdown', { static: false }]
723
- }], searchInput: [{
724
- type: ViewChild,
725
- args: ['searchInput', { static: false }]
726
- }], wcWrapper: [{
727
- type: ViewChild,
728
- args: ['wcWrapper', { static: false }]
729
- }], banPopupDiv: [{
730
- type: ViewChild,
731
- args: ['banPopupDiv', { static: false }]
732
- }], lockPopupDiv: [{
733
- type: ViewChild,
734
- args: ['lockPopupDiv', { static: false }]
735
- }], widgetInstanceId: [{
736
- type: Input,
737
- args: ['widget-instance-id']
738
- }], globalFilter: [{
739
- type: Input,
740
- args: ['global-filter']
741
- }], data: [{
742
- type: Input,
743
- args: ['data']
744
- }], raDashboardEventBus: [{
745
- type: Input,
746
- args: ['event-bus']
747
- }], appConfig: [{
748
- type: Input,
749
- args: ['app-config']
750
- }], width: [{
751
- type: Input,
752
- args: ['widget-width']
753
- }], height: [{
754
- type: Input,
755
- args: ['widget-height']
756
- }], gridCellHeight: [{
757
- type: Input,
758
- args: ['grid-cell-height']
759
- }], widgetDeleted: [{
760
- type: Output
761
- }], updateAppliedFilters: [{
762
- type: Output
763
- }], setResized: [{
764
- type: Input,
765
- args: ['dom-resized']
766
- }] } });
767
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9saWIvcmEtd2lkZ2V0LWNvbnRhaW5lci9yYS53aWRnZXQuY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC1mcmFtZXdvcmsvc3JjL2xpYi9yYS13aWRnZXQtY29udGFpbmVyL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQW9HLE1BQU0sZUFBZSxDQUFDO0FBR3hNLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFnRCxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFrQixNQUFNLCtCQUErQixDQUFDO0FBSXBMLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQTs7Ozs7Ozs7QUFTbkUsTUFBTSxPQUFPLGlCQUFpQjtJQXVGNUIsWUFBb0IsZ0JBQW9DLEVBQzlDLFVBQThCLEVBQzlCLGdCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsUUFBeUIsRUFDekIsUUFBbUIsRUFDbkIsbUJBQXdDLEVBQ3hDLFVBQXNCO1FBUFoscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUM5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHdCQUFtQixHQUFuQixt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O2dCQUNBLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSSxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0csWUFBWTtzQkFBekQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVmLGdCQUFnQjtzQkFBNUMsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBQ0gsWUFBWTtzQkFBbkMsS0FBSzt1QkFBQyxlQUFlO2dCQUNQLElBQUk7c0JBQWxCLEtBQUs7dUJBQUMsTUFBTTtnQkFDTyxtQkFBbUI7c0JBQXRDLEtBQUs7dUJBQUMsV0FBVztnQkFDRyxTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ0ksS0FBSztzQkFBM0IsS0FBSzt1QkFBQyxjQUFjO2dCQUNHLE1BQU07c0JBQTdCLEtBQUs7dUJBQUMsZUFBZTtnQkFDSyxjQUFjO3NCQUF4QyxLQUFLO3VCQUFDLGtCQUFrQjtnQkFHZixhQUFhO3NCQUF0QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFjSCxVQUFVO3NCQURiLEtBQUs7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBTaW1wbGVDaGFuZ2UsIE9uRGVzdHJveSwgTmdab25lLCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJhRGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4vLi4vcmEuZGFzaGJvYXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSQURhc2hib2FyZEV2ZW50QnVzIH0gZnJvbSAnLi4vcmEuZGFzaGJhcmQuZXZlbnQuYnVzJztcclxuaW1wb3J0IHsgUkFFdmVudCwgUkFFdmVudEtleSB9IGZyb20gJy4uL3JhLmV2ZW50LmVudW0nO1xyXG5pbXBvcnQgeyBJQXBwQ29uZmlnLCBJV2lkZ2V0Q29uZmlnRmlsdGVyLCBJV2lkZ2V0SW5mbywgUkFEb3dubG9hZFR5cGUsIFJBRG93bmxvYWRPcHRpb24sIFJhV2lkZ2V0bG9ja1N0YXR1cywgV2lkZ2V0Vmlld1N0YXRlLCBJY29uZmlnQ2hhbmdlcyB9IGZyb20gJ0BzY2huZWlkZXJlc3Mvd2lkZ2V0ZnJhbWV3b3JrJztcclxuaW1wb3J0IHsgTmd4VWlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXVpLWxvYWRlcic7XHJcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItbm90aWZpZXInO1xyXG5pbXBvcnQgeyBSQVRyYW5zbGF0ZVNlcnZpY2UsIFJBUGVybWlzc2lvblNlcnZpY2UsIERvbVNlcnZpY2UgfSBmcm9tICdAc2NobmVpZGVyZXNzL3JhLWNvbW1vbic7XHJcbmltcG9ydCB7IExvY2tUb29sdGlwIH0gZnJvbSAnLi9sb2NrLXRvb2x0aXAvbG9jay50b29sdGlwLmNvbXBvbmVudCdcclxuXHJcbmRlY2xhcmUgdmFyIGpRdWVyeTogYW55O1xyXG5kZWNsYXJlIHZhciB3aW5kb3c6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncmEtd2lkZ2V0LWNvbnRhaW5lcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSQVdpZGdldENvbnRhaW5lciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBwdWJsaWMgc2hvd1BhbmVsOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGlzV2lkZ2V0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB3aWRnZXRFbGVtZW50OiBhbnk7XHJcbiAgcHJpdmF0ZSBjb25maWdDaGFuZ2VkOiBhbnk7XHJcbiAgcHVibGljIHdpZGdldEhlaWdodDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsb2NrQ2xhc3M6IHN0cmluZyA9IFwidW5sb2NrZWRcIjtcclxuICBwdWJsaWMgbG9ja1N0YXR1czogUmFXaWRnZXRsb2NrU3RhdHVzID0gUmFXaWRnZXRsb2NrU3RhdHVzLlVubG9ja2VkO1xyXG4gIHB1YmxpYyBpc0Rvd25sb2FkSWNvblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNDaGFydERvd25sb2FkVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0dyaWREb3dubG9hZFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZG93bmxvYWRJY29uVHlwZTogUkFEb3dubG9hZFR5cGU7XHJcbiAgcHVibGljIGVuYWJsZVRpdGxlTGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0dsb2JhbEZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdG9vbFRpcFZhbHVlOiBzdHJpbmcgPSAnICAnO1xyXG4gIHB1YmxpYyB0b29sVGlwV2lkdGg6IHN0cmluZyA9ICcwcHgnO1xyXG4gIHB1YmxpYyBsb2NrRGV0YWlsczogYW55O1xyXG4gIHB1YmxpYyBsb2NrVGVtcGxhdGVJbmZvOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBlZGl0VG9vbFRpcFZhbHVlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHVibGljIGNvcHlUb29sVGlwVmFsdWU6IHN0cmluZyA9ICcgJztcclxuICBwdWJsaWMgbW92ZVRvb2xUaXBWYWx1ZTogc3RyaW5nID0gJyAnO1xyXG4gIHB1YmxpYyBleGNlbFRvb2xUaXBWYWx1ZTogc3RyaW5nID0gJyAnO1xyXG4gIHB1YmxpYyBkZWxldGVUb29sVGlwVmFsdWU6IHN0cmluZyA9ICcgJztcclxuICBwdWJsaWMgZWRpdFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyBjb3B5VGV4dDogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIG1vdmVUZXh0OiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgZXhjZWxUZXh0OiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgZGVsZXRlVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIGVkaXRUb29sVGlwV2lkdGg6IHN0cmluZyA9ICcwcHgnO1xyXG4gIHB1YmxpYyBjb3B5VG9vbFRpcFdpZHRoOiBzdHJpbmcgPSAnMHB4JztcclxuICBwdWJsaWMgbW92ZVRvb2xUaXBXaWR0aDogc3RyaW5nID0gJzBweCc7XHJcbiAgcHVibGljIGV4Y2VsVG9vbFRpcFdpZHRoOiBzdHJpbmcgPSAnMHB4JztcclxuICBwdWJsaWMgZGVsZXRlVG9vbFRpcFdpZHRoOiBzdHJpbmcgPSAnMHB4JztcclxuICBwdWJsaWMgd2lkZ2V0U2V0dGluZ3M6IGFueTtcclxuICBwdWJsaWMgbm9QYWRkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzTW91c2VIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93U2V0dGluZ3NMaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgaXNLcGlWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dFeGNlbGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBoaWRlVGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaW5hcHBsaWNhYmxlRmlsdGVyczogYW55ID0gW107XHJcbiAgcHVibGljIHBvcHVwSW5zdGFuY2U6IExvY2tUb29sdGlwO1xyXG4gIHB1YmxpYyBjdXJyZW50Q29tcG9uZW50OiBhbnk7XHJcblxyXG4gIHB1YmxpYyBsb2NrSWNvblRpdGxlOiBhbnk7XHJcbiAgcHVibGljIGxvY2tJY29uRm9vdGVyOiBhbnk7XHJcbiAgcHVibGljIGluYXBwbGljYWJsZUljb25UaXRsZTogYW55O1xyXG4gIHB1YmxpYyBpbmFwcGxpY2FibGVJY29uRm9vdGVyOiBhbnk7XHJcblxyXG5cclxuICBAVmlld0NoaWxkKCdjdGxXaWRnZXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY3RsV2lkZ2V0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3dpZGdldERyb3Bkb3duJywgeyBzdGF0aWM6IGZhbHNlIH0pIHdpZGdldERyb3Bkb3duOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3djV3JhcHBlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB3Y1dyYXBwZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYmFuUG9wdXBEaXYnLCB7IHN0YXRpYzogZmFsc2UgfSkgYmFuUG9wdXBEaXY6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnbG9ja1BvcHVwRGl2JywgeyBzdGF0aWM6IGZhbHNlIH0pIGxvY2tQb3B1cERpdjogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCd3aWRnZXQtaW5zdGFuY2UtaWQnKSB3aWRnZXRJbnN0YW5jZUlkOiBudW1iZXI7XHJcbiAgQElucHV0KCdnbG9iYWwtZmlsdGVyJykgZ2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgQElucHV0KCdkYXRhJykgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgnZXZlbnQtYnVzJykgcmFEYXNoYm9hcmRFdmVudEJ1czogUkFEYXNoYm9hcmRFdmVudEJ1cztcclxuICBASW5wdXQoJ2FwcC1jb25maWcnKSBhcHBDb25maWc6IElBcHBDb25maWc7XHJcbiAgQElucHV0KCd3aWRnZXQtd2lkdGgnKSB3aWR0aDogbnVtYmVyO1xyXG4gIEBJbnB1dCgnd2lkZ2V0LWhlaWdodCcpIGhlaWdodDogbnVtYmVyO1xyXG4gIEBJbnB1dCgnZ3JpZC1jZWxsLWhlaWdodCcpIGdyaWRDZWxsSGVpZ2h0OiBudW1iZXI7XHJcblxyXG5cclxuICBAT3V0cHV0KCkgd2lkZ2V0RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSB1cGRhdGVBcHBsaWVkRmlsdGVycyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgbG9ja1RpdGxlOiBzdHJpbmc7XHJcbiAgcHVibGljIGlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHdpZGdldEVtcHR5U3RhdGU6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyBkb21SZXNpemVkOiBib29sZWFuO1xyXG4gIHB1YmxpYyBsb2NrVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBsb2NrZWRGaWVsZHM6IGFueTtcclxuICBwdWJsaWMgZGV0YWlsUGFnZVVybDogc3RyaW5nO1xyXG4gIHB1YmxpYyBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgcHVibGljIGlzV2lkZ2V0TWdtbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgV2lkZ2V0RGlzcGxheU5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgZW5hYmxlVGl0bGVMaW5lQWN0dWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHdpZGdldEVsZW1lbnRIYW5kbGVyOiBhbnk7XHJcbiAgQElucHV0KCdkb20tcmVzaXplZCcpXHJcbiAgc2V0IHNldFJlc2l6ZWQocmVzaXplZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pbnZva2VXaWRnZXRSZXNpemVkRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogUmFEYXNoYm9hcmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuZ3hTZXJ2aWNlOiBOZ3hVaUxvYWRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFJBVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIG5vdGlmaWVyOiBOb3RpZmllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJhUGVybWlzc2lvblNlcnZpY2U6IFJBUGVybWlzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRvbVNlcnZpY2U6IERvbVNlcnZpY2UpIHtcclxuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlLnRhcmdldC5jbGFzc05hbWUpIHtcclxuICAgICAgICBpZiAoZS50YXJnZXQuY2xhc3NOYW1lICE9ICdmYWwgZmEtZWxsaXBzaXMtdiB3aWRnZXQtbWVudS1lbGxpcHNlJykge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVNZW51KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTWVudSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLldpZGdldERpc3BsYXlOYW1lID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLicgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmxvY2tJY29uVGl0bGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24ubG9ja2VkZmllbGRzJyk7XHJcbiAgICB0aGlzLmxvY2tJY29uRm9vdGVyID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmxvY2tlZGZpZWxkc2VkaXRpbmZvJyk7XHJcbiAgICB0aGlzLmluYXBwbGljYWJsZUljb25UaXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5JbmFwcGxpY2FibGVGaWx0ZXJzJyk7XHJcbiAgICB0aGlzLmluYXBwbGljYWJsZUljb25Gb290ZXIgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uSW5hcHBsaWNhYmxlRmlsdGVyc0Rlc2MnKTtcclxuICB9XHJcbiAgZ2V0IHdpZGdldFZpZXdTdGF0ZSgpIHsgcmV0dXJuIFdpZGdldFZpZXdTdGF0ZTsgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzV2lkZ2V0TWdtbnQgPSB0aGlzLnJhUGVybWlzc2lvblNlcnZpY2UuaGFzUGVybWlzc2lvbigncmEud2lkZ2V0bWFuYWdlbWVudCcpO1xyXG4gICAgaWYgKGNoYW5nZXNbJ3JhRGFzaGJvYXJkRXZlbnRCdXMnXSAmJiBjaGFuZ2VzWydyYURhc2hib2FyZEV2ZW50QnVzJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3JhRGFzaGJvYXJkRXZlbnRCdXMnXS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZCA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmVXaXRoS2V5KFJBRXZlbnQuQ29uZmlnQ2hhbmdlZCwgUkFFdmVudEtleS5XaWRnZXRJbnN0YW5jZUlkLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkLnRvU3RyaW5nKCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NoYW5nZUV2ZW50SGFuZGxlcihlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudCAmJiBjaGFuZ2VzWydnbG9iYWxGaWx0ZXInXSAmJiBjaGFuZ2VzWydnbG9iYWxGaWx0ZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1snZ2xvYmFsRmlsdGVyJ10ucHJldmlvdXNWYWx1ZSkge1xyXG5cclxuICAgICAgbGV0IGZpbHRlck9iaiA9IHRoaXMuZ2V0UGFyc2VkQ29uZmlnKHRoaXMuZ2xvYmFsRmlsdGVyKTtcclxuICAgICAgaWYgKGZpbHRlck9iai5XaWRnZXRJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQgIT0gZmlsdGVyT2JqLldpZGdldEluc3RhbmNlSWQpXHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFdpZGdldCh0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1snd2lkdGgnXSAmJiBjaGFuZ2VzWyd3aWR0aCddLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzWyd3aWR0aCddLnByZXZpb3VzVmFsdWUgfHxcclxuICAgICAgKGNoYW5nZXNbJ2hlaWdodCddICYmIGNoYW5nZXNbJ2hlaWdodCddLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzWydoZWlnaHQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLmludm9rZVdpZGdldFJlc2l6ZWRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW52b2tlV2lkZ2V0UmVzaXplZEV2ZW50KCkge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudCkge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMud2lkZ2V0RWxlbWVudC53aWRnZXRSZXNpemVkID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBsZXQgc2l6ZTogYW55ID0ge307XHJcbiAgICAgICAgc2l6ZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgICAgICBzaXplLndpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICBzaXplLmNlbGxIZWlnaHQgPSB0aGlzLmdyaWRDZWxsSGVpZ2h0O1xyXG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC53aWRnZXRSZXNpemVkKHNpemUpO1xyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA9PSAxIHx8IHRoaXMud2lkdGggPT0gMSlcclxuICAgICAgICAgIHRoaXMuaXNLcGlWaWV3ID0gdHJ1ZVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuaXNLcGlWaWV3ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlSG92ZXIoaXNIb3ZlciA9IHRydWUpIHtcclxuICAgIHRoaXMuaXNNb3VzZUhvdmVyID0gaXNIb3ZlcjtcclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50KSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy53aWRnZXRFbGVtZW50LmhvdmVyU3RhdHVzID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuaG92ZXJTdGF0dXMoaXNIb3Zlcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCd3aWRnZXQgZnJhbWV3b3JrIG91dGRhdGVkLCBwbGVhc2UgdXBkYXRlIHRvIHZlcnNpb24gMC4wLjk2Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvYWRXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVtb3ZlTWVudSgpO1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgIH0pXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGxldCBpdGVtID0galF1ZXJ5KHRoaXMud2NXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcclxuICAgICAgaXRlbS5iaW5kKCdtb3VzZWVudGVyJywgKCkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5ncmlkc3Rlckl0ZW1FbnRlciA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaXRlbS5iaW5kKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5ncmlkc3Rlckl0ZW1FbnRlciA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF3aW5kb3cubW91c2VPdmVyV2lkZ2V0TWVudSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU1lbnUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ0NoYW5nZWQpXHJcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZC51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudEhhbmRsZXIgJiYgdGhpcy5kYXRhICYmIHRoaXMuZGF0YS53aWRnZXRJbmZvICYmIHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCd3aWRnZXRpbml0aWF0ZWQnICsgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCwgdGhpcy53aWRnZXRFbGVtZW50SGFuZGxlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFRvIEVkaXQgY3VycmVudCB3aWRnZXQgY29uZmlndXJhdGlvbiovXHJcbiAgcHVibGljIGVkaXRXaWRnZXQoKSB7XHJcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyOiBJV2lkZ2V0Q29uZmlnRmlsdGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50ICYmIHR5cGVvZiAodGhpcy53aWRnZXRFbGVtZW50LmdldENvbmZpZ0ZpbHRlcikgPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBsZXQgY29uZmlnRGF0YSA9IHRoaXMud2lkZ2V0RWxlbWVudC5nZXRDb25maWdGaWx0ZXIoKTtcclxuICAgICAgaWYgKGNvbmZpZ0RhdGEpIHtcclxuICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIgPSBjb25maWdEYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAod2lkZ2V0Q29uZmlnRmlsdGVyKSB7XHJcbiAgICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuV2lkZ2V0RWRpdENsaWNrZWQsIHdpZGdldENvbmZpZ0ZpbHRlcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHdpZGdldENvbmZpZ0ZpbHRlckRhdGEgPSB0aGlzLmdlbmVyYXRlQ29uZmlnRmlsdGVyKGZhbHNlKTtcclxuICAgICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5XaWRnZXRFZGl0Q2xpY2tlZCwgd2lkZ2V0Q29uZmlnRmlsdGVyRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVG8gRGVsZXRlIGN1cnJlbnQgd2lkZ2V0IGZyb20gRE9NKi9cclxuICBwdWJsaWMgZGVsZXRlV2lkZ2V0KCkge1xyXG4gICAgbGV0IHdpZGdldENvbnRhaW5lckNvbnRleHQgPSB0aGlzO1xyXG4gICAgd2lkZ2V0Q29udGFpbmVyQ29udGV4dC5uZ3hTZXJ2aWNlLnN0YXJ0KCk7XHJcbiAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LmRhc2hib2FyZFNlcnZpY2UuZGVsZXRlV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XHJcbiAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubmd4U2VydmljZS5zdG9wKCk7XHJcbiAgICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LndpZGdldERlbGV0ZWQuZW1pdCh0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgICAgICB0aGlzLnNldEluYXBwbGljYWJsZUZpbHRlcnModW5kZWZpbmVkLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5vdGlmaWVyLm5vdGlmeSgnZXJyb3InLCBcIiBcIiArIHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0ZhaWxlZFRvUmVtb3ZlV2lkZ2V0JykgKyBcIiAgKFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLicgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSwgdHJ1ZSkgKyBcIikhXCIpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG8gTW92ZSBvciBjaGFuZ2UgcG9zaXRpb24gaWYgY3VycmVudCB3aWRnZXQgY29udGFpbmVyKi9cclxuICBwdWJsaWMgbW92ZVdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuTW92ZVdpZGdldCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgdGhpcy5zZXRJbmFwcGxpY2FibGVGaWx0ZXJzKHVuZGVmaW5lZCwgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAvLyB0aGlzLmRhc2hib2FyZFNlcnZpY2UubW92ZVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBDb3B5IEN1cnJlbnQgd2lkZ2V0IHdpdGggc2FtZSBjb25maWd1cmF0aW9uKi9cclxuICBwdWJsaWMgY29weVdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuQ29weVdpZGdldCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgLy90aGlzLmRhc2hib2FyZFNlcnZpY2UuY29weVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB2aXNpdFBhZ2UoKSB7XHJcbiAgICB0aGlzLmJhc2VVcmwgPSB0aGlzLmdldEhvc3RVcmwoKTtcclxuICAgIGxldCB1cmwgPSB0aGlzLmJhc2VVcmwgKyB0aGlzLmRldGFpbFBhZ2VVcmw7XHJcbiAgICBpZiAodGhpcy5kYXRhLndpZGdldEluZm8gJiYgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0U2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy53aWRnZXRTZXR0aW5ncyA9IHRoaXMuZ2V0UGFyc2VkQ29uZmlnKHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKTtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0U2V0dGluZ3MuY3VzdG9tUGFnZVBhcmFtcyB8fCB0aGlzLndpZGdldFNldHRpbmdzLmN1c3RvbVBhZ2VVUkwpIHtcclxuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy53aWRnZXRFbGVtZW50LmdldFBhZ2VQYXJhbXNDbGlja2VkKCk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldFR5cGUgPT0gJ0FWIFdpZGdldCcgfHwgdGhpcy53aWRnZXRTZXR0aW5ncy5jdXN0b21QYWdlVVJMKVxyXG4gICAgICAgICAgICB1cmwgPSB1cmwgKyBwYXJhbXM7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHVybCA9IHVybCArICc/JyArIHBhcmFtcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEhvc3RVcmwoKSB7XHJcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICh3aW5kb3cubG9jYXRpb24ucG9ydCA/ICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0IDogJycpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbmZpZ0NoYW5nZUV2ZW50SGFuZGxlcih3aWRnZXRJbmZvOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YS53aWRnZXRJbmZvID0gd2lkZ2V0SW5mbztcclxuICAgIGlmICh0aGlzLmdyaWRDZWxsSGVpZ2h0ID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGEud2lkZ2V0SW5mby5yb3dIZWlnaHQgPSB0aGlzLmdyaWRDZWxsSGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudCAmJiB0eXBlb2YgKHRoaXMud2lkZ2V0RWxlbWVudC5zZXRDb25maWdGaWx0ZXIpID09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy53aWRnZXRFbGVtZW50LnNldENvbmZpZ0ZpbHRlcih0aGlzLmdlbmVyYXRlQ29uZmlnRmlsdGVyKHRydWUpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3dpZGdldCBmcmFtZXdvcmsgb3V0ZGF0ZWQsIHBsZWFzZSB1cGRhdGUgdG8gdmVyc2lvbiAwLjAuOTgnKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaFdpZGdldCh0aGlzLmRhdGEud2lkZ2V0SW5mbywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbmZpZ0ZpbHRlcihjb25maWdDaGFuZ2VkOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGxldCB3aWRnZXRDb25maWdGaWx0ZXJEYXRhID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xyXG4gICAgICBhcHBDb25maWc6IHRoaXMuYXBwQ29uZmlnLFxyXG4gICAgICBnbG9iYWxGaWx0ZXI6IHRoaXMuZ2xvYmFsRmlsdGVyLFxyXG4gICAgICB3aWRnZXRJbmZvOiB0aGlzLmRhdGEud2lkZ2V0SW5mbyxcclxuICAgICAgY29uZmlnOiB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRDb25maWdJbmZvLmNvbmZpZyxcclxuICAgICAgY29uZmlnQ2hhbmdlczogdGhpcy5nZXRDb25maWdDaGFuZ2VzKGNvbmZpZ0NoYW5nZWQpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2lkZ2V0Q29uZmlnRmlsdGVyRGF0YTtcclxuICB9XHJcblxyXG5cclxuICAvKiogIFRvIGxvYWQgZXh0ZXJuYWwgY3VzdG9tIGVsZW1lbnQgdG8gdGhlIHdpZGdldCBjb250YWluZXIqL1xyXG4gIGFzeW5jIGxvYWRXaWRnZXQod2lkZ2V0SW5mbzogYW55KSB7XHJcbiAgICB3aWRnZXRJbmZvLnJvd0hlaWdodCA9IHRoaXMuZ3JpZENlbGxIZWlnaHQ7XHJcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xyXG4gICAgICBjb25maWc6IHdpZGdldEluZm8ud2lkZ2V0Q29uZmlnSW5mby5jb25maWcsXHJcbiAgICAgIGdsb2JhbEZpbHRlcjogdGhpcy5nbG9iYWxGaWx0ZXIsXHJcbiAgICAgIGNvbmZpZ0NoYW5nZXM6IHRoaXMuZ2V0Q29uZmlnQ2hhbmdlcyhmYWxzZSlcclxuICAgIH1cclxuICAgIGlmICh3aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0U2V0dGluZ3MgPSB0aGlzLmdldFBhcnNlZENvbmZpZyh3aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKTtcclxuICAgICAgdGhpcy5hcHBsYXlXaWRnZXRTZXR0aW5ncyh0aGlzLndpZGdldFNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV0YWlsUGFnZVVybCA9IHdpZGdldEluZm8uZGV0YWlsUGFnZVVybDtcclxuICAgIGxldCBtZSA9IHRoaXM7XHJcbiAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UubG9hZEV4dGVybmFsU2NyaXB0KHdpZGdldEluZm8uc2NyaXB0VXJsLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0Tm90Q29uZmlndXJlZFN0YXRlKHdpZGdldEluZm8pO1xyXG4gICAgICBsZXQgYXBwTW9kdWxlID0gdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0TmFtZTtcclxuICAgICAgaWYgKHRoaXMuZGF0YS53aWRnZXRJbmZvLmFwcGxpY2F0aW9uTW9kdWxlICYmIHRoaXMuZGF0YS53aWRnZXRJbmZvLmFwcGxpY2F0aW9uTW9kdWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBhcHBNb2R1bGUgPSB0aGlzLmRhdGEud2lkZ2V0SW5mby5hcHBsaWNhdGlvbk1vZHVsZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UubG9hZFRyYW5zbGF0aW9ucyh0aGlzLmFwcENvbmZpZy5hcHBNYW5hZ2VtZW50QmFzZVVybCwgYXBwTW9kdWxlLCBmYWxzZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgbWUud2lkZ2V0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQod2lkZ2V0SW5mby5jdXN0b21UYWcpO1xyXG4gICAgICAgIG1lLndpZGdldEVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkZ2V0LWluc3RhbmNlLWlkXCIsIHdpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCk7XHJcblxyXG4gICAgICAgIGxldCBoYW5kbGVyID0gKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb24td2lkZ2V0LXJlc3BvbmQnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IGUuZGV0YWlsLnR5cGU7XHJcbiAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdvbkRhdGFMb2FkJzpcclxuICAgICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UGFuZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UGFuZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdvbkNvbmZpZ0VkaXRDbGlja2VkJzpcclxuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0V2lkZ2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnb25FbmFibGVEZWZhdWx0U3RhdGUnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNldEVtcHR5U3RhdGUoZS5kZXRhaWwuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnb25TZXRUaXRsZVVuZGVybGluZSc6XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbC5kYXRhID09IHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVUaXRsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVUaXRsZUxpbmUgPSB0aGlzLmVuYWJsZVRpdGxlTGluZUFjdHVhbDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdvbldpZGdldFRpdGxlSGlkZGVuJzpcclxuICAgICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsLmRhdGEgPT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVUaXRsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVUaXRsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ29uVXBkYXRlTG9ja0RhdGEnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNldExvY2soZS5kZXRhaWwuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnb25HbG9iYWxGaWx0ZXJBcHBsaWNhYmxlQ2hlY2snOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNldEluYXBwbGljYWJsZUZpbHRlcnMoZS5kZXRhaWwuZGF0YSwgd2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy53aWRnZXRFbGVtZW50LnRpdGxlTGluZUVuYWJsZWQpICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRpdGxlTGluZUVuYWJsZWQgPSB0aGlzLndpZGdldEVsZW1lbnQudGl0bGVMaW5lRW5hYmxlZCgpO1xyXG4gICAgICAgICAgICAgIGlmICh0aXRsZUxpbmVFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVRpdGxlTGluZSA9IHRpdGxlTGluZUVuYWJsZWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVRpdGxlTGluZUFjdHVhbCA9IHRpdGxlTGluZUVuYWJsZWQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdFRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uZWRpdCcpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmVkaXQnKS5sZW5ndGggPiA2KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5lZGl0VGV4dCA9ICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uZWRpdCcpLnN1YnN0cmluZygwLCA2KSArICcuLi4nKTtcclxuICAgICAgICAgICAgICB0aGlzLmVkaXRUb29sVGlwVmFsdWUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uZWRpdCcpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZWRpdFRvb2xUaXBXaWR0aCA9IFwiMzAwcHhcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNvcHlUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmNvcHknKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5jb3B5JykubGVuZ3RoID4gNikge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29weVRleHQgPSAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmNvcHknKS5zdWJzdHJpbmcoMCwgNikgKyAnLi4uJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb3B5VG9vbFRpcFZhbHVlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmNvcHknKTtcclxuICAgICAgICAgICAgICB0aGlzLmNvcHlUb29sVGlwV2lkdGggPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb3ZlVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5tb3ZlJylcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5tb3ZlJykubGVuZ3RoID4gNikge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZVRleHQgPSAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLm1vdmUnKS5zdWJzdHJpbmcoMCwgNikgKyAnLi4uJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9vbFRpcFZhbHVlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLm1vdmUnKTtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVUb29sVGlwV2lkdGggPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5leGNlbFRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uZXhjZWwnKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5leGNlbCcpLmxlbmd0aCA+IDYpIHtcclxuICAgICAgICAgICAgICB0aGlzLmV4Y2VsVGV4dCA9ICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uZXhjZWwnKS5zdWJzdHJpbmcoMCwgNikgKyAnLi4uJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5leGNlbFRvb2xUaXBWYWx1ZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5leGNlbCcpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZXhjZWxUb29sVGlwV2lkdGggPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kZWxldGVUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmRlbGV0ZScpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmRlbGV0ZScpLmxlbmd0aCA+IDYpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVRleHQgPSAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmRlbGV0ZScpLnN1YnN0cmluZygwLCA2KSArICcuLi4nKTtcclxuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVRvb2xUaXBWYWx1ZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5kZWxldGUnKTtcclxuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVRvb2xUaXBXaWR0aCA9IFwiMzAwcHhcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc1dpZGdldExvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci5hcHBDb25maWcgPSB0aGlzLmFwcENvbmZpZztcclxuICAgICAgICAgICAgd2lkZ2V0Q29uZmlnRmlsdGVyLndpZGdldEluZm8gPSB3aWRnZXRJbmZvO1xyXG4gICAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIuY29uZmlnQ2hhbmdlcyA9IHRoaXMuZ2V0Q29uZmlnQ2hhbmdlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci53aWRnZXRJbmZvLndpZGdldE5hbWUgPSB3aWRnZXRJbmZvLndpZGdldE5hbWU7XHJcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci5nbG9iYWxGaWx0ZXIgPSB0aGlzLmdsb2JhbEZpbHRlcjtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LmxvYWRDb250ZW50KHdpZGdldENvbmZpZ0ZpbHRlcik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TG9jayh3aWRnZXRDb25maWdGaWx0ZXIuY29uZmlnKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXREb3dubG9hZEljb24oKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnRIYW5kbGVyID0gaGFuZGxlcjtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3dpZGdldGluaXRpYXRlZCcgKyB3aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuY3RsV2lkZ2V0Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy53aWRnZXRFbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlRvIHNldCBEZWZhdWx0IFN0YXRlIGZvciB0aGUgd2lkZ2V0IHdoZW4gaXQgaXMgbm90IGNvbmZpZ3VyZWQgKi9cclxuICBzZXROb3RDb25maWd1cmVkU3RhdGUod2lkZ2V0SW5mbzogSVdpZGdldEluZm8sIGZvcmNlRW5hYmxlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICgod2lkZ2V0SW5mby5zaG93RGVmYXVsdFN0YXRlICYmICh3aWRnZXRJbmZvLndpZGdldENvbmZpZ0luZm8uY29uZmlnID09IFwiXCIgfHwgT2JqZWN0LmtleXMoSlNPTi5wYXJzZSh3aWRnZXRJbmZvLndpZGdldENvbmZpZ0luZm8uY29uZmlnKSkubGVuZ3RoID09IDApKSB8fCAoZm9yY2VFbmFibGUpKSB7XHJcbiAgICAgIHRoaXMuaXNXaWRnZXRTdGF0ZUFwcGxpY2FibGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLndpZGdldEVtcHR5U3RhdGUgPSBXaWRnZXRWaWV3U3RhdGUuZW1wdHlDb25maWcudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLndpZGdldEVtcHR5U3RhdGUgPSAnJztcclxuICAgICAgdGhpcy5pc1dpZGdldFN0YXRlQXBwbGljYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqVG8gY29uZmlndXJlIGVtcHR5IHN0YXRlIGZvciB0aGUgd2lkZ2V0ICAqL1xyXG4gIHNldEVtcHR5U3RhdGUod2lkZ2V0U3RhdGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaGVpZ2h0ID09IDEgfHwgdGhpcy53aWR0aCA9PSAxKVxyXG4gICAgICB0aGlzLmlzS3BpVmlldyA9IHRydWVcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5pc0twaVZpZXcgPSBmYWxzZTtcclxuICAgIHRoaXMud2lkZ2V0RW1wdHlTdGF0ZSA9IHdpZGdldFN0YXRlLndpZGdldFZpZXdTdGF0ZTtcclxuICAgIHRoaXMuaXNHbG9iYWxGaWx0ZXJBcHBsaWVkID0gd2lkZ2V0U3RhdGUuaXNHbG9iYWxGaWx0ZXJBcHBsaWVkO1xyXG4gICAgaWYgKHdpZGdldFN0YXRlICE9IFdpZGdldFZpZXdTdGF0ZS5ub3JtYWwpIHtcclxuICAgICAgdGhpcy5pc1dpZGdldFN0YXRlQXBwbGljYWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNEb3dubG9hZEljb25WaXNpYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5pc1dpZGdldFN0YXRlQXBwbGljYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh3aWRnZXRTdGF0ZSkge1xyXG4gICAgICBjYXNlIFdpZGdldFZpZXdTdGF0ZS5lbXB0eUNvbmZpZzpcclxuICAgICAgICB0aGlzLnNldE5vdENvbmZpZ3VyZWRTdGF0ZSh0aGlzLmRhdGEud2lkZ2V0SW5mbywgdHJ1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgV2lkZ2V0Vmlld1N0YXRlLmVtcHR5RGF0YTpcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBXaWRnZXRWaWV3U3RhdGUuZXJyb3I6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWdDaGFuZ2VzKGNvbmZpZ0NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgbGV0IGNvbmZpZ0NoYW5nZXMgPSA8SWNvbmZpZ0NoYW5nZXM+e1xyXG4gICAgICBpc0NvbmZpZ1VwZGF0ZWQ6IGNvbmZpZ0NoYW5nZWQsXHJcbiAgICAgIHVwZGF0ZWRDb25maWdQcm9wZXJ0eTogW11cclxuICAgIH1cclxuICAgIHJldHVybiBjb25maWdDaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvIHJlZnJlc2ggd2lkZ2V0IG9uIGlucHV0IGNvbmZpZyBjaGFuZ2VzICovXHJcbiAgYXN5bmMgcmVmcmVzaFdpZGdldCh3aWRnZXRJbmZvOiBJV2lkZ2V0SW5mbywgY29uZmlnQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLldpZGdldERpc3BsYXlOYW1lID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLicgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSwgdHJ1ZSk7XHJcbiAgICB3aWRnZXRJbmZvLnJvd0hlaWdodCA9IHRoaXMuZ3JpZENlbGxIZWlnaHQ7XHJcbiAgICB0aGlzLnNldE5vdENvbmZpZ3VyZWRTdGF0ZSh3aWRnZXRJbmZvKTtcclxuICAgIGxldCB3aWRnZXRDb250YWluZXJDb250ZXh0ID0gdGhpcztcclxuXHJcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xyXG4gICAgICBjb25maWc6IHdpZGdldEluZm8ud2lkZ2V0Q29uZmlnSW5mby5jb25maWcsXHJcbiAgICAgIGdsb2JhbEZpbHRlcjogdGhpcy5nbG9iYWxGaWx0ZXIsXHJcbiAgICAgIGFwcENvbmZpZzogdGhpcy5hcHBDb25maWcsXHJcbiAgICAgIHdpZGdldEluZm86IHdpZGdldEluZm8sXHJcbiAgICAgIGNvbmZpZ0NoYW5nZXM6IHRoaXMuZ2V0Q29uZmlnQ2hhbmdlcyhjb25maWdDaGFuZ2VkKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aWRnZXRDb250YWluZXJDb250ZXh0LmlzV2lkZ2V0TG9hZGVkKSB7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEVsZW1lbnQgJiYgdHlwZW9mICh0aGlzLndpZGdldEVsZW1lbnQuc2V0Q29uZmlnRmlsdGVyKSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgd2lkZ2V0Q29udGFpbmVyQ29udGV4dC53aWRnZXRFbGVtZW50LnNldENvbmZpZ0ZpbHRlcih3aWRnZXRDb25maWdGaWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RWxlbWVudC5sb2FkQ29udGVudCh3aWRnZXRDb25maWdGaWx0ZXIpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldExvY2sod2lkZ2V0Q29uZmlnRmlsdGVyLmNvbmZpZyk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0RG93bmxvYWRJY29uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VPdmVyKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMudG9vbFRpcFZhbHVlID0gJyAnO1xyXG4gICAgdGhpcy50b29sVGlwV2lkdGggPSAnMHB4JztcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKGVsZW1lbnQub2Zmc2V0V2lkdGggPCBlbGVtZW50LnNjcm9sbFdpZHRoKSB7XHJcbiAgICAgIHRoaXMudG9vbFRpcFZhbHVlID0gZWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAgIHRoaXMudG9vbFRpcFdpZHRoID0gJzMwMHB4JztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvb2xUaXBXaWR0aCA9ICcwcHgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRMb2NrKGNvbmZpZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxvY2tUZW1wbGF0ZUluZm8gPSB0aGlzLndpZGdldEVsZW1lbnQubG9hZExvY2tJbmZvKCk7XHJcbiAgICB2YXIgY29uZmlnT2JqOiBhbnk7XHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIGNvbmZpZ09iaiA9IEpTT04ucGFyc2UoY29uZmlnKTtcclxuICAgICAgaWYgKGNvbmZpZ09iaiAmJiBjb25maWdPYmouTG9ja3MgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZ09iai5Mb2Nrcy5Jc0RhdGVMb2NrZWQgfHwgY29uZmlnT2JqLkxvY2tzLklzRGF0ZXNMb2NrZWQgfHwgY29uZmlnT2JqLkxvY2tzLklzUGFydGljaXBhbnRMb2NrZWQgfHwgY29uZmlnT2JqLkxvY2tzLklzU291cmNlTG9ja2VkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2tEZXRhaWxzID0gW107XHJcbiAgICAgICAgICBpZiAoY29uZmlnT2JqLkxvY2tzLklzRGF0ZUxvY2tlZCB8fCBjb25maWdPYmouTG9ja3MuSXNEYXRlc0xvY2tlZClcclxuICAgICAgICAgICAgdGhpcy5sb2NrRGV0YWlscy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5EYXRlUmFuZ2UnKSk7XHJcblxyXG4gICAgICAgICAgaWYgKGNvbmZpZ09iai5Mb2Nrcy5Jc1BhcnRpY2lwYW50TG9ja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9ja0RldGFpbHMucHVzaCh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uRGl2aXNpb25Pckdyb3Vwb3JTaXRlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGNvbmZpZ09iai5Mb2Nrcy5Jc1NvdXJjZUxvY2tlZClcclxuICAgICAgICAgICAgdGhpcy5sb2NrRGV0YWlscy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5EYXRhU3RyZWFtJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubG9ja0RldGFpbHMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9ja0RldGFpbHMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXREb3dubG9hZEljb24oKSB7XHJcbiAgICBsZXQgZG93bmxvYWRUeXBlID0gYXdhaXQgdGhpcy53aWRnZXRFbGVtZW50LmdldERvd25sb2FkVHlwZSgpO1xyXG4gICAgdGhpcy5kb3dubG9hZEljb25UeXBlID0gZG93bmxvYWRUeXBlO1xyXG4gICAgdGhpcy5pc0Rvd25sb2FkSWNvblZpc2libGUgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDaGFydERvd25sb2FkVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0dyaWREb3dubG9hZFZpc2libGUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0V4Y2VsbCA9IHRydWU7XHJcbiAgICBpZiAoZG93bmxvYWRUeXBlICE9IFJBRG93bmxvYWRUeXBlLk5vbmUpIHtcclxuICAgICAgdGhpcy5pc0Rvd25sb2FkSWNvblZpc2libGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1dpZGdldE1nbW50ICYmICF0aGlzLmRldGFpbFBhZ2VVcmwpIHtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5nc0xpbmsgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkb3dubG9hZFR5cGUgPT0gUkFEb3dubG9hZFR5cGUuQ2hhcnQpIHtcclxuICAgICAgdGhpcy5pc0NoYXJ0RG93bmxvYWRWaXNpYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZG93bmxvYWRUeXBlID09IFJBRG93bmxvYWRUeXBlLkdyaWQpIHtcclxuICAgICAgdGhpcy5pc0dyaWREb3dubG9hZFZpc2libGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkb3dubG9hZFR5cGUgPT0gUkFEb3dubG9hZFR5cGUuU3RhdGlzdGljcykge1xyXG4gICAgICB0aGlzLmlzR3JpZERvd25sb2FkVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd0V4Y2VsbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvd25sb2FkSWNvbkNsaWNrZWQodHlwZTogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBcIkNTVlwiOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLkNTVik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJQTkdcIjpcclxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuZG93bmxvYWRDbGlja2VkKHRoaXMuZG93bmxvYWRJY29uVHlwZSwgUkFEb3dubG9hZE9wdGlvbi5QTkcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiUERGXCI6XHJcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LmRvd25sb2FkQ2xpY2tlZCh0aGlzLmRvd25sb2FkSWNvblR5cGUsIFJBRG93bmxvYWRPcHRpb24uUERGKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlNWR1wiOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLlNWRyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJKUEVHXCI6XHJcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LmRvd25sb2FkQ2xpY2tlZCh0aGlzLmRvd25sb2FkSWNvblR5cGUsIFJBRG93bmxvYWRPcHRpb24uSlBFRyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZU1lbnUoKSB7XHJcbiAgICBqUXVlcnkoJyNyYS1kYi13aWRnZXQtbWVudScpLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1Zpc2l0TGlua1Zpc2libGl0eSgpIHtcclxuICAgIGxldCBpc1Zpc2l0QXBwbGljYWJsZSA9IHRydWU7XHJcbiAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50ICYmIHR5cGVvZiB0aGlzLndpZGdldEVsZW1lbnQuZ2V0VmlzaXRMaW5rVmlzaWJpbGl0eVN0YXR1cyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGlzVmlzaXRBcHBsaWNhYmxlID0gdGhpcy53aWRnZXRFbGVtZW50LmdldFZpc2l0TGlua1Zpc2liaWxpdHlTdGF0dXMoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc1Zpc2l0QXBwbGljYWJsZTtcclxuICB9XHJcblxyXG4gIC8qKlNob3cgZHJvcGRvd24gb24gZ2VhciBpY29uIGNsaWNrICAqL1xyXG4gIHB1YmxpYyBzaG93RHJvcERvd24oZTogYW55KSB7XHJcbiAgICB0aGlzLnNldERvd25sb2FkSWNvbigpO1xyXG5cclxuICAgIHRoaXMucmVtb3ZlTWVudSgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG5cclxuICAgICAgbGV0IHRhcmdldFBvcyA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBsZXQgc3R5bGU6IHN0cmluZyA9IFwicG9zaXRpb246Zml4ZWQ7dG9wOlwiICsgKHRhcmdldFBvcy55ICsgMTUpICsgJ3B4JyArICc7bGVmdDonICsgKGUucGFnZVggLSAxMjIpICsgJ3B4O3otaW5kZXg6MTAwMDsnO1xyXG4gICAgICBsZXQgaHRtbCA9IHRoaXMuZ2V0Q29udGVueHRIdG1sKHN0eWxlKTtcclxuXHJcbiAgICAgIGpRdWVyeShodG1sKS5hcHBlbmRUbygnYm9keScpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNXaWRnZXRNZ21udCkge1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2NFZGl0V2lkZ2V0JywgdGhpcy5lZGl0V2lkZ2V0KTtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3djQ29weVdpZGdldCcsIHRoaXMuY29weVdpZGdldCk7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd3Y01vdmVXaWRnZXQnLCB0aGlzLm1vdmVXaWRnZXQpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2NXaWRnZXREZWxldGUnLCB0aGlzLmRlbGV0ZVdpZGdldCk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGN1c3RvbVBhZ2VQYXJhbXMgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuZGF0YS53aWRnZXRJbmZvICYmIHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKSB7XHJcbiAgICAgICAgdGhpcy53aWRnZXRTZXR0aW5ncyA9IHRoaXMuZ2V0UGFyc2VkQ29uZmlnKHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKTtcclxuICAgICAgICBpZiAodGhpcy53aWRnZXRTZXR0aW5ncy5jdXN0b21QYWdlUGFyYW1zIHx8IHRoaXMud2lkZ2V0U2V0dGluZ3MuY3VzdG9tUGFnZVVSTCkge1xyXG4gICAgICAgICAgY3VzdG9tUGFnZVBhcmFtcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKHRoaXMuZGV0YWlsUGFnZVVybCB8fCBjdXN0b21QYWdlUGFyYW1zKSAmJiB0aGlzLmNoZWNrVmlzaXRMaW5rVmlzaWJsaXR5KCkpIHtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3djVmlzaXRXaWRnZXQnLCB0aGlzLnZpc2l0UGFnZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNDaGFydERvd25sb2FkVmlzaWJsZSkge1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2NEb3dubG9hZFBuZycsIHRoaXMuZG93bmxvYWRJY29uQ2xpY2tlZCwgJ1BORycpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2NEb3dubG9hZEpwZycsIHRoaXMuZG93bmxvYWRJY29uQ2xpY2tlZCwgJ0pQRUcnKTtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3djRG93bmxvYWRQZGYnLCB0aGlzLmRvd25sb2FkSWNvbkNsaWNrZWQsICdQREYnKTtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3djRG93bmxvYWRTdmcnLCB0aGlzLmRvd25sb2FkSWNvbkNsaWNrZWQsICdTVkcnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pc0dyaWREb3dubG9hZFZpc2libGUgJiYgdGhpcy5zaG93RXhjZWxsKSB7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd3Y0Rvd25sb2FkRXhjZWwnLCB0aGlzLmRvd25sb2FkSWNvbkNsaWNrZWQsICdDU1YnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhLWRiLXdpZGdldC1tZW51Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93Lm1vdXNlT3ZlcldpZGdldE1lbnUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhLWRiLXdpZGdldC1tZW51Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93Lm1vdXNlT3ZlcldpZGdldE1lbnUgPSBmYWxzZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICghd2luZG93LmdyaWRzdGVySXRlbUVudGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTWVudSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcihpZDogc3RyaW5nLCBldmVudDogYW55LCBwYXJhbXM/OiBhbnkpIHtcclxuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBldmVudC5jYWxsKHRoaXMsIHBhcmFtcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250ZW54dEh0bWwoc3R5bGU6IHN0cmluZykge1xyXG4gICAgbGV0IGh0bWw6IHN0cmluZyA9ICc8ZGl2IGlkPVwicmEtZGItd2lkZ2V0LW1lbnVcIicgKyAnc3R5bGU9XCInICsgc3R5bGUgKyAnXCIgY2xhc3M9XCJkb3dubG9hZC1jb250ZW50IGRyb3Bkb3duLWNvbnRlbnQgd2lkZ2V0LWNvbmZpZy1pdGVtIGRyb3Bkb3duLWNsaWNrXCIgc3R5bGU9XCJ6LWluZGV4OiAxMDAyO1wiPic7XHJcblxyXG4gICAgbGV0IHNldHRpbmdzID0gJyc7XHJcbiAgICBpZiAodGhpcy5pc1dpZGdldE1nbW50KSB7XHJcbiAgICAgIHNldHRpbmdzICs9IHRoaXMuZ2V0SHRtbEZvckJ1dHRvbignd2NFZGl0V2lkZ2V0JywgJ2ZhbCBmYS1lZGl0JywgdGhpcy5lZGl0VGV4dCk7XHJcbiAgICAgIHNldHRpbmdzICs9IHRoaXMuZ2V0SHRtbEZvckJ1dHRvbignd2NDb3B5V2lkZ2V0JywgJ2ZhbCBmYS1jb3B5JywgdGhpcy5jb3B5VGV4dCk7XHJcbiAgICAgIHNldHRpbmdzICs9IHRoaXMuZ2V0SHRtbEZvckJ1dHRvbignd2NNb3ZlV2lkZ2V0JywgJ2ZhbCBmYS1hcnJvd3MtYWx0JywgdGhpcy5tb3ZlVGV4dCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY3VzdG9tUGFnZVBhcmFtcyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZGF0YS53aWRnZXRJbmZvICYmIHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldFNldHRpbmdzKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0U2V0dGluZ3MgPSB0aGlzLmdldFBhcnNlZENvbmZpZyh0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRTZXR0aW5ncyk7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldFNldHRpbmdzLmN1c3RvbVBhZ2VQYXJhbXMgfHwgdGhpcy53aWRnZXRTZXR0aW5ncy5jdXN0b21QYWdlVVJMKSB7XHJcbiAgICAgICAgY3VzdG9tUGFnZVBhcmFtcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICgodGhpcy5kZXRhaWxQYWdlVXJsIHx8IGN1c3RvbVBhZ2VQYXJhbXMpICYmIHRoaXMuY2hlY2tWaXNpdExpbmtWaXNpYmxpdHkoKSkge1xyXG4gICAgICBzZXR0aW5ncyArPSAnPGEgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMHB4O2FsaWduLWl0ZW1zOiBjZW50ZXI7YWxpZ24tY29udGVudDogY2VudGVyOyBkaXNwbGF5OiBmbGV4O1wiIGlkPVwid2NWaXNpdFdpZGdldFwiPic7XHJcbiAgICAgIHNldHRpbmdzICs9ICc8aSBzdHlsZT1cInBhZGRpbmctbGVmdDogNHB4O2ZvbnQtc2l6ZTogMjdweCAhaW1wb3J0YW50O1wiIGNsYXNzPVwiZmFsIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPiAnO1xyXG4gICAgICBzZXR0aW5ncyArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDExcHg7bWFyZ2luLXRvcDogMnB4O1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiA2cHg7XCI+JztcclxuICAgICAgc2V0dGluZ3MgKz0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLnZpc2l0cGFnZScpO1xyXG4gICAgICBzZXR0aW5ncyArPSAnPC9zcGFuPjwvYT4nO1xyXG4gICAgfVxyXG4gICAgaWYgKCh0aGlzLmRldGFpbFBhZ2VVcmwgJiYgdGhpcy5jaGVja1Zpc2l0TGlua1Zpc2libGl0eSgpKSB8fCB0aGlzLmlzV2lkZ2V0TWdtbnQpIHtcclxuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImNvbG9yOiAjOUZBMEE0O2ZvbnQtc2l6ZTogMTJweDtwYWRkaW5nLXRvcDogOHB4O3BhZGRpbmctbGVmdDogMTJweDtcIj4nO1xyXG4gICAgICBodG1sICs9IHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5zZXR0aW5ncycpICsgJzwvZGl2Pic7XHJcbiAgICAgIGh0bWwgKz0gc2V0dGluZ3M7XHJcbiAgICAgIGh0bWwgKz0gdGhpcy5nZXRIcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRG93bmxvYWRJY29uVmlzaWJsZSkge1xyXG4gICAgICBpZiAodGhpcy5zaG93RXhjZWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGV0YWlsUGFnZVVybCB8fCB0aGlzLmlzV2lkZ2V0TWdtbnQpXHJcbiAgICAgICAgICBodG1sICs9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiAjOUZBMEE0O2ZvbnQtc2l6ZTogMTJweDtcIj4nO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICM5RkEwQTQ7Zm9udC1zaXplOiAxMnB4O3BhZGRpbmctdG9wOjVweDtkaXNwbGF5OmJsb2NrO1wiPic7XHJcblxyXG4gICAgICAgIGh0bWwgKz0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmRvd25sb2FkcycpO1xyXG4gICAgICAgIGh0bWwgKz0gJzwvc3Bhbj4nO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0NoYXJ0RG93bmxvYWRWaXNpYmxlKSB7XHJcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmctdG9wOiAxMHB4O1wiIGNsYXNzPVwiY2hhcnREb3dubG9hZFwiPic7XHJcbiAgICAgICAgaHRtbCArPSB0aGlzLmdldEh0bWxGb3JCdXR0b24oJ3djRG93bmxvYWRQbmcnLCAnZmFsIGZhLWZpbGUtaW1hZ2UnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24ucG5nJykpO1xyXG4gICAgICAgIGh0bWwgKz0gdGhpcy5nZXRIdG1sRm9yQnV0dG9uKCd3Y0Rvd25sb2FkSnBnJywgJ2ZhbCBmYS1maWxlLWltYWdlJywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmpwZWcnKSk7XHJcbiAgICAgICAgaHRtbCArPSB0aGlzLmdldEh0bWxGb3JCdXR0b24oJ3djRG93bmxvYWRQZGYnLCAnZmFsIGZhLWZpbGUtcGRmJywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLnBkZicpKTtcclxuICAgICAgICBodG1sICs9IHRoaXMuZ2V0SHRtbEZvckJ1dHRvbignd2NEb3dubG9hZFN2ZycsICdmYWwgZmEtZmlsZS1hbHQnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uc3ZnJykpO1xyXG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNHcmlkRG93bmxvYWRWaXNpYmxlICYmIHRoaXMuc2hvd0V4Y2VsbCkge1xyXG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJncmlkRG93bmxvYWRcIj4nO1xyXG4gICAgICAgIGh0bWwgKz0gdGhpcy5nZXRIdG1sRm9yQnV0dG9uKCd3Y0Rvd25sb2FkRXhjZWwnLCAnZmFsIGZhLWRvd25sb2FkJywgdGhpcy5leGNlbFRleHQpO1xyXG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzRG93bmxvYWRJY29uVmlzaWJsZSAmJiB0aGlzLmlzV2lkZ2V0TWdtbnQgJiYgdGhpcy5zaG93RXhjZWxsKSB7XHJcbiAgICAgIGh0bWwgKz0gdGhpcy5nZXRIcigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNXaWRnZXRNZ21udCkge1xyXG4gICAgICBodG1sICs9ICc8YSBpZD1cIndjV2lkZ2V0RGVsZXRlXCI+PGkgY2xhc3M9XCJmYWwgZmEtdGltZXNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogM3B4O2NvbG9yOiByZWQ7XCI+PC9pPjxzcGFuPic7XHJcbiAgICAgIGh0bWwgKz0gdGhpcy5kZWxldGVUZXh0O1xyXG4gICAgICBodG1sICs9ICc8L3NwYW4+PC9hPic7XHJcbiAgICB9XHJcblxyXG4gICAgaHRtbCArPSAnPC9kaXY+JztcclxuICAgIHJldHVybiBodG1sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIcigpIHtcclxuICAgIHJldHVybiAnPGhyIGNsYXNzPVwiaHJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDVweDttYXJnaW4tYm90dG9tOiA1cHg7XCI+JztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SHRtbEZvckJ1dHRvbihpZDogc3RyaW5nLCBmb250Q2xhc3M6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XHJcbiAgICBsZXQgaHRtbCA9ICc8YSBpZD1cIicgKyBpZCArICdcIj48aSBzdHlsZT1cIndpZHRoOjE2cHhcIiBjbGFzcz1cIicgKyBmb250Q2xhc3MgKyAnXCI+PC9pPiA8c3BhbiBzdHlsZT1cInBhZGRpbmctbGVmdDogNnB4O1wiPic7XHJcbiAgICBodG1sICs9IHRleHQ7XHJcbiAgICBodG1sICs9ICc8L3NwYW4+PC9hPic7XHJcbiAgICByZXR1cm4gaHRtbDtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGdldFBhcnNlZENvbmZpZyhjb25maWc6IGFueSkge1xyXG4gICAgbGV0IHBhcnNlZENvbmZpZzogYW55O1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgcGFyc2VkQ29uZmlnID0gSlNPTi5wYXJzZShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICBwYXJzZWRDb25maWcgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZENvbmZpZztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmZpZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbGF5V2lkZ2V0U2V0dGluZ3Moc2V0dGluZ3M6IGFueSkge1xyXG4gICAgaWYgKHNldHRpbmdzLk5vUGFkZGluZylcclxuICAgICAgdGhpcy5ub1BhZGRpbmcgPSB0cnVlXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubm9QYWRkaW5nID0gZmFsc2VcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5hcHBsaWNhYmxlRmlsdGVycyhkYXRhOiBhbnksIGluc3RhbmNlSWQ6IGFueSkge1xyXG4gICAgdmFyIHdpZGdldERhdGE6IGFueSA9IHt9O1xyXG4gICAgdGhpcy5pbmFwcGxpY2FibGVGaWx0ZXJzID0gW107XHJcbiAgICB3aWRnZXREYXRhLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQgPT0gJ2RhdGVSYW5nZScpXHJcbiAgICAgICAgICB0aGlzLmluYXBwbGljYWJsZUZpbHRlcnMucHVzaCh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uRGF0ZVJhbmdlJykpO1xyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgPT0gJ3BhcnRpY2lwYW50Jykge1xyXG4gICAgICAgICAgdGhpcy5pbmFwcGxpY2FibGVGaWx0ZXJzLnB1c2godGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLkRpdmlzaW9uR3JvdXAnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgPT0gJ3NvdXJjZScpXHJcbiAgICAgICAgICB0aGlzLmluYXBwbGljYWJsZUZpbHRlcnMucHVzaCh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uRGF0YVN0cmVhbScpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLmluYXBwbGljYWJsZUZpbHRlcnMucHVzaChlbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHdpZGdldERhdGEuZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgd2lkZ2V0RGF0YS5kYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBcHBsaWVkRmlsdGVycy5lbWl0KHdpZGdldERhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5Qb3B1cCh0aXRsZTogYW55LCBkYXRhOiBhbnksIGZvb3RlcjogYW55LCB0eXBlOiBhbnksIHRlbXBsYXRlOiBhbnkgPSB1bmRlZmluZWQpIHtcclxuICAgIGxldCBwcm9wczogYW55ID0ge307XHJcbiAgICBpZiAodHlwZSA9PSAnaW5uYXBsaWNhYmxlJyAmJiB0aGlzLmJhblBvcHVwRGl2KVxyXG4gICAgICBwcm9wcy5lbGVtZW50ID0gdGhpcy5iYW5Qb3B1cERpdi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKHR5cGUgPT0gJ2xvY2snICYmIHRoaXMubG9ja1BvcHVwRGl2KVxyXG4gICAgICBwcm9wcy5lbGVtZW50ID0gdGhpcy5sb2NrUG9wdXBEaXYubmF0aXZlRWxlbWVudDtcclxuICAgIHByb3BzLnRpdGxlID0gdGl0bGU7XHJcbiAgICBwcm9wcy5kYXRhID0gZGF0YTtcclxuICAgIHByb3BzLmZvb3RlciA9IGZvb3RlcjtcclxuICAgIGlmICh0ZW1wbGF0ZSlcclxuICAgICAgcHJvcHMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgIHRoaXMuY3VycmVudENvbXBvbmVudCA9IHRoaXMuZG9tU2VydmljZS5hcHBlbmRDb21wb25lbnQoTG9ja1Rvb2x0aXAsIGRvY3VtZW50LmJvZHksIHByb3BzKTtcclxuICAgIHRoaXMucG9wdXBJbnN0YW5jZSA9IDxhbnk+dGhpcy5jdXJyZW50Q29tcG9uZW50Lmluc3RhbmNlO1xyXG4gIH1cclxuICBwdWJsaWMgY2xvc2VQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDb21wb25lbnQpXHJcbiAgICAgIHRoaXMucG9wdXBJbnN0YW5jZS5yZW1vdmVNZSh0aGlzLmN1cnJlbnRDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiAjd2NXcmFwcGVyIGNsYXNzPVwid2Mtd3JhcHBlclwiIChtb3VzZWVudGVyKT1cIm1vdXNlSG92ZXIodHJ1ZSlcIiAobW91c2VsZWF2ZSk9XCJtb3VzZUhvdmVyKGZhbHNlKVwiXHJcbiAgW25nU3R5bGVdPVwieydtYXJnaW4tbGVmdCc6IG5vUGFkZGluZz8nMHB4JzonMTVweCcsJ21hcmdpbi1yaWdodCc6IG5vUGFkZGluZz8nMHB4JzonMTVweCd9XCI+XHJcbiAgPGRpdiBjbGFzcz1cIndjaGVhZGVyIHdpZGdldC1tb3ZlXCIgKm5nSWY9XCIhaGlkZVRpdGxlXCJcclxuICAgIFtuZ0NsYXNzXT1cInsndW5kZXJMaW5lJzogZW5hYmxlVGl0bGVMaW5lIHx8IGlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlfVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiB3Yy1tb3ZlclwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwcHg7aGVpZ2h0OmluaGVyaXQ7cGFkZGluZy1yaWdodDogMHB4O1wiPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O21hcmdpbi10b3A6MTBweDtcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLWxlZnQnOiBub1BhZGRpbmc/JzE1cHgnOicwcHgnLCdtYXJnaW4tcmlnaHQnOiBub1BhZGRpbmc/JzE1cHgnOicwcHgnfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOSBmbG9hdC1sZWZ0IHRpdGxlLWxhYmVsXCI+XHJcbiAgICAgICAgICA8cmEtdG9vbHRpcCBbdmFsdWVdPVwidG9vbFRpcFZhbHVlXCIgW3dpZHRoXT1cInRvb2xUaXBXaWR0aFwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiaGlkZVRpdGxlXCIgc3R5bGU9XCJ0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczt3aGl0ZS1zcGFjZTogbm93cmFwO292ZXJmbG93OiBoaWRkZW47XCJcclxuICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcigkZXZlbnQpXCIgI3NlYXJjaElucHV0Pnt7V2lkZ2V0RGlzcGxheU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgPC9yYS10b29sdGlwPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiIHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7cGFkZGluZy1yaWdodDogMHB4O1wiPiAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtcmlnaHRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgICNiYW5Qb3B1cERpdiAobW91c2VvdmVyKT1cIm9wZW5Qb3B1cChpbmFwcGxpY2FibGVJY29uVGl0bGUsaW5hcHBsaWNhYmxlRmlsdGVycyxpbmFwcGxpY2FibGVJY29uRm9vdGVyLCdpbm5hcGxpY2FibGUnKVwiIChtb3VzZW91dCk9XCJjbG9zZVBvcHVwKClcIiBjbGFzcz1cInRpdGxlLWJhci1sb2NrLWljb24gbG9jay1kcm9wZG93blwiIFtoaWRkZW5dPVwiIWluYXBwbGljYWJsZUZpbHRlcnMgfHwgaW5hcHBsaWNhYmxlRmlsdGVycy5sZW5ndGggPT0gMCB8fCAhZ2xvYmFsRmlsdGVyIHx8IGdsb2JhbEZpbHRlciA9PSAne30nXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtYmFuIGxvY2tcIj48L2k+ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICNsb2NrUG9wdXBEaXYgKG1vdXNlb3Zlcik9XCJvcGVuUG9wdXAobG9ja0ljb25UaXRsZSxsb2NrRGV0YWlscyxsb2NrSWNvbkZvb3RlciwnbG9jaycsbG9ja1RlbXBsYXRlSW5mbylcIiAobW91c2VvdXQpPVwiY2xvc2VQb3B1cCgpXCIgY2xhc3M9XCJ0aXRsZS1iYXItbG9jay1pY29uIGxvY2stZHJvcGRvd25cIiBbaGlkZGVuXT1cIiFsb2NrRGV0YWlscyAmJiAhbG9ja1RlbXBsYXRlSW5mb1wiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLWxvY2sgbG9ja1wiPjwvaT4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LW1lbnVcIiBzdHlsZT1cIndpZHRoOjEwcHg7XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3dpZGdldC1tZW51LXNob3cnOiBpc01vdXNlSG92ZXIgJiYgc2hvd1NldHRpbmdzTGlua31cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGJ0biB0aXRsZS1iYXItaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInNob3dEcm9wRG93bigkZXZlbnQpXCIgI3dpZGdldERyb3Bkb3duIGNsYXNzPVwiZmFsIGZhLWVsbGlwc2lzLXYgd2lkZ2V0LW1lbnUtZWxsaXBzZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwiaGlkZVRpdGxlXCIgY2xhc3M9XCJ3Y2hlYWRlciB3aWRnZXQtbW92ZVwiXHJcbiAgICBzdHlsZT1cImhlaWdodDogNDVweDt3aWR0aDogOTUlO2N1cnNvcjogbW92ZTt6LWluZGV4OiA5OTtvcGFjaXR5OiAwO1wiPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgICpuZ0lmPVwiaGlkZVRpdGxlXCIgY2xhc3M9XCJ3aWRnZXQtbWVudSB3aWRnZXQtbWVudS10aXRsZS1oaWRkZW5cIiBbbmdDbGFzc109XCJ7J3dpZGdldC1tZW51LXNob3cnOiBpc01vdXNlSG92ZXIgJiYgc2hvd1NldHRpbmdzTGlua31cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wYnRuIHRpdGxlLWJhci1pY29uXCI+XHJcbiAgICAgIDxpIChjbGljayk9XCJzaG93RHJvcERvd24oJGV2ZW50KVwiIGNsYXNzPVwiZmFsIGZhLWVsbGlwc2lzLXZcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj48L2k+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwid2NCb2R5XCIgW25nU3R5bGVdPVwieydib3R0b20nOiBub1BhZGRpbmc/JzBweCc6JzEwcHgnLCd0b3AnOmhpZGVUaXRsZT8nMTBweCc6JzQ2cHgnfVwiPlxyXG4gICAgPGRpdiBbaGlkZGVuXT1cImlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlXCIgY2xhc3M9XCJtLWZhZGVPdXQgd2lkZ2V0LW92ZXJsYXlcIiBbbmdDbGFzc109XCJ7J20tZmFkZUluJzogIHNob3dQYW5lbH1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxkcy1yb2xsZXJcIj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2NcIiBbaGlkZGVuXT1cImlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlXCI+XHJcbiAgICAgIDxkaXYgI2N0bFdpZGdldD48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlXCIgY2xhc3M9XCJkZWZhdWx0Q29uZmlnXCI+XHJcbiAgICAgIDxyYS13aWRnZXQtc3RhdGUgc3R5bGU9XCJ3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7XCIgW2lzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlXT1cImlzV2lkZ2V0U3RhdGVBcHBsaWNhYmxlXCJcclxuICAgICAgICBbaXNHbG9iYWxGaWx0ZXJBcHBsaWVkXT1cImlzR2xvYmFsRmlsdGVyQXBwbGllZFwiIFt3aWRnZXRFbXB0eVN0YXRlXT1cIndpZGdldEVtcHR5U3RhdGVcIlxyXG4gICAgICAgIChlZGl0V2lkZ2V0Q2xpY2tlZCk9ZWRpdFdpZGdldCgpIFt3aWR0aENvbF09XCJ3aWR0aFwiIFtoZWlnaHRDb2xdPVwiaGVpZ2h0XCI+XHJcbiAgICAgIDwvcmEtd2lkZ2V0LXN0YXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==