raise-common-lib 0.0.217 → 0.0.218

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 (55) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +1164 -0
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/raise-common-lib.module.js +4 -1
  7. package/esm2015/lib/smart-popup/index.component.js +1059 -0
  8. package/esm2015/public-api.js +2 -1
  9. package/esm2015/raise-common-lib.js +2 -2
  10. package/esm5/lib/raise-common-lib.module.js +4 -1
  11. package/esm5/lib/smart-popup/index.component.js +1164 -0
  12. package/esm5/public-api.js +2 -1
  13. package/esm5/raise-common-lib.js +2 -2
  14. package/fesm2015/raise-common-lib.js +1061 -1
  15. package/fesm2015/raise-common-lib.js.map +1 -1
  16. package/fesm5/raise-common-lib.js +1164 -1
  17. package/fesm5/raise-common-lib.js.map +1 -1
  18. package/lib/smart-popup/index.component.d.ts +55 -0
  19. package/package.json +1 -1
  20. package/public-api.d.ts +1 -0
  21. package/raise-common-lib.metadata.json +1 -1
  22. package/src/assets/img/arrow_right.svg +4 -4
  23. package/src/assets/img/calendar-disabled.svg +6 -6
  24. package/src/assets/img/calendar.svg +6 -6
  25. package/src/assets/img/calendar_arrow_left.svg +3 -3
  26. package/src/assets/img/calendar_arrow_right.svg +3 -3
  27. package/src/assets/img/checked-vector.svg +3 -3
  28. package/src/assets/img/dialog-close.svg +4 -4
  29. package/src/assets/img/dialog-grow.svg +6 -6
  30. package/src/assets/img/dialog-shrink.svg +6 -6
  31. package/src/assets/img/plus.svg +4 -4
  32. package/src/assets/img/search.svg +4 -4
  33. package/src/assets/img/shrink-icon.svg +6 -6
  34. package/src/assets/img/time-disabled.svg +4 -4
  35. package/src/assets/img/time.svg +4 -4
  36. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  37. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  38. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  39. package/src/assets/img/toolbar-action-combine.svg +4 -4
  40. package/src/assets/img/toolbar-action-edit.svg +4 -4
  41. package/src/assets/img/toolbar-action-expand.svg +7 -7
  42. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  43. package/src/assets/img/toolbar-action-lock.svg +6 -6
  44. package/src/assets/img/toolbar-action-preview.svg +7 -7
  45. package/src/assets/img/toolbar-action-publish.svg +5 -5
  46. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  47. package/src/assets/img/toolbar-action-rename.svg +7 -7
  48. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  49. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  50. package/src/assets/img/toolbar-action-settle.svg +7 -7
  51. package/src/assets/img/toolbar-action-share.svg +5 -5
  52. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  53. package/src/assets/img/toolbar-action-sync.svg +4 -4
  54. package/src/assets/img/toolbar-action-template.svg +6 -6
  55. package/src/assets/img/toolbar-action-workflow.svg +9 -9
@@ -0,0 +1,1059 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/smart-popup/index.component.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, HostListener, } from "@angular/core";
7
+ export class SmartPopupComponent {
8
+ /**
9
+ * @param {?} ref
10
+ */
11
+ constructor(ref) {
12
+ this.ref = ref;
13
+ this._placement = "BottomLeft";
14
+ this._offset = 8;
15
+ this._autoAdjust = "yes";
16
+ this.triggerElementRef = null;
17
+ this.loading = false;
18
+ this._open = false;
19
+ this._width = null;
20
+ this._height = null;
21
+ this.openChange = new EventEmitter();
22
+ this.contentLoad = new EventEmitter();
23
+ this.currentTriggerElement = null;
24
+ this.FIXED_CONTAINER_ID = "rs-smart-popup-fixed-container";
25
+ this.opened = "no";
26
+ this.positioning = "no";
27
+ this.actualPlacement = "bottom";
28
+ this.actualPosition = "start";
29
+ this.onClickOutside = (/**
30
+ * @param {?} event
31
+ * @return {?}
32
+ */
33
+ (event) => {
34
+ /** @type {?} */
35
+ const target = (/** @type {?} */ (event.target));
36
+ /** @type {?} */
37
+ const isClickOnTrigger = this.currentTriggerElement && this.currentTriggerElement.contains(target);
38
+ /** @type {?} */
39
+ const isClickOnPopup = this.popupElement &&
40
+ this.popupElement.nativeElement &&
41
+ this.popupElement.nativeElement.contains(target);
42
+ if (!isClickOnTrigger && !isClickOnPopup) {
43
+ this.close();
44
+ }
45
+ });
46
+ this.onWindowScroll = (/**
47
+ * @return {?}
48
+ */
49
+ () => {
50
+ if (this.opened === "yes") {
51
+ this.updatePopupPosition();
52
+ }
53
+ });
54
+ }
55
+ // 解析placement格式
56
+ /**
57
+ * @return {?}
58
+ */
59
+ get placementInfo() {
60
+ /** @type {?} */
61
+ const placementMap = {
62
+ TopLeft: { placement: "top", position: "start" },
63
+ TopCenter: { placement: "top", position: "center" },
64
+ TopRight: { placement: "top", position: "end" },
65
+ BottomLeft: { placement: "bottom", position: "start" },
66
+ BottomCenter: { placement: "bottom", position: "center" },
67
+ BottomRight: { placement: "bottom", position: "end" },
68
+ LeftTop: { placement: "left", position: "start" },
69
+ LeftCenter: { placement: "left", position: "center" },
70
+ LeftBottom: { placement: "left", position: "end" },
71
+ RightTop: { placement: "right", position: "start" },
72
+ RightCenter: { placement: "right", position: "center" },
73
+ RightBottom: { placement: "right", position: "end" },
74
+ };
75
+ return (placementMap[this._placement] || {
76
+ placement: "bottom",
77
+ position: "start",
78
+ });
79
+ }
80
+ /**
81
+ * @return {?}
82
+ */
83
+ get offset() {
84
+ return this._offset || 8;
85
+ }
86
+ /**
87
+ * @return {?}
88
+ */
89
+ get autoAdjust() {
90
+ return this._autoAdjust === "yes";
91
+ }
92
+ /**
93
+ * @return {?}
94
+ */
95
+ ngAfterViewInit() {
96
+ this.fixedContainerEl = this.getFixedContainer();
97
+ this.fixedContainerEl.append(this.popupElement.nativeElement);
98
+ this.updateTriggerElement();
99
+ // 如果提供了固定尺寸,立即应用
100
+ if (this._width !== null &&
101
+ this._height !== null &&
102
+ this.popupElement &&
103
+ this.popupElement.nativeElement) {
104
+ /** @type {?} */
105
+ const popupEl = this.popupElement.nativeElement;
106
+ popupEl.style.width = this._width + "px";
107
+ popupEl.style.height = this._height + "px";
108
+ popupEl.style.minWidth = this._width + "px";
109
+ popupEl.style.maxWidth = this._width + "px";
110
+ popupEl.style.minHeight = this._height + "px";
111
+ popupEl.style.maxHeight = this._height + "px";
112
+ }
113
+ // 如果外部传入 open 属性为 true,自动打开
114
+ if (this._open) {
115
+ setTimeout((/**
116
+ * @return {?}
117
+ */
118
+ () => this.open()), 0);
119
+ }
120
+ }
121
+ /**
122
+ * @param {?} changes
123
+ * @return {?}
124
+ */
125
+ ngOnChanges(changes) {
126
+ // 处理固定尺寸变化
127
+ if ((changes._width || changes._height) &&
128
+ this.popupElement &&
129
+ this.popupElement.nativeElement) {
130
+ /** @type {?} */
131
+ const popupEl = this.popupElement.nativeElement;
132
+ if (this._width !== null) {
133
+ popupEl.style.width = this._width + "px";
134
+ popupEl.style.minWidth = this._width + "px";
135
+ popupEl.style.maxWidth = this._width + "px";
136
+ }
137
+ if (this._height !== null) {
138
+ popupEl.style.height = this._height + "px";
139
+ popupEl.style.minHeight = this._height + "px";
140
+ popupEl.style.maxHeight = this._height + "px";
141
+ }
142
+ }
143
+ // 先处理触发元素变化(确保在打开前更新触发元素)
144
+ if (changes.triggerElementRef) {
145
+ /** @type {?} */
146
+ const previousTrigger = this.currentTriggerElement;
147
+ this.updateTriggerElement();
148
+ // 如果弹窗已经打开,且触发元素发生了变化,立即更新位置
149
+ if (this.opened === "yes" &&
150
+ previousTrigger !== this.currentTriggerElement &&
151
+ this.currentTriggerElement) {
152
+ // 使用新的打开方式更新位置
153
+ this.positioning = "yes";
154
+ this.ref.markForCheck();
155
+ requestAnimationFrame((/**
156
+ * @return {?}
157
+ */
158
+ () => {
159
+ requestAnimationFrame((/**
160
+ * @return {?}
161
+ */
162
+ () => {
163
+ this.updatePopupPosition();
164
+ this.positioning = "no";
165
+ this.ref.markForCheck();
166
+ }));
167
+ }));
168
+ }
169
+ }
170
+ // 处理 open 变化(确保在触发元素更新后处理)
171
+ if (changes._open) {
172
+ if (this._open && this.opened === "no") {
173
+ // 确保触发元素已更新
174
+ this.updateTriggerElement();
175
+ // 使用 setTimeout 确保所有变更都已处理
176
+ setTimeout((/**
177
+ * @return {?}
178
+ */
179
+ () => {
180
+ // 再次确保触发元素已更新
181
+ this.updateTriggerElement();
182
+ this.open();
183
+ }), 0);
184
+ }
185
+ else if (!this._open && this.opened === "yes") {
186
+ this.close();
187
+ }
188
+ }
189
+ // 当加载完成时,更新位置(如果提供了固定尺寸,不需要更新位置)
190
+ if (changes.loading &&
191
+ !changes.loading.currentValue &&
192
+ changes.loading.previousValue) {
193
+ if (this.opened === "yes") {
194
+ // 如果提供了固定尺寸,位置已经计算好了,不需要更新
195
+ if (this._width !== null && this._height !== null) {
196
+ this.contentLoad.emit();
197
+ }
198
+ else {
199
+ // 如果正在定位,不需要更新位置
200
+ if (this.positioning === "no") {
201
+ requestAnimationFrame((/**
202
+ * @return {?}
203
+ */
204
+ () => {
205
+ this.updatePopupPosition();
206
+ this.contentLoad.emit();
207
+ }));
208
+ }
209
+ else {
210
+ // 如果正在定位,等待定位完成后再触发事件
211
+ /** @type {?} */
212
+ const checkPositioning = (/**
213
+ * @return {?}
214
+ */
215
+ () => {
216
+ if (this.positioning === "no") {
217
+ this.contentLoad.emit();
218
+ }
219
+ else {
220
+ setTimeout(checkPositioning, 10);
221
+ }
222
+ });
223
+ checkPositioning();
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * @return {?}
231
+ */
232
+ ngOnDestroy() {
233
+ if (this.popupElement && this.popupElement.nativeElement) {
234
+ this.popupElement.nativeElement.remove();
235
+ }
236
+ window.removeEventListener("click", this.onClickOutside);
237
+ window.removeEventListener("scroll", this.onWindowScroll, true);
238
+ }
239
+ /**
240
+ * @return {?}
241
+ */
242
+ updateTriggerElement() {
243
+ if (this.triggerElementRef) {
244
+ this.currentTriggerElement = this.triggerElementRef;
245
+ }
246
+ else if (this.internalTriggerElement &&
247
+ this.internalTriggerElement.nativeElement) {
248
+ this.currentTriggerElement = this.internalTriggerElement.nativeElement;
249
+ }
250
+ else {
251
+ this.currentTriggerElement = null;
252
+ }
253
+ }
254
+ /**
255
+ * @return {?}
256
+ */
257
+ getFixedContainer() {
258
+ /** @type {?} */
259
+ let containerElement = document.getElementById(this.FIXED_CONTAINER_ID);
260
+ if (!containerElement) {
261
+ containerElement = document.createElement("div");
262
+ containerElement.setAttribute("id", this.FIXED_CONTAINER_ID);
263
+ document.body.append(containerElement);
264
+ }
265
+ return containerElement;
266
+ }
267
+ /**
268
+ * @param {?=} triggerElement
269
+ * @return {?}
270
+ */
271
+ open(triggerElement) {
272
+ // 如果传入了触发元素,使用它
273
+ if (triggerElement) {
274
+ this.currentTriggerElement = triggerElement;
275
+ }
276
+ else {
277
+ this.updateTriggerElement();
278
+ }
279
+ if (!this.currentTriggerElement) {
280
+ console.warn("SmartPopupComponent: No trigger element found");
281
+ return;
282
+ }
283
+ // 如果已经打开,先关闭再打开(更新位置)
284
+ if (this.opened === "yes") {
285
+ // 先关闭弹窗
286
+ this.opened = "no";
287
+ this.positioning = "no";
288
+ this.ref.markForCheck();
289
+ // 立即在新位置打开
290
+ requestAnimationFrame((/**
291
+ * @return {?}
292
+ */
293
+ () => {
294
+ // 再次确保触发元素已更新
295
+ this.updateTriggerElement();
296
+ this.openPopup();
297
+ }));
298
+ return;
299
+ }
300
+ // 确保触发元素已更新
301
+ this.updateTriggerElement();
302
+ this.openPopup();
303
+ }
304
+ /**
305
+ * @private
306
+ * @return {?}
307
+ */
308
+ openPopup() {
309
+ // 再次确保触发元素已更新
310
+ this.updateTriggerElement();
311
+ if (!this.currentTriggerElement) {
312
+ console.warn("SmartPopupComponent: No trigger element found when opening popup");
313
+ return;
314
+ }
315
+ // 如果提供了固定尺寸,可以在打开前就计算好位置
316
+ if (this._width !== null && this._height !== null) {
317
+ // 先计算位置(不依赖DOM渲染,直接根据triggerElement计算)
318
+ /** @type {?} */
319
+ const triggerRect = this.currentTriggerElement.getBoundingClientRect();
320
+ /** @type {?} */
321
+ const viewportWidth = window.innerWidth;
322
+ /** @type {?} */
323
+ const viewportHeight = window.innerHeight;
324
+ /** @type {?} */
325
+ const popupSize = {
326
+ width: this._width,
327
+ height: this._height,
328
+ };
329
+ /** @type {?} */
330
+ const popupRect = (/** @type {?} */ ({
331
+ width: popupSize.width,
332
+ height: popupSize.height,
333
+ top: 0,
334
+ left: 0,
335
+ right: popupSize.width,
336
+ bottom: popupSize.height,
337
+ x: 0,
338
+ y: 0,
339
+ toJSON: (/**
340
+ * @return {?}
341
+ */
342
+ () => ({})),
343
+ }));
344
+ /** @type {?} */
345
+ const targetInfo = this.placementInfo;
346
+ /** @type {?} */
347
+ let finalPlacement = targetInfo.placement;
348
+ /** @type {?} */
349
+ let finalPosition = targetInfo.position;
350
+ if (this.autoAdjust) {
351
+ /** @type {?} */
352
+ const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
353
+ finalPlacement = optimal.placement;
354
+ finalPosition = optimal.position;
355
+ }
356
+ this.actualPlacement = finalPlacement;
357
+ this.actualPosition = finalPosition;
358
+ // 计算位置坐标(不依赖DOM,直接计算)
359
+ /** @type {?} */
360
+ const position = this.calculatePositionCoordinates(triggerRect, finalPlacement, finalPosition, popupSize);
361
+ // 先设置打开状态,但保持隐藏(positioning = yes)
362
+ this.opened = "yes";
363
+ this.positioning = "yes";
364
+ this.openChange.emit(true);
365
+ this.ref.markForCheck();
366
+ // 强制更新视图,确保DOM已更新
367
+ this.ref.detectChanges();
368
+ // 如果元素已经存在,立即设置位置(不等待 requestAnimationFrame)
369
+ if (this.popupElement && this.popupElement.nativeElement) {
370
+ /** @type {?} */
371
+ const popupEl = this.popupElement.nativeElement;
372
+ // 立即设置尺寸和位置
373
+ popupEl.style.width = this._width + "px";
374
+ popupEl.style.height = this._height + "px";
375
+ popupEl.style.minWidth = this._width + "px";
376
+ popupEl.style.maxWidth = this._width + "px";
377
+ popupEl.style.minHeight = this._height + "px";
378
+ popupEl.style.maxHeight = this._height + "px";
379
+ popupEl.style.top = position.top;
380
+ popupEl.style.left = position.left;
381
+ popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
382
+ // 强制同步应用样式
383
+ popupEl.offsetHeight;
384
+ // 位置设置完成后,立即显示弹窗
385
+ this.positioning = "no";
386
+ this.ref.markForCheck();
387
+ }
388
+ else {
389
+ // 如果元素还不存在,等待渲染
390
+ requestAnimationFrame((/**
391
+ * @return {?}
392
+ */
393
+ () => {
394
+ if (this.popupElement && this.popupElement.nativeElement) {
395
+ /** @type {?} */
396
+ const popupEl = this.popupElement.nativeElement;
397
+ // 立即设置尺寸和位置
398
+ popupEl.style.width = this._width + "px";
399
+ popupEl.style.height = this._height + "px";
400
+ popupEl.style.minWidth = this._width + "px";
401
+ popupEl.style.maxWidth = this._width + "px";
402
+ popupEl.style.minHeight = this._height + "px";
403
+ popupEl.style.maxHeight = this._height + "px";
404
+ popupEl.style.top = position.top;
405
+ popupEl.style.left = position.left;
406
+ popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
407
+ // 强制同步应用样式
408
+ popupEl.offsetHeight;
409
+ // 位置设置完成后,立即显示弹窗
410
+ this.positioning = "no";
411
+ this.ref.markForCheck();
412
+ }
413
+ }));
414
+ }
415
+ }
416
+ else {
417
+ // 没有固定尺寸,需要等待DOM渲染
418
+ this.positioning = "yes";
419
+ this.ref.markForCheck();
420
+ // 立即强制更新视图,确保DOM已更新
421
+ this.ref.detectChanges();
422
+ // 使用 requestAnimationFrame 确保在浏览器渲染之前更新位置
423
+ requestAnimationFrame((/**
424
+ * @return {?}
425
+ */
426
+ () => {
427
+ // 确保元素已渲染并获取尺寸
428
+ if (this.popupElement && this.popupElement.nativeElement) {
429
+ // 强制重新计算布局,确保元素尺寸已计算
430
+ this.popupElement.nativeElement.offsetHeight;
431
+ // 计算并设置位置
432
+ this.updatePopupPosition();
433
+ // 位置设置完成后,移除定位状态,显示弹窗
434
+ this.positioning = "no";
435
+ this.ref.markForCheck();
436
+ }
437
+ }));
438
+ }
439
+ window.addEventListener("click", this.onClickOutside);
440
+ window.addEventListener("scroll", this.onWindowScroll, true);
441
+ }
442
+ /**
443
+ * @return {?}
444
+ */
445
+ close() {
446
+ if (this.opened === "no") {
447
+ return;
448
+ }
449
+ this.opened = "no";
450
+ this.positioning = "no";
451
+ this.openChange.emit(false);
452
+ window.removeEventListener("click", this.onClickOutside);
453
+ window.removeEventListener("scroll", this.onWindowScroll, true);
454
+ this.ref.markForCheck();
455
+ }
456
+ /**
457
+ * @return {?}
458
+ */
459
+ toggle() {
460
+ if (this.opened === "yes") {
461
+ this.close();
462
+ }
463
+ else {
464
+ this.open();
465
+ }
466
+ }
467
+ /**
468
+ * @param {?} event
469
+ * @return {?}
470
+ */
471
+ onClickTrigger(event) {
472
+ event.stopPropagation();
473
+ this.toggle();
474
+ }
475
+ // 计算并设置位置(支持固定尺寸,可在打开前调用)
476
+ /**
477
+ * @private
478
+ * @return {?}
479
+ */
480
+ calculateAndSetPosition() {
481
+ if (!this.currentTriggerElement) {
482
+ return;
483
+ }
484
+ /** @type {?} */
485
+ const triggerRect = this.currentTriggerElement.getBoundingClientRect();
486
+ /** @type {?} */
487
+ const viewportWidth = window.innerWidth;
488
+ /** @type {?} */
489
+ const viewportHeight = window.innerHeight;
490
+ // 获取弹窗尺寸(优先使用固定尺寸)
491
+ /** @type {?} */
492
+ const popupSize = {
493
+ width: this._width !== null
494
+ ? this._width
495
+ : this.popupElement && this.popupElement.nativeElement
496
+ ? this.popupElement.nativeElement.offsetWidth
497
+ : 300,
498
+ height: this._height !== null
499
+ ? this._height
500
+ : this.popupElement && this.popupElement.nativeElement
501
+ ? this.popupElement.nativeElement.offsetHeight
502
+ : 200,
503
+ };
504
+ // 创建虚拟的 popupRect(用于计算)
505
+ /** @type {?} */
506
+ const popupRect = (/** @type {?} */ ({
507
+ width: popupSize.width,
508
+ height: popupSize.height,
509
+ top: 0,
510
+ left: 0,
511
+ right: popupSize.width,
512
+ bottom: popupSize.height,
513
+ x: 0,
514
+ y: 0,
515
+ toJSON: (/**
516
+ * @return {?}
517
+ */
518
+ () => ({})),
519
+ }));
520
+ // 获取目标位置信息
521
+ /** @type {?} */
522
+ const targetInfo = this.placementInfo;
523
+ /** @type {?} */
524
+ let finalPlacement = targetInfo.placement;
525
+ /** @type {?} */
526
+ let finalPosition = targetInfo.position;
527
+ if (this.autoAdjust) {
528
+ /** @type {?} */
529
+ const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
530
+ finalPlacement = optimal.placement;
531
+ finalPosition = optimal.position;
532
+ }
533
+ this.actualPlacement = finalPlacement;
534
+ this.actualPosition = finalPosition;
535
+ // 立即设置位置(即使元素还没完全渲染,也要先设置位置)
536
+ if (this.popupElement && this.popupElement.nativeElement) {
537
+ this.setPopupPosition(triggerRect, popupRect, finalPlacement, finalPosition, popupSize);
538
+ // 强制应用样式,确保位置立即生效
539
+ this.ref.detectChanges();
540
+ }
541
+ else {
542
+ // 如果元素还不存在,延迟设置位置
543
+ setTimeout((/**
544
+ * @return {?}
545
+ */
546
+ () => {
547
+ if (this.popupElement && this.popupElement.nativeElement) {
548
+ this.setPopupPosition(triggerRect, popupRect, finalPlacement, finalPosition, popupSize);
549
+ this.ref.detectChanges();
550
+ }
551
+ }), 0);
552
+ }
553
+ this.ref.markForCheck();
554
+ }
555
+ /**
556
+ * @return {?}
557
+ */
558
+ updatePopupPosition() {
559
+ if (!this.currentTriggerElement ||
560
+ !this.popupElement ||
561
+ !this.popupElement.nativeElement) {
562
+ return;
563
+ }
564
+ // 如果提供了固定尺寸,使用固定尺寸计算
565
+ if (this._width !== null && this._height !== null) {
566
+ this.calculateAndSetPosition();
567
+ return;
568
+ }
569
+ /** @type {?} */
570
+ const triggerRect = this.currentTriggerElement.getBoundingClientRect();
571
+ /** @type {?} */
572
+ const popupRect = this.popupElement.nativeElement.getBoundingClientRect();
573
+ /** @type {?} */
574
+ const viewportWidth = window.innerWidth;
575
+ /** @type {?} */
576
+ const viewportHeight = window.innerHeight;
577
+ // 获取目标位置信息
578
+ /** @type {?} */
579
+ const targetInfo = this.placementInfo;
580
+ /** @type {?} */
581
+ let finalPlacement = targetInfo.placement;
582
+ /** @type {?} */
583
+ let finalPosition = targetInfo.position;
584
+ if (this.autoAdjust) {
585
+ /** @type {?} */
586
+ const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
587
+ finalPlacement = optimal.placement;
588
+ finalPosition = optimal.position;
589
+ }
590
+ this.actualPlacement = finalPlacement;
591
+ this.actualPosition = finalPosition;
592
+ this.setPopupPosition(triggerRect, popupRect, finalPlacement, finalPosition);
593
+ this.ref.markForCheck();
594
+ }
595
+ /**
596
+ * @param {?} triggerRect
597
+ * @param {?} popupRect
598
+ * @param {?} viewportWidth
599
+ * @param {?} viewportHeight
600
+ * @return {?}
601
+ */
602
+ calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight) {
603
+ /** @type {?} */
604
+ const targetInfo = this.placementInfo;
605
+ /** @type {?} */
606
+ const preferred = targetInfo.placement;
607
+ /** @type {?} */
608
+ const preferredPosition = targetInfo.position;
609
+ /** @type {?} */
610
+ const space = {
611
+ top: triggerRect.top,
612
+ bottom: viewportHeight - triggerRect.bottom,
613
+ left: triggerRect.left,
614
+ right: viewportWidth - triggerRect.right,
615
+ };
616
+ /** @type {?} */
617
+ const popupSize = {
618
+ width: popupRect.width || 300,
619
+ // 默认宽度,如果还没有渲染
620
+ height: popupRect.height || 200,
621
+ };
622
+ // 检查首选位置是否有足够空间
623
+ /** @type {?} */
624
+ const hasEnoughSpace = (/**
625
+ * @param {?} placement
626
+ * @return {?}
627
+ */
628
+ (placement) => {
629
+ switch (placement) {
630
+ case "top":
631
+ return space.top >= popupSize.height + this.offset;
632
+ case "bottom":
633
+ return space.bottom >= popupSize.height + this.offset;
634
+ case "left":
635
+ return space.left >= popupSize.width + this.offset;
636
+ case "right":
637
+ return space.right >= popupSize.width + this.offset;
638
+ }
639
+ });
640
+ // 检查指定位置是否有足够空间
641
+ /** @type {?} */
642
+ const checkPositionSpace = (/**
643
+ * @param {?} placement
644
+ * @param {?} position
645
+ * @return {?}
646
+ */
647
+ (placement, position) => {
648
+ if (placement === "top" || placement === "bottom") {
649
+ // 对于上下位置,检查水平对齐空间
650
+ /** @type {?} */
651
+ const popupWidth = popupSize.width;
652
+ /** @type {?} */
653
+ const spaceLeft = triggerRect.left;
654
+ /** @type {?} */
655
+ const spaceRight = viewportWidth - triggerRect.right;
656
+ if (position === "center") {
657
+ return spaceLeft >= popupWidth / 2 && spaceRight >= popupWidth / 2;
658
+ }
659
+ else if (position === "start") {
660
+ return spaceLeft >= popupWidth;
661
+ }
662
+ else {
663
+ // end
664
+ return spaceRight >= popupWidth;
665
+ }
666
+ }
667
+ else {
668
+ // 对于左右位置,检查垂直对齐空间
669
+ /** @type {?} */
670
+ const popupHeight = popupSize.height;
671
+ /** @type {?} */
672
+ const spaceTop = triggerRect.top;
673
+ /** @type {?} */
674
+ const spaceBottom = viewportHeight - triggerRect.bottom;
675
+ if (position === "center") {
676
+ return spaceTop >= popupHeight / 2 && spaceBottom >= popupHeight / 2;
677
+ }
678
+ else if (position === "start") {
679
+ return spaceTop >= popupHeight;
680
+ }
681
+ else {
682
+ // end
683
+ return spaceBottom >= popupHeight;
684
+ }
685
+ }
686
+ });
687
+ // 计算位置是否合适(考虑水平/垂直对齐)
688
+ /** @type {?} */
689
+ const calculatePosition = (/**
690
+ * @param {?} placement
691
+ * @return {?}
692
+ */
693
+ (placement) => {
694
+ if (placement === "top" || placement === "bottom") {
695
+ // 对于上下位置,检查水平对齐
696
+ /** @type {?} */
697
+ const popupWidth = popupSize.width;
698
+ /** @type {?} */
699
+ const spaceLeft = triggerRect.left;
700
+ /** @type {?} */
701
+ const spaceRight = viewportWidth - triggerRect.right;
702
+ // 优先尝试使用用户指定的position
703
+ if (checkPositionSpace(placement, preferredPosition)) {
704
+ return preferredPosition;
705
+ }
706
+ // 如果中心对齐有足够空间,优先使用中心
707
+ if (spaceLeft >= popupWidth / 2 && spaceRight >= popupWidth / 2) {
708
+ return "center";
709
+ }
710
+ // 如果左侧空间不足,使用右对齐
711
+ if (spaceLeft < popupWidth / 2) {
712
+ return "end";
713
+ }
714
+ // 如果右侧空间不足,使用左对齐
715
+ if (spaceRight < popupWidth / 2) {
716
+ return "start";
717
+ }
718
+ return preferredPosition;
719
+ }
720
+ else {
721
+ // 对于左右位置,检查垂直对齐
722
+ /** @type {?} */
723
+ const popupHeight = popupSize.height;
724
+ /** @type {?} */
725
+ const spaceTop = triggerRect.top;
726
+ /** @type {?} */
727
+ const spaceBottom = viewportHeight - triggerRect.bottom;
728
+ // 优先尝试使用用户指定的position
729
+ if (checkPositionSpace(placement, preferredPosition)) {
730
+ return preferredPosition;
731
+ }
732
+ // 如果中心对齐有足够空间,优先使用中心
733
+ if (spaceTop >= popupHeight / 2 && spaceBottom >= popupHeight / 2) {
734
+ return "center";
735
+ }
736
+ // 如果上方空间不足,使用下对齐
737
+ if (spaceTop < popupHeight / 2) {
738
+ return "end";
739
+ }
740
+ // 如果下方空间不足,使用上对齐
741
+ if (spaceBottom < popupHeight / 2) {
742
+ return "start";
743
+ }
744
+ return preferredPosition;
745
+ }
746
+ });
747
+ // 如果首选位置有足够空间,优先使用用户指定的position
748
+ if (hasEnoughSpace(preferred)) {
749
+ // 检查用户指定的position是否有足够空间
750
+ if (checkPositionSpace(preferred, preferredPosition)) {
751
+ return {
752
+ placement: preferred,
753
+ position: preferredPosition,
754
+ };
755
+ }
756
+ // 如果指定的position空间不足,自动计算最佳position
757
+ return {
758
+ placement: preferred,
759
+ position: calculatePosition(preferred),
760
+ };
761
+ }
762
+ // 根据首选位置选择备选位置
763
+ /** @type {?} */
764
+ const alternatives = {
765
+ bottom: ["top", "right", "left"],
766
+ top: ["bottom", "right", "left"],
767
+ right: ["left", "bottom", "top"],
768
+ left: ["right", "bottom", "top"],
769
+ };
770
+ /** @type {?} */
771
+ const altList = alternatives[preferred] || [];
772
+ // 尝试找到第一个有足够空间的备选位置
773
+ for (const alt of altList) {
774
+ if (hasEnoughSpace(alt)) {
775
+ return {
776
+ placement: alt,
777
+ position: calculatePosition(alt),
778
+ };
779
+ }
780
+ }
781
+ // 如果都没有足够空间,选择空间最大的位置
782
+ /** @type {?} */
783
+ const maxSpace = Math.max(space.top, space.bottom, space.left, space.right);
784
+ /** @type {?} */
785
+ let bestPlacement;
786
+ if (maxSpace === space.top)
787
+ bestPlacement = "top";
788
+ else if (maxSpace === space.bottom)
789
+ bestPlacement = "bottom";
790
+ else if (maxSpace === space.left)
791
+ bestPlacement = "left";
792
+ else
793
+ bestPlacement = "right";
794
+ return {
795
+ placement: bestPlacement,
796
+ position: calculatePosition(bestPlacement),
797
+ };
798
+ }
799
+ // 计算位置坐标(纯计算,不依赖DOM,包含边界约束)
800
+ /**
801
+ * @private
802
+ * @param {?} triggerRect
803
+ * @param {?} placement
804
+ * @param {?} position
805
+ * @param {?} popupSize
806
+ * @return {?}
807
+ */
808
+ calculatePositionCoordinates(triggerRect, placement, position, popupSize) {
809
+ /** @type {?} */
810
+ const triggerWidth = triggerRect.width;
811
+ /** @type {?} */
812
+ const triggerHeight = triggerRect.height;
813
+ /** @type {?} */
814
+ const viewportWidth = window.innerWidth;
815
+ /** @type {?} */
816
+ const viewportHeight = window.innerHeight;
817
+ /** @type {?} */
818
+ const scrollX = window.scrollX;
819
+ /** @type {?} */
820
+ const scrollY = window.scrollY;
821
+ /** @type {?} */
822
+ let top = 0;
823
+ /** @type {?} */
824
+ let left = 0;
825
+ /** @type {?} */
826
+ let translateX = "0";
827
+ /** @type {?} */
828
+ let translateY = "0";
829
+ switch (placement) {
830
+ case "top":
831
+ top = triggerRect.top + scrollY - this.offset;
832
+ translateY = "-100%";
833
+ if (position === "start") {
834
+ left = triggerRect.left + scrollX;
835
+ }
836
+ else if (position === "center") {
837
+ left = triggerRect.left + scrollX + triggerWidth / 2;
838
+ translateX = "-50%";
839
+ }
840
+ else {
841
+ left = triggerRect.left + scrollX + triggerWidth;
842
+ translateX = "-100%";
843
+ }
844
+ // 边界约束:确保弹窗不超出视口
845
+ if (top - popupSize.height < scrollY) {
846
+ top = scrollY + 8; // 距离顶部至少8px
847
+ }
848
+ if (left < scrollX) {
849
+ left = scrollX + 8;
850
+ translateX = "0";
851
+ }
852
+ else if (left + popupSize.width > scrollX + viewportWidth) {
853
+ left = scrollX + viewportWidth - popupSize.width - 8;
854
+ translateX = "0";
855
+ }
856
+ break;
857
+ case "bottom":
858
+ top = triggerRect.bottom + scrollY + this.offset;
859
+ if (position === "start") {
860
+ left = triggerRect.left + scrollX;
861
+ }
862
+ else if (position === "center") {
863
+ left = triggerRect.left + scrollX + triggerWidth / 2;
864
+ translateX = "-50%";
865
+ }
866
+ else {
867
+ left = triggerRect.left + scrollX + triggerWidth;
868
+ translateX = "-100%";
869
+ }
870
+ // 边界约束:确保弹窗不超出视口
871
+ if (top + popupSize.height > scrollY + viewportHeight) {
872
+ top = scrollY + viewportHeight - popupSize.height - 8; // 距离底部至少8px
873
+ }
874
+ if (left < scrollX) {
875
+ left = scrollX + 8;
876
+ translateX = "0";
877
+ }
878
+ else if (left + popupSize.width > scrollX + viewportWidth) {
879
+ left = scrollX + viewportWidth - popupSize.width - 8;
880
+ translateX = "0";
881
+ }
882
+ break;
883
+ case "left":
884
+ left = triggerRect.left + scrollX - this.offset;
885
+ translateX = "-100%";
886
+ if (position === "start") {
887
+ top = triggerRect.top + scrollY;
888
+ }
889
+ else if (position === "center") {
890
+ top = triggerRect.top + scrollY + triggerHeight / 2;
891
+ translateY = "-50%";
892
+ }
893
+ else {
894
+ top = triggerRect.top + scrollY + triggerHeight;
895
+ translateY = "-100%";
896
+ }
897
+ // 边界约束:确保弹窗不超出视口
898
+ if (left - popupSize.width < scrollX) {
899
+ left = scrollX + 8; // 距离左侧至少8px
900
+ }
901
+ if (top < scrollY) {
902
+ top = scrollY + 8;
903
+ translateY = "0";
904
+ }
905
+ else if (top + popupSize.height > scrollY + viewportHeight) {
906
+ top = scrollY + viewportHeight - popupSize.height - 8;
907
+ translateY = "0";
908
+ }
909
+ break;
910
+ case "right":
911
+ left = triggerRect.right + scrollX + this.offset;
912
+ if (position === "start") {
913
+ top = triggerRect.top + scrollY;
914
+ }
915
+ else if (position === "center") {
916
+ top = triggerRect.top + scrollY + triggerHeight / 2;
917
+ translateY = "-50%";
918
+ }
919
+ else {
920
+ top = triggerRect.top + scrollY + triggerHeight;
921
+ translateY = "-100%";
922
+ }
923
+ // 边界约束:确保弹窗不超出视口
924
+ if (left + popupSize.width > scrollX + viewportWidth) {
925
+ left = scrollX + viewportWidth - popupSize.width - 8; // 距离右侧至少8px
926
+ }
927
+ if (top < scrollY) {
928
+ top = scrollY + 8;
929
+ translateY = "0";
930
+ }
931
+ else if (top + popupSize.height > scrollY + viewportHeight) {
932
+ top = scrollY + viewportHeight - popupSize.height - 8;
933
+ translateY = "0";
934
+ }
935
+ break;
936
+ }
937
+ return {
938
+ top: top + "px",
939
+ left: left + "px",
940
+ translateX,
941
+ translateY,
942
+ };
943
+ }
944
+ /**
945
+ * @param {?} triggerRect
946
+ * @param {?} popupRect
947
+ * @param {?} placement
948
+ * @param {?} position
949
+ * @param {?=} popupSize
950
+ * @return {?}
951
+ */
952
+ setPopupPosition(triggerRect, popupRect, placement, position, popupSize) {
953
+ /** @type {?} */
954
+ const popupEl = this.popupElement && this.popupElement.nativeElement
955
+ ? this.popupElement.nativeElement
956
+ : null;
957
+ if (!popupEl) {
958
+ return; // 如果元素还不存在,无法设置位置
959
+ }
960
+ // 优先使用传入的固定尺寸,否则从DOM获取
961
+ /** @type {?} */
962
+ const popupWidth = popupSize && popupSize.width !== null && popupSize.width !== undefined
963
+ ? popupSize.width
964
+ : popupRect.width || popupEl.offsetWidth || 300;
965
+ /** @type {?} */
966
+ const popupHeight = popupSize && popupSize.height !== null && popupSize.height !== undefined
967
+ ? popupSize.height
968
+ : popupRect.height || popupEl.offsetHeight || 200;
969
+ /** @type {?} */
970
+ const coordinates = this.calculatePositionCoordinates(triggerRect, placement, position, { width: popupWidth, height: popupHeight });
971
+ popupEl.style.top = coordinates.top;
972
+ popupEl.style.left = coordinates.left;
973
+ popupEl.style.transform = `translate(${coordinates.translateX}, ${coordinates.translateY})`;
974
+ }
975
+ /**
976
+ * @return {?}
977
+ */
978
+ onWindowResize() {
979
+ if (this.opened === "yes") {
980
+ this.updatePopupPosition();
981
+ }
982
+ }
983
+ }
984
+ SmartPopupComponent.decorators = [
985
+ { type: Component, args: [{
986
+ selector: "rs-smart-popup",
987
+ template: "<!-- \u89E6\u53D1\u5143\u7D20\u63D2\u69FD -->\r\n<ng-container #trigger>\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n</ng-container>\r\n\r\n<!-- \u5F39\u7A97\u5185\u5BB9 -->\r\n<div\r\n #popup\r\n class=\"rs-smart-popup-content\"\r\n [attr.data-opened]=\"opened\"\r\n [attr.data-positioning]=\"positioning\"\r\n>\r\n <div *ngIf=\"loading\" class=\"rs-smart-popup-loading\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n <div *ngIf=\"!loading\" class=\"rs-smart-popup-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n",
988
+ styles: [".rs-smart-popup-trigger{display:inline-block;cursor:pointer}::ng-deep #rs-smart-popup-fixed-container{width:0;height:0;z-index:100000;pointer-events:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content{pointer-events:auto;position:fixed;z-index:100001;padding:8px;border-radius:8px;background:#fff;box-shadow:0 0 8px 0 rgba(0,0,0,.25);min-width:200px;max-width:400px;max-height:500px;overflow:auto}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=no]{display:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes]{display:block}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=yes]{display:none!important}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=no]{display:block;visibility:visible;opacity:1;pointer-events:auto;-webkit-animation:.2s ease-out popup-fade-in;animation:.2s ease-out popup-fade-in}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-height:100px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-spinner{width:24px;height:24px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;-webkit-animation:1s linear infinite spin;animation:1s linear infinite spin;margin-bottom:12px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-text{color:#666;font-size:14px}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-body{width:100%}@-webkit-keyframes popup-fade-in{from{opacity:0;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(.95)}to{opacity:1;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(1)}}@keyframes popup-fade-in{from{opacity:0;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(.95)}to{opacity:1;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(1)}}"]
989
+ }] }
990
+ ];
991
+ /** @nocollapse */
992
+ SmartPopupComponent.ctorParameters = () => [
993
+ { type: ChangeDetectorRef }
994
+ ];
995
+ SmartPopupComponent.propDecorators = {
996
+ _placement: [{ type: Input, args: ["placement",] }],
997
+ _offset: [{ type: Input, args: ["offset",] }],
998
+ _autoAdjust: [{ type: Input, args: ["autoAdjust",] }],
999
+ triggerElementRef: [{ type: Input, args: ["triggerElement",] }],
1000
+ loading: [{ type: Input, args: ["loading",] }],
1001
+ _open: [{ type: Input, args: ["open",] }],
1002
+ _width: [{ type: Input, args: ["width",] }],
1003
+ _height: [{ type: Input, args: ["height",] }],
1004
+ openChange: [{ type: Output, args: ["openChange",] }],
1005
+ contentLoad: [{ type: Output, args: ["contentLoad",] }],
1006
+ internalTriggerElement: [{ type: ViewChild, args: ["trigger", { static: false },] }],
1007
+ popupElement: [{ type: ViewChild, args: ["popup", { static: false },] }],
1008
+ onWindowResize: [{ type: HostListener, args: ["window:resize",] }]
1009
+ };
1010
+ if (false) {
1011
+ /** @type {?} */
1012
+ SmartPopupComponent.prototype._placement;
1013
+ /** @type {?} */
1014
+ SmartPopupComponent.prototype._offset;
1015
+ /** @type {?} */
1016
+ SmartPopupComponent.prototype._autoAdjust;
1017
+ /** @type {?} */
1018
+ SmartPopupComponent.prototype.triggerElementRef;
1019
+ /** @type {?} */
1020
+ SmartPopupComponent.prototype.loading;
1021
+ /** @type {?} */
1022
+ SmartPopupComponent.prototype._open;
1023
+ /** @type {?} */
1024
+ SmartPopupComponent.prototype._width;
1025
+ /** @type {?} */
1026
+ SmartPopupComponent.prototype._height;
1027
+ /** @type {?} */
1028
+ SmartPopupComponent.prototype.openChange;
1029
+ /** @type {?} */
1030
+ SmartPopupComponent.prototype.contentLoad;
1031
+ /** @type {?} */
1032
+ SmartPopupComponent.prototype.internalTriggerElement;
1033
+ /** @type {?} */
1034
+ SmartPopupComponent.prototype.popupElement;
1035
+ /** @type {?} */
1036
+ SmartPopupComponent.prototype.currentTriggerElement;
1037
+ /** @type {?} */
1038
+ SmartPopupComponent.prototype.FIXED_CONTAINER_ID;
1039
+ /** @type {?} */
1040
+ SmartPopupComponent.prototype.fixedContainerEl;
1041
+ /** @type {?} */
1042
+ SmartPopupComponent.prototype.opened;
1043
+ /** @type {?} */
1044
+ SmartPopupComponent.prototype.positioning;
1045
+ /** @type {?} */
1046
+ SmartPopupComponent.prototype.actualPlacement;
1047
+ /** @type {?} */
1048
+ SmartPopupComponent.prototype.actualPosition;
1049
+ /** @type {?} */
1050
+ SmartPopupComponent.prototype.onClickOutside;
1051
+ /** @type {?} */
1052
+ SmartPopupComponent.prototype.onWindowScroll;
1053
+ /**
1054
+ * @type {?}
1055
+ * @private
1056
+ */
1057
+ SmartPopupComponent.prototype.ref;
1058
+ }
1059
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zbWFydC1wb3B1cC9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQXFCdkIsTUFBTSxPQUFPLG1CQUFtQjs7OztJQThEOUIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzRHRCLGVBQVUsR0FBa0IsWUFBWSxDQUFDO1FBQzVDLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDaEIsZ0JBQVcsR0FBaUIsS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUF1QixJQUFJLENBQUM7UUFDcEQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUM1QixVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBMEN6QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFPOUQsMEJBQXFCLEdBQXVCLElBQUksQ0FBQztRQWlKakQsdUJBQWtCLEdBQUcsZ0NBQWdDLENBQUM7UUFZdEQsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBaUIsSUFBSSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXdDLFFBQVEsQ0FBQztRQUNoRSxtQkFBYyxHQUErQixPQUFPLENBQUM7UUErTXJELG1CQUFjOzs7O1FBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7O2tCQUMvQixNQUFNLEdBQUcsbUJBQUEsS0FBSyxDQUFDLE1BQU0sRUFBVzs7a0JBQ2hDLGdC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ZixLQUFLLFNBQUMsTUFBTTtxQkFDWixLQUFLLFNBQUMsT0FBTztzQkFDYixLQUFLLFNBQUMsUUFBUTt5QkEwQ2QsTUFBTSxTQUFDLFlBQVk7MEJBQ25CLE1BQU0sU0FBQyxhQUFhO3FDQUVwQixTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTsyQkFFdEMsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7NkJBdTJCcEMsWUFBWSxTQUFDLGVBQWU7Ozs7SUE3NUI3Qix5Q0FBNkQ7O0lBQzdELHNDQUFxQzs7SUFDckMsMENBQXVEOztJQUN2RCxnREFBc0U7O0lBQ3RFLHNDQUEyQzs7SUFDM0Msb0NBQXNDOztJQUN0QyxxQ0FBNkM7O0lBQzdDLHNDQUErQzs7SUEwQy9DLHlDQUErRDs7SUFDL0QsMENBQThEOztJQUU5RCxxREFDZ0Q7O0lBQ2hELDJDQUN5Qzs7SUFFekMsb0RBQWlEOztJQWlKakQsaURBQXNEOztJQUN0RCwrQ0FBOEI7O0lBVzlCLHFDQUE0Qjs7SUFDNUIsMENBQWlDOztJQUNqQyw4Q0FBZ0U7O0lBQ2hFLDZDQUFxRDs7SUErTXJELDZDQVlFOztJQUVGLDZDQUlFOzs7OztJQS9YVSxrQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuZXhwb3J0IHR5cGUgUGxhY2VtZW50VHlwZSA9XHJcbiAgfCBcIlRvcExlZnRcIlxyXG4gIHwgXCJUb3BDZW50ZXJcIlxyXG4gIHwgXCJUb3BSaWdodFwiXHJcbiAgfCBcIkJvdHRvbUxlZnRcIlxyXG4gIHwgXCJCb3R0b21DZW50ZXJcIlxyXG4gIHwgXCJCb3R0b21SaWdodFwiXHJcbiAgfCBcIkxlZnRUb3BcIlxyXG4gIHwgXCJMZWZ0Q2VudGVyXCJcclxuICB8IFwiTGVmdEJvdHRvbVwiXHJcbiAgfCBcIlJpZ2h0VG9wXCJcclxuICB8IFwiUmlnaHRDZW50ZXJcIlxyXG4gIHwgXCJSaWdodEJvdHRvbVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwicnMtc21hcnQtcG9wdXBcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2luZGV4LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2luZGV4LmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRQb3B1cENvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcclxue1xyXG4gIEBJbnB1dChcInBsYWNlbWVudFwiKSBfcGxhY2VtZW50OiBQbGFjZW1lbnRUeXBlID0gXCJCb3R0b21MZWZ0XCI7XHJcbiAgQElucHV0KFwib2Zmc2V0XCIpIF9vZmZzZXQ6IG51bWJlciA9IDg7XHJcbiAgQElucHV0KFwiYXV0b0FkanVzdFwiKSBfYXV0b0FkanVzdDogXCJ5ZXNcIiB8IFwibm9cIiA9IFwieWVzXCI7XHJcbiAgQElucHV0KFwidHJpZ2dlckVsZW1lbnRcIikgdHJpZ2dlckVsZW1lbnRSZWY6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KFwibG9hZGluZ1wiKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KFwib3BlblwiKSBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dChcIndpZHRoXCIpIF93aWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KFwiaGVpZ2h0XCIpIF9oZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDop6PmnpBwbGFjZW1lbnTmoLzlvI9cclxuICBnZXQgcGxhY2VtZW50SW5mbygpOiB7XHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCI7XHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCI7XHJcbiAgfSB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRNYXA6IHtcclxuICAgICAgW2tleTogc3RyaW5nXToge1xyXG4gICAgICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIjtcclxuICAgICAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCI7XHJcbiAgICAgIH07XHJcbiAgICB9ID0ge1xyXG4gICAgICBUb3BMZWZ0OiB7IHBsYWNlbWVudDogXCJ0b3BcIiwgcG9zaXRpb246IFwic3RhcnRcIiB9LFxyXG4gICAgICBUb3BDZW50ZXI6IHsgcGxhY2VtZW50OiBcInRvcFwiLCBwb3NpdGlvbjogXCJjZW50ZXJcIiB9LFxyXG4gICAgICBUb3BSaWdodDogeyBwbGFjZW1lbnQ6IFwidG9wXCIsIHBvc2l0aW9uOiBcImVuZFwiIH0sXHJcbiAgICAgIEJvdHRvbUxlZnQ6IHsgcGxhY2VtZW50OiBcImJvdHRvbVwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIEJvdHRvbUNlbnRlcjogeyBwbGFjZW1lbnQ6IFwiYm90dG9tXCIsIHBvc2l0aW9uOiBcImNlbnRlclwiIH0sXHJcbiAgICAgIEJvdHRvbVJpZ2h0OiB7IHBsYWNlbWVudDogXCJib3R0b21cIiwgcG9zaXRpb246IFwiZW5kXCIgfSxcclxuICAgICAgTGVmdFRvcDogeyBwbGFjZW1lbnQ6IFwibGVmdFwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIExlZnRDZW50ZXI6IHsgcGxhY2VtZW50OiBcImxlZnRcIiwgcG9zaXRpb246IFwiY2VudGVyXCIgfSxcclxuICAgICAgTGVmdEJvdHRvbTogeyBwbGFjZW1lbnQ6IFwibGVmdFwiLCBwb3NpdGlvbjogXCJlbmRcIiB9LFxyXG4gICAgICBSaWdodFRvcDogeyBwbGFjZW1lbnQ6IFwicmlnaHRcIiwgcG9zaXRpb246IFwic3RhcnRcIiB9LFxyXG4gICAgICBSaWdodENlbnRlcjogeyBwbGFjZW1lbnQ6IFwicmlnaHRcIiwgcG9zaXRpb246IFwiY2VudGVyXCIgfSxcclxuICAgICAgUmlnaHRCb3R0b206IHsgcGxhY2VtZW50OiBcInJpZ2h0XCIsIHBvc2l0aW9uOiBcImVuZFwiIH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgcGxhY2VtZW50TWFwW3RoaXMuX3BsYWNlbWVudF0gfHwge1xyXG4gICAgICAgIHBsYWNlbWVudDogXCJib3R0b21cIixcclxuICAgICAgICBwb3NpdGlvbjogXCJzdGFydFwiLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9vZmZzZXQgfHwgODtcclxuICB9XHJcblxyXG4gIGdldCBhdXRvQWRqdXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3QgPT09IFwieWVzXCI7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KFwib3BlbkNoYW5nZVwiKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBPdXRwdXQoXCJjb250ZW50TG9hZFwiKSBjb250ZW50TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcInRyaWdnZXJcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW50ZXJuYWxUcmlnZ2VyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcInBvcHVwXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHBvcHVwRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIGN1cnJlbnRUcmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmZpeGVkQ29udGFpbmVyRWwgPSB0aGlzLmdldEZpeGVkQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmZpeGVkQ29udGFpbmVyRWwuYXBwZW5kKHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG5cclxuICAgIC8vIOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOeri+WNs+W6lOeUqFxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl93aWR0aCAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLl9oZWlnaHQgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHBvcHVwRWwgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBwb3B1cEVsLnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICBwb3B1cEVsLnN0eWxlLm1pbldpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUubWF4V2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgcG9wdXBFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUubWF4SGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOWklumDqOS8oOWFpSBvcGVuIOWxnuaAp+S4uiB0cnVl77yM6Ieq5Yqo5omT5byAXHJcbiAgICBpZiAodGhpcy5fb3Blbikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3BlbigpLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIC8vIOWkhOeQhuWbuuWumuWwuuWvuOWPmOWMllxyXG4gICAgaWYgKFxyXG4gICAgICAoY2hhbmdlcy5fd2lkdGggfHwgY2hhbmdlcy5faGVpZ2h0KSAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgcG9wdXBFbCA9IHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbldpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLmhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1heEhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWFiOWkhOeQhuinpuWPkeWFg+e0oOWPmOWMlu+8iOehruS/neWcqOaJk+W8gOWJjeabtOaWsOinpuWPkeWFg+e0oO+8iVxyXG4gICAgaWYgKGNoYW5nZXMudHJpZ2dlckVsZW1lbnRSZWYpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNUcmlnZ2VyID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQ7XHJcbiAgICAgIHRoaXMudXBkYXRlVHJpZ2dlckVsZW1lbnQoKTtcclxuXHJcbiAgICAgIC8vIOWmguaenOW8ueeql+W3sue7j+aJk+W8gO+8jOS4lOinpuWPkeWFg+e0oOWPkeeUn+S6huWPmOWMlu+8jOeri+WNs+abtOaWsOS9jee9rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcGVuZWQgPT09IFwieWVzXCIgJiZcclxuICAgICAgICBwcmV2aW91c1RyaWdnZXIgIT09IHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ICYmXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnRcclxuICAgICAgKSB7XHJcbiAgICAgICAgLy8g5L2/55So5paw55qE5omT5byA5pa55byP5pu05paw5L2N572uXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwieWVzXCI7XHJcbiAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aSE55CGIG9wZW4g5Y+Y5YyW77yI56Gu5L+d5Zyo6Kem5Y+R5YWD57Sg5pu05paw5ZCO5aSE55CG77yJXHJcbiAgICBpZiAoY2hhbmdlcy5fb3Blbikge1xyXG4gICAgICBpZiAodGhpcy5fb3BlbiAmJiB0aGlzLm9wZW5lZCA9PT0gXCJub1wiKSB7XHJcbiAgICAgICAgLy8g56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgICAgIC8vIOS9v+eUqCBzZXRUaW1lb3V0IOehruS/neaJgOacieWPmOabtOmDveW3suWkhOeQhlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8g5YaN5qyh56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5fb3BlbiAmJiB0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOW9k+WKoOi9veWujOaIkOaXtu+8jOabtOaWsOS9jee9ru+8iOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOS4jemcgOimgeabtOaWsOS9jee9ru+8iVxyXG4gICAgaWYgKFxyXG4gICAgICBjaGFuZ2VzLmxvYWRpbmcgJiZcclxuICAgICAgIWNoYW5nZXMubG9hZGluZy5jdXJyZW50VmFsdWUgJiZcclxuICAgICAgY2hhbmdlcy5sb2FkaW5nLnByZXZpb3VzVmFsdWVcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgICAvLyDlpoLmnpzmj5Dkvpvkuoblm7rlrprlsLrlr7jvvIzkvY3nva7lt7Lnu4/orqHnrpflpb3kuobvvIzkuI3pnIDopoHmm7TmlrBcclxuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IG51bGwgJiYgdGhpcy5faGVpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkLmVtaXQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5a6a5L2N77yM5LiN6ZyA6KaB5pu05paw5L2N572uXHJcbiAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbmluZyA9PT0gXCJub1wiKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZC5lbWl0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5a6a5L2N77yM562J5b6F5a6a5L2N5a6M5oiQ5ZCO5YaN6Kem5Y+R5LqL5Lu2XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUG9zaXRpb25pbmcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25pbmcgPT09IFwibm9cIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tQb3NpdGlvbmluZywgMTApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hlY2tQb3NpdGlvbmluZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm9uQ2xpY2tPdXRzaWRlKTtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25XaW5kb3dTY3JvbGwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJpZ2dlckVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlckVsZW1lbnRSZWY7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmludGVybmFsVHJpZ2dlckVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5pbnRlcm5hbFRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRoaXMuaW50ZXJuYWxUcmlnZ2VyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgRklYRURfQ09OVEFJTkVSX0lEID0gXCJycy1zbWFydC1wb3B1cC1maXhlZC1jb250YWluZXJcIjtcclxuICBmaXhlZENvbnRhaW5lckVsOiBIVE1MRWxlbWVudDtcclxuICBnZXRGaXhlZENvbnRhaW5lcigpIHtcclxuICAgIGxldCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GSVhFRF9DT05UQUlORVJfSUQpO1xyXG4gICAgaWYgKCFjb250YWluZXJFbGVtZW50KSB7XHJcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICBjb250YWluZXJFbGVtZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuRklYRURfQ09OVEFJTkVSX0lEKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udGFpbmVyRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG9wZW5lZDogXCJ5ZXNcIiB8IFwibm9cIiA9IFwibm9cIjtcclxuICBwb3NpdGlvbmluZzogXCJ5ZXNcIiB8IFwibm9cIiA9IFwibm9cIjtcclxuICBhY3R1YWxQbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIgPSBcImJvdHRvbVwiO1xyXG4gIGFjdHVhbFBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIjtcclxuXHJcbiAgb3Blbih0cmlnZ2VyRWxlbWVudD86IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyDlpoLmnpzkvKDlhaXkuobop6blj5HlhYPntKDvvIzkvb/nlKjlroNcclxuICAgIGlmICh0cmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRyaWdnZXJFbGVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiU21hcnRQb3B1cENvbXBvbmVudDogTm8gdHJpZ2dlciBlbGVtZW50IGZvdW5kXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5bey57uP5omT5byA77yM5YWI5YWz6Zet5YaN5omT5byA77yI5pu05paw5L2N572u77yJXHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgLy8g5YWI5YWz6Zet5by556qXXHJcbiAgICAgIHRoaXMub3BlbmVkID0gXCJub1wiO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgLy8g56uL5Y2z5Zyo5paw5L2N572u5omT5byAXHJcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5YaN5qyh56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgICAgIHRoaXMub3BlblBvcHVwKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICB0aGlzLm9wZW5Qb3B1cCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuUG9wdXAoKSB7XHJcbiAgICAvLyDlho3mrKHnoa7kv53op6blj5HlhYPntKDlt7Lmm7TmlrBcclxuICAgIHRoaXMudXBkYXRlVHJpZ2dlckVsZW1lbnQoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIlNtYXJ0UG9wdXBDb21wb25lbnQ6IE5vIHRyaWdnZXIgZWxlbWVudCBmb3VuZCB3aGVuIG9wZW5pbmcgcG9wdXBcIlxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM5Y+v5Lul5Zyo5omT5byA5YmN5bCx6K6h566X5aW95L2N572uXHJcbiAgICBpZiAodGhpcy5fd2lkdGggIT09IG51bGwgJiYgdGhpcy5faGVpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIOWFiOiuoeeul+S9jee9ru+8iOS4jeS+nei1lkRPTea4suafk++8jOebtOaOpeagueaNrnRyaWdnZXJFbGVtZW506K6h566X77yJXHJcbiAgICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBwb3B1cFNpemUgPSB7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcG9wdXBSZWN0OiBET01SZWN0ID0ge1xyXG4gICAgICAgIHdpZHRoOiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBwb3B1cFNpemUuaGVpZ2h0LFxyXG4gICAgICAgIHRvcDogMCxcclxuICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgIHJpZ2h0OiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgICAgYm90dG9tOiBwb3B1cFNpemUuaGVpZ2h0LFxyXG4gICAgICAgIHg6IDAsXHJcbiAgICAgICAgeTogMCxcclxuICAgICAgICB0b0pTT046ICgpID0+ICh7fSksXHJcbiAgICAgIH0gYXMgRE9NUmVjdDtcclxuXHJcbiAgICAgIGNvbnN0IHRhcmdldEluZm8gPSB0aGlzLnBsYWNlbWVudEluZm87XHJcbiAgICAgIGxldCBmaW5hbFBsYWNlbWVudCA9IHRhcmdldEluZm8ucGxhY2VtZW50O1xyXG4gICAgICBsZXQgZmluYWxQb3NpdGlvbiA9IHRhcmdldEluZm8ucG9zaXRpb247XHJcblxyXG4gICAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW1hbCA9IHRoaXMuY2FsY3VsYXRlT3B0aW1hbFBsYWNlbWVudChcclxuICAgICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICAgICAgdmlld3BvcnRXaWR0aCxcclxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0XHJcbiAgICAgICAgKTtcclxuICAgICAgICBmaW5hbFBsYWNlbWVudCA9IG9wdGltYWwucGxhY2VtZW50O1xyXG4gICAgICAgIGZpbmFsUG9zaXRpb24gPSBvcHRpbWFsLnBvc2l0aW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFjdHVhbFBsYWNlbWVudCA9IGZpbmFsUGxhY2VtZW50O1xyXG4gICAgICB0aGlzLmFjdHVhbFBvc2l0aW9uID0gZmluYWxQb3NpdGlvbjtcclxuXHJcbiAgICAgIC8vIOiuoeeul+S9jee9ruWdkOagh++8iOS4jeS+nei1lkRPTe+8jOebtOaOpeiuoeeul++8iVxyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhcclxuICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICBmaW5hbFBsYWNlbWVudCxcclxuICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8g5YWI6K6+572u5omT5byA54q25oCB77yM5L2G5L+d5oyB6ZqQ6JeP77yIcG9zaXRpb25pbmcgPSB5ZXPvvIlcclxuICAgICAgdGhpcy5vcGVuZWQgPSBcInllc1wiO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJ5ZXNcIjtcclxuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgLy8g5by65Yi25pu05paw6KeG5Zu+77yM56Gu5L+dRE9N5bey5pu05pawXHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIC8vIOWmguaenOWFg+e0oOW3sue7j+WtmOWcqO+8jOeri+WNs+iuvue9ruS9jee9ru+8iOS4jeetieW+hSByZXF1ZXN0QW5pbWF0aW9uRnJhbWXvvIlcclxuICAgICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8g56uL5Y2z6K6+572u5bC65a+45ZKM5L2N572uXHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS53aWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUubWluV2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1heFdpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5tYXhIZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS50b3AgPSBwb3NpdGlvbi50b3A7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ubGVmdDtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtwb3NpdGlvbi50cmFuc2xhdGVYfSwgJHtwb3NpdGlvbi50cmFuc2xhdGVZfSlgO1xyXG5cclxuICAgICAgICAvLyDlvLrliLblkIzmraXlupTnlKjmoLflvI9cclxuICAgICAgICBwb3B1cEVsLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgLy8g5L2N572u6K6+572u5a6M5oiQ5ZCO77yM56uL5Y2z5pi+56S65by556qXXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwibm9cIjtcclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlpoLmnpzlhYPntKDov5jkuI3lrZjlnKjvvIznrYnlvoXmuLLmn5NcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wdXBFbCA9IHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyDnq4vljbPorr7nva7lsLrlr7jlkozkvY3nva5cclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS53aWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLmhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5XaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLm1heFdpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUubWluSGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLm1heEhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS50b3AgPSBwb3NpdGlvbi50b3A7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUubGVmdCA9IHBvc2l0aW9uLmxlZnQ7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnRyYW5zbGF0ZVh9LCAke3Bvc2l0aW9uLnRyYW5zbGF0ZVl9KWA7XHJcblxyXG4gICAgICAgICAgICAvLyDlvLrliLblkIzmraXlupTnlKjmoLflvI9cclxuICAgICAgICAgICAgcG9wdXBFbC5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyDkvY3nva7orr7nva7lrozmiJDlkI7vvIznq4vljbPmmL7npLrlvLnnqpdcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwibm9cIjtcclxuICAgICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOayoeacieWbuuWumuWwuuWvuO+8jOmcgOimgeetieW+hURPTea4suafk1xyXG4gICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJ5ZXNcIjtcclxuICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAvLyDnq4vljbPlvLrliLbmm7TmlrDop4blm77vvIznoa7kv51ET03lt7Lmm7TmlrBcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgLy8g5L2/55SoIHJlcXVlc3RBbmltYXRpb25GcmFtZSDnoa7kv53lnKjmtY/op4jlmajmuLLmn5PkuYvliY3mm7TmlrDkvY3nva5cclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyDnoa7kv53lhYPntKDlt7LmuLLmn5Plubbojrflj5blsLrlr7hcclxuICAgICAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgLy8g5by65Yi26YeN5paw6K6h566X5biD5bGA77yM56Gu5L+d5YWD57Sg5bC65a+45bey6K6h566XXHJcbiAgICAgICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAvLyDorqHnrpflubborr7nva7kvY3nva5cclxuICAgICAgICAgIHRoaXMudXBkYXRlUG9wdXBQb3NpdGlvbigpO1xyXG5cclxuICAgICAgICAgIC8vIOS9jee9ruiuvue9ruWujOaIkOWQju+8jOenu+mZpOWumuS9jeeKtuaAge+8jOaYvuekuuW8ueeql1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwibm9cIjtcclxuICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm9uQ2xpY2tPdXRzaWRlKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25XaW5kb3dTY3JvbGwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwibm9cIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcGVuZWQgPSBcIm5vXCI7XHJcbiAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm9uQ2xpY2tPdXRzaWRlKTtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25XaW5kb3dTY3JvbGwsIHRydWUpO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrVHJpZ2dlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnRvZ2dsZSgpO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG4gICAgY29uc3QgaXNDbGlja09uVHJpZ2dlciA9XHJcbiAgICAgIHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ICYmIHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XHJcbiAgICBjb25zdCBpc0NsaWNrT25Qb3B1cCA9XHJcbiAgICAgIHRoaXMucG9wdXBFbGVtZW50ICYmXHJcbiAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG5cclxuICAgIGlmICghaXNDbGlja09uVHJpZ2dlciAmJiAhaXNDbGlja09uUG9wdXApIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIG9uV2luZG93U2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkID09PSBcInllc1wiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIOiuoeeul+W5tuiuvue9ruS9jee9ru+8iOaUr+aMgeWbuuWumuWwuuWvuO+8jOWPr+WcqOaJk+W8gOWJjeiwg+eUqO+8iVxyXG4gIHByaXZhdGUgY2FsY3VsYXRlQW5kU2V0UG9zaXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmlnZ2VyUmVjdCA9IHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgLy8g6I635Y+W5by556qX5bC65a+477yI5LyY5YWI5L2/55So5Zu65a6a5bC65a+477yJXHJcbiAgICBjb25zdCBwb3B1cFNpemUgPSB7XHJcbiAgICAgIHdpZHRoOlxyXG4gICAgICAgIHRoaXMuX3dpZHRoICE9PSBudWxsXHJcbiAgICAgICAgICA/IHRoaXMuX3dpZHRoXHJcbiAgICAgICAgICA6IHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgID8gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgOiAzMDAsXHJcbiAgICAgIGhlaWdodDpcclxuICAgICAgICB0aGlzLl9oZWlnaHQgIT09IG51bGxcclxuICAgICAgICAgID8gdGhpcy5faGVpZ2h0XHJcbiAgICAgICAgICA6IHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgID8gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgIDogMjAwLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDliJvlu7romZrmi5/nmoQgcG9wdXBSZWN077yI55So5LqO6K6h566X77yJXHJcbiAgICBjb25zdCBwb3B1cFJlY3Q6IERPTVJlY3QgPSB7XHJcbiAgICAgIHdpZHRoOiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgIGhlaWdodDogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgdG9wOiAwLFxyXG4gICAgICBsZWZ0OiAwLFxyXG4gICAgICByaWdodDogcG9wdXBTaXplLndpZHRoLFxyXG4gICAgICBib3R0b206IHBvcHVwU2l6ZS5oZWlnaHQsXHJcbiAgICAgIHg6IDAsXHJcbiAgICAgIHk6IDAsXHJcbiAgICAgIHRvSlNPTjogKCkgPT4gKHt9KSxcclxuICAgIH0gYXMgRE9NUmVjdDtcclxuXHJcbiAgICAvLyDojrflj5bnm67moIfkvY3nva7kv6Hmga9cclxuICAgIGNvbnN0IHRhcmdldEluZm8gPSB0aGlzLnBsYWNlbWVudEluZm87XHJcbiAgICBsZXQgZmluYWxQbGFjZW1lbnQgPSB0YXJnZXRJbmZvLnBsYWNlbWVudDtcclxuICAgIGxldCBmaW5hbFBvc2l0aW9uID0gdGFyZ2V0SW5mby5wb3NpdGlvbjtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICAgIHZpZXdwb3J0V2lkdGgsXHJcbiAgICAgICAgdmlld3BvcnRIZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgZmluYWxQbGFjZW1lbnQgPSBvcHRpbWFsLnBsYWNlbWVudDtcclxuICAgICAgZmluYWxQb3NpdGlvbiA9IG9wdGltYWwucG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSBmaW5hbFBsYWNlbWVudDtcclxuICAgIHRoaXMuYWN0dWFsUG9zaXRpb24gPSBmaW5hbFBvc2l0aW9uO1xyXG5cclxuICAgIC8vIOeri+WNs+iuvue9ruS9jee9ru+8iOWNs+S9v+WFg+e0oOi/mOayoeWujOWFqOa4suafk++8jOS5n+imgeWFiOiuvue9ruS9jee9ru+8iVxyXG4gICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5zZXRQb3B1cFBvc2l0aW9uKFxyXG4gICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICBmaW5hbFBsYWNlbWVudCxcclxuICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICApO1xyXG4gICAgICAvLyDlvLrliLblupTnlKjmoLflvI/vvIznoa7kv53kvY3nva7nq4vljbPnlJ/mlYhcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c5YWD57Sg6L+Y5LiN5a2Y5Zyo77yM5bu26L+f6K6+572u5L2N572uXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnNldFBvcHVwUG9zaXRpb24oXHJcbiAgICAgICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgICAgICBwb3B1cFNpemVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvcHVwUG9zaXRpb24oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5wb3B1cEVsZW1lbnQgfHxcclxuICAgICAgIXRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM5L2/55So5Zu65a6a5bC65a+46K6h566XXHJcbiAgICBpZiAodGhpcy5fd2lkdGggIT09IG51bGwgJiYgdGhpcy5faGVpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQW5kU2V0UG9zaXRpb24oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBwb3B1cFJlY3QgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgLy8g6I635Y+W55uu5qCH5L2N572u5L+h5oGvXHJcbiAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgbGV0IGZpbmFsUGxhY2VtZW50ID0gdGFyZ2V0SW5mby5wbGFjZW1lbnQ7XHJcbiAgICBsZXQgZmluYWxQb3NpdGlvbiA9IHRhcmdldEluZm8ucG9zaXRpb247XHJcblxyXG4gICAgaWYgKHRoaXMuYXV0b0FkanVzdCkge1xyXG4gICAgICBjb25zdCBvcHRpbWFsID0gdGhpcy5jYWxjdWxhdGVPcHRpbWFsUGxhY2VtZW50KFxyXG4gICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICB2aWV3cG9ydFdpZHRoLFxyXG4gICAgICAgIHZpZXdwb3J0SGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIGZpbmFsUGxhY2VtZW50ID0gb3B0aW1hbC5wbGFjZW1lbnQ7XHJcbiAgICAgIGZpbmFsUG9zaXRpb24gPSBvcHRpbWFsLnBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0dWFsUGxhY2VtZW50ID0gZmluYWxQbGFjZW1lbnQ7XHJcbiAgICB0aGlzLmFjdHVhbFBvc2l0aW9uID0gZmluYWxQb3NpdGlvbjtcclxuICAgIHRoaXMuc2V0UG9wdXBQb3NpdGlvbihcclxuICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgZmluYWxQbGFjZW1lbnQsXHJcbiAgICAgIGZpbmFsUG9zaXRpb25cclxuICAgICk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICB0cmlnZ2VyUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICBwb3B1cFJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxyXG4gICAgdmlld3BvcnRIZWlnaHQ6IG51bWJlclxyXG4gICk6IHtcclxuICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIjtcclxuICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIjtcclxuICB9IHtcclxuICAgIGNvbnN0IHRhcmdldEluZm8gPSB0aGlzLnBsYWNlbWVudEluZm87XHJcbiAgICBjb25zdCBwcmVmZXJyZWQgPSB0YXJnZXRJbmZvLnBsYWNlbWVudDtcclxuICAgIGNvbnN0IHByZWZlcnJlZFBvc2l0aW9uID0gdGFyZ2V0SW5mby5wb3NpdGlvbjtcclxuXHJcbiAgICBjb25zdCBzcGFjZSA9IHtcclxuICAgICAgdG9wOiB0cmlnZ2VyUmVjdC50b3AsXHJcbiAgICAgIGJvdHRvbTogdmlld3BvcnRIZWlnaHQgLSB0cmlnZ2VyUmVjdC5ib3R0b20sXHJcbiAgICAgIGxlZnQ6IHRyaWdnZXJSZWN0LmxlZnQsXHJcbiAgICAgIHJpZ2h0OiB2aWV3cG9ydFdpZHRoIC0gdHJpZ2dlclJlY3QucmlnaHQsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHBvcHVwU2l6ZSA9IHtcclxuICAgICAgd2lkdGg6IHBvcHVwUmVjdC53aWR0aCB8fCAzMDAsIC8vIOm7mOiupOWuveW6pu+8jOWmguaenOi/mOayoeaciea4suafk1xyXG4gICAgICBoZWlnaHQ6IHBvcHVwUmVjdC5oZWlnaHQgfHwgMjAwLCAvLyDpu5jorqTpq5jluqZcclxuICAgIH07XHJcblxyXG4gICAgLy8g5qOA5p+l6aaW6YCJ5L2N572u5piv5ZCm5pyJ6Laz5aSf56m66Ze0XHJcbiAgICBjb25zdCBoYXNFbm91Z2hTcGFjZSA9IChwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIpID0+IHtcclxuICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgICBjYXNlIFwidG9wXCI6XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2UudG9wID49IHBvcHVwU2l6ZS5oZWlnaHQgKyB0aGlzLm9mZnNldDtcclxuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2UuYm90dG9tID49IHBvcHVwU2l6ZS5oZWlnaHQgKyB0aGlzLm9mZnNldDtcclxuICAgICAgICBjYXNlIFwibGVmdFwiOlxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlLmxlZnQgPj0gcG9wdXBTaXplLndpZHRoICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2UucmlnaHQgPj0gcG9wdXBTaXplLndpZHRoICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8g5qOA5p+l5oyH5a6a5L2N572u5piv5ZCm5pyJ6Laz5aSf56m66Ze0XHJcbiAgICBjb25zdCBjaGVja1Bvc2l0aW9uU3BhY2UgPSAoXHJcbiAgICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIixcclxuICAgICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiXHJcbiAgICApOiBib29sZWFuID0+IHtcclxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gXCJ0b3BcIiB8fCBwbGFjZW1lbnQgPT09IFwiYm90dG9tXCIpIHtcclxuICAgICAgICAvLyDlr7nkuo7kuIrkuIvkvY3nva7vvIzmo4Dmn6XmsLTlubPlr7npvZDnqbrpl7RcclxuICAgICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlTGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VSaWdodCA9IHZpZXdwb3J0V2lkdGggLSB0cmlnZ2VyUmVjdC5yaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VMZWZ0ID49IHBvcHVwV2lkdGggLyAyICYmIHNwYWNlUmlnaHQgPj0gcG9wdXBXaWR0aCAvIDI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VMZWZ0ID49IHBvcHVwV2lkdGg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVuZFxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlUmlnaHQgPj0gcG9wdXBXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5a+55LqO5bem5Y+z5L2N572u77yM5qOA5p+l5Z6C55u05a+56b2Q56m66Ze0XHJcbiAgICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cFNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHNwYWNlVG9wID0gdHJpZ2dlclJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlQm90dG9tID0gdmlld3BvcnRIZWlnaHQgLSB0cmlnZ2VyUmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlVG9wID49IHBvcHVwSGVpZ2h0IC8gMiAmJiBzcGFjZUJvdHRvbSA+PSBwb3B1cEhlaWdodCAvIDI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VUb3AgPj0gcG9wdXBIZWlnaHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVuZFxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlQm90dG9tID49IHBvcHVwSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDorqHnrpfkvY3nva7mmK/lkKblkIjpgILvvIjogIPomZHmsLTlubMv5Z6C55u05a+56b2Q77yJXHJcbiAgICBjb25zdCBjYWxjdWxhdGVQb3NpdGlvbiA9IChcclxuICAgICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiXHJcbiAgICApOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9PiB7XHJcbiAgICAgIGlmIChwbGFjZW1lbnQgPT09IFwidG9wXCIgfHwgcGxhY2VtZW50ID09PSBcImJvdHRvbVwiKSB7XHJcbiAgICAgICAgLy8g5a+55LqO5LiK5LiL5L2N572u77yM5qOA5p+l5rC05bmz5a+56b2QXHJcbiAgICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwU2l6ZS53aWR0aDtcclxuICAgICAgICBjb25zdCBzcGFjZUxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IHNwYWNlUmlnaHQgPSB2aWV3cG9ydFdpZHRoIC0gdHJpZ2dlclJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS8mOWFiOWwneivleS9v+eUqOeUqOaIt+aMh+WumueahHBvc2l0aW9uXHJcbiAgICAgICAgaWYgKGNoZWNrUG9zaXRpb25TcGFjZShwbGFjZW1lbnQsIHByZWZlcnJlZFBvc2l0aW9uKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHByZWZlcnJlZFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5Lit5b+D5a+56b2Q5pyJ6Laz5aSf56m66Ze077yM5LyY5YWI5L2/55So5Lit5b+DXHJcbiAgICAgICAgaWYgKHNwYWNlTGVmdCA+PSBwb3B1cFdpZHRoIC8gMiAmJiBzcGFjZVJpZ2h0ID49IHBvcHVwV2lkdGggLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5aaC5p6c5bem5L6n56m66Ze05LiN6Laz77yM5L2/55So5Y+z5a+56b2QXHJcbiAgICAgICAgaWYgKHNwYWNlTGVmdCA8IHBvcHVwV2lkdGggLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJlbmRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5aaC5p6c5Y+z5L6n56m66Ze05LiN6Laz77yM5L2/55So5bem5a+56b2QXHJcbiAgICAgICAgaWYgKHNwYWNlUmlnaHQgPCBwb3B1cFdpZHRoIC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwic3RhcnRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByZWZlcnJlZFBvc2l0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWvueS6juW3puWPs+S9jee9ru+8jOajgOafpeWeguebtOWvuem9kFxyXG4gICAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXBTaXplLmhlaWdodDtcclxuICAgICAgICBjb25zdCBzcGFjZVRvcCA9IHRyaWdnZXJSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBzcGFjZUJvdHRvbSA9IHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgICAvLyDkvJjlhYjlsJ3or5Xkvb/nlKjnlKjmiLfmjIflrprnmoRwb3NpdGlvblxyXG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uU3BhY2UocGxhY2VtZW50LCBwcmVmZXJyZWRQb3NpdGlvbikpIHtcclxuICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQb3NpdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWmguaenOS4reW/g+Wvuem9kOaciei2s+Wkn+epuumXtO+8jOS8mOWFiOS9v+eUqOS4reW/g1xyXG4gICAgICAgIGlmIChzcGFjZVRvcCA+PSBwb3B1cEhlaWdodCAvIDIgJiYgc3BhY2VCb3R0b20gPj0gcG9wdXBIZWlnaHQgLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5aaC5p6c5LiK5pa556m66Ze05LiN6Laz77yM5L2/55So5LiL5a+56b2QXHJcbiAgICAgICAgaWYgKHNwYWNlVG9wIDwgcG9wdXBIZWlnaHQgLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJlbmRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5aaC5p6c5LiL5pa556m66Ze05LiN6Laz77yM5L2/55So5LiK5a+56b2QXHJcbiAgICAgICAgaWYgKHNwYWNlQm90dG9tIDwgcG9wdXBIZWlnaHQgLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJlZmVycmVkUG9zaXRpb247XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8g5aaC5p6c6aaW6YCJ5L2N572u5pyJ6Laz5aSf56m66Ze077yM5LyY5YWI5L2/55So55So5oi35oyH5a6a55qEcG9zaXRpb25cclxuICAgIGlmIChoYXNFbm91Z2hTcGFjZShwcmVmZXJyZWQpKSB7XHJcbiAgICAgIC8vIOajgOafpeeUqOaIt+aMh+WumueahHBvc2l0aW9u5piv5ZCm5pyJ6Laz5aSf56m66Ze0XHJcbiAgICAgIGlmIChjaGVja1Bvc2l0aW9uU3BhY2UocHJlZmVycmVkLCBwcmVmZXJyZWRQb3NpdGlvbikpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcGxhY2VtZW50OiBwcmVmZXJyZWQsXHJcbiAgICAgICAgICBwb3NpdGlvbjogcHJlZmVycmVkUG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmjIflrprnmoRwb3NpdGlvbuepuumXtOS4jei2s++8jOiHquWKqOiuoeeul+acgOS9s3Bvc2l0aW9uXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcGxhY2VtZW50OiBwcmVmZXJyZWQsXHJcbiAgICAgICAgcG9zaXRpb246IGNhbGN1bGF0ZVBvc2l0aW9uKHByZWZlcnJlZCksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5qC55o2u6aaW6YCJ5L2N572u6YCJ5oup5aSH6YCJ5L2N572uXHJcbiAgICBjb25zdCBhbHRlcm5hdGl2ZXM6IHtcclxuICAgICAgW2tleTogc3RyaW5nXTogKFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIpW107XHJcbiAgICB9ID0ge1xyXG4gICAgICBib3R0b206IFtcInRvcFwiLCBcInJpZ2h0XCIsIFwibGVmdFwiXSxcclxuICAgICAgdG9wOiBbXCJib3R0b21cIiwgXCJyaWdodFwiLCBcImxlZnRcIl0sXHJcbiAgICAgIHJpZ2h0OiBbXCJsZWZ0XCIsIFwiYm90dG9tXCIsIFwidG9wXCJdLFxyXG4gICAgICBsZWZ0OiBbXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcInRvcFwiXSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWx0TGlzdCA9IGFsdGVybmF0aXZlc1twcmVmZXJyZWRdIHx8IFtdO1xyXG5cclxuICAgIC8vIOWwneivleaJvuWIsOesrOS4gOS4quaciei2s+Wkn+epuumXtOeahOWkh+mAieS9jee9rlxyXG4gICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlzdCkge1xyXG4gICAgICBpZiAoaGFzRW5vdWdoU3BhY2UoYWx0KSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBwbGFjZW1lbnQ6IGFsdCxcclxuICAgICAgICAgIHBvc2l0aW9uOiBjYWxjdWxhdGVQb3NpdGlvbihhbHQpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzpg73msqHmnInotrPlpJ/nqbrpl7TvvIzpgInmi6nnqbrpl7TmnIDlpKfnmoTkvY3nva5cclxuICAgIGNvbnN0IG1heFNwYWNlID0gTWF0aC5tYXgoc3BhY2UudG9wLCBzcGFjZS5ib3R0b20sIHNwYWNlLmxlZnQsIHNwYWNlLnJpZ2h0KTtcclxuICAgIGxldCBiZXN0UGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiO1xyXG4gICAgaWYgKG1heFNwYWNlID09PSBzcGFjZS50b3ApIGJlc3RQbGFjZW1lbnQgPSBcInRvcFwiO1xyXG4gICAgZWxzZSBpZiAobWF4U3BhY2UgPT09IHNwYWNlLmJvdHRvbSkgYmVzdFBsYWNlbWVudCA9IFwiYm90dG9tXCI7XHJcbiAgICBlbHNlIGlmIChtYXhTcGFjZSA9PT0gc3BhY2UubGVmdCkgYmVzdFBsYWNlbWVudCA9IFwibGVmdFwiO1xyXG4gICAgZWxzZSBiZXN0UGxhY2VtZW50ID0gXCJyaWdodFwiO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBsYWNlbWVudDogYmVzdFBsYWNlbWVudCxcclxuICAgICAgcG9zaXRpb246IGNhbGN1bGF0ZVBvc2l0aW9uKGJlc3RQbGFjZW1lbnQpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+S9jee9ruWdkOagh++8iOe6r+iuoeeul++8jOS4jeS+nei1lkRPTe+8jOWMheWQq+i+ueeVjOe6puadn++8iVxyXG4gIHByaXZhdGUgY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhcclxuICAgIHRyaWdnZXJSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIixcclxuICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcclxuICAgIHBvcHVwU2l6ZTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XHJcbiAgKTogeyB0b3A6IHN0cmluZzsgbGVmdDogc3RyaW5nOyB0cmFuc2xhdGVYOiBzdHJpbmc7IHRyYW5zbGF0ZVk6IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IHRyaWdnZXJSZWN0LndpZHRoO1xyXG4gICAgY29uc3QgdHJpZ2dlckhlaWdodCA9IHRyaWdnZXJSZWN0LmhlaWdodDtcclxuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgY29uc3Qgc2Nyb2xsWCA9IHdpbmRvdy5zY3JvbGxYO1xyXG4gICAgY29uc3Qgc2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZO1xyXG5cclxuICAgIGxldCB0b3AgPSAwO1xyXG4gICAgbGV0IGxlZnQgPSAwO1xyXG4gICAgbGV0IHRyYW5zbGF0ZVggPSBcIjBcIjtcclxuICAgIGxldCB0cmFuc2xhdGVZID0gXCIwXCI7XHJcblxyXG4gICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHNjcm9sbFkgLSB0aGlzLm9mZnNldDtcclxuICAgICAgICB0cmFuc2xhdGVZID0gXCItMTAwJVwiO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCArIHNjcm9sbFg7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyBzY3JvbGxYICsgdHJpZ2dlcldpZHRoIC8gMjtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi01MCVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyBzY3JvbGxYICsgdHJpZ2dlcldpZHRoO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTEwMCVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6L6555WM57qm5p2f77ya56Gu5L+d5by556qX5LiN6LaF5Ye66KeG5Y+jXHJcbiAgICAgICAgaWYgKHRvcCAtIHBvcHVwU2l6ZS5oZWlnaHQgPCBzY3JvbGxZKSB7XHJcbiAgICAgICAgICB0b3AgPSBzY3JvbGxZICsgODsgLy8g6Led56a76aG26YOo6Iez5bCROHB4XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsZWZ0IDwgc2Nyb2xsWCkge1xyXG4gICAgICAgICAgbGVmdCA9IHNjcm9sbFggKyA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHNjcm9sbFggKyB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGggLSBwb3B1cFNpemUud2lkdGggLSA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJib3R0b21cIjpcclxuICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC5ib3R0b20gKyBzY3JvbGxZICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgc2Nyb2xsWDtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCArIHNjcm9sbFggKyB0cmlnZ2VyV2lkdGggLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCArIHNjcm9sbFggKyB0cmlnZ2VyV2lkdGg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVYID0gXCItMTAwJVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDovrnnlYznuqbmnZ/vvJrnoa7kv53lvLnnqpfkuI3otoXlh7rop4blj6NcclxuICAgICAgICBpZiAodG9wICsgcG9wdXBTaXplLmhlaWdodCA+IHNjcm9sbFkgKyB2aWV3cG9ydEhlaWdodCkge1xyXG4gICAgICAgICAgdG9wID0gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0IC0gcG9wdXBTaXplLmhlaWdodCAtIDg7IC8vIOi3neemu+W6lemDqOiHs+WwkThweFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGVmdCA8IHNjcm9sbFgpIHtcclxuICAgICAgICAgIGxlZnQgPSBzY3JvbGxYICsgODtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIjBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlZnQgKyBwb3B1cFNpemUud2lkdGggPiBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCkge1xyXG4gICAgICAgICAgbGVmdCA9IHNjcm9sbFggKyB2aWV3cG9ydFdpZHRoIC0gcG9wdXBTaXplLndpZHRoIC0gODtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwibGVmdFwiOlxyXG4gICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgc2Nyb2xsWCAtIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHNjcm9sbFk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wICsgc2Nyb2xsWSArIHRyaWdnZXJIZWlnaHQgLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgKyBzY3JvbGxZICsgdHJpZ2dlckhlaWdodDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGlmIChsZWZ0IC0gcG9wdXBTaXplLndpZHRoIDwgc2Nyb2xsWCkge1xyXG4gICAgICAgICAgbGVmdCA9IHNjcm9sbFggKyA4OyAvLyDot53nprvlt6bkvqfoh7PlsJE4cHhcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvcCA8IHNjcm9sbFkpIHtcclxuICAgICAgICAgIHRvcCA9IHNjcm9sbFkgKyA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodG9wICsgcG9wdXBTaXplLmhlaWdodCA+IHNjcm9sbFkgKyB2aWV3cG9ydEhlaWdodCkge1xyXG4gICAgICAgICAgdG9wID0gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0IC0gcG9wdXBTaXplLmhlaWdodCAtIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LnJpZ2h0ICsgc2Nyb2xsWCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgKyBzY3JvbGxZO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHNjcm9sbFkgKyB0cmlnZ2VySGVpZ2h0IC8gMjtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi01MCVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wICsgc2Nyb2xsWSArIHRyaWdnZXJIZWlnaHQ7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCItMTAwJVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDovrnnlYznuqbmnZ/vvJrnoa7kv53lvLnnqpfkuI3otoXlh7rop4blj6NcclxuICAgICAgICBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHNjcm9sbFggKyB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGggLSBwb3B1cFNpemUud2lkdGggLSA4OyAvLyDot53nprvlj7Pkvqfoh7PlsJE4cHhcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvcCA8IHNjcm9sbFkpIHtcclxuICAgICAgICAgIHRvcCA9IHNjcm9sbFkgKyA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodG9wICsgcG9wdXBTaXplLmhlaWdodCA+IHNjcm9sbFkgKyB2aWV3cG9ydEhlaWdodCkge1xyXG4gICAgICAgICAgdG9wID0gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0IC0gcG9wdXBTaXplLmhlaWdodCAtIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvcDogdG9wICsgXCJweFwiLFxyXG4gICAgICBsZWZ0OiBsZWZ0ICsgXCJweFwiLFxyXG4gICAgICB0cmFuc2xhdGVYLFxyXG4gICAgICB0cmFuc2xhdGVZLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHNldFBvcHVwUG9zaXRpb24oXHJcbiAgICB0cmlnZ2VyUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICBwb3B1cFJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiLFxyXG4gICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxyXG4gICAgcG9wdXBTaXplPzogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XHJcbiAgKSB7XHJcbiAgICBjb25zdCBwb3B1cEVsID1cclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgID8gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIGlmICghcG9wdXBFbCkge1xyXG4gICAgICByZXR1cm47IC8vIOWmguaenOWFg+e0oOi/mOS4jeWtmOWcqO+8jOaXoOazleiuvue9ruS9jee9rlxyXG4gICAgfVxyXG5cclxuICAgIC8vIOS8mOWFiOS9v+eUqOS8oOWFpeeahOWbuuWumuWwuuWvuO+8jOWQpuWImeS7jkRPTeiOt+WPllxyXG4gICAgY29uc3QgcG9wdXBXaWR0aCA9XHJcbiAgICAgIHBvcHVwU2l6ZSAmJiBwb3B1cFNpemUud2lkdGggIT09IG51bGwgJiYgcG9wdXBTaXplLndpZHRoICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IHBvcHVwU2l6ZS53aWR0aFxyXG4gICAgICAgIDogcG9wdXBSZWN0LndpZHRoIHx8IHBvcHVwRWwub2Zmc2V0V2lkdGggfHwgMzAwO1xyXG4gICAgY29uc3QgcG9wdXBIZWlnaHQgPVxyXG4gICAgICBwb3B1cFNpemUgJiYgcG9wdXBTaXplLmhlaWdodCAhPT0gbnVsbCAmJiBwb3B1cFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IHBvcHVwU2l6ZS5oZWlnaHRcclxuICAgICAgICA6IHBvcHVwUmVjdC5oZWlnaHQgfHwgcG9wdXBFbC5vZmZzZXRIZWlnaHQgfHwgMjAwO1xyXG5cclxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKFxyXG4gICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgcGxhY2VtZW50LFxyXG4gICAgICBwb3NpdGlvbixcclxuICAgICAgeyB3aWR0aDogcG9wdXBXaWR0aCwgaGVpZ2h0OiBwb3B1cEhlaWdodCB9XHJcbiAgICApO1xyXG5cclxuICAgIHBvcHVwRWwuc3R5bGUudG9wID0gY29vcmRpbmF0ZXMudG9wO1xyXG4gICAgcG9wdXBFbC5zdHlsZS5sZWZ0ID0gY29vcmRpbmF0ZXMubGVmdDtcclxuICAgIHBvcHVwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2Nvb3JkaW5hdGVzLnRyYW5zbGF0ZVh9LCAke2Nvb3JkaW5hdGVzLnRyYW5zbGF0ZVl9KWA7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkID09PSBcInllc1wiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=