@colijnit/homedecorator 255.1.4 → 255.1.6

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 (89) hide show
  1. package/app/core/enum/message-type.enum.d.ts +3 -1
  2. package/app/core/interface/message-with-payload.interface.d.ts +6 -0
  3. package/app/core/model/homedecorator-settings-options.d.ts +2 -0
  4. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  5. package/app/core/service/homedecorator-connector-adapter.service.d.ts +2 -0
  6. package/app/core/service/homedecorator-connector.service.d.ts +5 -4
  7. package/app/core/service/homedecorator-settings.service.d.ts +2 -1
  8. package/app/core/service/presets.service.d.ts +3 -1
  9. package/app/homedecorator.component.d.ts +3 -1
  10. package/app/homedecorator.module.d.ts +2 -1
  11. package/app/plugins/core3d/service/floor-pattern.service.d.ts +1 -1
  12. package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +2 -1
  13. package/app/plugins/core3d/service/floor.service.d.ts +3 -1
  14. package/app/plugins/core3d/service/post-processing.service.d.ts +21 -7
  15. package/app/plugins/core3d/service/scene.service.d.ts +1 -1
  16. package/app/plugins/core3d/service/ssr.service.d.ts +0 -1
  17. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +11 -2
  18. package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +185 -15
  19. package/app/plugins/model-uploader/model-uploader.module.d.ts +5 -1
  20. package/app/plugins/render/render-dialog/render-dialog.component.d.ts +4 -1
  21. package/app/plugins/render/render-dialog/render-dialog.component.scss +5 -5
  22. package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +3 -1
  23. package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +1 -0
  24. package/app/plugins/room-planner/components/settings/settings.component.d.ts +5 -1
  25. package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +4 -1
  26. package/app/plugins/room-planner/room-planner/room-planner.component.scss +1 -0
  27. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +1 -3
  28. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +2 -0
  29. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  30. package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +2 -0
  31. package/assets/icons/dash-button.svg +7 -0
  32. package/assets/icons/pen-ruler.svg +1 -0
  33. package/assets/icons/retry-button.svg +7 -0
  34. package/bundles/colijnit-homedecorator.umd.js +822 -601
  35. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  36. package/esm2015/app/app.version.js +3 -3
  37. package/esm2015/app/core/enum/message-type.enum.js +3 -1
  38. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  39. package/esm2015/app/core/model/homedecorator-settings-options.js +3 -1
  40. package/esm2015/app/core/service/3dm-api.js +4 -4
  41. package/esm2015/app/core/service/homedecorator-app-event.service.js +2 -1
  42. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +25 -2
  43. package/esm2015/app/core/service/homedecorator-connector.service.js +25 -22
  44. package/esm2015/app/core/service/homedecorator-settings.service.js +3 -2
  45. package/esm2015/app/core/service/presets.service.js +13 -5
  46. package/esm2015/app/core/utils/material.utils.js +3 -3
  47. package/esm2015/app/homedecorator.component.js +26 -19
  48. package/esm2015/app/homedecorator.module.js +8 -4
  49. package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +5 -5
  50. package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +2 -2
  51. package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +2 -2
  52. package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +2 -2
  53. package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +2 -2
  54. package/esm2015/app/plugins/core3d/items/factory.js +3 -2
  55. package/esm2015/app/plugins/core3d/service/ar.service.js +2 -1
  56. package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +24 -18
  57. package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +13 -8
  58. package/esm2015/app/plugins/core3d/service/floor.service.js +9 -4
  59. package/esm2015/app/plugins/core3d/service/light-presets.service.js +10 -8
  60. package/esm2015/app/plugins/core3d/service/lights.service.js +8 -1
  61. package/esm2015/app/plugins/core3d/service/outline.service.js +4 -6
  62. package/esm2015/app/plugins/core3d/service/post-processing.service.js +148 -51
  63. package/esm2015/app/plugins/core3d/service/scene-event.service.js +14 -7
  64. package/esm2015/app/plugins/core3d/service/scene.service.js +84 -74
  65. package/esm2015/app/plugins/core3d/service/ssr.service.js +2 -53
  66. package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +10 -5
  67. package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +2 -2
  68. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +281 -166
  69. package/esm2015/app/plugins/model-uploader/model-uploader.module.js +22 -3
  70. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +3 -2
  71. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +19 -14
  72. package/esm2015/app/plugins/render/service/new-render.service.js +4 -2
  73. package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +4 -2
  74. package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +2 -2
  75. package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +29 -15
  76. package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +5 -2
  77. package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +12 -5
  78. package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +31 -15
  79. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +691 -683
  80. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +43 -41
  81. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1 -1
  82. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +26 -20
  83. package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +2 -2
  84. package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +15 -8
  85. package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +4 -2
  86. package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +3 -3
  87. package/fesm2015/colijnit-homedecorator.js +1656 -1322
  88. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  89. package/package.json +1 -1
@@ -26,21 +26,28 @@ import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';
26
26
  import { BoxMeasurement } from '../../core3d/hud/bounding-measurement-box/box-measurement';
27
27
  import { MeasurementUtils, positioningFactors, xDirection, yDirection, zDirection } from '../../core3d/hud/bounding-measurement-box/measurement-utils';
28
28
  import { makeTextMesh } from '../../core3d/hud/utils';
29
+ import { IconEnum } from '../../../core/enum/icon.enum';
29
30
  import * as i0 from "@angular/core";
30
31
  import * as i1 from "../../../core/service/homedecorator-settings.service";
31
- import * as i2 from "@angular/material/dialog";
32
- import * as i3 from "../../threedselector/threedselector/service/third-party-model.service";
33
- import * as i4 from "../../../core/service/message-bus.service";
34
- import * as i5 from "../../../core/service/homedecorator-connector-adapter.service";
35
- import * as i6 from "../../core3d/service/light-presets.service";
36
- import * as i7 from "../../../core/service/homedecorator-dictionary.service";
37
- import * as i8 from "../../core3d/service/font.service";
38
- import * as i9 from "@angular/material/radio";
39
- import * as i10 from "@angular/common";
32
+ import * as i2 from "../../../core/service/homedecorator-icon-cache.service";
33
+ import * as i3 from "@angular/material/dialog";
34
+ import * as i4 from "../../threedselector/threedselector/service/third-party-model.service";
35
+ import * as i5 from "../../../core/service/message-bus.service";
36
+ import * as i6 from "../../../core/service/homedecorator-connector-adapter.service";
37
+ import * as i7 from "../../core3d/service/light-presets.service";
38
+ import * as i8 from "../../../core/service/homedecorator-dictionary.service";
39
+ import * as i9 from "../../core3d/service/font.service";
40
+ import * as i10 from "@angular/material/icon";
41
+ import * as i11 from "@angular/material/slide-toggle";
42
+ import * as i12 from "@angular/material/form-field";
43
+ import * as i13 from "@angular/material/select";
44
+ import * as i14 from "@angular/material/core";
45
+ import * as i15 from "@angular/common";
40
46
  export class ModelPreviewComponent {
41
- constructor(data, settingsService, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService, _lightPresetsService, _dictionaryService, _fontService) {
47
+ constructor(data, settingsService, iconCache, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService, _lightPresetsService, _dictionaryService, _fontService) {
42
48
  this.data = data;
43
49
  this.settingsService = settingsService;
50
+ this.iconCache = iconCache;
44
51
  this._dialogRef = _dialogRef;
45
52
  this._thirdPartyModelService = _thirdPartyModelService;
46
53
  this._messageService = _messageService;
@@ -50,6 +57,7 @@ export class ModelPreviewComponent {
50
57
  this._dictionaryService = _dictionaryService;
51
58
  this._fontService = _fontService;
52
59
  this.unitsOfMeasurement = 'cm';
60
+ this.units = ['cm', 'inches'];
53
61
  this.mathPi = Math.PI;
54
62
  this.showReferenceModel = true;
55
63
  this.floorSizeHeight = 10;
@@ -59,16 +67,22 @@ export class ModelPreviewComponent {
59
67
  this.distanceStep = 1;
60
68
  this.stackable = false;
61
69
  this.heightAdjustable = false;
70
+ this.selectedPlacement = 0;
62
71
  this._measurements = [];
72
+ this.icon = IconEnum;
63
73
  this.font = this._fontService.hudFont;
64
74
  }
65
75
  ngOnInit() {
66
76
  this.initScene();
67
77
  this.loadModel(this.data);
78
+ this._adapterService.getModelPlacementOptions().then(result => {
79
+ this.placementOptions = result;
80
+ });
68
81
  }
69
82
  ngOnDestroy() {
70
83
  }
71
84
  initScene() {
85
+ const viewScale = 1.3;
72
86
  // init scene
73
87
  this.scenePreview = new Scene();
74
88
  // init renderer
@@ -92,11 +106,11 @@ export class ModelPreviewComponent {
92
106
  this.rendererPreview.outputColorSpace = LinearSRGBColorSpace;
93
107
  canvReference.appendChild(this.rendererPreview.domElement);
94
108
  this.rendererPreview.domElement.setAttribute('id', 'threed');
95
- this.rendererPreview.setSize(window.innerWidth / 2, window.innerHeight / 2, true);
109
+ this.rendererPreview.setSize(window.innerHeight / viewScale, window.innerHeight / viewScale, true);
96
110
  // init camera
97
111
  this.cameraPreview = new PerspectiveCamera(45, 1, 0.01, 100000000);
98
112
  this.cameraPreview.position.set(0, 2, 10);
99
- this.cameraPreview.aspect = window.innerWidth / window.innerHeight;
113
+ this.cameraPreview.aspect = (window.innerHeight / viewScale) / (window.innerHeight / viewScale);
100
114
  this.cameraPreview.updateProjectionMatrix();
101
115
  this.controls = new OrbitControls(this.cameraPreview, this.rendererPreview.domElement);
102
116
  this.controls.update();
@@ -209,6 +223,7 @@ export class ModelPreviewComponent {
209
223
  }, options);
210
224
  }
211
225
  scaleArticle() {
226
+ const model = this.scenePreview.getObjectByName(this.modelName);
212
227
  const inputHeight = this.heightArticle.nativeElement.value;
213
228
  let heightInMeter;
214
229
  if (this.unitsOfMeasurement === 'cm') {
@@ -219,7 +234,8 @@ export class ModelPreviewComponent {
219
234
  }
220
235
  // scale = this.bounding / heightInMeter and use Y as up/ height
221
236
  const scale = this.boundingBoxSize.y / heightInMeter;
222
- this.scenePreview.getObjectByName(this.modelName).scale.set(this.scenePreview.children[0].scale.x / scale, this.scenePreview.children[0].scale.y / scale, this.scenePreview.children[0].scale.z / scale);
237
+ model.scale.set(model.scale.x / scale, model.scale.y / scale, model.scale.z / scale);
238
+ this._getBoundingBox(model);
223
239
  }
224
240
  rotateModel(axis, degrees) {
225
241
  const model = this.scenePreview.getObjectByName(this.modelName);
@@ -245,12 +261,15 @@ export class ModelPreviewComponent {
245
261
  else if (axis === 'z') {
246
262
  model.position.z += amount;
247
263
  }
264
+ else if (axis === 'all') {
265
+ model.position.set(0, 0, 0);
266
+ }
248
267
  this._getBoundingBox(model);
249
268
  }
250
269
  setUnit(event) {
251
270
  this.unitsOfMeasurement = event.value;
252
271
  }
253
- toggleShowReferenceModel() {
272
+ toggleShowReferenceModel($event) {
254
273
  const model = this.scenePreview.getObjectByName('Reference_model');
255
274
  model.visible = !this.showReferenceModel;
256
275
  this.showReferenceModel = !this.showReferenceModel;
@@ -261,6 +280,9 @@ export class ModelPreviewComponent {
261
280
  setHeightAdjustable(event) {
262
281
  this.heightAdjustable = event.value;
263
282
  }
283
+ closePreview() {
284
+ this._dialog.closeAll();
285
+ }
264
286
  _animate() {
265
287
  setTimeout(() => {
266
288
  this.rendererPreview.setAnimationLoop((timestamp, frame) => this._render(timestamp, frame));
@@ -282,6 +304,7 @@ export class ModelPreviewComponent {
282
304
  }
283
305
  _sendModelToCDN(fileName, blob) {
284
306
  return __awaiter(this, void 0, void 0, function* () {
307
+ // console.log(this.placementOptions[this.selectedPlacement]);
285
308
  const reader = new FileReader();
286
309
  reader.readAsDataURL(blob);
287
310
  reader.onloadend = (event) => __awaiter(this, void 0, void 0, function* () {
@@ -303,6 +326,8 @@ export class ModelPreviewComponent {
303
326
  });
304
327
  });
305
328
  }
329
+ }).catch(error => {
330
+ this._messageService.emit(MessageType.RenderError, { title: 'Upload error', message: error });
306
331
  });
307
332
  });
308
333
  });
@@ -370,6 +395,8 @@ export class ModelPreviewComponent {
370
395
  this.boundingBoxSize = boundingBox.getSize(new Vector3());
371
396
  this._setMeasurements(this.boundingBoxSize);
372
397
  this._showMeasurements();
398
+ const modelBoxhelper = this.scenePreview.getObjectByName('modelBoxhelper');
399
+ this.scenePreview.remove(modelBoxhelper);
373
400
  const boxHelper = new BoxHelper(object);
374
401
  boxHelper.material.color.set(0xFF00FF);
375
402
  boxHelper.name = 'modelBoxhelper';
@@ -492,225 +519,313 @@ export class ModelPreviewComponent {
492
519
  }
493
520
  }
494
521
  }
495
- ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.HomedecoratorSettingsService }, { token: i2.MatDialogRef }, { token: i3.ThirdPartyModelService }, { token: i4.MessageBusService }, { token: i2.MatDialog }, { token: i5.HomedecoratorConnectorAdapterService }, { token: i6.LightPresetsService }, { token: i7.HomedecoratorDictionaryService }, { token: i8.FontService }], target: i0.ɵɵFactoryTarget.Component });
522
+ ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.HomedecoratorSettingsService }, { token: i2.HomedecoratorIconCacheService }, { token: i3.MatDialogRef }, { token: i4.ThirdPartyModelService }, { token: i5.MessageBusService }, { token: i3.MatDialog }, { token: i6.HomedecoratorConnectorAdapterService }, { token: i7.LightPresetsService }, { token: i8.HomedecoratorDictionaryService }, { token: i9.FontService }], target: i0.ɵɵFactoryTarget.Component });
496
523
  ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ModelPreviewComponent, selector: "rp-model-preview", viewQueries: [{ propertyName: "glbExportName", first: true, predicate: ["fileName"], descendants: true }, { propertyName: "heightArticle", first: true, predicate: ["heightArticle"], descendants: true }], ngImport: i0, template: `
524
+ <div class="model-close-preview" (click)="closePreview()">
525
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
526
+ </div>
497
527
  <div class="model-preview">
498
- <div class="model-preview-container" id="canvasContainer">
528
+ <div class="model-preview-window">
529
+ <div class="model-preview-container" id="canvasContainer"></div>
530
+ <div class="model-preview-window-bottom">
531
+ <div>
532
+ <mat-slide-toggle
533
+ [checked]="showReferenceModel"
534
+ [labelPosition]="'after'"
535
+ (change)="toggleShowReferenceModel($event)">
536
+ Show Reference model
537
+ </mat-slide-toggle>
538
+ </div>
539
+ <div class="disclaimer-text-container">
540
+ <p class="disclaimer-text">
541
+ Grid scale: 1 tile = 1x1 meter
542
+ </p>
543
+ </div>
544
+ </div>
499
545
  </div>
500
546
  <div class="model-preview-actions">
501
547
  <div class="input-height-container">
502
- <p>Centimeters of inches</p>
503
- <div class="mat-radio-wrapper">
504
- <mat-radio-group aria-label="Select an unit" (change)="setUnit($event)">
505
- <mat-radio-button [checked]="true" value="cm">Height in cm</mat-radio-button>
506
- <mat-radio-button value="inches">Height in inches</mat-radio-button>
507
- </mat-radio-group>
508
- </div>
548
+ <h2>Model settings</h2>
509
549
  <div>
510
- <input type="text" id="heightArticle" #heightArticle>
511
- <button (click)="scaleArticle()">scale</button>
550
+ <h3>Scale:</h3>
551
+ <input type="text" id="heightArticle" #heightArticle placeholder="Set model height">
552
+ <mat-form-field class="units-select-form">
553
+ <mat-select class="units-mat-select" [(value)]="unitsOfMeasurement">
554
+ <mat-option class="units-mat-option" *ngFor="let unit of units" [value]="unit">{{ unit }}</mat-option>
555
+ </mat-select>
556
+ </mat-form-field>
557
+ <button class="apply-button base-button" (click)="scaleArticle()">Apply</button>
512
558
  </div>
513
559
  </div>
514
-
515
- <div>
516
- <button (click)="toggleShowReferenceModel()">Show Reference model</button>
517
- </div>
518
-
519
560
  <div class="rotation-button-container">
520
- <p>Rotation</p>
521
- <div class="rotation-x-buttons">
522
- <button (click)="rotateModel('x', mathPi / 2)">x-as + 90 graden</button>
523
- <button (click)="rotateModel('x', -mathPi / 2)">x-as - 90 graden</button>
561
+ <h3>Rotation:</h3>
562
+ <div>
563
+ <p>Rotate on X axis (90 degrees)</p>
564
+ <p>
565
+ <button (click)="rotateModel('x', -mathPi / 2)">
566
+ <mat-icon svgIcon="dash-button"></mat-icon>
567
+ </button>
568
+ <button (click)="rotateModel('x', mathPi / 2)">
569
+ <mat-icon svgIcon="add-button"></mat-icon>
570
+ </button>
571
+ </p>
524
572
  </div>
525
- <div class="rotation-y-buttons">
526
- <button (click)="rotateModel('y', mathPi / 2)">y-as + 90 graden</button>
527
- <button (click)="rotateModel('y', -mathPi / 2)">y-as - 90 graden</button>
573
+ <div>
574
+ <p>Rotate on Y axis (90 degrees)</p>
575
+ <p>
576
+ <button (click)="rotateModel('y', -mathPi / 2)">
577
+ <mat-icon svgIcon="dash-button"></mat-icon>
578
+ </button>
579
+ <button (click)="rotateModel('y', mathPi / 2)">
580
+ <mat-icon svgIcon="add-button"></mat-icon>
581
+ </button>
582
+ </p>
528
583
  </div>
529
- <div class="rotation-z-buttons">
530
- <button (click)="rotateModel('z', mathPi / 2)">z-as + 90 graden</button>
531
- <button (click)="rotateModel('z', -mathPi / 2)">z-as - 90 graden</button>
584
+ <div>
585
+ <p>Rotate on Z axis (90 degrees)</p>
586
+ <p>
587
+ <button (click)="rotateModel('z', -mathPi / 2)">
588
+ <mat-icon svgIcon="dash-button"></mat-icon>
589
+ </button>
590
+ <button (click)="rotateModel('z', mathPi / 2)">
591
+ <mat-icon svgIcon="add-button"></mat-icon>
592
+ </button>
593
+ </p>
532
594
  </div>
533
595
  </div>
534
-
535
-
536
596
  <div class="rotation-button-container">
537
- <p>Positie</p>
538
- <div class="rotation-x-buttons">
539
- <button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
540
- <button (click)="moveModel('x', -0.01)">x-as -0.01</button>
541
- </div>
542
- <div class="rotation-y-buttons">
543
- <button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
544
- <button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
597
+ <h3>Position:</h3>
598
+ <div>
599
+ <p>Reset to coordinates 0,0,0</p>
600
+ <p>
601
+ <button class="button-as-link" (click)="moveModel('all', 0)">
602
+ <mat-icon svgIcon="retry-button"></mat-icon>
603
+ Reset
604
+ </button>
605
+ </p>
545
606
  </div>
546
- <div class="rotation-z-buttons">
547
- <button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
548
- <button (click)="moveModel('z', -0.01)">z-as -0.01</button>
607
+ <div>
608
+ <p>Move on the Y axis (0.01 unit)</p>
609
+ <p>
610
+ <button (click)="moveModel('y', -0.01)">
611
+ <mat-icon svgIcon="dash-button"></mat-icon>
612
+ </button>
613
+ <button (click)="moveModel('y', 0.01)">
614
+ <mat-icon svgIcon="add-button"></mat-icon>
615
+ </button>
616
+ </p>
549
617
  </div>
550
618
  </div>
551
619
 
552
- <div class="model-preview-info" *ngIf="this.data">
553
- <div class="model-preview-info-container">
554
- <div class="model-preview-info-left">
555
- <label>Name</label>
556
- </div>
557
- <div class="model-preview-info-right">
558
- <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
559
- </div>
620
+ <div class="model-preview-info-container">
621
+ <h3>Properties:</h3>
622
+ <div>
623
+ <mat-slide-toggle
624
+ [checked]="false"
625
+ [labelPosition]="'before'"
626
+ (change)="setStackable($event)">
627
+ Stackable
628
+ </mat-slide-toggle>
629
+ </div>
630
+ <div>
631
+ <mat-slide-toggle
632
+ [checked]="false"
633
+ [labelPosition]="'before'"
634
+ (change)="setHeightAdjustable($event)">
635
+ Height adjustable
636
+ </mat-slide-toggle>
560
637
  </div>
561
638
 
562
- <div class="model-preview-info-container">
563
- <div class="model-preview-info-left">
564
- <label>Stackable</label>
565
- </div>
566
- <div class="model-preview-info-right">
567
- <div class="mat-radio-wrapper">
568
- <mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
569
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
570
- <mat-radio-button value="true">Yes</mat-radio-button>
571
- </mat-radio-group>
572
- </div>
639
+ <div class="model-placement-container">
640
+ <div>
641
+ <label>Placement</label>
642
+
643
+ <mat-form-field *ngIf="placementOptions">
644
+ <mat-select [(value)]="selectedPlacement">
645
+ <mat-option *ngFor="let placementOption of placementOptions"
646
+ [value]="placementOption.code">{{ placementOption.description }}
647
+ </mat-option>
648
+ </mat-select>
649
+ </mat-form-field>
573
650
  </div>
574
651
  </div>
652
+ </div>
575
653
 
654
+ <div class="model-preview-info" *ngIf="this.data">
576
655
  <div class="model-preview-info-container">
577
656
  <div class="model-preview-info-left">
578
- <label>Height adjustable</label>
657
+ <label>Save as:</label>
579
658
  </div>
580
659
  <div class="model-preview-info-right">
581
- <div class="mat-radio-wrapper">
582
- <mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
583
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
584
- <mat-radio-button value="true">Yes</mat-radio-button>
585
- </mat-radio-group>
586
- </div>
660
+ <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
587
661
  </div>
588
662
  </div>
663
+ <div>
664
+ <button class="base-button exportButton" (click)="exportSceneAsGLB('upload')">Upload and add to scene</button>
665
+ <button class="base-button exportButtonDark" (click)="exportSceneAsGLB('download')">Download</button>
589
666
 
590
- <div class="model-preview-info-container">
591
- <div class="model-preview-info-left">
592
- <label>Extension</label>
593
- </div>
594
- <div class="model-preview-info-right">
595
- <label>{{ this.data.file.fileType }}</label>
596
- </div>
667
+ <button (click)="closePreview()" class="base-button exportButtonDark">
668
+ <!-- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>-->
669
+ <span>Cancel</span>
670
+ </button>
597
671
  </div>
598
- <button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
599
- <p></p>
600
- <button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
601
672
  </div>
602
673
  </div>
603
674
  </div>
604
- `, isInline: true, styles: [".model-preview{display:flex;flex-direction:row}.model-preview .model-preview-actions{min-width:240px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:10px}.rotation-button-container div button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px}.rotation-button-container div button:hover{background:#dda73f;color:#fff}\n"], components: [{ type: i9.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i9.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
675
+ `, isInline: true, styles: [".model-preview{display:flex;flex-direction:row;font-size:14px}.model-preview .model-preview-window .model-preview-window-bottom{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.model-preview .model-preview-window .model-preview-window-bottom .disclaimer-text-container{padding-right:20px;text-align:right;font-style:italic;font-size:12px}.model-preview .model-preview-actions{min-width:350px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions #heightArticle{max-width:160px}.model-preview .model-preview-actions .units-select-form{width:80px;margin:0 5px}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .model-preview-actions .model-preview-info{margin-top:80px}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}.model-preview input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px;line-height:30px;width:100%}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.base-button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:4px 10px;line-height:30px}.base-button:hover{background:#dda73f;color:#fff}.model-placement-container div{display:flex;justify-content:space-between;margin:5px 0;align-items:center}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:5px}.rotation-button-container div p{margin:0;padding:0}.rotation-button-container div button{margin:0 0 0 10px;cursor:pointer;color:#5b6875;background:#fff;border:2px solid #5b6875;border-radius:50%;box-sizing:border-box;padding:0;height:22px;width:22px;font-size:18px;text-align:center}.rotation-button-container div button:hover{background:#dda73f;color:#fff}.rotation-button-container div .button-as-link{color:#dda73f;border:none;width:100%;height:100%;font-size:14px;position:relative;top:-15px}.rotation-button-container div .button-as-link ::ng-deep mat-icon{width:25px;height:25px;position:relative;top:8px}.rotation-button-container div .button-as-link ::ng-deep mat-icon svg path{fill:#dda73f}.rotation-button-container div .button-as-link:hover{background:none;color:#dda73f}.error-container{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid #f5c6cb;border-radius:.25rem;color:#721c24;background-color:#f8d7da;max-width:190px}.exportButton,.exportButtonDark{display:inline-block!important;margin-right:10px}.exportButtonDark{background:#5b6875;border-color:#5b6875}.exportButtonDark:hover{background:#5b6875;color:#fff}.model-close-preview{text-align:right;cursor:pointer}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:0;border:1px solid #5b6875;border-radius:4px}:host ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-infix{padding:0;border:none}:host ::ng-deep .mat-select-value{padding-left:5px}:host ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{height:0}:host ::ng-deep .mat-select-trigger{line-height:36px}:host ::ng-deep mat-icon{width:18px;height:18px}:host ::ng-deep mat-icon svg path{fill:#5b6875}:host ::ng-deep .mat-slide-toggle-content{width:calc(100% - 36px);min-width:300px}\n"], components: [{ type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i12.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i13.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i14.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
605
676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, decorators: [{
606
677
  type: Component,
607
678
  args: [{
608
679
  selector: 'rp-model-preview',
609
680
  template: `
681
+ <div class="model-close-preview" (click)="closePreview()">
682
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
683
+ </div>
610
684
  <div class="model-preview">
611
- <div class="model-preview-container" id="canvasContainer">
685
+ <div class="model-preview-window">
686
+ <div class="model-preview-container" id="canvasContainer"></div>
687
+ <div class="model-preview-window-bottom">
688
+ <div>
689
+ <mat-slide-toggle
690
+ [checked]="showReferenceModel"
691
+ [labelPosition]="'after'"
692
+ (change)="toggleShowReferenceModel($event)">
693
+ Show Reference model
694
+ </mat-slide-toggle>
695
+ </div>
696
+ <div class="disclaimer-text-container">
697
+ <p class="disclaimer-text">
698
+ Grid scale: 1 tile = 1x1 meter
699
+ </p>
700
+ </div>
701
+ </div>
612
702
  </div>
613
703
  <div class="model-preview-actions">
614
704
  <div class="input-height-container">
615
- <p>Centimeters of inches</p>
616
- <div class="mat-radio-wrapper">
617
- <mat-radio-group aria-label="Select an unit" (change)="setUnit($event)">
618
- <mat-radio-button [checked]="true" value="cm">Height in cm</mat-radio-button>
619
- <mat-radio-button value="inches">Height in inches</mat-radio-button>
620
- </mat-radio-group>
621
- </div>
705
+ <h2>Model settings</h2>
622
706
  <div>
623
- <input type="text" id="heightArticle" #heightArticle>
624
- <button (click)="scaleArticle()">scale</button>
707
+ <h3>Scale:</h3>
708
+ <input type="text" id="heightArticle" #heightArticle placeholder="Set model height">
709
+ <mat-form-field class="units-select-form">
710
+ <mat-select class="units-mat-select" [(value)]="unitsOfMeasurement">
711
+ <mat-option class="units-mat-option" *ngFor="let unit of units" [value]="unit">{{ unit }}</mat-option>
712
+ </mat-select>
713
+ </mat-form-field>
714
+ <button class="apply-button base-button" (click)="scaleArticle()">Apply</button>
625
715
  </div>
626
716
  </div>
627
-
628
- <div>
629
- <button (click)="toggleShowReferenceModel()">Show Reference model</button>
630
- </div>
631
-
632
717
  <div class="rotation-button-container">
633
- <p>Rotation</p>
634
- <div class="rotation-x-buttons">
635
- <button (click)="rotateModel('x', mathPi / 2)">x-as + 90 graden</button>
636
- <button (click)="rotateModel('x', -mathPi / 2)">x-as - 90 graden</button>
718
+ <h3>Rotation:</h3>
719
+ <div>
720
+ <p>Rotate on X axis (90 degrees)</p>
721
+ <p>
722
+ <button (click)="rotateModel('x', -mathPi / 2)">
723
+ <mat-icon svgIcon="dash-button"></mat-icon>
724
+ </button>
725
+ <button (click)="rotateModel('x', mathPi / 2)">
726
+ <mat-icon svgIcon="add-button"></mat-icon>
727
+ </button>
728
+ </p>
637
729
  </div>
638
- <div class="rotation-y-buttons">
639
- <button (click)="rotateModel('y', mathPi / 2)">y-as + 90 graden</button>
640
- <button (click)="rotateModel('y', -mathPi / 2)">y-as - 90 graden</button>
730
+ <div>
731
+ <p>Rotate on Y axis (90 degrees)</p>
732
+ <p>
733
+ <button (click)="rotateModel('y', -mathPi / 2)">
734
+ <mat-icon svgIcon="dash-button"></mat-icon>
735
+ </button>
736
+ <button (click)="rotateModel('y', mathPi / 2)">
737
+ <mat-icon svgIcon="add-button"></mat-icon>
738
+ </button>
739
+ </p>
641
740
  </div>
642
- <div class="rotation-z-buttons">
643
- <button (click)="rotateModel('z', mathPi / 2)">z-as + 90 graden</button>
644
- <button (click)="rotateModel('z', -mathPi / 2)">z-as - 90 graden</button>
741
+ <div>
742
+ <p>Rotate on Z axis (90 degrees)</p>
743
+ <p>
744
+ <button (click)="rotateModel('z', -mathPi / 2)">
745
+ <mat-icon svgIcon="dash-button"></mat-icon>
746
+ </button>
747
+ <button (click)="rotateModel('z', mathPi / 2)">
748
+ <mat-icon svgIcon="add-button"></mat-icon>
749
+ </button>
750
+ </p>
645
751
  </div>
646
752
  </div>
647
-
648
-
649
753
  <div class="rotation-button-container">
650
- <p>Positie</p>
651
- <div class="rotation-x-buttons">
652
- <button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
653
- <button (click)="moveModel('x', -0.01)">x-as -0.01</button>
654
- </div>
655
- <div class="rotation-y-buttons">
656
- <button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
657
- <button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
754
+ <h3>Position:</h3>
755
+ <div>
756
+ <p>Reset to coordinates 0,0,0</p>
757
+ <p>
758
+ <button class="button-as-link" (click)="moveModel('all', 0)">
759
+ <mat-icon svgIcon="retry-button"></mat-icon>
760
+ Reset
761
+ </button>
762
+ </p>
658
763
  </div>
659
- <div class="rotation-z-buttons">
660
- <button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
661
- <button (click)="moveModel('z', -0.01)">z-as -0.01</button>
764
+ <div>
765
+ <p>Move on the Y axis (0.01 unit)</p>
766
+ <p>
767
+ <button (click)="moveModel('y', -0.01)">
768
+ <mat-icon svgIcon="dash-button"></mat-icon>
769
+ </button>
770
+ <button (click)="moveModel('y', 0.01)">
771
+ <mat-icon svgIcon="add-button"></mat-icon>
772
+ </button>
773
+ </p>
662
774
  </div>
663
775
  </div>
664
776
 
665
- <div class="model-preview-info" *ngIf="this.data">
666
- <div class="model-preview-info-container">
667
- <div class="model-preview-info-left">
668
- <label>Name</label>
669
- </div>
670
- <div class="model-preview-info-right">
671
- <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
672
- </div>
777
+ <div class="model-preview-info-container">
778
+ <h3>Properties:</h3>
779
+ <div>
780
+ <mat-slide-toggle
781
+ [checked]="false"
782
+ [labelPosition]="'before'"
783
+ (change)="setStackable($event)">
784
+ Stackable
785
+ </mat-slide-toggle>
786
+ </div>
787
+ <div>
788
+ <mat-slide-toggle
789
+ [checked]="false"
790
+ [labelPosition]="'before'"
791
+ (change)="setHeightAdjustable($event)">
792
+ Height adjustable
793
+ </mat-slide-toggle>
673
794
  </div>
674
795
 
675
- <div class="model-preview-info-container">
676
- <div class="model-preview-info-left">
677
- <label>Stackable</label>
678
- </div>
679
- <div class="model-preview-info-right">
680
- <div class="mat-radio-wrapper">
681
- <mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
682
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
683
- <mat-radio-button value="true">Yes</mat-radio-button>
684
- </mat-radio-group>
685
- </div>
796
+ <div class="model-placement-container">
797
+ <div>
798
+ <label>Placement</label>
799
+
800
+ <mat-form-field *ngIf="placementOptions">
801
+ <mat-select [(value)]="selectedPlacement">
802
+ <mat-option *ngFor="let placementOption of placementOptions"
803
+ [value]="placementOption.code">{{ placementOption.description }}
804
+ </mat-option>
805
+ </mat-select>
806
+ </mat-form-field>
686
807
  </div>
687
808
  </div>
809
+ </div>
688
810
 
811
+ <div class="model-preview-info" *ngIf="this.data">
689
812
  <div class="model-preview-info-container">
690
813
  <div class="model-preview-info-left">
691
- <label>Height adjustable</label>
814
+ <label>Save as:</label>
692
815
  </div>
693
816
  <div class="model-preview-info-right">
694
- <div class="mat-radio-wrapper">
695
- <mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
696
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
697
- <mat-radio-button value="true">Yes</mat-radio-button>
698
- </mat-radio-group>
699
- </div>
817
+ <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
700
818
  </div>
701
819
  </div>
820
+ <div>
821
+ <button class="base-button exportButton" (click)="exportSceneAsGLB('upload')">Upload and add to scene</button>
822
+ <button class="base-button exportButtonDark" (click)="exportSceneAsGLB('download')">Download</button>
702
823
 
703
- <div class="model-preview-info-container">
704
- <div class="model-preview-info-left">
705
- <label>Extension</label>
706
- </div>
707
- <div class="model-preview-info-right">
708
- <label>{{ this.data.file.fileType }}</label>
709
- </div>
824
+ <button (click)="closePreview()" class="base-button exportButtonDark">
825
+ <!-- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>-->
826
+ <span>Cancel</span>
827
+ </button>
710
828
  </div>
711
- <button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
712
- <p></p>
713
- <button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
714
829
  </div>
715
830
  </div>
716
831
  </div>
@@ -720,11 +835,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
720
835
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
721
836
  type: Inject,
722
837
  args: [MAT_DIALOG_DATA]
723
- }] }, { type: i1.HomedecoratorSettingsService }, { type: i2.MatDialogRef }, { type: i3.ThirdPartyModelService }, { type: i4.MessageBusService }, { type: i2.MatDialog }, { type: i5.HomedecoratorConnectorAdapterService }, { type: i6.LightPresetsService }, { type: i7.HomedecoratorDictionaryService }, { type: i8.FontService }]; }, propDecorators: { glbExportName: [{
838
+ }] }, { type: i1.HomedecoratorSettingsService }, { type: i2.HomedecoratorIconCacheService }, { type: i3.MatDialogRef }, { type: i4.ThirdPartyModelService }, { type: i5.MessageBusService }, { type: i3.MatDialog }, { type: i6.HomedecoratorConnectorAdapterService }, { type: i7.LightPresetsService }, { type: i8.HomedecoratorDictionaryService }, { type: i9.FontService }]; }, propDecorators: { glbExportName: [{
724
839
  type: ViewChild,
725
840
  args: ['fileName']
726
841
  }], heightArticle: [{
727
842
  type: ViewChild,
728
843
  args: ['heightArticle']
729
844
  }] } });
730
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL21vZGVsLXVwbG9hZGVyL21vZGVsLXByZXZpZXdlci9tb2RlbC1wcmV2aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBQyxlQUFlLEVBQTBCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEYsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLElBQUksRUFDSixpQkFBaUIsRUFDakIsaUJBQWlCLEVBRWpCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGNBQWMsRUFDZCxLQUFLLEVBQ0wsT0FBTyxFQUNQLGFBQWEsRUFDZCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDakUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUcvRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1B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QyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEM7U0FDRjthQUFNO1lBQ0wsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNILENBQUM7O21IQXpmVSxxQkFBcUIsa0JBMkJ0QixlQUFlO3VHQTNCZCxxQkFBcUIsb1FBL0d0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEdUOzRGQUdVLHFCQUFxQjtrQkFqSGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0R1Q7b0JBQ0QsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDOzswQkE0QkksTUFBTTsyQkFBQyxlQUFlOzJXQTFCSyxhQUFhO3NCQUExQyxTQUFTO3VCQUFDLFVBQVU7Z0JBQ2MsYUFBYTtzQkFBL0MsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3Itc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2csIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuXHJcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtcclxuICBCb3gzLFxyXG4gIEJveEhlbHBlcixcclxuICBDb2xvcixcclxuICBHcmlkSGVscGVyLFxyXG4gIExpZ2h0LFxyXG4gIExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG4gIE1lc2gsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgTWVzaFBob25nTWF0ZXJpYWwsXHJcbiAgT2JqZWN0M0QsXHJcbiAgUENGU29mdFNoYWRvd01hcCxcclxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICBQbGFuZUdlb21ldHJ5LFxyXG4gIFBNUkVNR2VuZXJhdG9yLFxyXG4gIFNjZW5lLFxyXG4gIFZlY3RvcjMsXHJcbiAgV2ViR0xSZW5kZXJlclxyXG59IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtGbG9hdFR5cGUsIExpbmVhclRvbmVNYXBwaW5nfSBmcm9tICd0aHJlZS9zcmMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtHTFRGTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHtSR0JFTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9SR0JFTG9hZGVyJztcclxuaW1wb3J0IHtPcmJpdENvbnRyb2xzfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7R0xURkV4cG9ydGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL0dMVEZFeHBvcnRlcic7XHJcbmltcG9ydCB7RkJYTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9GQlhMb2FkZXInO1xyXG5pbXBvcnQge09CSkxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvT0JKTG9hZGVyJztcclxuaW1wb3J0IHtUaGlyZFBhcnR5TW9kZWxTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL3RoaXJkLXBhcnR5LW1vZGVsLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7VERTTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9URFNMb2FkZXInO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7TGlnaHRQcmVzZXRzU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvbGlnaHQtcHJlc2V0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodFByb3BlcnRpZXN9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvbGlnaHQtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7TGlnaHRFbnVtfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vbGlnaHQuZW51bSc7XHJcbmltcG9ydCB7TGlnaHRDcmVhdGVTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL2xpZ2h0LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xpZ2h0UHJlc2V0fSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVsL2xpZ2h0LXByZXNldCc7XHJcbmltcG9ydCB7RmlsZVV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL2ZpbGUudXRpbHMnO1xyXG5pbXBvcnQge1NUTExvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvU1RMTG9hZGVyJztcclxuaW1wb3J0IHtCb3hNZWFzdXJlbWVudH0gZnJvbSAnLi4vLi4vY29yZTNkL2h1ZC9ib3VuZGluZy1tZWFzdXJlbWVudC1ib3gvYm94LW1lYXN1cmVtZW50JztcclxuaW1wb3J0IHtcclxuICBNZWFzdXJlbWVudFV0aWxzLFxyXG4gIHBvc2l0aW9uaW5nRmFjdG9ycyxcclxuICB4RGlyZWN0aW9uLFxyXG4gIHlEaXJlY3Rpb24sXHJcbiAgekRpcmVjdGlvblxyXG59IGZyb20gJy4uLy4uL2NvcmUzZC9odWQvYm91bmRpbmctbWVhc3VyZW1lbnQtYm94L21lYXN1cmVtZW50LXV0aWxzJztcclxuaW1wb3J0IHttYWtlVGV4dE1lc2h9IGZyb20gJy4uLy4uL2NvcmUzZC9odWQvdXRpbHMnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItZGljdGlvbmFyeS5zZXJ2aWNlJztcclxuaW1wb3J0IHtGb250U2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvZm9udC5zZXJ2aWNlJztcclxuaW1wb3J0IHtGb250fSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9Gb250TG9hZGVyJztcclxuaW1wb3J0IHtNZXRhZGF0YX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL21ldGFkYXRhJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3JwLW1vZGVsLXByZXZpZXcnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlld1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1jb250YWluZXJcIiBpZD1cImNhbnZhc0NvbnRhaW5lclwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1oZWlnaHQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cD5DZW50aW1ldGVycyBvZiBpbmNoZXM8L3A+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXJhZGlvLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIHVuaXRcIiAoY2hhbmdlKT1cInNldFVuaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFtjaGVja2VkXT1cInRydWVcIiB2YWx1ZT1cImNtXCI+SGVpZ2h0IGluIGNtPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiaW5jaGVzXCI+SGVpZ2h0IGluIGluY2hlczwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVpZ2h0QXJ0aWNsZVwiICNoZWlnaHRBcnRpY2xlPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzY2FsZUFydGljbGUoKVwiPnNjYWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZVNob3dSZWZlcmVuY2VNb2RlbCgpXCI+U2hvdyBSZWZlcmVuY2UgbW9kZWw8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxwPlJvdGF0aW9uPC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXgtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneCcsIG1hdGhQaSAvIDIpXCI+eC1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneCcsIC1tYXRoUGkgLyAyKVwiPngtYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXktYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneScsIG1hdGhQaSAvIDIpXCI+eS1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneScsIC1tYXRoUGkgLyAyKVwiPnktYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXotYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneicsIG1hdGhQaSAvIDIpXCI+ei1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneicsIC1tYXRoUGkgLyAyKVwiPnotYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxwPlBvc2l0aWU8L3A+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm90YXRpb24teC1idXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vdmVNb2RlbCgneCcsICAwLjAxKVwiPngtYXMgKyAwLjAxPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vdmVNb2RlbCgneCcsIC0wLjAxKVwiPngtYXMgLTAuMDE8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXktYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb3ZlTW9kZWwoJ3knLCAwLjAxKVwiPnktYXMgKyAwLjAxPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vdmVNb2RlbCgneScsIC0wLjAxKVwiPnktYXMgLSAwLjAxPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi16LWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW92ZU1vZGVsKCd6JywgIDAuMDEpXCI+ei1hcyArIDAuMDE8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW92ZU1vZGVsKCd6JywgLTAuMDEpXCI+ei1hcyAtMC4wMTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm9cIiAqbmdJZj1cInRoaXMuZGF0YVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPk5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZmlsZU5hbWVcIiAjZmlsZU5hbWUgdmFsdWU9XCJ7eyB0aGlzLmRhdGEuZmlsZS5maWxlLm5hbWUgfX1cIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWxlZnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+U3RhY2thYmxlPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXJhZGlvLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiB1bml0XCIgKGNoYW5nZSk9XCJzZXRTdGFja2FibGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbY2hlY2tlZF09XCJ0cnVlXCIgdmFsdWU9XCJmYWxzZVwiPk5vPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInRydWVcIj5ZZXM8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWxlZnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+SGVpZ2h0IGFkanVzdGFibGU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtcmFkaW8td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIHVuaXRcIiAoY2hhbmdlKT1cInNldEhlaWdodEFkanVzdGFibGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbY2hlY2tlZF09XCJ0cnVlXCIgdmFsdWU9XCJmYWxzZVwiPk5vPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInRydWVcIj5ZZXM8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWxlZnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+RXh0ZW5zaW9uPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+e3sgdGhpcy5kYXRhLmZpbGUuZmlsZVR5cGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydEJ1dHRvblwiIChjbGljayk9XCJleHBvcnRTY2VuZUFzR0xCKCd1cGxvYWQnKVwiPlVwbG9hZCB0byBDRE4gYW5kIGFkZCB0byBzY2VuZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydEJ1dHRvblwiIChjbGljayk9XCJleHBvcnRTY2VuZUFzR0xCKCdkb3dubG9hZCcpXCI+RG93bmxvYWQgbW9kZWw8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlVXJsczogWycuL21vZGVsLXByZXZpZXcuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9kZWxQcmV2aWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVOYW1lJykgcHVibGljIGdsYkV4cG9ydE5hbWU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaGVpZ2h0QXJ0aWNsZScpIHB1YmxpYyBoZWlnaHRBcnRpY2xlOiBFbGVtZW50UmVmO1xyXG5cclxuICBwdWJsaWMgc2NlbmVQcmV2aWV3OiBUSFJFRS5TY2VuZTtcclxuICBwdWJsaWMgY2FtZXJhUHJldmlldzogVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmE7XHJcbiAgcHVibGljIHJlbmRlcmVyUHJldmlldzogVEhSRUUuV2ViR0xSZW5kZXJlcjtcclxuICBwdWJsaWMgY29udHJvbHM6IE9yYml0Q29udHJvbHM7XHJcbiAgcHVibGljIGJvdW5kaW5nQm94U2l6ZTogVmVjdG9yMztcclxuICBwdWJsaWMgbG9hZGVkTW9kZWw6IGFueTtcclxuICBwdWJsaWMgdW5pdHNPZk1lYXN1cmVtZW50OiBzdHJpbmcgPSAnY20nO1xyXG4gIHB1YmxpYyBtb2RlbE5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgbWF0aFBpOiBudW1iZXIgPSBNYXRoLlBJO1xyXG4gIHB1YmxpYyBzaG93UmVmZXJlbmNlTW9kZWw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBmbG9vclNpemVIZWlnaHQ6IG51bWJlciA9IDEwO1xyXG4gIHB1YmxpYyBmbG9vclNpemVXaWR0aDogbnVtYmVyID0gMTA7XHJcbiAgcHVibGljIGdyaWRTaXplOiBudW1iZXIgPSAxMDtcclxuICBwdWJsaWMgZ3JpZERpdmlzaW9uOiBudW1iZXIgPSAxMDtcclxuICBwdWJsaWMgZGlzdGFuY2VTdGVwOiBudW1iZXIgPSAxO1xyXG4gIHB1YmxpYyBmb250OiBGb250O1xyXG5cclxuICBwdWJsaWMgc3RhY2thYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGhlaWdodEFkanVzdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfbWVhc3VyZW1lbnRzOiBCb3hNZWFzdXJlbWVudFtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiB7IGZpbGU6IGFueSB9LFxyXG4gICAgcHVibGljIHNldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE1vZGVsUHJldmlld0NvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF90aGlyZFBhcnR5TW9kZWxTZXJ2aWNlOiBUaGlyZFBhcnR5TW9kZWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIF9hZGFwdGVyU2VydmljZTogSG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbGlnaHRQcmVzZXRzU2VydmljZTogTGlnaHRQcmVzZXRzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpY3Rpb25hcnlTZXJ2aWNlOiBIb21lZGVjb3JhdG9yRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mb250U2VydmljZTogRm9udFNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuZm9udCA9IHRoaXMuX2ZvbnRTZXJ2aWNlLmh1ZEZvbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFNjZW5lKCk7XHJcbiAgICB0aGlzLmxvYWRNb2RlbCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXRTY2VuZSgpOiB2b2lkIHtcclxuICAgIC8vIGluaXQgc2NlbmVcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3ID0gbmV3IFNjZW5lKCk7XHJcbiAgICAvLyBpbml0IHJlbmRlcmVyXHJcbiAgICBjb25zdCBjYW52UmVmZXJlbmNlOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXNDb250YWluZXInKTtcclxuICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQ6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjb250ZXh0OiBhbnkgPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoJ3dlYmdsMicsIHthbnRpYWxpYXM6IHRydWV9KTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3ID0gbmV3IFdlYkdMUmVuZGVyZXIoe1xyXG4gICAgICBjYW52YXM6IGNhbnZhc0VsZW1lbnQsXHJcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXHJcbiAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICBhbnRpYWxpYXM6IHRydWUsXHJcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSxcclxuICAgICAgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNldENsZWFyQ29sb3IoMHhmYWZhZmEpO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuYXV0b0NsZWFyID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy50b25lTWFwcGluZyA9IExpbmVhclRvbmVNYXBwaW5nO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2hhZG93TWFwLnR5cGUgPSBQQ0ZTb2Z0U2hhZG93TWFwO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcub3V0cHV0Q29sb3JTcGFjZSA9IExpbmVhclNSR0JDb2xvclNwYWNlO1xyXG4gICAgY2FudlJlZmVyZW5jZS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlcmVyUHJldmlldy5kb21FbGVtZW50KTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LmRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsICd0aHJlZWQnKTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNldFNpemUod2luZG93LmlubmVyV2lkdGggLyAyLCB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpbml0IGNhbWVyYVxyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKDQ1LCAxLCAwLjAxLCAxMDAwMDAwMDApO1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LnBvc2l0aW9uLnNldCgwLCAyLCAxMCk7XHJcbiAgICB0aGlzLmNhbWVyYVByZXZpZXcuYXNwZWN0ID0gd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmNhbWVyYVByZXZpZXcudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYVByZXZpZXcsIHRoaXMucmVuZGVyZXJQcmV2aWV3LmRvbUVsZW1lbnQpO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuXHJcbiAgICB0aGlzLmxvYWRGbG9vclBsYW5lKCk7XHJcbiAgICB0aGlzLmxvYWRSZWZlcmVuY2VNb2RlbCgpO1xyXG4gICAgdGhpcy5sb2FkTGlnaHRzKCk7XHJcblxyXG4gICAgY29uc3QgZ3JpZEhlbHBlcjogR3JpZEhlbHBlciA9IG5ldyBHcmlkSGVscGVyKHRoaXMuZ3JpZFNpemUsIHRoaXMuZ3JpZERpdmlzaW9uKTtcclxuICAgIGdyaWRIZWxwZXIubmFtZSA9ICdHcmlkSGVscGVyJztcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChncmlkSGVscGVyKTtcclxuXHJcbiAgICB0aGlzLl9hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEZsb29yUGxhbmUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5ID0gbmV3IFBsYW5lR2VvbWV0cnkodGhpcy5mbG9vclNpemVXaWR0aCwgdGhpcy5mbG9vclNpemVIZWlnaHQpO1xyXG4gICAgY29uc3QgcGxhbmVNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOiAweDg5OTQ5OSwgc2lkZTogVEhSRUUuRG91YmxlU2lkZX0pO1xyXG4gICAgY29uc3QgcGxhbmUgPSBuZXcgTWVzaChwbGFuZUdlb21ldHJ5LCBwbGFuZU1hdGVyaWFsKTtcclxuICAgIHBsYW5lLnJvdGF0aW9uLnggPSAtTWF0aC5QSSAvIDI7XHJcbiAgICBwbGFuZS5wb3NpdGlvbi55ID0gMDtcclxuICAgIHBsYW5lLm5hbWUgPSAnZmxvb3JfcGxhbmUnO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKHBsYW5lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkTGlnaHRzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGlzdE9mTGlnaHRQcmVzZXRzOiBMaWdodFByZXNldFtdID0gdGhpcy5fbGlnaHRQcmVzZXRzU2VydmljZS5sb2FkZWRMaWdodFByZXNldHM7XHJcbiAgICBjb25zdCBsaWdodFByZXNldDogTGlnaHRQcmVzZXQgPSB0aGlzLl9saWdodFByZXNldHNTZXJ2aWNlLmFjdGl2ZUxpZ2h0UHJlc2V0O1xyXG4gICAgZm9yIChjb25zdCBsaWdodFByb3BlcnRpZXMgb2YgbGlnaHRQcmVzZXQubGlnaHRzKSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxpZ2h0RnJvbVByb3BlcnRpZXMobGlnaHRQcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkUmVmZXJlbmNlTW9kZWwoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVmZXJlbmNlTW9kZWxQYXRoOiBzdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IHJlZmVyZW5jZU1vZGVsOiBzdHJpbmcgPSAncmVmZXJlbmNlX3BvcC5nbGInO1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnRocmVlREFzc2V0UGF0aCkge1xyXG4gICAgICByZWZlcmVuY2VNb2RlbFBhdGggPSB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy50aHJlZURBc3NldFBhdGggKyAnYXNzZXRzLyc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2FkZXI6IEdMVEZMb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG4gICAgbG9hZGVyLmxvYWQocmVmZXJlbmNlTW9kZWxQYXRoICsgcmVmZXJlbmNlTW9kZWwsIGFzeW5jIGdsdGYgPT4ge1xyXG4gICAgICBnbHRmLnNjZW5lLnBvc2l0aW9uLnNldCgzLCAwLCAzKTtcclxuICAgICAgZ2x0Zi5zY2VuZS5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuICAgICAgZ2x0Zi5zY2VuZS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgICAgZ2x0Zi5zY2VuZS5uYW1lID0gJ1JlZmVyZW5jZV9tb2RlbCc7XHJcbiAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChnbHRmLnNjZW5lKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRNb2RlbChpbnB1dDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsTmFtZSA9IHRoaXMuX3NldE1vZGVsTmFtZShpbnB1dC5maWxlLmZpbGUubmFtZSk7XHJcbiAgICBjb25zdCBmaWxlVHlwZSA9IGlucHV0LmZpbGUuZmlsZVR5cGUudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmIChmaWxlVHlwZSA9PT0gJ2dsYicgfHwgZmlsZVR5cGUgPT09ICdnbHRmJykge1xyXG4gICAgICB0aGlzLl9nbGJMb2FkZXIoaW5wdXQpO1xyXG4gICAgfSBlbHNlIGlmIChmaWxlVHlwZSA9PT0gJ2ZieCcpIHtcclxuICAgICAgdGhpcy5fZmJ4TG9hZGVyKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT09ICdvYmonKSB7XHJcbiAgICAgIHRoaXMuX29iakxvYWRlcihpbnB1dCk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbGVUeXBlID09PSAnM2RzJykge1xyXG4gICAgICB0aGlzLl90ZHNMb2FkZXIoaW5wdXQpO1xyXG4gICAgfSBlbHNlIGlmIChmaWxlVHlwZSA9PT0gJ3N0bCcpIHtcclxuICAgICAgdGhpcy5fc3RsTG9hZGVyKGlucHV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkSERSSShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG5ldyBSR0JFTG9hZGVyKCkuc2V0RGF0YVR5cGUoRmxvYXRUeXBlKS5sb2FkKHBhdGgsIChoZHJUZXh0dXJlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG1yZW1HZW5lcmF0b3I6IFBNUkVNR2VuZXJhdG9yID0gbmV3IFBNUkVNR2VuZXJhdG9yKHRoaXMucmVuZGVyZXJQcmV2aWV3KTtcclxuICAgICAgICBwbXJlbUdlbmVyYXRvci5jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCk7XHJcbiAgICAgICAgY29uc3QgaGRyQ3ViZVJlbmRlclRhcmdldCA9IHBtcmVtR2VuZXJhdG9yLmZyb21FcXVpcmVjdGFuZ3VsYXIoaGRyVGV4dHVyZSk7XHJcbiAgICAgICAgaGRyVGV4dHVyZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5zY2VuZVByZXZpZXcuZW52aXJvbm1lbnQgPSBoZHJDdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcbiAgICAgICAgLy8gdGhpcy5zY2VuZVByZXZpZXcuYmFja2dyb3VuZCA9IGhkckN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuICAgICAgICBwbXJlbUdlbmVyYXRvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LCB1bmRlZmluZWQsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBvcnRTY2VuZUFzR0xCKHJldHVyblR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gYWRkIHRpbWVzdGFtcFxyXG4gICAgY29uc3QgdGltZXN0YW1wOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGV4cG9ydEZpbGVOYW1lOiBzdHJpbmcgPSB0aGlzLl9zZXRNb2RlbE5hbWUodGhpcy5nbGJFeHBvcnROYW1lLm5hdGl2ZUVsZW1lbnQudmFsdWUpICsgJ18nICsgdGltZXN0YW1wO1xyXG4gICAgY29uc3QgZWxlbWVudHNUb1JlbW92ZTogc3RyaW5nW10gPSBbJ21vZGVsQm94aGVscGVyJywgJ1JlZmVyZW5jZV9tb2RlbCcsICdmbG9vcl9wbGFuZScsICdHcmlkSGVscGVyJywgJ0FtYmllbnQnLCAnRGlyZWN0aW9uYWwgZnJvbnQtbGVmdCcsICdzcG90IGJhY2sgKGFudGktc3VuKScsICdib3hIZWlnaHQnLCAnYm94V2lkdGgnLCAnYm94RGVwdGgnXTtcclxuICAgIGNvbnN0IGdsdGZFeHBvcnRlcjogR0xURkV4cG9ydGVyID0gbmV3IEdMVEZFeHBvcnRlcigpO1xyXG4gICAgbGV0IHNjZW5lOiBTY2VuZTtcclxuICAgIHNjZW5lID0gdGhpcy5zY2VuZVByZXZpZXcuY2xvbmUoKTtcclxuICAgIHNjZW5lLmNoaWxkcmVuLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICBzY2VuZS5yZW1vdmUoYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZWxlbWVudHNUb1JlbW92ZS5mb3JFYWNoKGVsZW1lbnROYW1lID0+IHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPYmplY3Q6IE9iamVjdDNEID0gc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgICAgc2NlbmUucmVtb3ZlKHNlbGVjdGVkT2JqZWN0KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgdHJzOiBmYWxzZSxcclxuICAgICAgb25seVZpc2libGU6IHRydWUsXHJcbiAgICAgIHRydW5jYXRlRHJhd1JhbmdlOiB0cnVlLFxyXG4gICAgICBiaW5hcnk6IHRydWUsXHJcbiAgICAgIG1heFRleHR1cmVTaXplOiBJbmZpbml0eVxyXG4gICAgfTtcclxuICAgIGdsdGZFeHBvcnRlci5wYXJzZShzY2VuZSwgKHJlc3VsdDogQXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgY29uc3QgZmlsZTogQmxvYiA9IG5ldyBCbG9iKFtyZXN1bHRdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9KTtcclxuICAgICAgaWYgKHJldHVyblR5cGUgPT09ICd1cGxvYWQnKSB7XHJcbiAgICAgICAgdGhpcy5fc2VuZE1vZGVsVG9DRE4oYCR7ZXhwb3J0RmlsZU5hbWV9LmdsYmAsIGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkTW9kZWwoYCR7ZXhwb3J0RmlsZU5hbWV9LmdsYmAsIGZpbGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSwgKGUpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9LCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY2FsZUFydGljbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dEhlaWdodCA9IHRoaXMuaGVpZ2h0QXJ0aWNsZS5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgbGV0IGhlaWdodEluTWV0ZXI6IG51bWJlcjtcclxuICAgIGlmICh0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCA9PT0gJ2NtJykge1xyXG4gICAgICBoZWlnaHRJbk1ldGVyID0gaW5wdXRIZWlnaHQgLyAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudW5pdHNPZk1lYXN1cmVtZW50ID09PSAnaW5jaGVzJykge1xyXG4gICAgICBoZWlnaHRJbk1ldGVyID0gKGlucHV0SGVpZ2h0ICogMi41NCkgLyAxMDA7XHJcbiAgICB9XHJcbiAgICAvLyBzY2FsZSA9IHRoaXMuYm91bmRpbmcgLyBoZWlnaHRJbk1ldGVyIGFuZCB1c2UgWSBhcyB1cC8gaGVpZ2h0XHJcbiAgICBjb25zdCBzY2FsZTogbnVtYmVyID0gdGhpcy5ib3VuZGluZ0JveFNpemUueSAvIGhlaWdodEluTWV0ZXI7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5nZXRPYmplY3RCeU5hbWUodGhpcy5tb2RlbE5hbWUpLnNjYWxlLnNldChcclxuICAgICAgdGhpcy5zY2VuZVByZXZpZXcuY2hpbGRyZW5bMF0uc2NhbGUueCAvIHNjYWxlLFxyXG4gICAgICB0aGlzLnNjZW5lUHJldmlldy5jaGlsZHJlblswXS5zY2FsZS55IC8gc2NhbGUsXHJcbiAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmNoaWxkcmVuWzBdLnNjYWxlLnogLyBzY2FsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm90YXRlTW9kZWwoYXhpczogc3RyaW5nLCBkZWdyZWVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKHRoaXMubW9kZWxOYW1lKTtcclxuICAgIGlmIChheGlzID09PSAneCcpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueCArPSBkZWdyZWVzO1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneScpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueSArPSBkZWdyZWVzO1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneicpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueiArPSBkZWdyZWVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZ2V0Qm91bmRpbmdCb3gobW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVNb2RlbChheGlzOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc2NlbmVQcmV2aWV3LmdldE9iamVjdEJ5TmFtZSh0aGlzLm1vZGVsTmFtZSk7XHJcbiAgICBpZiAoYXhpcyA9PT0gJ3gnKSB7XHJcbiAgICAgIG1vZGVsLnBvc2l0aW9uLnggKz0gYW1vdW50O1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneScpIHtcclxuICAgICAgbW9kZWwucG9zaXRpb24ueSArPSBhbW91bnQ7XHJcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd6Jykge1xyXG4gICAgICBtb2RlbC5wb3NpdGlvbi56ICs9IGFtb3VudDtcclxuICAgIH1cclxuICAgIHRoaXMuX2dldEJvdW5kaW5nQm94KG1vZGVsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRVbml0KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50ID0gZXZlbnQudmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2hvd1JlZmVyZW5jZU1vZGVsKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZWw6IE9iamVjdDNEID0gdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKCdSZWZlcmVuY2VfbW9kZWwnKTtcclxuICAgIG1vZGVsLnZpc2libGUgPSAhdGhpcy5zaG93UmVmZXJlbmNlTW9kZWw7XHJcbiAgICB0aGlzLnNob3dSZWZlcmVuY2VNb2RlbCA9ICF0aGlzLnNob3dSZWZlcmVuY2VNb2RlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTdGFja2FibGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGFja2FibGUgPSBldmVudC52YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRIZWlnaHRBZGp1c3RhYmxlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGVpZ2h0QWRqdXN0YWJsZSA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZSgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRBbmltYXRpb25Mb29wKCh0aW1lc3RhbXAsIGZyYW1lKSA9PiB0aGlzLl9yZW5kZXIodGltZXN0YW1wLCBmcmFtZSkpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbmRlcih0LCBmcmFtZSkge1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcucmVuZGVyKHRoaXMuc2NlbmVQcmV2aWV3LCB0aGlzLmNhbWVyYVByZXZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZG93bmxvYWRNb2RlbChmaWxlTmFtZTogc3RyaW5nLCBibG9iOiBCbG9iKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGVsZW1lbnQuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBlbGVtZW50LmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRNb2RlbFRvQ0ROKGZpbGVOYW1lOiBzdHJpbmcsIGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlQXNTdHJpbmc6IHN0cmluZyA9IEZpbGVVdGlscy5TdHJpcE1pbWVTdHJpbmdGcm9tRGF0YVVyaShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgdGhpcy5fYWRhcHRlclNlcnZpY2Uuc3RvcmUzRE1vZGVsQ0ROKGZpbGVOYW1lLCBmaWxlQXNTdHJpbmcpLnRoZW4oZmlsZVBhdGggPT4ge1xyXG4gICAgICAgIGlmIChmaWxlUGF0aCkge1xyXG4gICAgICAgICAgdGhpcy5fYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikudGhlbihmaWxlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaDogc3RyaW5nID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsVXJsOiBzdHJpbmcgPSBmaWxlUGF0aDsgLy8gU2V0IHVybCBmcm9tIHRoZSBDRE5cclxuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbkRhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZURhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhRGF0YTogTWV0YWRhdGEgPSB0aGlzLl90aGlyZFBhcnR5TW9kZWxTZXJ2aWNlLnNldE1ldGFkYXRhKGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLmNhbkVsZXZhdGUgPSB0aGlzLmhlaWdodEFkanVzdGFibGU7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLnRoaXJkUGFydHlNb2RlbCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIFdlIGFsc28gY2FuIHNldCB0aGUgbWV0YWRhdGEgaGVyZSBhbmQgcGFzIGl0IGFzIHRoZSBsYXN0IGFyZ3VtZW50IGZvciBwYXJzZU1vZGVsVG9HTEIuXHJcbiAgICAgICAgICAgIHRoaXMuX3RoaXJkUGFydHlNb2RlbFNlcnZpY2UucGFyc2VNb2RlbFRvR0xCKGZpbGUsIGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSwgcHJpY2VEYXRhLCBtZXRhRGF0YSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RpYWxvZy5jbG9zZUFsbCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1vZGVsTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVtb3ZlRXh0ZW5zaW9uOiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoJy5nbGInLCAnJyk7IC8vIHJlbW92ZSAuZ2xiIGFzIGZpbGUgZXh0ZW5zaW9uXHJcbiAgICByZXR1cm4gcmVtb3ZlRXh0ZW5zaW9uLnJlcGxhY2UoJy4nLCAnLScpOyAvLyByZXBsYWNlIGFsbCBkb3RzIGZvciBwZXJpb2RzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nbGJMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcclxuICAgIGxvYWRlci5wYXJzZShpbnB1dC5maWxlLmZpbGVDb250ZW50cywgJycsXHJcbiAgICAgIGFzeW5jIG9iamVjdCA9PiB7XHJcbiAgICAgICAgdGhpcy5fcHJlcE1vZGVsRm9yU2NlbmUob2JqZWN0LnNjZW5lKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQYXJzaW5nIGVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9mYnhMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmJ4TG9hZGVyOiBGQlhMb2FkZXIgPSBuZXcgRkJYTG9hZGVyKCk7XHJcbiAgICBjb25zdCBvYmplY3QgPSBmYnhMb2FkZXIucGFyc2UoaW5wdXQuZmlsZS5maWxlQ29udGVudHMsICcnKTtcclxuICAgIHRoaXMuX3ByZXBNb2RlbEZvclNjZW5lKG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vYmpMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqTG9hZGVyOiBPQkpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAvLyBmb3Igb2piIGZpbGVzOiBjb252ZXJ0IHRoZSBBcnJheUJ1ZmZlciB0byBhIHN0cmluZ1xyXG4gICAgY29uc3QgYnVmID0gaW5wdXQuZmlsZS5maWxlQ29udGVudHM7XHJcbiAgICBjb25zdCBkZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShidWYpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqTG9hZGVyLnBhcnNlKHN0cik7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGRzTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRkc0xvYWRlcjogVERTTG9hZGVyID0gbmV3IFREU0xvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGRzTG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzLCAnJyk7XHJcbiAgICBvYmplY3QudHJhdmVyc2UoZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3RsTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0bExvYWRlcjogU1RMTG9hZGVyID0gbmV3IFNUTExvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gc3RsTG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzKTtcclxuICAgIHRoaXMuX2FkZEZyb21HZW9tZXRyeShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkRnJvbUdlb21ldHJ5KGdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBNZXNoUGhvbmdNYXRlcmlhbCh7dHJhbnNwYXJlbnQ6IHRydWUsIG9wYWNpdHk6IGdlb21ldHJ5LmFscGhhfSk7XHJcbiAgICBjb25zdCBtb2RlbCA9IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3Q6IGFueSk6IHZvaWQge1xyXG4gICAgb2JqZWN0Lm5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcclxuICAgIG9iamVjdC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBvYmplY3Quc2NhbGUuc2V0KDEsIDEsIDEpO1xyXG4gICAgLy8gUmVtb3ZlIGxpZ2h0cyBmcm9tIHRoZSBjaGlsZHJlblxyXG4gICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICBvYmplY3QucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChvYmplY3QpO1xyXG4gICAgdGhpcy5sb2FkZWRNb2RlbCA9IG9iamVjdDtcclxuICAgIHRoaXMuX2dldEJvdW5kaW5nQm94KG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRCb3VuZGluZ0JveChvYmplY3QpIHtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IEJveDMoKS5zZXRGcm9tT2JqZWN0KG9iamVjdCk7XHJcbiAgICB0aGlzLmJvdW5kaW5nQm94U2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUobmV3IFZlY3RvcjMoKSk7XHJcblxyXG4gICAgdGhpcy5fc2V0TWVhc3VyZW1lbnRzKHRoaXMuYm91bmRpbmdCb3hTaXplKTtcclxuICAgIHRoaXMuX3Nob3dNZWFzdXJlbWVudHMoKTtcclxuXHJcbiAgICBjb25zdCBib3hIZWxwZXIgPSBuZXcgQm94SGVscGVyKG9iamVjdCk7XHJcbiAgICBib3hIZWxwZXIubWF0ZXJpYWwuY29sb3Iuc2V0KDB4RkYwMEZGKTtcclxuICAgIGJveEhlbHBlci5uYW1lID0gJ21vZGVsQm94aGVscGVyJztcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChib3hIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvd01lYXN1cmVtZW50cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lYXN1cmVtZW50c01lc2hlcyA9IHRoaXMuX21lYXN1cmVtZW50cy5tYXAodmFsdWUgPT4gdmFsdWUudGV4dE1lc2gpO1xyXG4gICAgbWVhc3VyZW1lbnRzTWVzaGVzLmZvckVhY2gob2JqZWN0ID0+IHRoaXMuc2NlbmVQcmV2aWV3LmFkZChvYmplY3QpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1lYXN1cmVtZW50cyhib3VuZGluZ0JveDogVmVjdG9yMykge1xyXG4gICAgY29uc3Qgc2V0SGVpZ2h0OiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZUhlaWdodE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnkpO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0SGVpZ2h0KTtcclxuICAgIGNvbnN0IHNldFdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZVdpZHRoTWVhc3VyZW1lbnQoYm91bmRpbmdCb3gueCk7XHJcbiAgICB0aGlzLl9tZWFzdXJlbWVudHMucHVzaChzZXRXaWR0aCk7XHJcbiAgICBjb25zdCBzZXREZXB0aDogQm94TWVhc3VyZW1lbnQgPSB0aGlzLl9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnopO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0RGVwdGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlSGVpZ2h0TWVhc3VyZW1lbnQoaGVpZ2h0SW5wdXQpOiBCb3hNZWFzdXJlbWVudCB7XHJcbiAgICBjb25zdCBoZWlnaHQ6IEJveE1lYXN1cmVtZW50ID0gbmV3IEJveE1lYXN1cmVtZW50KCk7XHJcbiAgICBjb25zdCBoZWlnaHRTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGhlaWdodElucHV0LCB0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCwgdGhpcy5kaXN0YW5jZVN0ZXApO1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldCgnTEFCRUxfSEVJR0hUJyk7XHJcbiAgICBoZWlnaHQudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goaGVpZ2h0U3RyaW5nLCB0aGlzLmZvbnQsIDB4RkYwMEZGLCAwLjA4LCBmYWxzZSwgZmFsc2UsIHRleHQpO1xyXG4gICAgaGVpZ2h0LnBvc2l0aW9ucyA9IHRoaXMuX2NhbGN1bGF0ZUhlaWdodFBvc2l0aW9ucygpO1xyXG4gICAgaGVpZ2h0LnRleHRNZXNoLm5hbWUgPSAnYm94SGVpZ2h0JztcclxuICAgIHJldHVybiBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVXaWR0aE1lYXN1cmVtZW50KHdpZHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IHdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3Qgd2lkdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KHdpZHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9XSURUSCcpO1xyXG4gICAgd2lkdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2god2lkdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB3aWR0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVXaWR0aFBvc2l0aW9ucygpO1xyXG4gICAgd2lkdGgudGV4dE1lc2gubmFtZSA9ICdib3hXaWR0aCc7XHJcbiAgICByZXR1cm4gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGRlcHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IGRlcHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3QgZGVwdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGRlcHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9ERVBUSCcpO1xyXG4gICAgZGVwdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goZGVwdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICBkZXB0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpO1xyXG4gICAgZGVwdGgudGV4dE1lc2gubmFtZSA9ICdib3hEZXB0aCc7XHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVIZWlnaHRQb3NpdGlvbnMoKTogVEhSRUUuVmVjdG9yM1tdIHtcclxuICAgIHJldHVybiBwb3NpdGlvbmluZ0ZhY3RvcnMubWFwKChbaiwga10pID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHhEaXJlY3Rpb24sIGogLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHpEaXJlY3Rpb24sIGsgLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVdpZHRoUG9zaXRpb25zKCk6IFRIUkVFLlZlY3RvcjNbXSB7XHJcbiAgICByZXR1cm4gcG9zaXRpb25pbmdGYWN0b3JzLm1hcCgoW2osIGtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMygpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih5RGlyZWN0aW9uLCBqIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnkpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih6RGlyZWN0aW9uLCBrIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnopO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpOiBUSFJFRS5WZWN0b3IzW10ge1xyXG4gICAgcmV0dXJuIHBvc2l0aW9uaW5nRmFjdG9ycy5tYXAoKFtqLCBrXSkgPT4ge1xyXG4gICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoKVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeURpcmVjdGlvbiwgaiAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS55KVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeERpcmVjdGlvbiwgayAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS54KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2Jsb2JUb0FycmF5QnVmZmVyKGJsb2I6IEJsb2IpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFcnJvciByZWFkaW5nIGJsb2IgYXMgQXJyYXlCdWZmZXInKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gcmVhZCBibG9iIGFzIEFycmF5QnVmZmVyJykpO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUxpZ2h0RnJvbVByb3BlcnRpZXMobGlnaHRQcm9wZXJ0aWVzOiBMaWdodFByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IGxpZ2h0VHlwZTogTGlnaHRFbnVtID0gbGlnaHRQcm9wZXJ0aWVzLnR5cGU7XHJcbiAgICBjb25zdCBnZXRMaWdodHM6IExpZ2h0Q3JlYXRlU2VydmljZSA9IG5ldyBMaWdodENyZWF0ZVNlcnZpY2UoKTtcclxuICAgIGNvbnN0IGxpZ2h0OiBMaWdodCA9IGdldExpZ2h0cy5jcmVhdGVOZXdMaWdodChsaWdodFR5cGUpO1xyXG4gICAgbGlnaHQudXNlckRhdGEud2FsbE9mZnNldCA9IGxpZ2h0UHJvcGVydGllcy53YWxsT2Zmc2V0O1xyXG4gICAgbGlnaHQudXNlckRhdGEucm90YXRpb25PZmZzZXQgPSBsaWdodFByb3BlcnRpZXMucm90YXRpb25PZmZzZXQ7XHJcbiAgICBsaWdodC51c2VyRGF0YS50b3BEb3duRGlyZWN0aW9uYWwgPSBsaWdodFByb3BlcnRpZXMudG9wRG93bkRpcmVjdGlvbmFsO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsaWdodFByb3BlcnRpZXMpIHtcclxuICAgICAgaWYgKCFsaWdodC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdwb3NpdGlvbicpIHtcclxuICAgICAgICBsaWdodC5wb3NpdGlvbi55ID0gbGlnaHRQcm9wZXJ0aWVzLnBvc2l0aW9uLnk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICdjb2xvcicpIHtcclxuICAgICAgICBsaWdodC5jb2xvciA9IG5ldyBDb2xvcihsaWdodFByb3BlcnRpZXMuY29sb3IpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnZ3JvdW5kQ29sb3InKSB7XHJcbiAgICAgICAgKGxpZ2h0IGFzIGFueSkuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IobGlnaHRQcm9wZXJ0aWVzLmdyb3VuZENvbG9yKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZXRPYmplY3RQcm9wZXJ0aWVzKGxpZ2h0LCBwcm9wZXJ0eSwgbGlnaHRQcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChsaWdodCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRPYmplY3RQcm9wZXJ0aWVzKG9iamVjdDogTGlnaHQgfCBMaWdodFByb3BlcnRpZXMsIHByb3BlcnR5OiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3NoYWRvdycpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3RbcHJvcGVydHldLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqZWN0W3Byb3BlcnR5XVtwcm9wXSA9IHZhbHVlW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3RbcHJvcGVydHldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
845
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL21vZGVsLXVwbG9hZGVyL21vZGVsLXByZXZpZXdlci9tb2RlbC1wcmV2aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBQyxlQUFlLEVBQTBCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEYsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLElBQUksRUFDSixpQkFBaUIsRUFDakIsaUJBQWlCLEVBRWpCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGNBQWMsRUFDZCxLQUFLLEVBQ0wsT0FBTyxFQUNQLGFBQWEsRUFDZCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDakUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUcvRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1B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Q0FBQyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNILENBQUM7O21IQTlnQlUscUJBQXFCLGtCQTRCdEIsZUFBZTt1R0E1QmQscUJBQXFCLG9RQTNKdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0pUOzRGQUdVLHFCQUFxQjtrQkE3SmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdKVDtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztpQkFDOUM7OzBCQTZCSSxNQUFNOzJCQUFDLGVBQWU7dVpBM0JLLGFBQWE7c0JBQTFDLFNBQVM7dUJBQUMsVUFBVTtnQkFDYyxhQUFhO3NCQUEvQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1xyXG4gIEJveDMsXHJcbiAgQm94SGVscGVyLFxyXG4gIENvbG9yLFxyXG4gIEdyaWRIZWxwZXIsXHJcbiAgTGlnaHQsXHJcbiAgTGluZWFyU1JHQkNvbG9yU3BhY2UsXHJcbiAgTWVzaCxcclxuICBNZXNoQmFzaWNNYXRlcmlhbCxcclxuICBNZXNoUGhvbmdNYXRlcmlhbCxcclxuICBPYmplY3QzRCxcclxuICBQQ0ZTb2Z0U2hhZG93TWFwLFxyXG4gIFBlcnNwZWN0aXZlQ2FtZXJhLFxyXG4gIFBsYW5lR2VvbWV0cnksXHJcbiAgUE1SRU1HZW5lcmF0b3IsXHJcbiAgU2NlbmUsXHJcbiAgVmVjdG9yMyxcclxuICBXZWJHTFJlbmRlcmVyXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0Zsb2F0VHlwZSwgTGluZWFyVG9uZU1hcHBpbmd9IGZyb20gJ3RocmVlL3NyYy9jb25zdGFudHMnO1xyXG5pbXBvcnQge0dMVEZMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xyXG5pbXBvcnQge1JHQkVMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL1JHQkVMb2FkZXInO1xyXG5pbXBvcnQge09yYml0Q29udHJvbHN9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcclxuaW1wb3J0IHtHTFRGRXhwb3J0ZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvR0xURkV4cG9ydGVyJztcclxuaW1wb3J0IHtGQlhMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0ZCWExvYWRlcic7XHJcbmltcG9ydCB7T0JKTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9PQkpMb2FkZXInO1xyXG5pbXBvcnQge1RoaXJkUGFydHlNb2RlbFNlcnZpY2V9IGZyb20gJy4uLy4uL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3NlcnZpY2UvdGhpcmQtcGFydHktbW9kZWwuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtURFNMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL1REU0xvYWRlcic7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtMaWdodFByZXNldHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9saWdodC1wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xpZ2h0UHJvcGVydGllc30gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9saWdodC1wcm9wZXJ0aWVzJztcclxuaW1wb3J0IHtMaWdodEVudW19IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9saWdodC5lbnVtJztcclxuaW1wb3J0IHtMaWdodENyZWF0ZVNlcnZpY2V9IGZyb20gJy4uLy4uL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3NlcnZpY2UvbGlnaHQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7TGlnaHRQcmVzZXR9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvbGlnaHQtcHJlc2V0JztcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvZmlsZS51dGlscyc7XHJcbmltcG9ydCB7U1RMTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9TVExMb2FkZXInO1xyXG5pbXBvcnQge0JveE1lYXN1cmVtZW50fSBmcm9tICcuLi8uLi9jb3JlM2QvaHVkL2JvdW5kaW5nLW1lYXN1cmVtZW50LWJveC9ib3gtbWVhc3VyZW1lbnQnO1xyXG5pbXBvcnQge1xyXG4gIE1lYXN1cmVtZW50VXRpbHMsXHJcbiAgcG9zaXRpb25pbmdGYWN0b3JzLFxyXG4gIHhEaXJlY3Rpb24sXHJcbiAgeURpcmVjdGlvbixcclxuICB6RGlyZWN0aW9uXHJcbn0gZnJvbSAnLi4vLi4vY29yZTNkL2h1ZC9ib3VuZGluZy1tZWFzdXJlbWVudC1ib3gvbWVhc3VyZW1lbnQtdXRpbHMnO1xyXG5pbXBvcnQge21ha2VUZXh0TWVzaH0gZnJvbSAnLi4vLi4vY29yZTNkL2h1ZC91dGlscyc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQge0ZvbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9mb250LnNlcnZpY2UnO1xyXG5pbXBvcnQge0ZvbnR9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0ZvbnRMb2FkZXInO1xyXG5pbXBvcnQge01ldGFkYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvbWV0YWRhdGEnO1xyXG5pbXBvcnQge0ljb25FbnVtfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi5lbnVtJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9ySWNvbkNhY2hlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItaWNvbi1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb0RvbWFpblZhbHVlfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9tb2RlbC9jby1kb21haW4tdmFsdWUuYm8nO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnAtbW9kZWwtcHJldmlldycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1jbG9zZS1wcmV2aWV3XCIgKGNsaWNrKT1cImNsb3NlUHJldmlldygpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlld1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy13aW5kb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1jb250YWluZXJcIiBpZD1cImNhbnZhc0NvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LXdpbmRvdy1ib3R0b21cIj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2hvd1JlZmVyZW5jZU1vZGVsXCJcclxuICAgICAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCInYWZ0ZXInXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNob3dSZWZlcmVuY2VNb2RlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgU2hvdyBSZWZlcmVuY2UgbW9kZWxcclxuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImRpc2NsYWltZXItdGV4dFwiPlxyXG4gICAgICAgICAgICAgIEdyaWQgc2NhbGU6IDEgdGlsZSA9IDF4MSBtZXRlclxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtaGVpZ2h0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGgyPk1vZGVsIHNldHRpbmdzPC9oMj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoMz5TY2FsZTo8L2gzPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlaWdodEFydGljbGVcIiAjaGVpZ2h0QXJ0aWNsZSBwbGFjZWhvbGRlcj1cIlNldCBtb2RlbCBoZWlnaHRcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidW5pdHMtc2VsZWN0LWZvcm1cIj5cclxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cInVuaXRzLW1hdC1zZWxlY3RcIiBbKHZhbHVlKV09XCJ1bml0c09mTWVhc3VyZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwidW5pdHMtbWF0LW9wdGlvblwiICpuZ0Zvcj1cImxldCB1bml0IG9mIHVuaXRzXCIgW3ZhbHVlXT1cInVuaXRcIj57eyB1bml0IH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFwcGx5LWJ1dHRvbiBiYXNlLWJ1dHRvblwiIChjbGljayk9XCJzY2FsZUFydGljbGUoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm90YXRpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGgzPlJvdGF0aW9uOjwvaDM+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8cD5Sb3RhdGUgb24gWCBheGlzICg5MCBkZWdyZWVzKTwvcD5cclxuICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3gnLCAtbWF0aFBpIC8gMilcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGFzaC1idXR0b25cIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJvdGF0ZU1vZGVsKCd4JywgbWF0aFBpIC8gMilcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkLWJ1dHRvblwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPHA+Um90YXRlIG9uIFkgYXhpcyAoOTAgZGVncmVlcyk8L3A+XHJcbiAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJvdGF0ZU1vZGVsKCd5JywgLW1hdGhQaSAvIDIpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRhc2gtYnV0dG9uXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneScsIG1hdGhQaSAvIDIpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImFkZC1idXR0b25cIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxwPlJvdGF0ZSBvbiBaIGF4aXMgKDkwIGRlZ3JlZXMpPC9wPlxyXG4gICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneicsIC1tYXRoUGkgLyAyKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkYXNoLWJ1dHRvblwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3onLCBtYXRoUGkgLyAyKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGQtYnV0dG9uXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxoMz5Qb3NpdGlvbjo8L2gzPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPHA+UmVzZXQgdG8gY29vcmRpbmF0ZXMgMCwwLDA8L3A+XHJcbiAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tYXMtbGlua1wiIChjbGljayk9XCJtb3ZlTW9kZWwoJ2FsbCcsIDApXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cInJldHJ5LWJ1dHRvblwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICBSZXNldFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxwPk1vdmUgb24gdGhlIFkgYXhpcyAoMC4wMSB1bml0KTwvcD5cclxuICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW92ZU1vZGVsKCd5JywgLTAuMDEpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRhc2gtYnV0dG9uXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb3ZlTW9kZWwoJ3knLCAgMC4wMSlcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkLWJ1dHRvblwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGgzPlByb3BlcnRpZXM6PC9oMz5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFN0YWNrYWJsZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgU3RhY2thYmxlXHJcbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0SGVpZ2h0QWRqdXN0YWJsZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgSGVpZ2h0IGFkanVzdGFibGVcclxuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXBsYWNlbWVudC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8bGFiZWw+UGxhY2VtZW50PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicGxhY2VtZW50T3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2VsZWN0ZWRQbGFjZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBsYWNlbWVudE9wdGlvbiBvZiBwbGFjZW1lbnRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBsYWNlbWVudE9wdGlvbi5jb2RlXCI+e3sgcGxhY2VtZW50T3B0aW9uLmRlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvXCIgKm5nSWY9XCJ0aGlzLmRhdGFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tbGVmdFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5TYXZlIGFzOjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJmaWxlTmFtZVwiICNmaWxlTmFtZSB2YWx1ZT1cInt7IHRoaXMuZGF0YS5maWxlLmZpbGUubmFtZSB9fVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhc2UtYnV0dG9uIGV4cG9ydEJ1dHRvblwiIChjbGljayk9XCJleHBvcnRTY2VuZUFzR0xCKCd1cGxvYWQnKVwiPlVwbG9hZCBhbmQgYWRkIHRvIHNjZW5lPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYXNlLWJ1dHRvbiBleHBvcnRCdXR0b25EYXJrXCIgKGNsaWNrKT1cImV4cG9ydFNjZW5lQXNHTEIoJ2Rvd25sb2FkJylcIj5Eb3dubG9hZDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VQcmV2aWV3KClcIiBjbGFzcz1cImJhc2UtYnV0dG9uIGV4cG9ydEJ1dHRvbkRhcmtcIj5cclxuPCEtLSAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNhbmNlbDwvbWF0LWljb24+LS0+XHJcbiAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtcHJldmlldy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNb2RlbFByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZU5hbWUnKSBwdWJsaWMgZ2xiRXhwb3J0TmFtZTogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdoZWlnaHRBcnRpY2xlJykgcHVibGljIGhlaWdodEFydGljbGU6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHB1YmxpYyBzY2VuZVByZXZpZXc6IFRIUkVFLlNjZW5lO1xyXG4gIHB1YmxpYyBjYW1lcmFQcmV2aWV3OiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcclxuICBwdWJsaWMgcmVuZGVyZXJQcmV2aWV3OiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHB1YmxpYyBjb250cm9sczogT3JiaXRDb250cm9scztcclxuICBwdWJsaWMgYm91bmRpbmdCb3hTaXplOiBWZWN0b3IzO1xyXG4gIHB1YmxpYyBsb2FkZWRNb2RlbDogYW55O1xyXG4gIHB1YmxpYyB1bml0c09mTWVhc3VyZW1lbnQ6IHN0cmluZyA9ICdjbSc7XHJcbiAgcHVibGljIHVuaXRzOiBzdHJpbmdbXSA9IFsnY20nLCAnaW5jaGVzJ107XHJcbiAgcHVibGljIG1vZGVsTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBtYXRoUGk6IG51bWJlciA9IE1hdGguUEk7XHJcbiAgcHVibGljIHNob3dSZWZlcmVuY2VNb2RlbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGZsb29yU2l6ZUhlaWdodDogbnVtYmVyID0gMTA7XHJcbiAgcHVibGljIGZsb29yU2l6ZVdpZHRoOiBudW1iZXIgPSAxMDtcclxuICBwdWJsaWMgZ3JpZFNpemU6IG51bWJlciA9IDEwO1xyXG4gIHB1YmxpYyBncmlkRGl2aXNpb246IG51bWJlciA9IDEwO1xyXG4gIHB1YmxpYyBkaXN0YW5jZVN0ZXA6IG51bWJlciA9IDE7XHJcbiAgcHVibGljIGZvbnQ6IEZvbnQ7XHJcbiAgcHVibGljIHN0YWNrYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoZWlnaHRBZGp1c3RhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHBsYWNlbWVudE9wdGlvbnM6IENvRG9tYWluVmFsdWVbXTtcclxuICBwdWJsaWMgc2VsZWN0ZWRQbGFjZW1lbnQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbWVhc3VyZW1lbnRzOiBCb3hNZWFzdXJlbWVudFtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiB7IGZpbGU6IGFueSB9LFxyXG4gICAgcHVibGljIHNldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHB1YmxpYyBpY29uQ2FjaGU6IEhvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8TW9kZWxQcmV2aWV3Q29tcG9uZW50PixcclxuICAgIHByaXZhdGUgX3RoaXJkUGFydHlNb2RlbFNlcnZpY2U6IFRoaXJkUGFydHlNb2RlbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX2FkYXB0ZXJTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9saWdodFByZXNldHNTZXJ2aWNlOiBMaWdodFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGljdGlvbmFyeVNlcnZpY2U6IEhvbWVkZWNvcmF0b3JEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgIHByaXZhdGUgX2ZvbnRTZXJ2aWNlOiBGb250U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuZm9udCA9IHRoaXMuX2ZvbnRTZXJ2aWNlLmh1ZEZvbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFNjZW5lKCk7XHJcbiAgICB0aGlzLmxvYWRNb2RlbCh0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy5fYWRhcHRlclNlcnZpY2UuZ2V0TW9kZWxQbGFjZW1lbnRPcHRpb25zKCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICB0aGlzLnBsYWNlbWVudE9wdGlvbnMgPSByZXN1bHQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0U2NlbmUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2aWV3U2NhbGU6IG51bWJlciA9IDEuMztcclxuXHJcbiAgICAvLyBpbml0IHNjZW5lXHJcbiAgICB0aGlzLnNjZW5lUHJldmlldyA9IG5ldyBTY2VuZSgpO1xyXG4gICAgLy8gaW5pdCByZW5kZXJlclxyXG4gICAgY29uc3QgY2FudlJlZmVyZW5jZTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzQ29udGFpbmVyJyk7XHJcbiAgICBjb25zdCBjYW52YXNFbGVtZW50OiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY29uc3QgY29udGV4dDogYW55ID0gY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KCd3ZWJnbDInLCB7YW50aWFsaWFzOiB0cnVlfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldyA9IG5ldyBXZWJHTFJlbmRlcmVyKHtcclxuICAgICAgY2FudmFzOiBjYW52YXNFbGVtZW50LFxyXG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgYW50aWFsaWFzOiB0cnVlLFxyXG4gICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXHJcbiAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWVcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRDbGVhckNvbG9yKDB4ZmFmYWZhKTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LmF1dG9DbGVhciA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNoYWRvd01hcC5lbmFibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNoYWRvd01hcC50eXBlID0gUENGU29mdFNoYWRvd01hcDtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3Lm91dHB1dENvbG9yU3BhY2UgPSBMaW5lYXJTUkdCQ29sb3JTcGFjZTtcclxuICAgIGNhbnZSZWZlcmVuY2UuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlclByZXZpZXcuZG9tRWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5kb21FbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCAndGhyZWVkJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRTaXplKHdpbmRvdy5pbm5lckhlaWdodCAvIHZpZXdTY2FsZSwgd2luZG93LmlubmVySGVpZ2h0IC8gdmlld1NjYWxlLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpbml0IGNhbWVyYVxyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKDQ1LCAxLCAwLjAxLCAxMDAwMDAwMDApO1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LnBvc2l0aW9uLnNldCgwLCAyLCAxMCk7XHJcbiAgICB0aGlzLmNhbWVyYVByZXZpZXcuYXNwZWN0ID0gKHdpbmRvdy5pbm5lckhlaWdodCAvIHZpZXdTY2FsZSkgLyAod2luZG93LmlubmVySGVpZ2h0IC8gdmlld1NjYWxlKTtcclxuICAgIHRoaXMuY2FtZXJhUHJldmlldy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBPcmJpdENvbnRyb2xzKHRoaXMuY2FtZXJhUHJldmlldywgdGhpcy5yZW5kZXJlclByZXZpZXcuZG9tRWxlbWVudCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xyXG5cclxuICAgIHRoaXMubG9hZEZsb29yUGxhbmUoKTtcclxuICAgIHRoaXMubG9hZFJlZmVyZW5jZU1vZGVsKCk7XHJcbiAgICB0aGlzLmxvYWRMaWdodHMoKTtcclxuXHJcbiAgICBjb25zdCBncmlkSGVscGVyOiBHcmlkSGVscGVyID0gbmV3IEdyaWRIZWxwZXIodGhpcy5ncmlkU2l6ZSwgdGhpcy5ncmlkRGl2aXNpb24pO1xyXG4gICAgZ3JpZEhlbHBlci5uYW1lID0gJ0dyaWRIZWxwZXInO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKGdyaWRIZWxwZXIpO1xyXG5cclxuICAgIHRoaXMuX2FuaW1hdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkRmxvb3JQbGFuZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSh0aGlzLmZsb29yU2l6ZVdpZHRoLCB0aGlzLmZsb29yU2l6ZUhlaWdodCk7XHJcbiAgICBjb25zdCBwbGFuZU1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6IDB4ODk5NDk5LCBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlfSk7XHJcbiAgICBjb25zdCBwbGFuZSA9IG5ldyBNZXNoKHBsYW5lR2VvbWV0cnksIHBsYW5lTWF0ZXJpYWwpO1xyXG4gICAgcGxhbmUucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjtcclxuICAgIHBsYW5lLnBvc2l0aW9uLnkgPSAwO1xyXG4gICAgcGxhbmUubmFtZSA9ICdmbG9vcl9wbGFuZSc7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQocGxhbmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRMaWdodHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsaXN0T2ZMaWdodFByZXNldHM6IExpZ2h0UHJlc2V0W10gPSB0aGlzLl9saWdodFByZXNldHNTZXJ2aWNlLmxvYWRlZExpZ2h0UHJlc2V0cztcclxuICAgIGNvbnN0IGxpZ2h0UHJlc2V0OiBMaWdodFByZXNldCA9IHRoaXMuX2xpZ2h0UHJlc2V0c1NlcnZpY2UuYWN0aXZlTGlnaHRQcmVzZXQ7XHJcbiAgICBmb3IgKGNvbnN0IGxpZ2h0UHJvcGVydGllcyBvZiBsaWdodFByZXNldC5saWdodHMpIHtcclxuICAgICAgdGhpcy5fY3JlYXRlTGlnaHRGcm9tUHJvcGVydGllcyhsaWdodFByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRSZWZlcmVuY2VNb2RlbCgpOiB2b2lkIHtcclxuICAgIGxldCByZWZlcmVuY2VNb2RlbFBhdGg6IHN0cmluZyA9ICcnO1xyXG4gICAgY29uc3QgcmVmZXJlbmNlTW9kZWw6IHN0cmluZyA9ICdyZWZlcmVuY2VfcG9wLmdsYic7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MudGhyZWVEQXNzZXRQYXRoKSB7XHJcbiAgICAgIHJlZmVyZW5jZU1vZGVsUGF0aCA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnRocmVlREFzc2V0UGF0aCArICdhc3NldHMvJztcclxuICAgIH1cclxuICAgIGNvbnN0IGxvYWRlcjogR0xURkxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICBsb2FkZXIubG9hZChyZWZlcmVuY2VNb2RlbFBhdGggKyByZWZlcmVuY2VNb2RlbCwgYXN5bmMgZ2x0ZiA9PiB7XHJcbiAgICAgIGdsdGYuc2NlbmUucG9zaXRpb24uc2V0KDMsIDAsIDMpO1xyXG4gICAgICBnbHRmLnNjZW5lLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgICBnbHRmLnNjZW5lLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgICBnbHRmLnNjZW5lLm5hbWUgPSAnUmVmZXJlbmNlX21vZGVsJztcclxuICAgICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKGdsdGYuc2NlbmUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZE1vZGVsKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5fc2V0TW9kZWxOYW1lKGlucHV0LmZpbGUuZmlsZS5uYW1lKTtcclxuICAgIGNvbnN0IGZpbGVUeXBlID0gaW5wdXQuZmlsZS5maWxlVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGZpbGVUeXBlID09PSAnZ2xiJyB8fCBmaWxlVHlwZSA9PT0gJ2dsdGYnKSB7XHJcbiAgICAgIHRoaXMuX2dsYkxvYWRlcihpbnB1dCk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbGVUeXBlID09PSAnZmJ4Jykge1xyXG4gICAgICB0aGlzLl9mYnhMb2FkZXIoaW5wdXQpO1xyXG4gICAgfSBlbHNlIGlmIChmaWxlVHlwZSA9PT0gJ29iaicpIHtcclxuICAgICAgdGhpcy5fb2JqTG9hZGVyKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT09ICczZHMnKSB7XHJcbiAgICAgIHRoaXMuX3Rkc0xvYWRlcihpbnB1dCk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbGVUeXBlID09PSAnc3RsJykge1xyXG4gICAgICB0aGlzLl9zdGxMb2FkZXIoaW5wdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRIRFJJKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbmV3IFJHQkVMb2FkZXIoKS5zZXREYXRhVHlwZShGbG9hdFR5cGUpLmxvYWQocGF0aCwgKGhkclRleHR1cmUpID0+IHtcclxuICAgICAgICBjb25zdCBwbXJlbUdlbmVyYXRvcjogUE1SRU1HZW5lcmF0b3IgPSBuZXcgUE1SRU1HZW5lcmF0b3IodGhpcy5yZW5kZXJlclByZXZpZXcpO1xyXG4gICAgICAgIHBtcmVtR2VuZXJhdG9yLmNvbXBpbGVFcXVpcmVjdGFuZ3VsYXJTaGFkZXIoKTtcclxuICAgICAgICBjb25zdCBoZHJDdWJlUmVuZGVyVGFyZ2V0ID0gcG1yZW1HZW5lcmF0b3IuZnJvbUVxdWlyZWN0YW5ndWxhcihoZHJUZXh0dXJlKTtcclxuICAgICAgICBoZHJUZXh0dXJlLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLnNjZW5lUHJldmlldy5lbnZpcm9ubWVudCA9IGhkckN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuICAgICAgICAvLyB0aGlzLnNjZW5lUHJldmlldy5iYWNrZ3JvdW5kID0gaGRyQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG4gICAgICAgIHBtcmVtR2VuZXJhdG9yLmRpc3Bvc2UoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgcmVqZWN0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cG9ydFNjZW5lQXNHTEIocmV0dXJuVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBhZGQgdGltZXN0YW1wXHJcbiAgICBjb25zdCB0aW1lc3RhbXA6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgZXhwb3J0RmlsZU5hbWU6IHN0cmluZyA9IHRoaXMuX3NldE1vZGVsTmFtZSh0aGlzLmdsYkV4cG9ydE5hbWUubmF0aXZlRWxlbWVudC52YWx1ZSkgKyAnXycgKyB0aW1lc3RhbXA7XHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFsnbW9kZWxCb3hoZWxwZXInLCAnUmVmZXJlbmNlX21vZGVsJywgJ2Zsb29yX3BsYW5lJywgJ0dyaWRIZWxwZXInLCAnQW1iaWVudCcsICdEaXJlY3Rpb25hbCBmcm9udC1sZWZ0JywgJ3Nwb3QgYmFjayAoYW50aS1zdW4pJywgJ2JveEhlaWdodCcsICdib3hXaWR0aCcsICdib3hEZXB0aCddO1xyXG4gICAgY29uc3QgZ2x0ZkV4cG9ydGVyOiBHTFRGRXhwb3J0ZXIgPSBuZXcgR0xURkV4cG9ydGVyKCk7XHJcbiAgICBsZXQgc2NlbmU6IFNjZW5lO1xyXG4gICAgc2NlbmUgPSB0aGlzLnNjZW5lUHJldmlldy5jbG9uZSgpO1xyXG4gICAgc2NlbmUuY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcclxuICAgICAgaWYgKGMgaW5zdGFuY2VvZiBMaWdodCkge1xyXG4gICAgICAgIHNjZW5lLnJlbW92ZShjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBlbGVtZW50c1RvUmVtb3ZlLmZvckVhY2goZWxlbWVudE5hbWUgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdDogT2JqZWN0M0QgPSBzY2VuZS5nZXRPYmplY3RCeU5hbWUoZWxlbWVudE5hbWUpO1xyXG4gICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICB0cnM6IGZhbHNlLFxyXG4gICAgICBvbmx5VmlzaWJsZTogdHJ1ZSxcclxuICAgICAgdHJ1bmNhdGVEcmF3UmFuZ2U6IHRydWUsXHJcbiAgICAgIGJpbmFyeTogdHJ1ZSxcclxuICAgICAgbWF4VGV4dHVyZVNpemU6IEluZmluaXR5XHJcbiAgICB9O1xyXG4gICAgZ2x0ZkV4cG9ydGVyLnBhcnNlKHNjZW5lLCAocmVzdWx0OiBBcnJheUJ1ZmZlcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlOiBCbG9iID0gbmV3IEJsb2IoW3Jlc3VsdF0sIHt0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pO1xyXG4gICAgICBpZiAocmV0dXJuVHlwZSA9PT0gJ3VwbG9hZCcpIHtcclxuICAgICAgICB0aGlzLl9zZW5kTW9kZWxUb0NETihgJHtleHBvcnRGaWxlTmFtZX0uZ2xiYCwgZmlsZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZG93bmxvYWRNb2RlbChgJHtleHBvcnRGaWxlTmFtZX0uZ2xiYCwgZmlsZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9LCAoZSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjYWxlQXJ0aWNsZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKHRoaXMubW9kZWxOYW1lKTtcclxuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGhpcy5oZWlnaHRBcnRpY2xlLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICBsZXQgaGVpZ2h0SW5NZXRlcjogbnVtYmVyO1xyXG4gICAgaWYgKHRoaXMudW5pdHNPZk1lYXN1cmVtZW50ID09PSAnY20nKSB7XHJcbiAgICAgIGhlaWdodEluTWV0ZXIgPSBpbnB1dEhlaWdodCAvIDEwMDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51bml0c09mTWVhc3VyZW1lbnQgPT09ICdpbmNoZXMnKSB7XHJcbiAgICAgIGhlaWdodEluTWV0ZXIgPSAoaW5wdXRIZWlnaHQgKiAyLjU0KSAvIDEwMDtcclxuICAgIH1cclxuICAgIC8vIHNjYWxlID0gdGhpcy5ib3VuZGluZyAvIGhlaWdodEluTWV0ZXIgYW5kIHVzZSBZIGFzIHVwLyBoZWlnaHRcclxuICAgIGNvbnN0IHNjYWxlOiBudW1iZXIgPSB0aGlzLmJvdW5kaW5nQm94U2l6ZS55IC8gaGVpZ2h0SW5NZXRlcjtcclxuICAgIG1vZGVsLnNjYWxlLnNldChcclxuICAgICAgbW9kZWwuc2NhbGUueCAvIHNjYWxlLFxyXG4gICAgICBtb2RlbC5zY2FsZS55IC8gc2NhbGUsXHJcbiAgICAgIG1vZGVsLnNjYWxlLnogLyBzY2FsZSk7XHJcbiAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm90YXRlTW9kZWwoYXhpczogc3RyaW5nLCBkZWdyZWVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKHRoaXMubW9kZWxOYW1lKTtcclxuICAgIGlmIChheGlzID09PSAneCcpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueCArPSBkZWdyZWVzO1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneScpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueSArPSBkZWdyZWVzO1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneicpIHtcclxuICAgICAgbW9kZWwucm90YXRpb24ueiArPSBkZWdyZWVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZ2V0Qm91bmRpbmdCb3gobW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVNb2RlbChheGlzOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc2NlbmVQcmV2aWV3LmdldE9iamVjdEJ5TmFtZSh0aGlzLm1vZGVsTmFtZSk7XHJcbiAgICBpZiAoYXhpcyA9PT0gJ3gnKSB7XHJcbiAgICAgIG1vZGVsLnBvc2l0aW9uLnggKz0gYW1vdW50O1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneScpIHtcclxuICAgICAgbW9kZWwucG9zaXRpb24ueSArPSBhbW91bnQ7XHJcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd6Jykge1xyXG4gICAgICBtb2RlbC5wb3NpdGlvbi56ICs9IGFtb3VudDtcclxuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ2FsbCcpIHtcclxuICAgICAgbW9kZWwucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZ2V0Qm91bmRpbmdCb3gobW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFVuaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy51bml0c09mTWVhc3VyZW1lbnQgPSBldmVudC52YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVTaG93UmVmZXJlbmNlTW9kZWwoJGV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBtb2RlbDogT2JqZWN0M0QgPSB0aGlzLnNjZW5lUHJldmlldy5nZXRPYmplY3RCeU5hbWUoJ1JlZmVyZW5jZV9tb2RlbCcpO1xyXG4gICAgbW9kZWwudmlzaWJsZSA9ICF0aGlzLnNob3dSZWZlcmVuY2VNb2RlbDtcclxuICAgIHRoaXMuc2hvd1JlZmVyZW5jZU1vZGVsID0gIXRoaXMuc2hvd1JlZmVyZW5jZU1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YWNrYWJsZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YWNrYWJsZSA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEhlaWdodEFkanVzdGFibGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5oZWlnaHRBZGp1c3RhYmxlID0gZXZlbnQudmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nLmNsb3NlQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hbmltYXRlKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNldEFuaW1hdGlvbkxvb3AoKHRpbWVzdGFtcCwgZnJhbWUpID0+IHRoaXMuX3JlbmRlcih0aW1lc3RhbXAsIGZyYW1lKSk7XHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyKHQsIGZyYW1lKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5yZW5kZXIodGhpcy5zY2VuZVByZXZpZXcsIHRoaXMuY2FtZXJhUHJldmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9kb3dubG9hZE1vZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgZWxlbWVudC5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGVsZW1lbnQuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICBlbGVtZW50LmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfc2VuZE1vZGVsVG9DRE4oZmlsZU5hbWU6IHN0cmluZywgYmxvYjogQmxvYik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5wbGFjZW1lbnRPcHRpb25zW3RoaXMuc2VsZWN0ZWRQbGFjZW1lbnRdKTtcclxuICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlQXNTdHJpbmc6IHN0cmluZyA9IEZpbGVVdGlscy5TdHJpcE1pbWVTdHJpbmdGcm9tRGF0YVVyaShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgdGhpcy5fYWRhcHRlclNlcnZpY2Uuc3RvcmUzRE1vZGVsQ0ROKGZpbGVOYW1lLCBmaWxlQXNTdHJpbmcpLnRoZW4oZmlsZVBhdGggPT4ge1xyXG4gICAgICAgIGlmIChmaWxlUGF0aCkge1xyXG4gICAgICAgICAgdGhpcy5fYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikudGhlbihmaWxlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaDogc3RyaW5nID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsVXJsOiBzdHJpbmcgPSBmaWxlUGF0aDsgLy8gU2V0IHVybCBmcm9tIHRoZSBDRE5cclxuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbkRhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZURhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhRGF0YTogTWV0YWRhdGEgPSB0aGlzLl90aGlyZFBhcnR5TW9kZWxTZXJ2aWNlLnNldE1ldGFkYXRhKGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLmNhbkVsZXZhdGUgPSB0aGlzLmhlaWdodEFkanVzdGFibGU7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLnRoaXJkUGFydHlNb2RlbCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIFdlIGFsc28gY2FuIHNldCB0aGUgbWV0YWRhdGEgaGVyZSBhbmQgcGFzIGl0IGFzIHRoZSBsYXN0IGFyZ3VtZW50IGZvciBwYXJzZU1vZGVsVG9HTEIuXHJcbiAgICAgICAgICAgIHRoaXMuX3RoaXJkUGFydHlNb2RlbFNlcnZpY2UucGFyc2VNb2RlbFRvR0xCKGZpbGUsIGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSwgcHJpY2VEYXRhLCBtZXRhRGF0YSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RpYWxvZy5jbG9zZUFsbCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlbmRlckVycm9yLCB7dGl0bGU6ICdVcGxvYWQgZXJyb3InLCBtZXNzYWdlOiBlcnJvcn0pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRNb2RlbE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlbW92ZUV4dGVuc2lvbjogc3RyaW5nID0gbmFtZS5yZXBsYWNlKCcuZ2xiJywgJycpOyAvLyByZW1vdmUgLmdsYiBhcyBmaWxlIGV4dGVuc2lvblxyXG4gICAgcmV0dXJuIHJlbW92ZUV4dGVuc2lvbi5yZXBsYWNlKCcuJywgJy0nKTsgLy8gcmVwbGFjZSBhbGwgZG90cyBmb3IgcGVyaW9kc1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2xiTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxvYWRlcjogR0xURkxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICBsb2FkZXIucGFyc2UoaW5wdXQuZmlsZS5maWxlQ29udGVudHMsICcnLFxyXG4gICAgICBhc3luYyBvYmplY3QgPT4ge1xyXG4gICAgICAgIHRoaXMuX3ByZXBNb2RlbEZvclNjZW5lKG9iamVjdC5zY2VuZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnUGFyc2luZyBlcnJvcicpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmJ4TG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZieExvYWRlcjogRkJYTG9hZGVyID0gbmV3IEZCWExvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gZmJ4TG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzLCAnJyk7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb2JqTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iakxvYWRlcjogT0JKTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xyXG4gICAgLy8gZm9yIG9qYiBmaWxlczogY29udmVydCB0aGUgQXJyYXlCdWZmZXIgdG8gYSBzdHJpbmdcclxuICAgIGNvbnN0IGJ1ZiA9IGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzO1xyXG4gICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nID0gZGVjb2Rlci5kZWNvZGUoYnVmKTtcclxuICAgIGNvbnN0IG9iamVjdCA9IG9iakxvYWRlci5wYXJzZShzdHIpO1xyXG4gICAgdGhpcy5fcHJlcE1vZGVsRm9yU2NlbmUob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rkc0xvYWRlcihpbnB1dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZHNMb2FkZXI6IFREU0xvYWRlciA9IG5ldyBURFNMb2FkZXIoKTtcclxuICAgIGNvbnN0IG9iamVjdCA9IHRkc0xvYWRlci5wYXJzZShpbnB1dC5maWxlLmZpbGVDb250ZW50cywgJycpO1xyXG4gICAgb2JqZWN0LnRyYXZlcnNlKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlbGVtZW50KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcHJlcE1vZGVsRm9yU2NlbmUob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N0bExvYWRlcihpbnB1dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGxMb2FkZXI6IFNUTExvYWRlciA9IG5ldyBTVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IG9iamVjdCA9IHN0bExvYWRlci5wYXJzZShpbnB1dC5maWxlLmZpbGVDb250ZW50cyk7XHJcbiAgICB0aGlzLl9hZGRGcm9tR2VvbWV0cnkob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZEZyb21HZW9tZXRyeShnZW9tZXRyeSkge1xyXG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaFBob25nTWF0ZXJpYWwoe3RyYW5zcGFyZW50OiB0cnVlLCBvcGFjaXR5OiBnZW9tZXRyeS5hbHBoYX0pO1xyXG4gICAgY29uc3QgbW9kZWwgPSBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG4gICAgdGhpcy5fcHJlcE1vZGVsRm9yU2NlbmUobW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcE1vZGVsRm9yU2NlbmUob2JqZWN0OiBhbnkpOiB2b2lkIHtcclxuICAgIG9iamVjdC5uYW1lID0gdGhpcy5tb2RlbE5hbWU7XHJcbiAgICBvYmplY3QucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgb2JqZWN0LnNjYWxlLnNldCgxLCAxLCAxKTtcclxuICAgIC8vIFJlbW92ZSBsaWdodHMgZnJvbSB0aGUgY2hpbGRyZW5cclxuICAgIG9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgb2JqZWN0LnJlbW92ZShjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQob2JqZWN0KTtcclxuICAgIHRoaXMubG9hZGVkTW9kZWwgPSBvYmplY3Q7XHJcbiAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Qm91bmRpbmdCb3gob2JqZWN0OiBPYmplY3QzRCkge1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIHRoaXMuYm91bmRpbmdCb3hTaXplID0gYm91bmRpbmdCb3guZ2V0U2l6ZShuZXcgVmVjdG9yMygpKTtcclxuXHJcbiAgICB0aGlzLl9zZXRNZWFzdXJlbWVudHModGhpcy5ib3VuZGluZ0JveFNpemUpO1xyXG4gICAgdGhpcy5fc2hvd01lYXN1cmVtZW50cygpO1xyXG5cclxuICAgIGNvbnN0IG1vZGVsQm94aGVscGVyID0gdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKCdtb2RlbEJveGhlbHBlcicpO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcucmVtb3ZlKG1vZGVsQm94aGVscGVyKTtcclxuXHJcbiAgICBjb25zdCBib3hIZWxwZXIgPSBuZXcgQm94SGVscGVyKG9iamVjdCk7XHJcbiAgICBib3hIZWxwZXIubWF0ZXJpYWwuY29sb3Iuc2V0KDB4RkYwMEZGKTtcclxuICAgIGJveEhlbHBlci5uYW1lID0gJ21vZGVsQm94aGVscGVyJztcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChib3hIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvd01lYXN1cmVtZW50cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lYXN1cmVtZW50c01lc2hlcyA9IHRoaXMuX21lYXN1cmVtZW50cy5tYXAodmFsdWUgPT4gdmFsdWUudGV4dE1lc2gpO1xyXG4gICAgbWVhc3VyZW1lbnRzTWVzaGVzLmZvckVhY2gob2JqZWN0ID0+IHRoaXMuc2NlbmVQcmV2aWV3LmFkZChvYmplY3QpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1lYXN1cmVtZW50cyhib3VuZGluZ0JveDogVmVjdG9yMykge1xyXG4gICAgY29uc3Qgc2V0SGVpZ2h0OiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZUhlaWdodE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnkpO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0SGVpZ2h0KTtcclxuICAgIGNvbnN0IHNldFdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZVdpZHRoTWVhc3VyZW1lbnQoYm91bmRpbmdCb3gueCk7XHJcbiAgICB0aGlzLl9tZWFzdXJlbWVudHMucHVzaChzZXRXaWR0aCk7XHJcbiAgICBjb25zdCBzZXREZXB0aDogQm94TWVhc3VyZW1lbnQgPSB0aGlzLl9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnopO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0RGVwdGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlSGVpZ2h0TWVhc3VyZW1lbnQoaGVpZ2h0SW5wdXQpOiBCb3hNZWFzdXJlbWVudCB7XHJcbiAgICBjb25zdCBoZWlnaHQ6IEJveE1lYXN1cmVtZW50ID0gbmV3IEJveE1lYXN1cmVtZW50KCk7XHJcbiAgICBjb25zdCBoZWlnaHRTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGhlaWdodElucHV0LCB0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCwgdGhpcy5kaXN0YW5jZVN0ZXApO1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldCgnTEFCRUxfSEVJR0hUJyk7XHJcbiAgICBoZWlnaHQudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goaGVpZ2h0U3RyaW5nLCB0aGlzLmZvbnQsIDB4RkYwMEZGLCAwLjA4LCBmYWxzZSwgZmFsc2UsIHRleHQpO1xyXG4gICAgaGVpZ2h0LnBvc2l0aW9ucyA9IHRoaXMuX2NhbGN1bGF0ZUhlaWdodFBvc2l0aW9ucygpO1xyXG4gICAgaGVpZ2h0LnRleHRNZXNoLm5hbWUgPSAnYm94SGVpZ2h0JztcclxuICAgIHJldHVybiBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVXaWR0aE1lYXN1cmVtZW50KHdpZHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IHdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3Qgd2lkdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KHdpZHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9XSURUSCcpO1xyXG4gICAgd2lkdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2god2lkdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB3aWR0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVXaWR0aFBvc2l0aW9ucygpO1xyXG4gICAgd2lkdGgudGV4dE1lc2gubmFtZSA9ICdib3hXaWR0aCc7XHJcbiAgICByZXR1cm4gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGRlcHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IGRlcHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3QgZGVwdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGRlcHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9ERVBUSCcpO1xyXG4gICAgZGVwdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goZGVwdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICBkZXB0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpO1xyXG4gICAgZGVwdGgudGV4dE1lc2gubmFtZSA9ICdib3hEZXB0aCc7XHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVIZWlnaHRQb3NpdGlvbnMoKTogVEhSRUUuVmVjdG9yM1tdIHtcclxuICAgIHJldHVybiBwb3NpdGlvbmluZ0ZhY3RvcnMubWFwKChbaiwga10pID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHhEaXJlY3Rpb24sIGogLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHpEaXJlY3Rpb24sIGsgLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVdpZHRoUG9zaXRpb25zKCk6IFRIUkVFLlZlY3RvcjNbXSB7XHJcbiAgICByZXR1cm4gcG9zaXRpb25pbmdGYWN0b3JzLm1hcCgoW2osIGtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMygpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih5RGlyZWN0aW9uLCBqIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnkpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih6RGlyZWN0aW9uLCBrIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnopO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpOiBUSFJFRS5WZWN0b3IzW10ge1xyXG4gICAgcmV0dXJuIHBvc2l0aW9uaW5nRmFjdG9ycy5tYXAoKFtqLCBrXSkgPT4ge1xyXG4gICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoKVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeURpcmVjdGlvbiwgaiAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS55KVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeERpcmVjdGlvbiwgayAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS54KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2Jsb2JUb0FycmF5QnVmZmVyKGJsb2I6IEJsb2IpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFcnJvciByZWFkaW5nIGJsb2IgYXMgQXJyYXlCdWZmZXInKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gcmVhZCBibG9iIGFzIEFycmF5QnVmZmVyJykpO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUxpZ2h0RnJvbVByb3BlcnRpZXMobGlnaHRQcm9wZXJ0aWVzOiBMaWdodFByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IGxpZ2h0VHlwZTogTGlnaHRFbnVtID0gbGlnaHRQcm9wZXJ0aWVzLnR5cGU7XHJcbiAgICBjb25zdCBnZXRMaWdodHM6IExpZ2h0Q3JlYXRlU2VydmljZSA9IG5ldyBMaWdodENyZWF0ZVNlcnZpY2UoKTtcclxuICAgIGNvbnN0IGxpZ2h0OiBMaWdodCA9IGdldExpZ2h0cy5jcmVhdGVOZXdMaWdodChsaWdodFR5cGUpO1xyXG4gICAgbGlnaHQudXNlckRhdGEud2FsbE9mZnNldCA9IGxpZ2h0UHJvcGVydGllcy53YWxsT2Zmc2V0O1xyXG4gICAgbGlnaHQudXNlckRhdGEucm90YXRpb25PZmZzZXQgPSBsaWdodFByb3BlcnRpZXMucm90YXRpb25PZmZzZXQ7XHJcbiAgICBsaWdodC51c2VyRGF0YS50b3BEb3duRGlyZWN0aW9uYWwgPSBsaWdodFByb3BlcnRpZXMudG9wRG93bkRpcmVjdGlvbmFsO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsaWdodFByb3BlcnRpZXMpIHtcclxuICAgICAgaWYgKCFsaWdodC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdwb3NpdGlvbicpIHtcclxuICAgICAgICBsaWdodC5wb3NpdGlvbi55ID0gbGlnaHRQcm9wZXJ0aWVzLnBvc2l0aW9uLnk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICdjb2xvcicpIHtcclxuICAgICAgICBsaWdodC5jb2xvciA9IG5ldyBDb2xvcihsaWdodFByb3BlcnRpZXMuY29sb3IpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnZ3JvdW5kQ29sb3InKSB7XHJcbiAgICAgICAgKGxpZ2h0IGFzIGFueSkuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IobGlnaHRQcm9wZXJ0aWVzLmdyb3VuZENvbG9yKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZXRPYmplY3RQcm9wZXJ0aWVzKGxpZ2h0LCBwcm9wZXJ0eSwgbGlnaHRQcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChsaWdodCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRPYmplY3RQcm9wZXJ0aWVzKG9iamVjdDogTGlnaHQgfCBMaWdodFByb3BlcnRpZXMsIHByb3BlcnR5OiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3NoYWRvdycpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3RbcHJvcGVydHldLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqZWN0W3Byb3BlcnR5XVtwcm9wXSA9IHZhbHVlW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3RbcHJvcGVydHldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWNvbiA9IEljb25FbnVtO1xyXG59XHJcblxyXG4iXX0=