@sumit_yewale/angular 1.1.18 → 1.1.20

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.
@@ -3,18 +3,137 @@
3
3
  * Generated from: lib/csvbox-button.component.ts
4
4
  * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
5
  */
6
- import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
6
+ import { Component, Input, SecurityContext, ChangeDetectorRef, NgZone } from '@angular/core';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
8
8
  import { insertCSS } from '../utlis/insertCSS';
9
- import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
9
+ import { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
10
+ // How long we wait for the importer to confirm a file it was sent before giving up on it.
10
11
  /** @type {?} */
11
- const appVersion = '1.1.16';
12
+ const FILE_ACK_TIMEOUT_MS = 8000;
13
+ /**
14
+ * @record
15
+ */
16
+ function OpenImporterEntry() { }
17
+ if (false) {
18
+ /** @type {?} */
19
+ OpenImporterEntry.prototype.getHolder;
20
+ }
21
+ /**
22
+ * @record
23
+ */
24
+ function OpenImporters() { }
25
+ if (false) {
26
+ /** @type {?} */
27
+ OpenImporters.prototype.open;
28
+ /** @type {?} */
29
+ OpenImporters.prototype.listeners;
30
+ }
31
+ /** @type {?} */
32
+ const OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
33
+ /** @type {?} */
34
+ const TOP_Z_INDEX = 2147483647;
35
+ /**
36
+ * @return {?}
37
+ */
38
+ function openImporters() {
39
+ /** @type {?} */
40
+ const w = (/** @type {?} */ (window));
41
+ if (!w[OPEN_IMPORTERS_KEY])
42
+ w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
43
+ return w[OPEN_IMPORTERS_KEY];
44
+ }
45
+ /**
46
+ * @param {?} reg
47
+ * @return {?}
48
+ */
49
+ function restackOpenImporters(reg) {
50
+ reg.open.forEach((/**
51
+ * @param {?} entry
52
+ * @param {?} i
53
+ * @return {?}
54
+ */
55
+ (entry, i) => {
56
+ /** @type {?} */
57
+ const holder = entry.getHolder();
58
+ if (holder)
59
+ holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
60
+ }));
61
+ }
62
+ /**
63
+ * @param {?} entry
64
+ * @return {?}
65
+ */
66
+ function registerOpenImporter(entry) {
67
+ /** @type {?} */
68
+ const reg = openImporters();
69
+ if (reg.open.indexOf(entry) >= 0)
70
+ return;
71
+ reg.open.push(entry);
72
+ restackOpenImporters(reg);
73
+ reg.listeners.slice().forEach((/**
74
+ * @param {?} fn
75
+ * @return {?}
76
+ */
77
+ fn => fn()));
78
+ }
79
+ /**
80
+ * @param {?} entry
81
+ * @return {?}
82
+ */
83
+ function unregisterOpenImporter(entry) {
84
+ /** @type {?} */
85
+ const reg = openImporters();
86
+ /** @type {?} */
87
+ const i = reg.open.indexOf(entry);
88
+ if (i < 0)
89
+ return;
90
+ reg.open.splice(i, 1);
91
+ restackOpenImporters(reg);
92
+ reg.listeners.slice().forEach((/**
93
+ * @param {?} fn
94
+ * @return {?}
95
+ */
96
+ fn => fn()));
97
+ }
98
+ /**
99
+ * @param {?} entry
100
+ * @return {?}
101
+ */
102
+ function isBlockedByOpenImporter(entry) {
103
+ /** @type {?} */
104
+ const reg = openImporters();
105
+ return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
106
+ }
107
+ /**
108
+ * @param {?} fn
109
+ * @return {?}
110
+ */
111
+ function subscribeOpenImporters(fn) {
112
+ /** @type {?} */
113
+ const reg = openImporters();
114
+ reg.listeners.push(fn);
115
+ return (/**
116
+ * @return {?}
117
+ */
118
+ () => {
119
+ /** @type {?} */
120
+ const i = reg.listeners.indexOf(fn);
121
+ if (i >= 0)
122
+ reg.listeners.splice(i, 1);
123
+ });
124
+ }
125
+ /** @type {?} */
126
+ const appVersion = '1.1.20';
12
127
  export class CSVBoxButtonComponent {
13
128
  /**
14
129
  * @param {?} sanitizer
130
+ * @param {?} cdr
131
+ * @param {?} zone
15
132
  */
16
- constructor(sanitizer) {
133
+ constructor(sanitizer, cdr, zone) {
17
134
  this.sanitizer = sanitizer;
135
+ this.cdr = cdr;
136
+ this.zone = zone;
18
137
  this.isModalShown = false;
19
138
  this.licenseKey = null;
20
139
  this.uuid = null;
@@ -27,53 +146,121 @@ export class CSVBoxButtonComponent {
27
146
  this.lazy = false;
28
147
  this.iframe = null;
29
148
  this.disabled = true;
30
- }
31
- /**
32
- * @return {?}
33
- */
34
- ngOnInit() {
35
- this.uuid = generateUuid();
36
- /** @type {?} */
37
- let iframeUrl = buildImportUrl({
38
- licenseKey: this.licenseKey,
39
- customDomain: this.customDomain,
40
- dataLocation: this.dataLocation,
41
- language: this.language,
42
- theme: this.theme,
43
- environment: this.environment
44
- }, "angular", appVersion);
45
- this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
46
- }
47
- /**
48
- * @param {?} changes
49
- * @return {?}
50
- */
51
- ngOnChanges(changes) {
52
- if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
53
- this.updateUserVariabe(changes['user'].currentValue);
54
- }
55
- }
56
- /**
57
- * @param {?} data
58
- * @return {?}
59
- */
60
- updateUserVariabe(data) {
61
- this.user = data;
62
- if (this.iframe && this.iframe.contentWindow) {
63
- this.iframe.contentWindow.postMessage({
64
- "customer": data
65
- }, "*");
66
- }
67
- }
68
- /**
69
- * @return {?}
70
- */
71
- ngAfterContentInit() {
72
- window.addEventListener("message", (/**
149
+ // True while a different importer on the page is open: the button stays disabled.
150
+ this.blockedByOther = false;
151
+ this.registryEntry = { getHolder: (/**
152
+ * @return {?}
153
+ */
154
+ () => this.holder) };
155
+ this.fileSender = createFileSender({
156
+ getIframe: (/**
157
+ * @return {?}
158
+ */
159
+ () => this.iframe),
160
+ getToken: (/**
161
+ * @return {?}
162
+ */
163
+ () => (/** @type {?} */ (this.uuid))),
164
+ getTargetOrigin: (/**
165
+ * @return {?}
166
+ */
167
+ () => (/** @type {?} */ (this.targetOrigin))),
168
+ getBaseDomain: (/**
169
+ * @return {?}
170
+ */
171
+ () => this.baseDomain),
172
+ takeFile: (/**
173
+ * @return {?}
174
+ */
175
+ () => {
176
+ /** @type {?} */
177
+ const file = this.pendingFile;
178
+ this.pendingFile = null;
179
+ return file;
180
+ }),
181
+ onSent: (/**
182
+ * @return {?}
183
+ */
184
+ () => this.startFileAckTimer())
185
+ });
186
+ this.unsubscribeOpenImporters = null;
187
+ this.pendingFile = null;
188
+ // Data-location sheets redirect to another host, so the iframe origin can differ from
189
+ // targetOrigin. baseDomain is used to check the real origin before trusting it.
190
+ this.baseDomain = "app.csvbox.io";
191
+ this.fileAckTimer = null;
192
+ this.messageListener = (/**
73
193
  * @param {?} event
74
194
  * @return {?}
75
195
  */
76
196
  (event) => {
197
+ // Older importers send these as bare strings, without a token.
198
+ /** @type {?} */
199
+ const legacy = classifyLegacyMessage(event.data);
200
+ if (legacy) {
201
+ // Legacy messages carry no token, so the only way to tell which importer sent one is its
202
+ // window. Ignore those that came from another instance's iframe (or anywhere else).
203
+ if (!this.iframe || event.source !== this.iframe.contentWindow) {
204
+ return;
205
+ }
206
+ if (legacy.type === "mainModalHidden") {
207
+ this.handleModalClosed();
208
+ }
209
+ else if (legacy.type === "uploadSuccessful") {
210
+ if (this.onImport)
211
+ this.onImport(true);
212
+ if (this.isImported)
213
+ this.isImported(true);
214
+ if (this.imported)
215
+ this.imported(true);
216
+ }
217
+ else if (legacy.type === "uploadFailed") {
218
+ if (this.onImport)
219
+ this.onImport(false);
220
+ if (this.isImported)
221
+ this.isImported(false);
222
+ if (this.imported)
223
+ this.imported(false);
224
+ }
225
+ return;
226
+ }
227
+ // Set-file handshake messages. The shared core does not classify these, so they are
228
+ // read here, behind the same unique_token check the core applies.
229
+ /** @type {?} */
230
+ const raw = event.data;
231
+ if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == this.uuid) {
232
+ this.fileSender.learnOrigin(event);
233
+ if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
234
+ // Reply to our probe (it has no file). It only tells us the origin, so do nothing.
235
+ return;
236
+ }
237
+ if (raw.type === "csvbox-modal-shown") {
238
+ this.clearFileAckTimer();
239
+ registerOpenImporter(this.registryEntry);
240
+ // What the file path in openModal() is waiting for. display as well as
241
+ // pointer-events: a second file declined while the first was still opening the
242
+ // modal has put the holder away in the meantime.
243
+ this.isModalShown = true;
244
+ if (this.holder) {
245
+ this.holder.style.display = 'block';
246
+ this.holder.style.pointerEvents = 'auto';
247
+ }
248
+ return;
249
+ }
250
+ if (raw.type === "csvbox-set-file-rejected") {
251
+ this.clearFileAckTimer();
252
+ // The importer has the file and will not take it. Put the holder away only if the
253
+ // modal was never confirmed up: a file declined while it is open leaves that modal
254
+ // where it is, and its own 'csvbox-modal-hidden' will put the holder away.
255
+ if (!this.isModalShown && this.holder) {
256
+ this.holder.style.display = 'none';
257
+ this.holder.style.pointerEvents = 'auto';
258
+ unregisterOpenImporter(this.registryEntry);
259
+ }
260
+ console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
261
+ return;
262
+ }
263
+ }
77
264
  /** @type {?} */
78
265
  let message = classifyStructuredMessage(event.data, (/** @type {?} */ (this.uuid)));
79
266
  if (!message) {
@@ -117,7 +304,58 @@ export class CSVBoxButtonComponent {
117
304
  if (this.imported)
118
305
  this.imported(false);
119
306
  }
120
- }), false);
307
+ });
308
+ }
309
+ /**
310
+ * @return {?}
311
+ */
312
+ ngOnInit() {
313
+ this.uuid = generateUuid();
314
+ /** @type {?} */
315
+ let iframeUrl = buildImportUrl({
316
+ licenseKey: this.licenseKey,
317
+ customDomain: this.customDomain,
318
+ dataLocation: this.dataLocation,
319
+ language: this.language,
320
+ theme: this.theme,
321
+ environment: this.environment
322
+ }, "angular", appVersion);
323
+ // Default place to send the file. A file is only ever sent to a named origin, never "*".
324
+ this.targetOrigin = new URL(iframeUrl).origin;
325
+ this.baseDomain = this.customDomain || "app.csvbox.io";
326
+ this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
327
+ }
328
+ /**
329
+ * @param {?} changes
330
+ * @return {?}
331
+ */
332
+ ngOnChanges(changes) {
333
+ if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
334
+ this.updateUserVariabe(changes['user'].currentValue);
335
+ }
336
+ }
337
+ /**
338
+ * @param {?} data
339
+ * @return {?}
340
+ */
341
+ updateUserVariabe(data) {
342
+ this.user = data;
343
+ if (this.iframe && this.iframe.contentWindow) {
344
+ this.iframe.contentWindow.postMessage({
345
+ "customer": data
346
+ }, "*");
347
+ }
348
+ }
349
+ /**
350
+ * @return {?}
351
+ */
352
+ ngAfterContentInit() {
353
+ window.addEventListener("message", this.messageListener, false);
354
+ this.syncBlocked();
355
+ this.unsubscribeOpenImporters = subscribeOpenImporters((/**
356
+ * @return {?}
357
+ */
358
+ () => this.syncBlocked()));
121
359
  if (this.lazy) {
122
360
  this.disabled = false;
123
361
  }
@@ -130,8 +368,10 @@ export class CSVBoxButtonComponent {
130
368
  * @return {?}
131
369
  */
132
370
  handleModalClosed() {
133
- if (this.holder)
371
+ if (this.holder) {
134
372
  this.holder.style.display = 'none';
373
+ this.holder.style.pointerEvents = 'auto';
374
+ }
135
375
  this.isModalShown = false;
136
376
  this.isIframeLoaded = false;
137
377
  this.openModalOnIframeLoad = false;
@@ -139,6 +379,9 @@ export class CSVBoxButtonComponent {
139
379
  this.holder.remove();
140
380
  this.holder = null;
141
381
  this.iframe = null;
382
+ // A new iframe is built on the next open, so the origin is learned again.
383
+ this.clearProbeTimer();
384
+ unregisterOpenImporter(this.registryEntry);
142
385
  if (this.onClose)
143
386
  this.onClose();
144
387
  if (this.isClosed)
@@ -158,6 +401,7 @@ export class CSVBoxButtonComponent {
158
401
  let iframe = document.createElement("iframe");
159
402
  this.iframe = iframe;
160
403
  iframe.setAttribute("src", this.safeUrl);
404
+ iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
161
405
  iframe.frameBorder = "0";
162
406
  /** @type {?} */
163
407
  let self = this;
@@ -185,11 +429,16 @@ export class CSVBoxButtonComponent {
185
429
  this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);
186
430
  this.holder.appendChild(iframe);
187
431
  document.body.insertAdjacentElement('beforeend', this.holder);
432
+ // The holder did not exist yet if openModal() asked for the importer before it was built.
433
+ restackOpenImporters(openImporters());
188
434
  }
189
435
  /**
190
436
  * @return {?}
191
437
  */
192
438
  openModal() {
439
+ // Counts as open from the moment it is requested, so the other buttons are disabled while
440
+ // this importer is still loading, and so it is stacked above any importer opened earlier.
441
+ registerOpenImporter(this.registryEntry);
193
442
  if (!this.iframe) {
194
443
  this.openModalOnIframeLoad = true;
195
444
  this.initImporter();
@@ -197,11 +446,36 @@ export class CSVBoxButtonComponent {
197
446
  }
198
447
  if (!this.isModalShown) {
199
448
  if (this.isIframeLoaded) {
200
- this.isModalShown = true;
201
- if (this.holder)
202
- this.holder.style.display = 'block';
203
- if (this.iframe && this.iframe.contentWindow) {
204
- this.iframe.contentWindow.postMessage('openModal', '*');
449
+ if (this.pendingFile) {
450
+ // The importer opens its own modal once it has the file, so that it can inject on
451
+ // 'shown.bs.modal'. Sending 'openModal' as well would race that.
452
+ //
453
+ // It can also decline: wrong step, an import file URL configured on the sheet, or
454
+ // an importer too old to know the message at all. So the holder goes up
455
+ // click-through and stays that way until 'csvbox-modal-shown' confirms the modal
456
+ // is really up. It covers the viewport at z-index 2147483647 and the importer
457
+ // renders transparent with its modal closed, so arming it on an unanswered message
458
+ // leaves an invisible sheet over the host page eating every click.
459
+ //
460
+ // display:block regardless, so the iframe lays out and animates normally; only
461
+ // pointer-events is held back. isModalShown likewise waits for the confirmation,
462
+ // or a declined file would latch the importer shut for good.
463
+ if (this.holder) {
464
+ this.holder.style.pointerEvents = 'none';
465
+ this.holder.style.display = 'block';
466
+ }
467
+ this.fileSender.send();
468
+ }
469
+ else {
470
+ this.isModalShown = true;
471
+ if (this.holder) {
472
+ // Explicit: a previously declined file leaves the holder click-through.
473
+ this.holder.style.pointerEvents = 'auto';
474
+ this.holder.style.display = 'block';
475
+ }
476
+ if (this.iframe && this.iframe.contentWindow) {
477
+ this.iframe.contentWindow.postMessage('openModal', '*');
478
+ }
205
479
  }
206
480
  }
207
481
  else {
@@ -209,13 +483,118 @@ export class CSVBoxButtonComponent {
209
483
  }
210
484
  }
211
485
  }
486
+ /**
487
+ * Open the importer on a File the host page already has, instead of the file picker.
488
+ *
489
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
490
+ * or `\@ViewChild(CSVBoxButtonComponent)`.
491
+ *
492
+ * The File crosses to the iframe by structured clone, so the importer receives the real
493
+ * object and applies its own extension, worksheet and size rules to it -- this does not
494
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
495
+ * extension from.
496
+ * @param {?} file
497
+ * @return {?}
498
+ */
499
+ openModalWithFile(file) {
500
+ if (typeof File === 'undefined' || !(file instanceof File)) {
501
+ return;
502
+ }
503
+ this.pendingFile = file;
504
+ // Already open: hand it over now rather than holding it for the next open. The importer
505
+ // takes it only while it is still on the upload step, and ignores it once the user has a
506
+ // dataset and a mapping in progress.
507
+ if (this.isModalShown && this.iframe && this.isIframeLoaded) {
508
+ this.fileSender.send();
509
+ return;
510
+ }
511
+ this.openModal();
512
+ }
513
+ /**
514
+ * @return {?}
515
+ */
516
+ clearProbeTimer() {
517
+ this.clearFileAckTimer();
518
+ this.fileSender.reset();
519
+ }
520
+ /**
521
+ * @return {?}
522
+ */
523
+ startFileAckTimer() {
524
+ this.clearFileAckTimer();
525
+ this.fileAckTimer = setTimeout((/**
526
+ * @return {?}
527
+ */
528
+ () => {
529
+ this.fileAckTimer = null;
530
+ this.giveUpOnFile();
531
+ }), FILE_ACK_TIMEOUT_MS);
532
+ }
533
+ /**
534
+ * @return {?}
535
+ */
536
+ clearFileAckTimer() {
537
+ if (this.fileAckTimer) {
538
+ clearTimeout(this.fileAckTimer);
539
+ this.fileAckTimer = null;
540
+ }
541
+ }
542
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
543
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
544
+ // and the other instances' buttons would stay disabled for good.
545
+ /**
546
+ * @return {?}
547
+ */
548
+ giveUpOnFile() {
549
+ if (this.isModalShown) {
550
+ return;
551
+ }
552
+ /** @type {?} */
553
+ const holder = this.holder;
554
+ if (holder) {
555
+ holder.style.display = 'none';
556
+ holder.style.pointerEvents = 'auto';
557
+ }
558
+ unregisterOpenImporter(this.registryEntry);
559
+ console.warn("[csvbox] the importer did not respond to the supplied file");
560
+ }
561
+ /**
562
+ * @private
563
+ * @return {?}
564
+ */
565
+ syncBlocked() {
566
+ /** @type {?} */
567
+ const blocked = isBlockedByOpenImporter(this.registryEntry);
568
+ if (blocked !== this.blockedByOther) {
569
+ // The registry can call back from outside Angular's zone (another instance, another app).
570
+ this.zone.run((/**
571
+ * @return {?}
572
+ */
573
+ () => {
574
+ this.blockedByOther = blocked;
575
+ this.cdr.markForCheck();
576
+ }));
577
+ }
578
+ }
579
+ /**
580
+ * @return {?}
581
+ */
582
+ ngOnDestroy() {
583
+ this.clearProbeTimer();
584
+ window.removeEventListener("message", this.messageListener);
585
+ unregisterOpenImporter(this.registryEntry);
586
+ if (this.unsubscribeOpenImporters) {
587
+ this.unsubscribeOpenImporters();
588
+ this.unsubscribeOpenImporters = null;
589
+ }
590
+ }
212
591
  }
213
592
  CSVBoxButtonComponent.decorators = [
214
593
  { type: Component, args: [{
215
594
  selector: 'csvbox-button',
216
595
  template: `
217
596
  <div>
218
- <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid">
597
+ <button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
219
598
  <ng-content></ng-content>
220
599
  </button>
221
600
  </div>
@@ -224,10 +603,11 @@ CSVBoxButtonComponent.decorators = [
224
603
  ];
225
604
  /** @nocollapse */
226
605
  CSVBoxButtonComponent.ctorParameters = () => [
227
- { type: DomSanitizer }
606
+ { type: DomSanitizer },
607
+ { type: ChangeDetectorRef },
608
+ { type: NgZone }
228
609
  ];
229
610
  CSVBoxButtonComponent.propDecorators = {
230
- initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
231
611
  onImport: [{ type: Input }],
232
612
  onReady: [{ type: Input }],
233
613
  onClose: [{ type: Input }],
@@ -260,8 +640,6 @@ if (false) {
260
640
  /** @type {?} */
261
641
  CSVBoxButtonComponent.prototype.isModalShown;
262
642
  /** @type {?} */
263
- CSVBoxButtonComponent.prototype.initiator;
264
- /** @type {?} */
265
643
  CSVBoxButtonComponent.prototype.onImport;
266
644
  /** @type {?} */
267
645
  CSVBoxButtonComponent.prototype.onReady;
@@ -320,8 +698,51 @@ if (false) {
320
698
  /** @type {?} */
321
699
  CSVBoxButtonComponent.prototype.disabled;
322
700
  /** @type {?} */
701
+ CSVBoxButtonComponent.prototype.blockedByOther;
702
+ /**
703
+ * @type {?}
704
+ * @private
705
+ */
706
+ CSVBoxButtonComponent.prototype.registryEntry;
707
+ /**
708
+ * @type {?}
709
+ * @private
710
+ */
711
+ CSVBoxButtonComponent.prototype.fileSender;
712
+ /**
713
+ * @type {?}
714
+ * @private
715
+ */
716
+ CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
717
+ /** @type {?} */
323
718
  CSVBoxButtonComponent.prototype.holder;
324
719
  /** @type {?} */
720
+ CSVBoxButtonComponent.prototype.pendingFile;
721
+ /** @type {?} */
722
+ CSVBoxButtonComponent.prototype.targetOrigin;
723
+ /** @type {?} */
724
+ CSVBoxButtonComponent.prototype.baseDomain;
725
+ /**
726
+ * @type {?}
727
+ * @private
728
+ */
729
+ CSVBoxButtonComponent.prototype.fileAckTimer;
730
+ /**
731
+ * @type {?}
732
+ * @private
733
+ */
734
+ CSVBoxButtonComponent.prototype.messageListener;
735
+ /** @type {?} */
325
736
  CSVBoxButtonComponent.prototype.sanitizer;
737
+ /**
738
+ * @type {?}
739
+ * @private
740
+ */
741
+ CSVBoxButtonComponent.prototype.cdr;
742
+ /**
743
+ * @type {?}
744
+ * @private
745
+ */
746
+ CSVBoxButtonComponent.prototype.zone;
326
747
  }
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O01BRWpILFVBQVUsR0FBRyxRQUFRO0FBYTNCLE1BQU0sT0FBTyxxQkFBcUI7Ozs7SUE0Q2hDLFlBQW1CLFNBQXNCO1FBQXRCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUExQ3pDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBcUJaLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWpDLFNBQUksR0FBa0IsSUFBSSxDQUFDO1FBQzNCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFHL0IsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFNUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRXZDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFJL0IsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFFL0IsYUFBUSxHQUFZLElBQUksQ0FBQztJQUVVLENBQUM7Ozs7SUFJN0MsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxjQUFjLENBQzVCO1lBQ0UsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDOUIsRUFDRCxTQUFTLEVBQ1QsVUFBVSxDQUNYO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqSSxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUU7WUFDbkYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsSUFBUztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxVQUFVLEVBQUcsSUFBSTthQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDOzs7O0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTOzs7O1FBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7Z0JBQ3ZDLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFBLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLE9BQU87YUFDUjtZQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtnQkFDckMsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVztvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekQsSUFBSSxJQUFJLENBQUMsU0FBUztvQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0RDtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO29CQUNwQixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxJQUFJLENBQUMsVUFBVTtvQkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckU7aUJBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLHFCQUFxQixFQUFFO2dCQUNqRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUMxQjtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssMEJBQTBCLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsVUFBVTtvQkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLHNCQUFzQixFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVU7b0JBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzNDO1FBQ0gsQ0FBQyxHQUFFLEtBQUssQ0FBQyxDQUFDO1FBRVYsSUFBRyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7Ozs7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV6QyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBRTNCLFNBQVMsRUFBRSxDQUFDOztZQUVSLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7O1lBRXJCLElBQUksR0FBRyxJQUFJO1FBQ2YsTUFBTSxDQUFDLE1BQU07OztRQUFHO1lBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsYUFBYTtnQkFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQUEsSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDeEg7WUFDRCxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFBLENBQUE7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQ3pCLENBQUM7SUFDSixDQUFDOzs7O0lBRUQsU0FBUztRQUNQLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsT0FBTztTQUNWO1FBQ0QsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBRyxJQUFJLENBQUMsTUFBTTtvQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUNwRCxJQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ3pEO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQzs7O1lBdE1GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFOzs7Ozs7R0FNVDthQUNGOzs7O1lBZlEsWUFBWTs7O3dCQXFCbEIsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7dUJBQ3RDLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3VCQUNMLEtBQUs7eUJBRUwsS0FBSztzQkFDTCxLQUFLO3VCQUNMLEtBQUs7MEJBQ0wsS0FBSzs0QkFFTCxLQUFLO3FCQUNMLEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLOzBCQUNMLEtBQUs7bUJBRUwsS0FBSzs2QkFDTCxLQUFLO3lCQUNMLEtBQUs7c0JBQ0wsS0FBSzttQkFDTCxLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzt1QkFDTCxLQUFLOzBCQUNMLEtBQUs7b0JBRUwsS0FBSzs2QkFFTCxLQUFLO29DQUNMLEtBQUs7bUJBRUwsS0FBSzt1QkFNTCxLQUFLOzs7O0lBeENOLDZDQUFxQjs7SUFFckIsMENBQXdEOztJQUN4RCx5Q0FBNkI7O0lBQzdCLHdDQUE0Qjs7SUFDNUIsd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBRTdCLDJDQUErQjs7SUFDL0Isd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBQzdCLDRDQUFnQzs7SUFFaEMsOENBQWtDOztJQUNsQyx1Q0FBMkI7O0lBQzNCLDBDQUE4Qjs7SUFDOUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLHFDQUF1Qjs7SUFDdkIsK0NBQWlDOztJQUNqQywyQ0FBMEM7O0lBQzFDLHdDQUEwQjs7SUFDMUIscUNBQW9DOztJQUNwQyw2Q0FBNEM7O0lBQzVDLDZDQUE0Qzs7SUFDNUMseUNBQXdDOztJQUN4Qyw0Q0FBOEI7O0lBRTlCLHNDQUFxQzs7SUFFckMsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQXdDOztJQUV4Qyx5Q0FBa0M7O0lBSWxDLHVDQUFZOztJQUZBLDBDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBpbnNlcnRDU1MgfSBmcm9tICcuLi91dGxpcy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnaW5pdGlhdG9yJywge3N0YXRpYzogZmFsc2V9KSBpbml0aWF0b3I6IGFueTtcbiAgQElucHV0KCkgb25JbXBvcnQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25SZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvbkNsb3NlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1JlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBjbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgdXNlcj86IG9iamVjdDtcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zPzogb2JqZWN0O1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudD86IG9iamVjdDtcblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IGFueTtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6RG9tU2FuaXRpemVyKSB7fVxuXG4gIGhvbGRlcjogYW55O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICB0aGlzLnNhZmVVcmwgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaWZyYW1lVXJsKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYoY2hhbmdlc1tcInVzZXJcIl0gJiYgY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzWyd1c2VyJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyVmFyaWFiZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFiZShkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xuICAgIGlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgXCJjdXN0b21lclwiIDogZGF0YVxuICAgICAgfSwgXCIqXCIpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkISk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzU3VibWl0dGVkKSB0aGlzLmlzU3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5zdWNjZXNzKSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtdXBsb2FkLWZhaWxlZFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIGlmKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9kYWxDbG9zZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICB9XG5cbiAgaW5pdEltcG9ydGVyKCkge1xuICAgIGlmICh0aGlzLmxvYWRTdGFydGVkKSB0aGlzLmxvYWRTdGFydGVkKCk7XG5cbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcblxuICAgIGluc2VydENTUygpO1xuXG4gICAgbGV0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmwpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XG5cbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgc2VsZi5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcbiAgICB0aGlzLmhvbGRlci5zZXRBdHRyaWJ1dGUoJ2lkJywgYGNzdmJveC1lbWJlZC0ke3RoaXMudXVpZH1gKTtcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcbiAgICApO1xuICB9XG5cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iXX0=
748
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztNQUcxSixtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O01BQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7TUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztVQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFB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QUM3Qix3Q0FBNEI7O0lBQzVCLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUtsQywrQ0FBZ0M7Ozs7O0lBRWhDLDhDQUE0RTs7Ozs7SUFFNUUsMkNBV0c7Ozs7O0lBRUgseURBQTZEOztJQUU3RCx1Q0FBWTs7SUFFWiw0Q0FBZ0M7O0lBRWhDLDZDQUFpQzs7SUFJakMsMkNBQXFDOzs7OztJQUVyQyw2Q0FBaUM7Ozs7O0lBcUNqQyxnREF3RkU7O0lBN0pVLDBDQUE2Qjs7Ozs7SUFBRSxvQ0FBOEI7Ozs7O0lBQUUscUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4uL3V0bGlzL2luc2VydENTUyc7XG5pbXBvcnQgeyBidWlsZEltcG9ydFVybCwgZ2VuZXJhdGVVdWlkLCBidWlsZEluaXRQYXlsb2FkLCBjcmVhdGVGaWxlU2VuZGVyLCBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlLCBjbGFzc2lmeUxlZ2FjeU1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbi8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIHRoZSBpbXBvcnRlciB0byBjb25maXJtIGEgZmlsZSBpdCB3YXMgc2VudCBiZWZvcmUgZ2l2aW5nIHVwIG9uIGl0LlxuY29uc3QgRklMRV9BQ0tfVElNRU9VVF9NUyA9IDgwMDA7XG5cbi8vIFBhZ2Utd2lkZSByZWNvcmQgb2YgdGhlIGltcG9ydGVycyB0aGF0IGFyZSBvcGVuIG9yIG9wZW5pbmcsIHNoYXJlZCBieSBldmVyeSBDU1ZCb3ggYWRhcHRlclxuLy8gb24gdGhlIHBhZ2UgKGl0IGxpdmVzIG9uIHdpbmRvdyBzbyBzZXBhcmF0ZSBjb3BpZXMgb2YgYW4gYWRhcHRlciBzZWUgdGhlIHNhbWUgbGlzdCkuIEl0IGRvZXNcbi8vIHR3byB0aGluZ3M6IHRoZSBuZXdlc3QgaW1wb3J0ZXIgaXMgc3RhY2tlZCBvbiB0b3AgKGV2ZXJ5IGhvbGRlciBpcyBmaXhlZCwgZnVsbCBzY3JlZW4gYW5kXG4vLyB6LWluZGV4IDIxNDc0ODM2NDcsIHNvIGVxdWFsIHotaW5kZXhlcyB3b3VsZCBsZWF2ZSB0aGUgb25lIHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTSBvblxuLy8gdG9wKSwgYW5kIHRoZSBvdGhlciBpbnN0YW5jZXMgbGVhcm4gdGhhdCBhbiBpbXBvcnRlciBpcyBvcGVuIHNvIHRoZXkgY2FuIGRpc2FibGUgdGhlaXIgYnV0dG9uLlxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlckVudHJ5IHsgZ2V0SG9sZGVyOiAoKSA9PiBIVE1MRWxlbWVudCB8IG51bGw7IH1cbmludGVyZmFjZSBPcGVuSW1wb3J0ZXJzIHsgb3BlbjogT3BlbkltcG9ydGVyRW50cnlbXTsgbGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPjsgfVxuY29uc3QgT1BFTl9JTVBPUlRFUlNfS0VZID0gJ19fY3N2Ym94T3BlbkltcG9ydGVycyc7XG5jb25zdCBUT1BfWl9JTkRFWCA9IDIxNDc0ODM2NDc7XG5cbmZ1bmN0aW9uIG9wZW5JbXBvcnRlcnMoKTogT3BlbkltcG9ydGVycyB7XG4gIGNvbnN0IHcgPSB3aW5kb3cgYXMgYW55O1xuICBpZiAoIXdbT1BFTl9JTVBPUlRFUlNfS0VZXSkgd1tPUEVOX0lNUE9SVEVSU19LRVldID0geyBvcGVuOiBbXSwgbGlzdGVuZXJzOiBbXSB9O1xuICByZXR1cm4gd1tPUEVOX0lNUE9SVEVSU19LRVldO1xufVxuXG5mdW5jdGlvbiByZXN0YWNrT3BlbkltcG9ydGVycyhyZWc6IE9wZW5JbXBvcnRlcnMpOiB2b2lkIHtcbiAgcmVnLm9wZW4uZm9yRWFjaCgoZW50cnksIGkpID0+IHtcbiAgICBjb25zdCBob2xkZXIgPSBlbnRyeS5nZXRIb2xkZXIoKTtcbiAgICBpZiAoaG9sZGVyKSBob2xkZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKFRPUF9aX0lOREVYIC0gKHJlZy5vcGVuLmxlbmd0aCAtIDEgLSBpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBpZiAocmVnLm9wZW4uaW5kZXhPZihlbnRyeSkgPj0gMCkgcmV0dXJuO1xuICByZWcub3Blbi5wdXNoKGVudHJ5KTtcbiAgcmVzdGFja09wZW5JbXBvcnRlcnMocmVnKTtcbiAgcmVnLmxpc3RlbmVycy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oKSk7XG59XG5cbmZ1bmN0aW9uIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgY29uc3QgaSA9IHJlZy5vcGVuLmluZGV4T2YoZW50cnkpO1xuICBpZiAoaSA8IDApIHJldHVybjtcbiAgcmVnLm9wZW4uc3BsaWNlKGksIDEpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgcmV0dXJuIHJlZy5vcGVuLmxlbmd0aCA+IDAgJiYgcmVnLm9wZW4uaW5kZXhPZihlbnRyeSkgPCAwO1xufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKGZuOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgcmVnLmxpc3RlbmVycy5wdXNoKGZuKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBpID0gcmVnLmxpc3RlbmVycy5pbmRleE9mKGZuKTtcbiAgICBpZiAoaSA+PSAwKSByZWcubGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgfTtcbn1cblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMjAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgYmxvY2tlZEJ5T3RoZXJcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XG5cbiAgQElucHV0KCkgb25JbXBvcnQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25SZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvbkNsb3NlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1JlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBjbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgdXNlcj86IG9iamVjdDtcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zPzogb2JqZWN0O1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudD86IG9iamVjdDtcblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IGFueTtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6RG9tU2FuaXRpemVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7fVxuXG4gIC8vIFRydWUgd2hpbGUgYSBkaWZmZXJlbnQgaW1wb3J0ZXIgb24gdGhlIHBhZ2UgaXMgb3BlbjogdGhlIGJ1dHRvbiBzdGF5cyBkaXNhYmxlZC5cbiAgYmxvY2tlZEJ5T3RoZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IGFueTtcblxuICBwZW5kaW5nRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xuXG4gIHRhcmdldE9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIERhdGEtbG9jYXRpb24gc2hlZXRzIHJlZGlyZWN0IHRvIGFub3RoZXIgaG9zdCwgc28gdGhlIGlmcmFtZSBvcmlnaW4gY2FuIGRpZmZlciBmcm9tXG4gIC8vIHRhcmdldE9yaWdpbi4gYmFzZURvbWFpbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSByZWFsIG9yaWdpbiBiZWZvcmUgdHJ1c3RpbmcgaXQuXG4gIGJhc2VEb21haW46IHN0cmluZyA9IFwiYXBwLmNzdmJveC5pb1wiO1xuXG4gIHByaXZhdGUgZmlsZUFja1RpbWVyOiBhbnkgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJlKGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXG4gICAgICB9LCBcIipcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIC8vIE9sZGVyIGltcG9ydGVycyBzZW5kIHRoZXNlIGFzIGJhcmUgc3RyaW5ncywgd2l0aG91dCBhIHRva2VuLlxuICAgIGNvbnN0IGxlZ2FjeSA9IGNsYXNzaWZ5TGVnYWN5TWVzc2FnZShldmVudC5kYXRhKTtcbiAgICBpZiAobGVnYWN5KSB7XG4gICAgICAvLyBMZWdhY3kgbWVzc2FnZXMgY2Fycnkgbm8gdG9rZW4sIHNvIHRoZSBvbmx5IHdheSB0byB0ZWxsIHdoaWNoIGltcG9ydGVyIHNlbnQgb25lIGlzIGl0c1xuICAgICAgLy8gd2luZG93LiBJZ25vcmUgdGhvc2UgdGhhdCBjYW1lIGZyb20gYW5vdGhlciBpbnN0YW5jZSdzIGlmcmFtZSAob3IgYW55d2hlcmUgZWxzZSkuXG4gICAgICBpZiAoIXRoaXMuaWZyYW1lIHx8IGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobGVnYWN5LnR5cGUgPT09IFwibWFpbk1vZGFsSGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChsZWdhY3kudHlwZSA9PT0gXCJ1cGxvYWRTdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZEZhaWxlZFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldC1maWxlIGhhbmRzaGFrZSBtZXNzYWdlcy4gVGhlIHNoYXJlZCBjb3JlIGRvZXMgbm90IGNsYXNzaWZ5IHRoZXNlLCBzbyB0aGV5IGFyZVxuICAgIC8vIHJlYWQgaGVyZSwgYmVoaW5kIHRoZSBzYW1lIHVuaXF1ZV90b2tlbiBjaGVjayB0aGUgY29yZSBhcHBsaWVzLlxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKHJhdyAmJiB0eXBlb2YgcmF3ID09PSBcIm9iamVjdFwiICYmIHJhdy5kYXRhICYmIHJhdy5kYXRhLnVuaXF1ZV90b2tlbiA9PSB0aGlzLnV1aWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5sZWFybk9yaWdpbihldmVudCk7XG5cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtc2V0LWZpbGUtcmVqZWN0ZWRcIiAmJiByYXcuZGF0YS5yZWFzb24gPT09IFwibm90LWEtZmlsZVwiKSB7XG4gICAgICAgIC8vIFJlcGx5IHRvIG91ciBwcm9iZSAoaXQgaGFzIG5vIGZpbGUpLiBJdCBvbmx5IHRlbGxzIHVzIHRoZSBvcmlnaW4sIHNvIGRvIG5vdGhpbmcuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtc2hvd25cIikge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICAgIHJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIC8vIFdoYXQgdGhlIGZpbGUgcGF0aCBpbiBvcGVuTW9kYWwoKSBpcyB3YWl0aW5nIGZvci4gZGlzcGxheSBhcyB3ZWxsIGFzXG4gICAgICAgIC8vIHBvaW50ZXItZXZlbnRzOiBhIHNlY29uZCBmaWxlIGRlY2xpbmVkIHdoaWxlIHRoZSBmaXJzdCB3YXMgc3RpbGwgb3BlbmluZyB0aGVcbiAgICAgICAgLy8gbW9kYWwgaGFzIHB1dCB0aGUgaG9sZGVyIGF3YXkgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgLy8gVGhlIGltcG9ydGVyIGhhcyB0aGUgZmlsZSBhbmQgd2lsbCBub3QgdGFrZSBpdC4gUHV0IHRoZSBob2xkZXIgYXdheSBvbmx5IGlmIHRoZVxuICAgICAgICAvLyBtb2RhbCB3YXMgbmV2ZXIgY29uZmlybWVkIHVwOiBhIGZpbGUgZGVjbGluZWQgd2hpbGUgaXQgaXMgb3BlbiBsZWF2ZXMgdGhhdCBtb2RhbFxuICAgICAgICAvLyB3aGVyZSBpdCBpcywgYW5kIGl0cyBvd24gJ2NzdmJveC1tb2RhbC1oaWRkZW4nIHdpbGwgcHV0IHRoZSBob2xkZXIgYXdheS5cbiAgICAgICAgaWYgKCF0aGlzLmlzTW9kYWxTaG93biAmJiB0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKFwiW2NzdmJveF0gaW1wb3J0ZXIgZGVjbGluZWQgdGhlIHN1cHBsaWVkIGZpbGU6IFwiICsgcmF3LmRhdGEucmVhc29uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZShldmVudC5kYXRhLCB0aGlzLnV1aWQhKTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNTdWJtaXR0ZWQpIHRoaXMuaXNTdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgaWYgKCFtZXNzYWdlLnN1Y2Nlc3MpIHtcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xuICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5tZXNzYWdlTGlzdGVuZXIsIGZhbHNlKTtcbiAgICB0aGlzLnN5bmNCbG9ja2VkKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBzdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKCgpID0+IHRoaXMuc3luY0Jsb2NrZWQoKSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIC8vIEEgbmV3IGlmcmFtZSBpcyBidWlsdCBvbiB0aGUgbmV4dCBvcGVuLCBzbyB0aGUgb3JpZ2luIGlzIGxlYXJuZWQgYWdhaW4uXG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XG4gIH1cblxuICBpbml0SW1wb3J0ZXIoKSB7XG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcblxuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuXG4gICAgaW5zZXJ0Q1NTKCk7XG5cbiAgICBsZXQgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICB0aGlzLmlmcmFtZSA9IGlmcmFtZTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybCk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcImFsbG93XCIsIFwiY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZSAqXCIpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XG5cbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgc2VsZi5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcbiAgICB0aGlzLmhvbGRlci5zZXRBdHRyaWJ1dGUoJ2lkJywgYGNzdmJveC1lbWJlZC0ke3RoaXMudXVpZH1gKTtcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcbiAgICApO1xuICAgIC8vIFRoZSBob2xkZXIgZGlkIG5vdCBleGlzdCB5ZXQgaWYgb3Blbk1vZGFsKCkgYXNrZWQgZm9yIHRoZSBpbXBvcnRlciBiZWZvcmUgaXQgd2FzIGJ1aWx0LlxuICAgIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKG9wZW5JbXBvcnRlcnMoKSk7XG4gIH1cblxuICBvcGVuTW9kYWwoKTogdm9pZCB7XG4gICAgLy8gQ291bnRzIGFzIG9wZW4gZnJvbSB0aGUgbW9tZW50IGl0IGlzIHJlcXVlc3RlZCwgc28gdGhlIG90aGVyIGJ1dHRvbnMgYXJlIGRpc2FibGVkIHdoaWxlXG4gICAgLy8gdGhpcyBpbXBvcnRlciBpcyBzdGlsbCBsb2FkaW5nLCBhbmQgc28gaXQgaXMgc3RhY2tlZCBhYm92ZSBhbnkgaW1wb3J0ZXIgb3BlbmVkIGVhcmxpZXIuXG4gICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICBpZih0aGlzLnBlbmRpbmdGaWxlKSB7XG4gICAgICAgICAgLy8gVGhlIGltcG9ydGVyIG9wZW5zIGl0cyBvd24gbW9kYWwgb25jZSBpdCBoYXMgdGhlIGZpbGUsIHNvIHRoYXQgaXQgY2FuIGluamVjdCBvblxuICAgICAgICAgIC8vICdzaG93bi5icy5tb2RhbCcuIFNlbmRpbmcgJ29wZW5Nb2RhbCcgYXMgd2VsbCB3b3VsZCByYWNlIHRoYXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJdCBjYW4gYWxzbyBkZWNsaW5lOiB3cm9uZyBzdGVwLCBhbiBpbXBvcnQgZmlsZSBVUkwgY29uZmlndXJlZCBvbiB0aGUgc2hlZXQsIG9yXG4gICAgICAgICAgLy8gYW4gaW1wb3J0ZXIgdG9vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlIGF0IGFsbC4gU28gdGhlIGhvbGRlciBnb2VzIHVwXG4gICAgICAgICAgLy8gY2xpY2stdGhyb3VnaCBhbmQgc3RheXMgdGhhdCB3YXkgdW50aWwgJ2NzdmJveC1tb2RhbC1zaG93bicgY29uZmlybXMgdGhlIG1vZGFsXG4gICAgICAgICAgLy8gaXMgcmVhbGx5IHVwLiBJdCBjb3ZlcnMgdGhlIHZpZXdwb3J0IGF0IHotaW5kZXggMjE0NzQ4MzY0NyBhbmQgdGhlIGltcG9ydGVyXG4gICAgICAgICAgLy8gcmVuZGVycyB0cmFuc3BhcmVudCB3aXRoIGl0cyBtb2RhbCBjbG9zZWQsIHNvIGFybWluZyBpdCBvbiBhbiB1bmFuc3dlcmVkIG1lc3NhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgYW4gaW52aXNpYmxlIHNoZWV0IG92ZXIgdGhlIGhvc3QgcGFnZSBlYXRpbmcgZXZlcnkgY2xpY2suXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBkaXNwbGF5OmJsb2NrIHJlZ2FyZGxlc3MsIHNvIHRoZSBpZnJhbWUgbGF5cyBvdXQgYW5kIGFuaW1hdGVzIG5vcm1hbGx5OyBvbmx5XG4gICAgICAgICAgLy8gcG9pbnRlci1ldmVudHMgaXMgaGVsZCBiYWNrLiBpc01vZGFsU2hvd24gbGlrZXdpc2Ugd2FpdHMgZm9yIHRoZSBjb25maXJtYXRpb24sXG4gICAgICAgICAgLy8gb3IgYSBkZWNsaW5lZCBmaWxlIHdvdWxkIGxhdGNoIHRoZSBpbXBvcnRlciBzaHV0IGZvciBnb29kLlxuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdDogYSBwcmV2aW91c2x5IGRlY2xpbmVkIGZpbGUgbGVhdmVzIHRoZSBob2xkZXIgY2xpY2stdGhyb3VnaC5cbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBpbXBvcnRlciBvbiBhIEZpbGUgdGhlIGhvc3QgcGFnZSBhbHJlYWR5IGhhcywgaW5zdGVhZCBvZiB0aGUgZmlsZSBwaWNrZXIuXG4gICAqXG4gICAqIFJlYWNoYWJsZSB0aHJvdWdoIGEgdGVtcGxhdGUgcmVmZXJlbmNlIChgI2ltcG9ydGVyYCB0aGVuIGBpbXBvcnRlci5vcGVuTW9kYWxXaXRoRmlsZShmaWxlKWApXG4gICAqIG9yIGBAVmlld0NoaWxkKENTVkJveEJ1dHRvbkNvbXBvbmVudClgLlxuICAgKlxuICAgKiBUaGUgRmlsZSBjcm9zc2VzIHRvIHRoZSBpZnJhbWUgYnkgc3RydWN0dXJlZCBjbG9uZSwgc28gdGhlIGltcG9ydGVyIHJlY2VpdmVzIHRoZSByZWFsXG4gICAqIG9iamVjdCBhbmQgYXBwbGllcyBpdHMgb3duIGV4dGVuc2lvbiwgd29ya3NoZWV0IGFuZCBzaXplIHJ1bGVzIHRvIGl0IC0tIHRoaXMgZG9lcyBub3RcbiAgICogYnlwYXNzIGFueSBvZiB0aGVtLiBQYXNzIGEgRmlsZTsgYSBCbG9iIGhhcyBubyBuYW1lIGZvciB0aGUgaW1wb3J0ZXIgdG8gcmVhZCBhblxuICAgKiBleHRlbnNpb24gZnJvbS5cbiAgICovXG4gIG9wZW5Nb2RhbFdpdGhGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZih0eXBlb2YgRmlsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgIShmaWxlIGluc3RhbmNlb2YgRmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdGaWxlID0gZmlsZTtcblxuICAgIC8vIEFscmVhZHkgb3BlbjogaGFuZCBpdCBvdmVyIG5vdyByYXRoZXIgdGhhbiBob2xkaW5nIGl0IGZvciB0aGUgbmV4dCBvcGVuLiBUaGUgaW1wb3J0ZXJcbiAgICAvLyB0YWtlcyBpdCBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIG9uIHRoZSB1cGxvYWQgc3RlcCwgYW5kIGlnbm9yZXMgaXQgb25jZSB0aGUgdXNlciBoYXMgYVxuICAgIC8vIGRhdGFzZXQgYW5kIGEgbWFwcGluZyBpbiBwcm9ncmVzcy5cbiAgICBpZih0aGlzLmlzTW9kYWxTaG93biAmJiB0aGlzLmlmcmFtZSAmJiB0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICB0aGlzLmZpbGVTZW5kZXIuc2VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3Blbk1vZGFsKCk7XG4gIH1cblxuICBjbGVhclByb2JlVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgIHRoaXMuZmlsZVNlbmRlci5yZXNldCgpO1xuICB9XG5cbiAgc3RhcnRGaWxlQWNrVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgIHRoaXMuZmlsZUFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmdpdmVVcE9uRmlsZSgpO1xuICAgIH0sIEZJTEVfQUNLX1RJTUVPVVRfTVMpO1xuICB9XG5cbiAgY2xlYXJGaWxlQWNrVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsZUFja1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5maWxlQWNrVGltZXIpO1xuICAgICAgdGhpcy5maWxlQWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBpbXBvcnRlciBuZXZlciBjb25maXJtZWQgdGhlIGZpbGUgaXQgd2FzIHNlbnQgKGFuIG9yaWdpbiB3ZSBkbyBub3QgdHJ1c3QsIG9yIGFuIGltcG9ydGVyIHRvb1xuICAvLyBvbGQgdG8ga25vdyB0aGUgbWVzc2FnZSkuIFdpdGhvdXQgdGhpcyB0aGUgaG9sZGVyIHdvdWxkIHN0YXkgdXAsIGludmlzaWJsZSBhbmQgY2xpY2stdGhyb3VnaCxcbiAgLy8gYW5kIHRoZSBvdGhlciBpbnN0YW5jZXMnIGJ1dHRvbnMgd291bGQgc3RheSBkaXNhYmxlZCBmb3IgZ29vZC5cbiAgZ2l2ZVVwT25GaWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob2xkZXIgPSB0aGlzLmhvbGRlcjtcbiAgICBpZiAoaG9sZGVyKSB7XG4gICAgICBob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgY29uc29sZS53YXJuKFwiW2NzdmJveF0gdGhlIGltcG9ydGVyIGRpZCBub3QgcmVzcG9uZCB0byB0aGUgc3VwcGxpZWQgZmlsZVwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0Jsb2NrZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tlZCA9IGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKGJsb2NrZWQgIT09IHRoaXMuYmxvY2tlZEJ5T3RoZXIpIHtcbiAgICAgIC8vIFRoZSByZWdpc3RyeSBjYW4gY2FsbCBiYWNrIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSAoYW5vdGhlciBpbnN0YW5jZSwgYW5vdGhlciBhcHApLlxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYmxvY2tlZEJ5T3RoZXIgPSBibG9ja2VkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycygpO1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19