@colijnit/homedecorator 258.1.1 → 258.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/app/core/enum/icon.enum.d.ts +1 -0
  2. package/app/core/enum/message-type.enum.d.ts +2 -1
  3. package/app/core/interface/message-with-payload.interface.d.ts +1 -0
  4. package/app/core/model/homedecorator-settings-options.d.ts +1 -1
  5. package/app/core/model/homedecorator-settings.d.ts +3 -0
  6. package/app/core/service/3dm-api.d.ts +2 -2
  7. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  8. package/app/core/service/homedecorator-connector-adapter.service.d.ts +9 -1
  9. package/app/core/service/homedecorator-connector.service.d.ts +15 -2
  10. package/app/core/service/utils.service.d.ts +1 -1
  11. package/app/core/utils/object.utils.d.ts +2 -0
  12. package/app/homedecorator.module.d.ts +2 -1
  13. package/app/plugins/core3d/service/wall-measurements.service.d.ts +2 -0
  14. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +3 -0
  15. package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +2 -0
  16. package/app/plugins/product-configurator/product-configurator-selector-list-of-values.component.scss +28 -0
  17. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.d.ts +19 -0
  18. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.scss +38 -0
  19. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.d.ts +20 -0
  20. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.scss +0 -0
  21. package/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.d.ts +19 -0
  22. package/app/plugins/product-configurator/product-configurator-selector-option-tile.component.scss +56 -0
  23. package/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.d.ts +20 -0
  24. package/app/plugins/product-configurator/product-configurator-selector.component.d.ts +26 -0
  25. package/app/plugins/product-configurator/product-configurator-selector.component.scss +46 -0
  26. package/app/plugins/product-configurator/product-configurator.component.d.ts +38 -0
  27. package/app/plugins/product-configurator/product-configurator.component.scss +35 -0
  28. package/app/plugins/product-configurator/product-configurator.module.d.ts +18 -0
  29. package/app/plugins/product-configurator/template_variables.scss +13 -0
  30. package/app/plugins/render/model/blender-render-settings.d.ts +10 -0
  31. package/app/plugins/render/model/blender-scene-settings.d.ts +18 -0
  32. package/app/plugins/render/render-controls/render-controls.component.d.ts +19 -7
  33. package/app/plugins/render/service/new-render.service.d.ts +21 -4
  34. package/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.scss +1 -1
  35. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +5 -0
  36. package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +4 -0
  37. package/app/plugins/threedselector/threedselector/threedselector.component.scss +17 -0
  38. package/app/plugins/threedselector/threedselector.module.d.ts +2 -1
  39. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  40. package/assets/icons/circle_regular.svg +0 -0
  41. package/bundles/colijnit-homedecorator.umd.js +1986 -835
  42. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  43. package/esm2015/app/app.version.js +3 -3
  44. package/esm2015/app/core/enum/icon.enum.js +2 -1
  45. package/esm2015/app/core/enum/message-type.enum.js +2 -1
  46. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  47. package/esm2015/app/core/model/homedecorator-settings-options.js +2 -2
  48. package/esm2015/app/core/model/homedecorator-settings.js +3 -1
  49. package/esm2015/app/core/model/icon.js +2 -1
  50. package/esm2015/app/core/service/3dm-api.js +15 -22
  51. package/esm2015/app/core/service/homedecorator-app-event.service.js +3 -2
  52. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +65 -7
  53. package/esm2015/app/core/service/homedecorator-connector.service.js +150 -6
  54. package/esm2015/app/core/service/homedecorator-settings.service.js +8 -1
  55. package/esm2015/app/core/service/utils.service.js +116 -93
  56. package/esm2015/app/core/utils/object.utils.js +13 -1
  57. package/esm2015/app/homedecorator.component.js +1 -2
  58. package/esm2015/app/homedecorator.module.js +8 -4
  59. package/esm2015/app/plugins/core3d/core3d/core3d.component.js +2 -2
  60. package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +7 -1
  61. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +98 -50
  62. package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +4 -4
  63. package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +21 -11
  64. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-button.component.js +67 -0
  65. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.js +57 -0
  66. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.js +75 -0
  67. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.js +90 -0
  68. package/esm2015/app/plugins/product-configurator/product-configurator-selector.component.js +253 -0
  69. package/esm2015/app/plugins/product-configurator/product-configurator.component.js +151 -0
  70. package/esm2015/app/plugins/product-configurator/product-configurator.module.js +115 -0
  71. package/esm2015/app/plugins/render/model/blender-render-settings.js +3 -0
  72. package/esm2015/app/plugins/render/model/blender-scene-settings.js +10 -0
  73. package/esm2015/app/plugins/render/model/render-parameters.js +3 -3
  74. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +532 -446
  75. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +6 -40
  76. package/esm2015/app/plugins/render/service/new-render.service.js +212 -44
  77. package/esm2015/app/plugins/render/service/render.service.js +6 -9
  78. package/esm2015/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.js +1 -1
  79. package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +1 -1
  80. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +12 -10
  81. package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +2 -2
  82. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +55 -1
  83. package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +3 -3
  84. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +64 -15
  85. package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +1 -1
  86. package/esm2015/app/plugins/threedselector/threedselector.module.js +8 -4
  87. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +1 -1
  88. package/esm2015/app/shared/category-library/category-library.component.js +1 -1
  89. package/fesm2015/colijnit-homedecorator.js +2522 -1149
  90. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  91. package/package.json +4 -4
  92. package/styles.scss +1 -1
@@ -24,6 +24,7 @@ import { Utils } from '../../plugins/core3d/core/utils';
24
24
  import { ExportDialogComponent } from '../../shared/export-dialog/export-dialog.component';
25
25
  import { ExportType } from '../enum/export-type.enum';
26
26
  import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils';
27
+ import { MessageType } from '../enum/message-type.enum';
27
28
  import * as i0 from "@angular/core";
28
29
  import * as i1 from "./3dm-api";
29
30
  import * as i2 from "./message-bus.service";
@@ -311,114 +312,135 @@ export class UtilsService {
311
312
  prepRoomForRender(standalone = false, renderParameters, renderPreview = false) {
312
313
  return __awaiter(this, void 0, void 0, function* () {
313
314
  const camera = this._cameraService.camera;
314
- const elementsToRemove = ['ground-plane', 'hud-ring', 'hud-circle', 'rotationCircle'];
315
- if (standalone) {
316
- elementsToRemove.push('floor-plane');
315
+ let useCachedRender = true;
316
+ // As of now Culling and cameraWithinRoom are the only values that can overwrite all other values.
317
+ if (renderParameters.allowCulling) {
318
+ useCachedRender = false;
319
+ this._sceneCachedCulling = true;
317
320
  }
318
- let scene;
319
- scene = this._sceneService.scene.clone();
320
- scene.children.forEach(c => {
321
- if (c instanceof Light) {
322
- scene.remove(c);
321
+ else {
322
+ if (this._sceneCachedCulling) {
323
+ this.clearSavedRoomRenderSettings();
323
324
  }
324
- let renameMesh = false;
325
- if (c.name && c.name.indexOf('edge') > -1) {
326
- c.traverse(cc => {
327
- if (cc instanceof Mesh && cc.material) {
328
- if (Array.isArray(cc.material)) {
329
- cc.material.forEach(m => {
330
- if (m.opacity === 0) {
331
- renameMesh = true;
325
+ useCachedRender = true;
326
+ }
327
+ if (this._sceneRenderName !== '' && !standalone && useCachedRender) {
328
+ this.messageService.emit(MessageType.HideLoadingIndicator);
329
+ this.messageService.emit(MessageType.ShowLoadingIndicator, { title: 'Rendering...' });
330
+ yield this.apiServiceModule.requestRender(this._sceneRenderName, camera, standalone, renderParameters, renderPreview);
331
+ }
332
+ else {
333
+ const elementsToRemove = ['ground-plane', 'hud-ring', 'hud-circle', 'rotationCircle'];
334
+ if (standalone) {
335
+ elementsToRemove.push('floor-plane');
336
+ }
337
+ let scene;
338
+ scene = this._sceneService.scene.clone();
339
+ scene.children.forEach(c => {
340
+ if (c instanceof Light) {
341
+ scene.remove(c);
342
+ }
343
+ if (renderParameters.allowCulling) {
344
+ let renameMesh = false;
345
+ if (c.name && c.name.indexOf('edge') > -1) {
346
+ c.traverse(cc => {
347
+ if (cc instanceof Mesh && cc.material) {
348
+ if (Array.isArray(cc.material)) {
349
+ cc.material.forEach(m => {
350
+ renameMesh = true;
351
+ });
352
+ }
353
+ else {
354
+ if (cc.material.opacity === 0) {
355
+ renameMesh = true;
356
+ }
332
357
  }
333
- });
334
- }
335
- else {
336
- if (cc.material.opacity === 0) {
337
- renameMesh = true;
338
358
  }
339
- }
359
+ });
340
360
  }
341
- });
342
- }
343
- if (renameMesh) {
344
- c.name = `CULLING_${c.name}`;
345
- }
346
- let renameCeiling = false;
347
- if (c.name === 'ceilingPlane-plane') {
348
- c.traverse(cc => {
349
- if (cc instanceof Mesh && cc.material) {
350
- if (Array.isArray(cc.material)) {
351
- cc.material.forEach(m => {
352
- if (m.side === 0) {
353
- renameCeiling = true;
361
+ if (renameMesh) {
362
+ c.name = `CULLING_${c.name}`;
363
+ }
364
+ let renameCeiling = false;
365
+ if (c.name === 'ceilingPlane-plane') {
366
+ c.traverse(cc => {
367
+ if (cc instanceof Mesh && cc.material) {
368
+ if (Array.isArray(cc.material)) {
369
+ cc.material.forEach(m => {
370
+ if (m.side === 0) {
371
+ renameCeiling = true;
372
+ }
373
+ });
374
+ }
375
+ else {
376
+ if (cc.material.side === 0) {
377
+ renameCeiling = true;
378
+ }
354
379
  }
355
- });
356
- }
357
- else {
358
- if (cc.material.side === 0) {
359
- renameCeiling = true;
360
380
  }
361
- }
381
+ });
362
382
  }
363
- });
364
- }
365
- if (renameCeiling) {
366
- c.name = `CULLING_${c.name}`;
367
- }
368
- if (c.name && c.name.indexOf('edge') > -1) { // walls should all be visible
369
- c.traverse(cc => {
370
- if (cc instanceof Mesh && cc.material) {
371
- if (Array.isArray(cc.material)) {
372
- cc.material.forEach(m => {
373
- m.opacity = 0;
374
- m.transparent = false;
375
- m.depthWrite = true;
376
- m.depthTest = true;
377
- });
378
- }
379
- else {
380
- cc.material.opacity = 0;
381
- cc.material.transparent = false;
382
- cc.material.depthWrite = true;
383
- cc.material.depthTest = true;
384
- }
383
+ if (renameCeiling) {
384
+ c.name = `CULLING_${c.name}`;
385
385
  }
386
- if (cc instanceof Mesh && cc.geometry) {
387
- if (!cc.geometry.index) {
388
- cc.geometry = BufferGeometryUtils.mergeVertices(cc.geometry);
389
- cc.geometry.computeVertexNormals();
386
+ }
387
+ if (c.name && c.name.indexOf('edge') > -1) { // walls should all be visible
388
+ c.traverse(cc => {
389
+ if (cc instanceof Mesh && cc.material) {
390
+ if (Array.isArray(cc.material)) {
391
+ cc.material.forEach(m => {
392
+ m.opacity = 0;
393
+ m.transparent = false;
394
+ m.depthWrite = true;
395
+ m.depthTest = true;
396
+ });
397
+ }
398
+ else {
399
+ cc.material.opacity = 0;
400
+ cc.material.transparent = false;
401
+ cc.material.depthWrite = true;
402
+ cc.material.depthTest = true;
403
+ }
390
404
  }
391
- Object.keys(cc.geometry.attributes).forEach((attrName) => {
392
- const array = cc.geometry.attributes[attrName].array;
393
- for (let i = 0; i < array.length; i++) {
394
- if (!isFinite(array[i]) || isNaN(array[i])) {
395
- array[i] = 0; // Set it so some value
396
- }
405
+ if (cc instanceof Mesh && cc.geometry) {
406
+ if (!cc.geometry.index) {
407
+ cc.geometry = BufferGeometryUtils.mergeVertices(cc.geometry);
408
+ cc.geometry.computeVertexNormals();
397
409
  }
398
- cc.geometry.attributes[attrName].needsUpdate = true;
399
- });
410
+ Object.keys(cc.geometry.attributes).forEach((attrName) => {
411
+ const array = cc.geometry.attributes[attrName].array;
412
+ for (let i = 0; i < array.length; i++) {
413
+ if (!isFinite(array[i]) || isNaN(array[i])) {
414
+ array[i] = 0; // Set it so some value
415
+ }
416
+ }
417
+ cc.geometry.attributes[attrName].needsUpdate = true;
418
+ });
419
+ }
420
+ });
421
+ }
422
+ else {
423
+ if (!c.visible && renderParameters.allowCulling) {
424
+ c.name = `CULLING_${c.name}`;
400
425
  }
401
- });
402
- }
403
- else {
404
- if (!c.visible) {
405
- c.name = `CULLING_${c.name}`;
406
426
  }
407
- }
408
- });
409
- elementsToRemove.forEach(elementName => {
410
- const selectedObject = scene.getObjectByName(elementName);
411
- scene.remove(selectedObject);
412
- });
413
- scene.name = 'mrp_room_' + scene.uuid;
414
- this._createGLBForAPI(scene, camera, standalone, renderParameters, renderPreview);
415
- Utils.DisposeObject(scene);
416
- scene = null;
427
+ });
428
+ elementsToRemove.forEach(elementName => {
429
+ const selectedObject = scene.getObjectByName(elementName);
430
+ scene.remove(selectedObject);
431
+ });
432
+ scene.name = 'mrp_room_' + scene.uuid;
433
+ this._createGLBForAPI(scene, camera, standalone, renderParameters, renderPreview);
434
+ // We need to update this the make sure culling keeps on working.... no sure why tbh..
435
+ this._cameraService.controls.update();
436
+ Utils.DisposeObject(scene);
437
+ scene = null;
438
+ }
417
439
  });
418
440
  }
419
441
  clearSavedRoomRenderSettings() {
420
442
  this._sceneRenderName = '';
421
- this._sceneRenderContents = new Object3D();
443
+ this._sceneCachedCulling = false;
422
444
  }
423
445
  _createGLBForAPI(object, camera, standalone, renderParameters, renderPreview) {
424
446
  // Check if we've made a render already, but only if it's not standalone
@@ -443,7 +465,8 @@ export class UtilsService {
443
465
  type: 'model/gltf-binary',
444
466
  });
445
467
  this._sceneRenderName = filename;
446
- this._sceneRenderContents = object;
468
+ // this._downloadFile(filename, file);
469
+ // this.messageService.emit(MessageType.HideLoadingIndicator);
447
470
  this._sendFileToApi(file, filename, camera, standalone, renderParameters, renderPreview);
448
471
  }, () => {
449
472
  }, options);
@@ -794,4 +817,4 @@ UtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version
794
817
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: UtilsService, decorators: [{
795
818
  type: Injectable
796
819
  }], ctorParameters: function () { return [{ type: i1.ApiServiceModule }, { type: i2.MessageBusService }, { type: i3.HomedecoratorSettingsService }, { type: i4.JsonUtilsService }, { type: i5.ProgressService }, { type: i6.ItemService }, { type: i7.SceneService }, { type: i8.MatDialog }, { type: i9.CameraService }]; } });
797
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBb0IsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLFFBQVEsRUFDUixZQUFZLEVBRVosY0FBYyxFQUNkLGNBQWMsRUFFZCxhQUFhLEVBQ2IsT0FBTyxFQUNSLE1BQU0sT0FBTyxDQUFDO0FBQ2Ysd0RBQXdEO0FBQ3hELHVEQUF1RDtBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFdkUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSx3RUFBd0U7QUFDeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBUXZFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUN6RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFJcEQsT0FBTyxLQUFLLG1CQUFtQixNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7OztBQUVwRixxQ0FBcUM7QUFDckMsMERBQTBEO0FBQzFELHVCQUF1QjtBQUN2QixLQUFLO0FBR0wsTUFBTSxPQUFPLFlBQVk7SUFhdkIsWUFDUyxnQkFBa0MsRUFDbEMsY0FBaUMsRUFDaEMsZ0JBQThDLEVBQzlDLGlCQUFtQyxFQUNuQyxnQkFBaUMsRUFDakMsYUFBMEIsRUFDMUIsYUFBMkIsRUFDM0IsT0FBa0IsRUFDbEIsY0FBNkI7UUFSOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQUM5QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsa0JBQWEsR0FBYixhQUFhLENBQWE7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQXBCaEMsVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUVmLGlCQUFZLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEQsVUFBSyxHQUFtQixFQUFFLENBQUM7UUFDM0IsZ0JBQVcsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkMscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBY3BDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFVO1FBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RCxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxzQkFBc0IsQ0FBQyxJQUFTLEVBQUUsYUFBcUIsR0FBRyxFQUFFLE9BQWE7UUFDOUUsSUFBSSxZQUFvQixDQUFDO1FBQ3pCLElBQUksVUFBa0IsQ0FBQztRQUV2QixPQUFPO1lBQ0wsTUFBTSxPQUFPLEdBQVEsT0FBTyxJQUFJLElBQUksQ0FBQztZQUNyQyxNQUFNLEdBQUcsR0FBUSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFRLFNBQVMsQ0FBQztZQUM1QixJQUFJLFlBQVksSUFBSSxHQUFHLEdBQUcsWUFBWSxHQUFHLFVBQVUsRUFBRTtnQkFDbkQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztvQkFDN0IsWUFBWSxHQUFHLEdBQUcsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUNoQjtpQkFBTTtnQkFDTCxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFWSxhQUFhLENBQUMsUUFBZ0I7O1lBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3pEO1lBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQVcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRixNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUk7b0JBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2Q7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNkO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFWSxtQkFBbUIsQ0FBQyxRQUFnQjs7WUFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDekQ7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDbEIsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDZCxNQUFNLEdBQUcsR0FBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3hILElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDckMsT0FBTyxDQUFDLEdBQWUsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLEVBQ0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQzVELEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUN2QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFRCx3RUFBd0U7SUFDeEUsOENBQThDO0lBQzlDLDhDQUE4QztJQUM5QyxFQUFFO0lBQ0YsbUZBQW1GO0lBQ25GLGlEQUFpRDtJQUNqRCwyRUFBMkU7SUFDM0UsNkNBQTZDO0lBQzdDLG1FQUFtRTtJQUNuRSxFQUFFO0lBQ0YsNERBQTREO0lBQzVELEVBQUU7SUFDRixRQUFRO0lBQ1IsSUFBSTtJQUVJLFlBQVksQ0FBQyxNQUFZO1FBQy9CLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRVksWUFBWSxDQUFDLFFBQWdCLEVBQUUsTUFBZTs7WUFDekQsNkNBQTZDO1lBQzdDLHFDQUFxQztZQUNyQyxnQkFBZ0I7WUFDaEIsd0RBQXdEO1lBQ3hELCtCQUErQjtZQUMvQix1REFBdUQ7WUFDdkQsSUFBSTtZQUNKLDRDQUE0QztZQUM1QyxvQkFBb0I7WUFDcEIsZ0JBQWdCO1lBQ2hCLHVCQUF1QjtZQUN2Qix1Q0FBdUM7WUFDdkMsU0FBUztZQUNULHdCQUF3QjtZQUN4QixPQUFPO1lBQ1AsTUFBTTtZQUNOLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3pEO1lBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxTQUFTLEVBQUU7cUJBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3FCQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3hCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxTQUFTLEVBQUU7eUJBQ1osWUFBWSxDQUFDLFNBQVMsQ0FBQzt5QkFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3lCQUNqRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3pCLE1BQU0sR0FBRyxHQUFhLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDcEQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTs0QkFDdEMsSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0NBQzNDLE1BQU0sUUFBUSxHQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dDQUMzRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29DQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7d0NBQ1QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDO3FDQUNuQztnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjt3QkFDSCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZixDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLEVBQ0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQzdELENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVNLFlBQVksQ0FBQyxJQUFZLEVBQUUsZUFBd0IsSUFBSSxFQUFFLFVBQW1CLElBQUk7UUFDckYsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN4RDtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBaUIsRUFBRSxNQUFnQixFQUFFLEVBQUU7WUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFDZCxDQUFNLE1BQU0sRUFBQyxFQUFFO2dCQUNiLHdDQUF3QztnQkFDeEMsbURBQW1EO2dCQUNuRDs7OztrQkFJRTtnQkFDRixzQ0FBc0M7Z0JBQ3RDLDRCQUE0QjtnQkFDNUIscURBQXFEO2dCQUNyRCx5Q0FBeUM7Z0JBQ3pDLDBDQUEwQztnQkFDMUMsa0dBQWtHO2dCQUNsRyxpQ0FBaUM7Z0JBQ2pDLHdEQUF3RDtnQkFDeEQsUUFBUTtnQkFDUiw2QkFBNkI7Z0JBQzdCLElBQUk7Z0JBQ0osSUFBSTtnQkFDSixNQUFNO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sR0FBRyxHQUFhLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUMsQ0FBQSxFQUNELEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUN4RCxLQUFLLENBQUMsRUFBRTtnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZSxDQUFDLElBQWlCO1FBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFpQixFQUFFLE1BQWdCLEVBQUUsRUFBRTtZQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFDbkIsQ0FBTSxNQUFNLEVBQUMsRUFBRTtnQkFDYixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFBLEVBQ0QsS0FBSyxDQUFDLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLElBQVk7UUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBTyxPQUFpQixFQUFFLE1BQWdCLEVBQUUsRUFBRTtZQUMvRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkLENBQU0sTUFBTSxFQUFDLEVBQUU7Z0JBQ2IsTUFBTSxHQUFHLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDbkMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDZixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQzVILENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztxQkFDeEI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUMsQ0FBQSxFQUNELEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUN4RCxLQUFLLENBQUMsRUFBRTtnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVZLGFBQWE7O1lBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RGLElBQUksS0FBWSxDQUFDO1lBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFO29CQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLGNBQWMsR0FBYSxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRSxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVZLGlCQUFpQixDQUFDLGFBQXNCLEtBQUssRUFBRSxnQkFBcUIsRUFBRSxnQkFBeUIsS0FBSzs7WUFDL0csTUFBTSxNQUFNLEdBQXNCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RGLElBQUksVUFBVSxFQUFFO2dCQUNkLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN0QztZQUNELElBQUksS0FBWSxDQUFDO1lBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFO29CQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQjtnQkFDRCxJQUFJLFVBQVUsR0FBWSxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDekMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDZCxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTs0QkFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQ0FDOUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0NBQ3RCLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7d0NBQ25CLFVBQVUsR0FBRyxJQUFJLENBQUM7cUNBQ25CO2dDQUNILENBQUMsQ0FBQyxDQUFDOzZCQUNKO2lDQUFNO2dDQUNMLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFO29DQUM3QixVQUFVLEdBQUcsSUFBSSxDQUFDO2lDQUNuQjs2QkFDRjt5QkFDRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxJQUFJLFVBQVUsRUFBRTtvQkFDZCxDQUFDLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM5QjtnQkFFRCxJQUFJLGFBQWEsR0FBWSxLQUFLLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRTtvQkFDbkMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDZCxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTs0QkFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQ0FDOUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0NBQ3RCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7d0NBQ2hCLGFBQWEsR0FBRyxJQUFJLENBQUM7cUNBQ3RCO2dDQUNILENBQUMsQ0FBQyxDQUFDOzZCQUNKO2lDQUFNO2dDQUNMLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO29DQUMxQixhQUFhLEdBQUcsSUFBSSxDQUFDO2lDQUN0Qjs2QkFDRjt5QkFDRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxJQUFJLGFBQWEsRUFBRTtvQkFDakIsQ0FBQyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDOUI7Z0JBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsOEJBQThCO29CQUN6RSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUNkLElBQUksRUFBRSxZQUFZLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFOzRCQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dDQUM5QixFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQ0FDdEIsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7b0NBQ2QsQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7b0NBQ3RCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO29DQUNwQixDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQ0FDckIsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7aUNBQU07Z0NBQ0wsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dDQUN4QixFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0NBQ2hDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQ0FDOUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOzZCQUM5Qjt5QkFDRjt3QkFFRCxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTs0QkFDckMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dDQUN0QixFQUFFLENBQUMsUUFBUSxHQUFHLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQzdELEVBQUUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs2QkFDcEM7NEJBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBUSxFQUFFO2dDQUM3RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0NBQ3JELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3Q0FDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtxQ0FDdEM7aUNBQ0Y7Z0NBQ0QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs0QkFDdEQsQ0FBQyxDQUFDLENBQUM7eUJBQ0o7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7d0JBQ2QsQ0FBQyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDOUI7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDckMsTUFBTSxjQUFjLEdBQWEsS0FBSyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILEtBQUssQ0FBQyxJQUFJLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2xGLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVNLDRCQUE0QjtRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsTUFBZ0IsRUFDaEIsTUFBeUIsRUFDekIsVUFBbUIsRUFDbkIsZ0JBQXFCLEVBQ3JCLGFBQXNCO1FBRXRCLHdFQUF3RTtRQUN4RSwrQ0FBK0M7UUFDL0MscURBQXFEO1FBQ3JELHlCQUF5QjtRQUN6QixnRUFBZ0U7UUFDaEUseUZBQXlGO1FBQ3pGLHFIQUFxSDtRQUNySCxFQUFFO1FBQ0YsV0FBVztRQUNYLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxFQUFFLEtBQUs7WUFDVixXQUFXLEVBQUUsSUFBSTtZQUNqQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJO1lBQ1osY0FBYyxFQUFFLFFBQVE7U0FDekIsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQW1CLEVBQUUsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRTtnQkFDeEMsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxFQUFFLEdBQUcsRUFBRTtRQUNSLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNaLElBQUk7SUFDTixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFVLEVBQ1YsUUFBZ0IsRUFDaEIsTUFBeUIsRUFDekIsVUFBbUIsRUFDbkIsZ0JBQXFCLEVBQ3JCLGFBQXNCO1FBRXRCLE1BQU0sUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFDMUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUdZLGFBQWEsQ0FBQyxJQUFZOztZQUNyQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUU7Z0JBQ25DLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFXLEVBQUUsRUFBRTtvQkFDekIsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9GLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRSxtQkFBbUI7Z0JBQ3RGLE1BQU0sUUFBUSxHQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2RCxNQUFNLElBQUksR0FBVyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDMUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLE1BQU0sR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakI7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7S0FBQTtJQUVNLGdCQUFnQixDQUFDLE1BQWdCO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVELEtBQUssRUFBRSxPQUFPO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFPLElBQWdCLEVBQUUsRUFBRTtZQUM5RCxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLElBQUksS0FBSyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3BDO3FCQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDckM7cUJBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRTtvQkFDbkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3BDO3FCQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDaEM7YUFDRjtRQUNILENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR1ksY0FBYyxDQUFDLEdBQVc7O1lBQ3JDLG1DQUFtQztZQUNuQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUMxQyxvRUFBb0U7Z0JBQ3BFLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUNwQixDQUFDLE9BQWdCLEVBQUUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDO29CQUMvQixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxFQUNELElBQUksRUFDSixNQUFNLENBQ1AsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRU0sb0JBQW9CLENBQUMsRUFBcUIsRUFBRSxTQUFjLEVBQUUsUUFBZ0I7UUFDakYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0IsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVZLG9CQUFvQixDQUFDLE1BQWdCOztZQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FBQztZQUVuRSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sT0FBTyxHQUFzQixRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUMvQixPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNuQixPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO0tBQUE7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFnQixFQUFFLFVBQW1CLElBQUk7UUFDL0QsSUFBSSxHQUFHLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNuQywyQkFBMkI7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFXLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLEVBQUU7Z0JBQzFCLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtvQkFDaEcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDeEM7cUJBQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDMUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7cUJBQ3BCO3lCQUFNO3dCQUNMLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ2pCO2lCQUNGO3FCQUFNO29CQUNMLDhDQUE4QztvQkFDOUMsb0NBQW9DO29CQUNwQyxzQ0FBc0M7b0JBQ3RDLFFBQVE7b0JBQ1IsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQ3BCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQzFCLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBZ0I7UUFDNUMsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLEVBQUUsS0FBSztZQUNWLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsTUFBTSxFQUFFLElBQUk7WUFDWixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBbUIsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxFQUFFLEdBQUcsRUFBRTtRQUNSLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFYSxzQkFBc0IsQ0FBQyxNQUFnQjs7WUFDbkQsb0VBQW9FO1lBQ3BFLGtGQUFrRjtZQUVsRixNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFDLENBQUMsQ0FBQztZQUd6RSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUM7S0FBQTtJQUVPLGFBQWEsQ0FBQyxRQUFnQixFQUFFLElBQVU7UUFDaEQsTUFBTSxPQUFPLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRS9CLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWdCO1FBQ3ZDLG1FQUFtRTtRQUNuRSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUN2QyxNQUFNLEVBQUUsZUFBZTtZQUN2QixLQUFLLEVBQUUsSUFBSTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixzQkFBc0IsRUFBRSxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUVILGtFQUFrRTtRQUNsRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUUxRCxvREFBb0Q7UUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLHNEQUFzRDtZQUN0RCxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDMUIscURBQXFEO1lBQ3JELEtBQUssR0FBRyxJQUFJLENBQUM7U0FDZDtRQUVELFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLHFGQUFxRjtRQUNyRixRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBQzlELFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNsQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUM7UUFDbkQsUUFBUSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztRQUVuQywwQ0FBMEM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFFLDRDQUE0QztRQUM1QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLDhCQUE4QjtRQUNoRixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsTUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQiw0QkFBNEI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtRQUNqRixLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXhCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUNuRSxzQ0FBc0M7UUFDdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVCLDZCQUE2QjtRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUN0RCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO1FBQy9HLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRWhDLG1DQUFtQztRQUNuQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpELFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV6QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBR00sb0JBQW9CLENBQUMsTUFBZ0I7UUFDMUMsbUVBQW1FO1FBQ25FLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixxQkFBcUIsRUFBRSxJQUFJLEVBQUUsa0NBQWtDO1NBQ2hFLENBQUMsQ0FBQztRQUVILG9EQUFvRDtRQUNwRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLHFGQUFxRjtRQUNyRixRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBRTlELDBDQUEwQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUUsOEJBQThCO1FBQzlCLDRDQUE0QztRQUM1QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLDhCQUE4QjtRQUNoRixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQiw0QkFBNEI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtRQUNqRixLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXhCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUNuRSxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFNUIsa0VBQWtFO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTFELDZCQUE2QjtRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQjtRQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO1FBQy9HLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRWhDLG1DQUFtQztRQUNuQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRCxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFekIsT0FBTyxTQUFTLENBQUM7UUFDakIsOERBQThEO1FBQzlELGtFQUFrRTtJQUNwRSxDQUFDO0lBR08sY0FBYyxDQUFDLFFBQWdCLEVBQUUsU0FBaUI7UUFDeEQseUNBQXlDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFTO1FBQzFCLE1BQU0sS0FBSyxHQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ2hELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBVSxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBR08seUJBQXlCLENBQUMsS0FBZSxFQUFFLEdBQWEsRUFBRSxVQUFtQixJQUFJO1FBQ3ZGLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBWSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLElBQUksRUFBRSxZQUFZLEtBQUssRUFBRTtnQkFDbEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUN6QztpQkFBTTtnQkFDTCxvQ0FBb0M7Z0JBQ3BDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsb0NBQW9DO2dCQUNwQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsUUFBb0IsRUFBRSxRQUE2QjtRQUMxRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBYSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFO2dCQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDakI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDakQ7U0FDRjtJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsR0FBVztRQUNqQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDbEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2xCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3hELENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sSUFBSSxHQUFlLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDOzswR0FsMEJVLFlBQVk7OEdBQVosWUFBWTs0RkFBWixZQUFZO2tCQUR4QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgSW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1xyXG4gIEJveDMsXHJcbiAgQ2FtZXJhLFxyXG4gIEdyb3VwLFxyXG4gIExpZ2h0LFxyXG4gIE1lc2gsXHJcbiAgT2JqZWN0M0QsXHJcbiAgT2JqZWN0TG9hZGVyLFxyXG4gIFBlcnNwZWN0aXZlQ2FtZXJhLFxyXG4gIFJlcGVhdFdyYXBwaW5nLFxyXG4gIFNSR0JDb2xvclNwYWNlLFxyXG4gIFRleHR1cmUsXHJcbiAgVGV4dHVyZUxvYWRlcixcclxuICBWZWN0b3IzXHJcbn0gZnJvbSAndGhyZWUnO1xyXG4vLyBpbXBvcnQgT0JKTG9hZGVyIGZyb20gJ2FwcC90aHJlZS1sb2FkZXJzL09CSkxvYWRlcjInO1xyXG4vLyBpbXBvcnQgTVRMTG9hZGVyIGZyb20gJ2FwcC90aHJlZS1sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7T0JKTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9PQkpMb2FkZXInO1xyXG5pbXBvcnQge01UTExvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvTVRMTG9hZGVyJztcclxuaW1wb3J0IHtHTFRGTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHtHTFRGRXhwb3J0ZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvR0xURkV4cG9ydGVyJztcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0RSQUNPTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9EUkFDT0xvYWRlcic7XHJcbmltcG9ydCB7S1RYMkxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvS1RYMkxvYWRlcic7XHJcbi8vIGltcG9ydCB7TWVzaG9wdERlY29kZXJ9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2xpYi9tZXNob3B0X2RlY29kZXIuanMnO1xyXG5pbXBvcnQge1VTRFpFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9VU0RaRXhwb3J0ZXInO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtTY2VuZX0gZnJvbSAndGhyZWUvc3JjL3NjZW5lcy9TY2VuZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0pzb25VdGlsc1NlcnZpY2V9IGZyb20gJy4vanNvbi11dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtQcm9ncmVzc1NlcnZpY2V9IGZyb20gJy4vcHJvZ3Jlc3Muc2VydmljZSc7XHJcbmltcG9ydCB7SXRlbVNlcnZpY2V9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29yZTNkL3NlcnZpY2UvaXRlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHtTY2VuZVNlcnZpY2V9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29yZTNkL2NvcmUvdXRpbHMnO1xyXG5pbXBvcnQge0V4cG9ydERpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC1kaWFsb2cvZXhwb3J0LWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQge0V4cG9ydFR5cGV9IGZyb20gJy4uL2VudW0vZXhwb3J0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7QXBpU2VydmljZU1vZHVsZX0gZnJvbSAnLi8zZG0tYXBpJztcclxuaW1wb3J0IHtDYW1lcmFTZXJ2aWNlfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9zZXJ2aWNlL2NhbWVyYS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgQnVmZmVyR2VvbWV0cnlVdGlscyBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vdXRpbHMvQnVmZmVyR2VvbWV0cnlVdGlscyc7XHJcblxyXG4vLyBjb25zdCBtdGxMb2FkZXIgPSBuZXcgTVRMTG9hZGVyKCk7XHJcbi8vIG10bExvYWRlci5zZXRNYXRlcmlhbE9wdGlvbnMoe2ludmVydFRyUHJvcGVydHk6IHRydWV9KTtcclxuLy8gY29uc3Qgbm9vcCA9ICgpID0+IHtcclxuLy8gfTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFV0aWxzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBjbGlwczogYW55ID0gW107XHJcblxyXG4gIHByaXZhdGUgX29iamVjdENhY2hlOiBNYXA8c3RyaW5nLCBPYmplY3QzRD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9rdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKTtcclxuICBwcml2YXRlIF91c2R6RXhwb3J0ZXIgPSBuZXcgVVNEWkV4cG9ydGVyKCk7XHJcbiAgcHJpdmF0ZSBfZ2x0ZkV4cG9ydGVyID0gbmV3IEdMVEZFeHBvcnRlcigpO1xyXG5cclxuICBwcml2YXRlIF9zY2VuZVJlbmRlck5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgX3NjZW5lUmVuZGVyQ29udGVudHM6IE9iamVjdDNEO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBhcGlTZXJ2aWNlTW9kdWxlOiBBcGlTZXJ2aWNlTW9kdWxlLFxyXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2pzb25VdGlsc1NlcnZpY2U6IEpzb25VdGlsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcm9ncmVzc1NlcnZpY2U6IFByb2dyZXNzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2l0ZW1zU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLl9pdGVtc1NlcnZpY2UucmVtb3ZlQWxsSXRlbXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NsZWFyQ2FjaGUoKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLl9jbGVhckNhY2hlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVhZEZpbGVBc1RleHQoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4gcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBpcyBhIHRocm90dGxlZCB2ZXJzaW9uIG9mIGdpdmVuIGZ1bmN0aW9uIGZ1bmMuIEVuZm9yY2VzIHRoYXQgdGhlcmUgaXMgYSBhbHdheXMgbWluaW11bSBhbW91bnQgb2YgdGltZVxyXG4gICAqIGJldHdlZW4gdHdvIHN1YnNlcXVlbnQgY2FsbHMgb2YgdGhlIGZ1bmN0aW9uLiBUYWlsIGNhbGxzIGFyZSBhbHdheXMgZXhlY3V0ZWQuIEluLWJldHdlZW4gY2FsbHMgYXJlIGxvc3QgYW5kIG5vdCBleGVjdXRlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXR1cm4gYXMgYSB0aHJvdHRsZWQgdmVyc2lvblxyXG4gICAqIEBwYXJhbSB0aHJvdHRsZU1zIE51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIHRocm90dGxlOiB0aGUgbWluaW11bSB0aW1lIGJldHdlZW4gYW55IHR3byBzdWJzZXF1ZW50IGZ1bmN0aW9uIGNhbGxzIG9mIGZ1bmN0aW9uXHJcbiAgICogQHBhcmFtIFt0aGlzQXJnXSBPcHRpb25hbGx5IHN1cHBseSB0aGUgdGhpcyBjb250ZXh0IG9mIHRoZSBjYWxsZXJcclxuICAgKiBAcmV0dXJucyBUaGUgZ2l2ZW4gZnVuY3Rpb24sIHdpdGggdGhlIGFib3ZlLW1lbnRpb25lZCB0aW1lIGNvbnN0cmFpbnRzXHJcbiAgICovXHJcbiAgcHVibGljIGdldEFzVGhyb3R0bGVkRnVuY3Rpb24oZnVuYzogYW55LCB0aHJvdHRsZU1zOiBudW1iZXIgPSAyNTAsIHRoaXNBcmc/OiBhbnkpOiBhbnkge1xyXG4gICAgbGV0IGxhc3RDYWxsVGltZTogbnVtYmVyO1xyXG4gICAgbGV0IGRlZmVyVGltZXI6IG51bWJlcjtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCk6IGFueSB7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IHRoaXNBcmcgfHwgdGhpcztcclxuICAgICAgY29uc3Qgbm93OiBhbnkgPSArbmV3IERhdGU7XHJcbiAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IGFyZ3VtZW50cztcclxuICAgICAgaWYgKGxhc3RDYWxsVGltZSAmJiBub3cgPCBsYXN0Q2FsbFRpbWUgKyB0aHJvdHRsZU1zKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVyVGltZXIpO1xyXG4gICAgICAgIGRlZmVyVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKTogYW55IHtcclxuICAgICAgICAgIGxhc3RDYWxsVGltZSA9IG5vdztcclxuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XHJcbiAgICAgICAgfSwgdGhyb3R0bGVNcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGFzdENhbGxUaW1lID0gbm93O1xyXG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZEpzb25Nb2RlbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLl9vYmplY3RDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XHJcbiAgICB9XHJcbiAgICBmaWxlUGF0aCA9IHRoaXMuX2luY2x1ZGVCYXNlVXJsKGZpbGVQYXRoKTtcclxuICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX2pzb25VdGlsc1NlcnZpY2UucmVhZEpzb25GaWxlKGZpbGVQYXRoLCBmYWxzZSk7XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgT2JqZWN0TG9hZGVyKCk7XHJcbiAgICBsb2FkZXIuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gbG9hZGVyLnBhcnNlKGpzb24pO1xyXG4gICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlUGF0aCwgb2JqKTtcclxuICAgICAgICByZXNvbHZlKG9iaik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRKc29uT2JqZWN0TW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBmaWxlUGF0aCA9IHRoaXMuX2luY2x1ZGVCYXNlVXJsKGZpbGVQYXRoKTtcclxuICAgIGlmICh0aGlzLl9vYmplY3RDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgT2JqZWN0TG9hZGVyKCk7XHJcbiAgICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oJ0Fub255bW91cycpO1xyXG4gICAgbG9hZGVyLnNldFJlc291cmNlUGF0aCgnJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsb2FkZXIubG9hZChmaWxlUGF0aCxcclxuICAgICAgICAob2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iajogT2JqZWN0M0QgPSAob2JqZWN0LnR5cGUgPT09ICdTY2VuZScgJiYgb2JqZWN0LmNoaWxkcmVuWzBdLnR5cGUgPT09ICdPYmplY3QzRCcpID8gb2JqZWN0LmNoaWxkcmVuWzBdIDogb2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGVQYXRoLCBvYmopO1xyXG4gICAgICAgICAgcmVzb2x2ZShvYmogYXMgT2JqZWN0M0QpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeGhyID0+IHRoaXMuX3Byb2dyZXNzU2VydmljZS5zZXRMb2FkZWQoZmlsZVBhdGgsIHhoci5sb2FkZWQpLFxyXG4gICAgICAgIGVycm9yID0+IHJlamVjdChlcnJvcilcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBsb2FkTXRsKG10bFVybDogc3RyaW5nKTogUHJvbWlzZTxNVExMb2FkZXIuTWF0ZXJpYWxDcmVhdG9yPiB7XHJcbiAgLy8gICAvLyBtdGxVcmwgPSB0aGlzLl9pbmNsdWRlQmFzZVVybChtdGxVcmwpO1xyXG4gIC8vICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAvL1xyXG4gIC8vICAgICBjb25zdCBtdGxEaXJlY3Rvcnk6IHN0cmluZyA9IG10bFVybC5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgKyAnLyc7XHJcbiAgLy8gICAgIC8vIG10bExvYWRlci5zZXRUZXh0dXJlUGF0aChtdGxEaXJlY3RvcnkpO1xyXG4gIC8vICAgICAvLyBtdGxMb2FkZXIuc2V0UmVzb3VQYXRoKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgpO1xyXG4gIC8vICAgICBtdGxMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oJ0Fub255bW91cycpO1xyXG4gIC8vICAgICBtdGxMb2FkZXIuc2V0UGF0aCh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoKTtcclxuICAvL1xyXG4gIC8vICAgICByZXR1cm4gbXRsTG9hZGVyLmxvYWQobXRsVXJsLCByZXNvbHZlLCBub29wLCByZWplY3QpO1xyXG4gIC8vXHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgX2Fic1Bvc2l0aW9uKGJnTWVzaDogTWVzaCk6IFZlY3RvcjMge1xyXG4gICAgYmdNZXNoLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSBiZ01lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3g7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBwb3NpdGlvbi5zdWJWZWN0b3JzKGJvdW5kaW5nQm94Lm1heCwgYm91bmRpbmdCb3gubWluKTtcclxuICAgIHBvc2l0aW9uLm11bHRpcGx5U2NhbGFyKDAuNSk7XHJcbiAgICBwb3NpdGlvbi5hZGQoYm91bmRpbmdCb3gubWluKTtcclxuICAgIHBvc2l0aW9uLmFwcGx5TWF0cml4NChiZ01lc2gubWF0cml4V29ybGQpO1xyXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRPYmpNb2RlbChmaWxlUGF0aDogc3RyaW5nLCBtdGxVcmw/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgLy8gZmlsZVBhdGggPSB0aGlzLl9pbmNsdWRlQmFzZVVybChmaWxlUGF0aCk7XHJcbiAgICAvLyBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAvLyBpZiAobXRsVXJsKSB7XHJcbiAgICAvLyAgIGNvbnN0IG1hdGVyaWFsQ3JlYXRvciA9IGF3YWl0IHRoaXMubG9hZE10bChtdGxVcmwpO1xyXG4gICAgLy8gICBtYXRlcmlhbENyZWF0b3IucHJlbG9hZCgpO1xyXG4gICAgLy8gICBvYmpMb2FkZXIuc2V0TWF0ZXJpYWxzKG1hdGVyaWFsQ3JlYXRvci5tYXRlcmlhbHMpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIC8vICAgb2JqTG9hZGVyLmxvYWQoXHJcbiAgICAvLyAgICAgZmlsZVBhdGgsXHJcbiAgICAvLyAgICAgKG5vZGU6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLmxvYWRHcm91cChub2RlKSk7XHJcbiAgICAvLyAgICAgfSxcclxuICAgIC8vICAgICB1bmRlZmluZWQsIHJlamVjdFxyXG4gICAgLy8gICApO1xyXG4gICAgLy8gfSk7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlUGF0aCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbmV3IE1UTExvYWRlcigpXHJcbiAgICAgICAgLnNldFBhdGgodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aClcclxuICAgICAgICAubG9hZChtdGxVcmwsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuICAgICAgICAgICAgbmV3IE9CSkxvYWRlcigpXHJcbiAgICAgICAgICAgICAgLnNldE1hdGVyaWFscyhtYXRlcmlhbHMpXHJcbiAgICAgICAgICAgICAgLnNldFBhdGgodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aClcclxuICAgICAgICAgICAgICAubG9hZChmaWxlUGF0aCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IHRoaXMuY2xlYW5lZFVwT2JqZWN0cyhvYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgb2JqLnRyYXZlcnNlKChjaGlsZDogT2JqZWN0M0QgfCBNZXNoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1lc2ggJiYgY2hpbGQubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRlcmlhbDogYW55W10gPSAhQXJyYXkuaXNBcnJheShjaGlsZC5tYXRlcmlhbCkgPyBbY2hpbGQubWF0ZXJpYWxdIDogY2hpbGQubWF0ZXJpYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtLm1hcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtLm1hcC5jb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGVQYXRoLCBvYmopO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvYmopO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHhociA9PiB0aGlzLl9wcm9ncmVzc1NlcnZpY2Uuc2V0TG9hZGVkKGZpbGVQYXRoLCB4aHIubG9hZGVkKVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkR2xiTW9kZWwoZmlsZTogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IGJvb2xlYW4gPSB0cnVlLCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8T2JqZWN0M0Q+IHtcclxuICAgIGlmIChyZWxhdGl2ZVBhdGgpIHtcclxuICAgICAgZmlsZSA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGggKyBmaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICAgIGxvYWRlci5zZXREUkFDT0xvYWRlcihuZXcgRFJBQ09Mb2FkZXIoKSk7XHJcbiAgICAgIGxvYWRlci5kcmFjb0xvYWRlci5zZXREZWNvZGVyUGF0aCh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZHJhY29QYXRoKTtcclxuICAgICAgbG9hZGVyLmRyYWNvTG9hZGVyLnNldERlY29kZXJDb25maWcoe3R5cGU6ICdqcyd9KTtcclxuICAgICAgbG9hZGVyLmxvYWQoZmlsZSxcclxuICAgICAgICBhc3luYyBvYmplY3QgPT4ge1xyXG4gICAgICAgICAgLy8gY29uc3Qgb2JqOiBPYmplY3QzRCA9IG5ldyBPYmplY3QzRCgpO1xyXG4gICAgICAgICAgLy8gb2JqZWN0LnNjZW5lLmNoaWxkcmVuLmZvckVhY2goKGM6IE9iamVjdDNEKSA9PiB7XHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNoaWxkcmVuLmZvckVhY2goZ2MgPT4gb2JqLmFkZChnYy5jbG9uZSgpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgKi9cclxuICAgICAgICAgIC8vIHJlc2V0IG9yaWdpbiBvZiBjaGlsZHJlbiBmb3IgZ3JvdXBzXHJcbiAgICAgICAgICAvLyBpZiAoYyBpbnN0YW5jZW9mIEdyb3VwKSB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IEJveDMoKS5zZXRGcm9tT2JqZWN0KGMpO1xyXG4gICAgICAgICAgLy8gICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFZlY3RvcjMoKTtcclxuICAgICAgICAgIC8vICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgICAgICAgLy8gICBjb25zdCBkZWx0YTogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuYWRkKGJiQ2VudGVyUGl2b3QpLnN1YihuZXcgVmVjdG9yMygwLCBjLnBvc2l0aW9uLnksIDApKTtcclxuICAgICAgICAgIC8vICAgYy5jaGlsZHJlbi5mb3JFYWNoKChjYykgPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGNjLnBvc2l0aW9uLmFkZChuZXcgVmVjdG9yMygwLCBjLnBvc2l0aW9uLnksIDApKTtcclxuICAgICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgICAvLyAgIGMucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICB0aGlzLmNsaXBzID0gb2JqZWN0LmFuaW1hdGlvbnMgfHwgW107XHJcbiAgICAgICAgICBjb25zdCBvYmo6IE9iamVjdDNEID0gdGhpcy5jbGVhbmVkVXBPYmplY3RzKG9iamVjdC5zY2VuZSwgY2xlYW5VcCk7XHJcbiAgICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQoZmlsZSwgb2JqKTtcclxuICAgICAgICAgIHJlc29sdmUob2JqKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHhociA9PiB0aGlzLl9wcm9ncmVzc1NlcnZpY2Uuc2V0TG9hZGVkKGZpbGUsIHhoci5sb2FkZWQpLFxyXG4gICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciEgJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkR2xiRnJvbUZpbGUoZmlsZTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPE9iamVjdDNEPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICAgIGxvYWRlci5wYXJzZShmaWxlLCAnJyxcclxuICAgICAgICBhc3luYyBvYmplY3QgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShvYmplY3QpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkR2xiUm9vbShmaWxlOiBzdHJpbmcpOiBQcm9taXNlPE9iamVjdDNEPiB7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGUpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLnByZXBhcmVEb3dubG9hZHMoW3ttb2RlbF91cmw6IGZpbGV9XSk7XHJcbiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICAgIGxvYWRlci5sb2FkKGZpbGUsXHJcbiAgICAgICAgYXN5bmMgb2JqZWN0ID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iajogT2JqZWN0M0QgPSBvYmplY3Quc2NlbmU7XHJcbiAgICAgICAgICBvYmoudHJhdmVyc2UoYyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdnbGFzJykgPCAwICYmICgoYy5wYXJlbnQgJiYgYy5wYXJlbnQubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2dsYXMnKSA8IDApIHx8ICFjLnBhcmVudCkpIHtcclxuICAgICAgICAgICAgICBjLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGMucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGUsIG9iaik7XHJcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc1NlcnZpY2UuZmluaXNoRG93bmxvYWRzKCk7XHJcbiAgICAgICAgICByZXNvbHZlKG9iaik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB4aHIgPT4gdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLnNldExvYWRlZChmaWxlLCB4aHIubG9hZGVkKSxcclxuICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IhICcsIGVycm9yKTtcclxuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzU2VydmljZS5maW5pc2hEb3dubG9hZHMoKTtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2F2ZVJvb21Bc0dsYigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVsZW1lbnRzVG9SZW1vdmUgPSBbJ2dyb3VuZC1wbGFuZScsICdodWQtcmluZycsICdodWQtY2lyY2xlJywgJ3JvdGF0aW9uQ2lyY2xlJ107XHJcbiAgICBsZXQgc2NlbmU6IFNjZW5lO1xyXG4gICAgc2NlbmUgPSB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUuY2xvbmUoKTtcclxuICAgIHNjZW5lLmNoaWxkcmVuLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICBzY2VuZS5yZW1vdmUoYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZWxlbWVudHNUb1JlbW92ZS5mb3JFYWNoKGVsZW1lbnROYW1lID0+IHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPYmplY3Q6IE9iamVjdDNEID0gc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgICAgc2NlbmUucmVtb3ZlKHNlbGVjdGVkT2JqZWN0KTtcclxuICAgIH0pO1xyXG4gICAgc2NlbmUubmFtZSA9ICdtcnBfcm9vbSc7XHJcbiAgICB0aGlzLl9kb3dubG9hZDNETW9kZWxBc0dMQihzY2VuZSk7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHNjZW5lKTtcclxuICAgIHNjZW5lID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwcmVwUm9vbUZvclJlbmRlcihzdGFuZGFsb25lOiBib29sZWFuID0gZmFsc2UsIHJlbmRlclBhcmFtZXRlcnM6IGFueSwgcmVuZGVyUHJldmlldzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjYW1lcmE6IFBlcnNwZWN0aXZlQ2FtZXJhID0gdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmE7XHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlID0gWydncm91bmQtcGxhbmUnLCAnaHVkLXJpbmcnLCAnaHVkLWNpcmNsZScsICdyb3RhdGlvbkNpcmNsZSddO1xyXG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcclxuICAgICAgZWxlbWVudHNUb1JlbW92ZS5wdXNoKCdmbG9vci1wbGFuZScpO1xyXG4gICAgfVxyXG4gICAgbGV0IHNjZW5lOiBTY2VuZTtcclxuICAgIHNjZW5lID0gdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lLmNsb25lKCk7XHJcbiAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgc2NlbmUucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCByZW5hbWVNZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlmIChjLm5hbWUgJiYgYy5uYW1lLmluZGV4T2YoJ2VkZ2UnKSA+IC0xKSB7XHJcbiAgICAgICAgYy50cmF2ZXJzZShjYyA9PiB7XHJcbiAgICAgICAgICBpZiAoY2MgaW5zdGFuY2VvZiBNZXNoICYmIGNjLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNjLm1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICAgIGNjLm1hdGVyaWFsLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5vcGFjaXR5ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlbmFtZU1lc2ggPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChjYy5tYXRlcmlhbC5vcGFjaXR5ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZW5hbWVNZXNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVuYW1lTWVzaCkge1xyXG4gICAgICAgIGMubmFtZSA9IGBDVUxMSU5HXyR7Yy5uYW1lfWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCByZW5hbWVDZWlsaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlmIChjLm5hbWUgPT09ICdjZWlsaW5nUGxhbmUtcGxhbmUnKSB7XHJcbiAgICAgICAgYy50cmF2ZXJzZShjYyA9PiB7XHJcbiAgICAgICAgICBpZiAoY2MgaW5zdGFuY2VvZiBNZXNoICYmIGNjLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNjLm1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICAgIGNjLm1hdGVyaWFsLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5zaWRlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlbmFtZUNlaWxpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChjYy5tYXRlcmlhbC5zaWRlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZW5hbWVDZWlsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlbmFtZUNlaWxpbmcpIHtcclxuICAgICAgICBjLm5hbWUgPSBgQ1VMTElOR18ke2MubmFtZX1gO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYy5uYW1lICYmIGMubmFtZS5pbmRleE9mKCdlZGdlJykgPiAtMSkgeyAvLyB3YWxscyBzaG91bGQgYWxsIGJlIHZpc2libGVcclxuICAgICAgICBjLnRyYXZlcnNlKGNjID0+IHtcclxuICAgICAgICAgIGlmIChjYyBpbnN0YW5jZW9mIE1lc2ggJiYgY2MubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2MubWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgICAgY2MubWF0ZXJpYWwuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgIG0ub3BhY2l0eSA9IDA7XHJcbiAgICAgICAgICAgICAgICBtLnRyYW5zcGFyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBtLmRlcHRoV3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbS5kZXB0aFRlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNjLm1hdGVyaWFsLm9wYWNpdHkgPSAwO1xyXG4gICAgICAgICAgICAgIGNjLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY2MubWF0ZXJpYWwuZGVwdGhXcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY2MubWF0ZXJpYWwuZGVwdGhUZXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjYyBpbnN0YW5jZW9mIE1lc2ggJiYgY2MuZ2VvbWV0cnkpIHtcclxuICAgICAgICAgICAgaWYgKCFjYy5nZW9tZXRyeS5pbmRleCkge1xyXG4gICAgICAgICAgICAgIGNjLmdlb21ldHJ5ID0gQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZVZlcnRpY2VzKGNjLmdlb21ldHJ5KTtcclxuICAgICAgICAgICAgICBjYy5nZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNjLmdlb21ldHJ5LmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJOYW1lKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBjYy5nZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJOYW1lXS5hcnJheTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoYXJyYXlbaV0pIHx8IGlzTmFOKGFycmF5W2ldKSkge1xyXG4gICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IDA7IC8vIFNldCBpdCBzbyBzb21lIHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNjLmdlb21ldHJ5LmF0dHJpYnV0ZXNbYXR0ck5hbWVdLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFjLnZpc2libGUpIHtcclxuICAgICAgICAgIGMubmFtZSA9IGBDVUxMSU5HXyR7Yy5uYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0OiBPYmplY3QzRCA9IHNjZW5lLmdldE9iamVjdEJ5TmFtZShlbGVtZW50TmFtZSk7XHJcbiAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICB9KTtcclxuICAgIHNjZW5lLm5hbWUgPSAnbXJwX3Jvb21fJyArIHNjZW5lLnV1aWQ7XHJcbiAgICB0aGlzLl9jcmVhdGVHTEJGb3JBUEkoc2NlbmUsIGNhbWVyYSwgc3RhbmRhbG9uZSwgcmVuZGVyUGFyYW1ldGVycywgcmVuZGVyUHJldmlldyk7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHNjZW5lKTtcclxuICAgIHNjZW5lID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNhdmVkUm9vbVJlbmRlclNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2NlbmVSZW5kZXJOYW1lID0gJyc7XHJcbiAgICB0aGlzLl9zY2VuZVJlbmRlckNvbnRlbnRzID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVHTEJGb3JBUEkoXHJcbiAgICBvYmplY3Q6IE9iamVjdDNELFxyXG4gICAgY2FtZXJhOiBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICAgIHN0YW5kYWxvbmU6IGJvb2xlYW4sXHJcbiAgICByZW5kZXJQYXJhbWV0ZXJzOiBhbnksXHJcbiAgICByZW5kZXJQcmV2aWV3OiBib29sZWFuXHJcbiAgKTogdm9pZCB7XHJcbiAgICAvLyBDaGVjayBpZiB3ZSd2ZSBtYWRlIGEgcmVuZGVyIGFscmVhZHksIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IHN0YW5kYWxvbmVcclxuICAgIC8vIER1ZSB0byBjdWxsaW5nLCB3ZSBjYW4ndCByZXVzZSB0aGUgc2FtZSBHTEIuXHJcbiAgICAvLyBpZiAodGhpcy5fc2NlbmVSZW5kZXJOYW1lICE9PSAnJyAmJiAhc3RhbmRhbG9uZSkge1xyXG4gICAgLy8gICAvLyBMb29rcyBsaWtlIHdlIGRpZFxyXG4gICAgLy8gICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxvYWRpbmdJbmRpY2F0b3IpO1xyXG4gICAgLy8gICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2hvd0xvYWRpbmdJbmRpY2F0b3IsIHt0aXRsZTogJ1JlbmRlcmluZy4uLid9KTtcclxuICAgIC8vICAgdGhpcy5hcGlTZXJ2aWNlTW9kdWxlLnJlcXVlc3RSZW5kZXIodGhpcy5fc2NlbmVSZW5kZXJOYW1lLCBjYW1lcmEsIHN0YW5kYWxvbmUsIHJlbmRlclBhcmFtZXRlcnMsIHJlbmRlclByZXZpZXcpO1xyXG4gICAgLy9cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICB0cnM6IGZhbHNlLFxyXG4gICAgICBvbmx5VmlzaWJsZTogdHJ1ZSxcclxuICAgICAgdHJ1bmNhdGVEcmF3UmFuZ2U6IHRydWUsXHJcbiAgICAgIGJpbmFyeTogdHJ1ZSxcclxuICAgICAgbWF4VGV4dHVyZVNpemU6IEluZmluaXR5XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX2dsdGZFeHBvcnRlci5wYXJzZShvYmplY3QsIChyZXN1bHQ6IEFycmF5QnVmZmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lOiBzdHJpbmcgPSBgJHtvYmplY3QubmFtZX0uZ2xiYDtcclxuICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtyZXN1bHRdLCBmaWxlbmFtZSwge1xyXG4gICAgICAgIHR5cGU6ICdtb2RlbC9nbHRmLWJpbmFyeScsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9zY2VuZVJlbmRlck5hbWUgPSBmaWxlbmFtZTtcclxuICAgICAgdGhpcy5fc2NlbmVSZW5kZXJDb250ZW50cyA9IG9iamVjdDtcclxuICAgICAgdGhpcy5fc2VuZEZpbGVUb0FwaShmaWxlLCBmaWxlbmFtZSwgY2FtZXJhLCBzdGFuZGFsb25lLCByZW5kZXJQYXJhbWV0ZXJzLCByZW5kZXJQcmV2aWV3KTtcclxuICAgIH0sICgpID0+IHtcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2VuZEZpbGVUb0FwaShcclxuICAgIGZpbGU6IEZpbGUsXHJcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxyXG4gICAgY2FtZXJhOiBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICAgIHN0YW5kYWxvbmU6IGJvb2xlYW4sXHJcbiAgICByZW5kZXJQYXJhbWV0ZXJzOiBhbnksXHJcbiAgICByZW5kZXJQcmV2aWV3OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZ2xiJywgZmlsZSk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2VNb2R1bGUudXBsb2FkVG9BcGlHTEIoZm9ybURhdGEsIGZpbGVuYW1lLCBjYW1lcmEsIHN0YW5kYWxvbmUsIHJlbmRlclBhcmFtZXRlcnMsIHJlbmRlclByZXZpZXcpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkR2xiU291cmNlKGZpbGU6IHN0cmluZyk6IFByb21pc2U8T2JqZWN0M0Q+IHtcclxuICAgIGNvbnN0IG9iaiA9IGF3YWl0IHRoaXMubG9hZEdsYk1vZGVsKGZpbGUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICBvYmouY2hpbGRyZW4gPSBvYmouY2hpbGRyZW4uZmlsdGVyKGMgPT4gIShjIGluc3RhbmNlb2YgQ2FtZXJhKSk7XHJcbiAgICBvYmouY2hpbGRyZW4uc29ydCgoYSwgYikgPT4gYVsnbmFtZSddIDwgYlsnbmFtZSddID8gMSA6IC0xKTtcclxuICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjOiBPYmplY3QzRCkgPT4ge1xyXG4gICAgICBjLnRyYXZlcnNlKCh0OiBPYmplY3QzRCkgPT4ge1xyXG4gICAgICAgIHQudmlzaWJsZSA9ICF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjXycpICYmICF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwXycpO1xyXG4gICAgICB9KTtcclxuICAgICAgYy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIGlmIChvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG9iai5jaGlsZHJlblswXSBpbnN0YW5jZW9mIEdyb3VwKSB7IC8vIGZsYXR0ZW4gY2hpbGRyZW5cclxuICAgICAgY29uc3QgY2hpbGRyZW46IGFueSA9IG9iai5jaGlsZHJlblswXS5jaGlsZHJlbi5zbGljZSgpO1xyXG4gICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBvYmouY2hpbGRyZW5bMF0ubmFtZTtcclxuICAgICAgb2JqLmNoaWxkcmVuLmxlbmd0aCA9IDA7XHJcbiAgICAgIGNvbnN0IHBhcmVudDogT2JqZWN0M0QgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgICAgcGFyZW50Lm5hbWUgPSBuYW1lO1xyXG4gICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgICAgb2JqLmFkZChwYXJlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RXhwb3J0RGlhbG9nKG9iamVjdDogT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4cG9ydERpYWxvZyA9IHRoaXMuX2RpYWxvZy5vcGVuKEV4cG9ydERpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzQwMHB4J1xyXG4gICAgfSk7XHJcbiAgICBleHBvcnREaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoYXN5bmMgKHR5cGU6IEV4cG9ydFR5cGUpID0+IHtcclxuICAgICAgaWYgKHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZSA9PT0gRXhwb3J0VHlwZS5HTEIpIHtcclxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkM0RNb2RlbEFzR0xCKG9iamVjdCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBFeHBvcnRUeXBlLlVTRFopIHtcclxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkM0RNb2RlbEFzVVNEWihvYmplY3QpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRXhwb3J0VHlwZS5CT1RIKSB7XHJcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZDNETW9kZWxBc1VTRFoob2JqZWN0KTtcclxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkM0RNb2RlbEFzR0xCKG9iamVjdCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBFeHBvcnRUeXBlLlRIVU1CKSB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZUNhbnZhc0ltYWdlKG9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgdGV4dHVyZUZyb21VcmwodXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgLy8gdXJsID0gdGhpcy5faW5jbHVkZUJhc2VVcmwodXJsKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xyXG4gICAgICAvLyB0ZXh0dXJlTG9hZGVyLnNldEJhc2VVKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgpO1xyXG4gICAgICB0ZXh0dXJlTG9hZGVyLmxvYWQodXJsLFxyXG4gICAgICAgICh0ZXh0dXJlOiBUZXh0dXJlKSA9PiB7XHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XHJcbiAgICAgICAgICB0ZXh0dXJlLnJlcGVhdC5zZXQoMSwgMSk7XHJcbiAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRleHR1cmUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICByZWplY3RcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcmNlQ2hhbmdlRGV0ZWN0aW9uKGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgY29tcG9uZW50OiBhbnksIHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbHVlID0gY29tcG9uZW50W3Byb3BOYW1lXTtcclxuICAgIGNvbXBvbmVudFtwcm9wTmFtZV0gPSBudWxsO1xyXG4gICAgY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgY29tcG9uZW50W3Byb3BOYW1lXSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEtUWDJMb2FkZXIoKTogS1RYMkxvYWRlciB7XHJcbiAgICB0aGlzLl9rdHgyTG9hZGVyLmRldGVjdFN1cHBvcnQodGhpcy5fc2NlbmVTZXJ2aWNlLnJlbmRlcmVyKTtcclxuICAgIHJldHVybiB0aGlzLl9rdHgyTG9hZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRvd25sb2FkVVNEWmZvckFSSU9TKG9iamVjdDogT2JqZWN0M0QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGV4cG9ydGVyID0gbmV3IFVTRFpFeHBvcnRlcigpO1xyXG4gICAgY29uc3QgYXJyYXlidWZmZXIgPSBhd2FpdCBleHBvcnRlci5wYXJzZUFzeW5jKG9iamVjdCk7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2FycmF5YnVmZmVyXSwge3R5cGU6ICdtb2RlbC92bmQudXNkeit6aXAnfSk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgZWxlbWVudC5ocmVmID0gdXJsO1xyXG4gICAgZWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICBlbGVtZW50LmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFuZWRVcE9iamVjdHMob2JqZWN0OiBPYmplY3QzRCwgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiBPYmplY3QzRCB7XHJcbiAgICBsZXQgb2JqOiBPYmplY3QzRCA9IG5ldyBPYmplY3QzRCgpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5jbGlwcyk7XHJcbiAgICBvYmplY3QuY2hpbGRyZW4uZm9yRWFjaCgoYzogT2JqZWN0M0QpID0+IHtcclxuICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIENhbWVyYSkpIHtcclxuICAgICAgICBpZiAoY2xlYW5VcCAmJiBjIGluc3RhbmNlb2YgR3JvdXAgfHwgKGMuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBHcm91cCkpIHtcclxuICAgICAgICAgIHRoaXMuX2FkZEdyb3VwQ2hpbGRyZW5Ub09iamVjdChjLCBvYmopO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKGNsZWFuVXAgJiYgIShjIGluc3RhbmNlb2YgTWVzaCkpIHx8ICghKGMgaW5zdGFuY2VvZiBNZXNoKSAmJiAhYy5uYW1lICYmIGMuY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQudHJhbnNsYXRlWShjLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjLnRyYW5zbGF0ZVkoLWMucG9zaXRpb24ueSk7XHJcbiAgICAgICAgICBpZiAob2JqLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JqLmFkZChjLmNsb25lKCkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb2JqID0gYy5jbG9uZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpZiAoYy5wb3NpdGlvbi55ID4gMCB8fCBjLnBvc2l0aW9uLnkgPCAwKSB7XHJcbiAgICAgICAgICAvLyAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgIC8vICAgICBjaGlsZC50cmFuc2xhdGVZKGMucG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgLy8gICBjLnRyYW5zbGF0ZVkoLWMucG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICBvYmouYWRkKGMuY2xvbmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IEJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFZlY3RvcjMoKTtcclxuICAgIGJvdW5kaW5nQm94LmdldENlbnRlcihiYkNlbnRlclBpdm90KTtcclxuICAgIGNvbnN0IGRlbHRhOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKS5hZGQoYmJDZW50ZXJQaXZvdCkubmVnYXRlKCk7XHJcbiAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2MpID0+IHtcclxuICAgICAgY2MucG9zaXRpb24uYWRkKGRlbHRhKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rvd25sb2FkM0RNb2RlbEFzR0xCKG9iamVjdDogT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHRyczogZmFsc2UsXHJcbiAgICAgIG9ubHlWaXNpYmxlOiB0cnVlLFxyXG4gICAgICB0cnVuY2F0ZURyYXdSYW5nZTogdHJ1ZSxcclxuICAgICAgYmluYXJ5OiB0cnVlLFxyXG4gICAgICBtYXhUZXh0dXJlU2l6ZTogMjA0OFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9nbHRmRXhwb3J0ZXIucGFyc2Uob2JqZWN0LCAocmVzdWx0OiBBcnJheUJ1ZmZlcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW3Jlc3VsdF0sIHt0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pO1xyXG4gICAgICB0aGlzLl9kb3dubG9hZEZpbGUoYCR7b2JqZWN0Lm5hbWV9LmdsYmAsIGZpbGUpO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgfSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9kb3dubG9hZDNETW9kZWxBc1VTRFoob2JqZWN0OiBPYmplY3QzRCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gY29uc3QgYXJyYXlidWZmZXI6IGFueSA9ICBhd2FpdCB0aGlzLl91c2R6RXhwb3J0ZXIucGFyc2Uob2JqZWN0KTtcclxuICAgIC8vIGNvbnN0IGJsb2I6IEJsb2IgPSBuZXcgQmxvYihbYXJyYXlidWZmZXJdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9KTtcclxuXHJcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBVU0RaRXhwb3J0ZXIoKTtcclxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gYXdhaXQgZXhwb3J0ZXIucGFyc2VBc3luYyhvYmplY3QpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJheWJ1ZmZlcl0sIHt0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pO1xyXG5cclxuXHJcbiAgICB0aGlzLl9kb3dubG9hZEZpbGUoYCR7b2JqZWN0Lm5hbWV9LnVzZHpgLCBibG9iKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rvd25sb2FkRmlsZShmaWxlTmFtZTogc3RyaW5nLCBibG9iOiBCbG9iKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICBlbGVtZW50LmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgZWxlbWVudC5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgIGVsZW1lbnQuY2xpY2soKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlQ2FudmFzSW1hZ2Uob2JqZWN0OiBPYmplY3QzRCk6IHN0cmluZyB7XHJcbiAgICAvLyBDcmVhdGUgYSBjYW52YXMgYW5kIFdlYkdMIHJlbmRlcmVyIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kXHJcbiAgICBjb25zdCBvZmZzY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe1xyXG4gICAgICBjYW52YXM6IG9mZnNjcmVlbkNhbnZhcyxcclxuICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgIGFudGlhbGlhczogdHJ1ZSxcclxuICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLCAvLyBLZWVwcyB0aGUgcmVuZGVyZWQgaW1hZ2UgaW50YWN0XHJcbiAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBFbnN1cmUgdGhlIG9iamVjdCBzdGF5cyBjZW50ZXJlZCBieSBhZGp1c3RpbmcgdGhlIGNhbWVyYSdzIHZpZXdcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iamVjdCk7XHJcbiAgICBjb25zdCBzaXplID0gYm91bmRpbmdCb3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJvdW5kaW5nQm94LmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuXHJcbiAgICAvLyBTZXQgYSByZWFzb25hYmxlIGNhbnZhcyBzaXplIGZvciB0aGUgb3V0cHV0IGltYWdlXHJcbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHNpemUueCAvIHNpemUueTtcclxuICAgIGxldCB3aWR0aCA9IDE2MDA7XHJcbiAgICBsZXQgaGVpZ2h0ID0gMTYwMDtcclxuICAgIGlmIChhc3BlY3RSYXRpbyA+IDIpIHtcclxuICAgICAgLy8gV2lkZSBtb2RlbCDihpIgYWRqdXN0IGhlaWdodCB0byBtYWludGFpbiBhc3BlY3QgcmF0aW9cclxuICAgICAgaGVpZ2h0ID0gMTIwMDtcclxuICAgIH0gZWxzZSBpZiAoYXNwZWN0UmF0aW8gPCAyKSB7XHJcbiAgICAgIC8vIFRhbGwgbW9kZWwg4oaSIGFkanVzdCB3aWR0aCB0byBtYWludGFpbiBhc3BlY3QgcmF0aW9cclxuICAgICAgd2lkdGggPSAxMjAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjbGVhciBjb2xvciB0byB0cmFuc3BhcmVudCAoYWxwaGE6IHRydWUgbWFrZXMgdGhpcyBiYWNrZ3JvdW5kIHRyYW5zcGFyZW50KVxyXG4gICAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbygyKTtcclxuICAgIHJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHgwMDAwMDAsIDApOyAvLyBUcmFuc3BhcmVudCBiYWNrZ3JvdW5kXHJcbiAgICByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7XHJcbiAgICByZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7XHJcbiAgICByZW5kZXJlci50b25lTWFwcGluZyA9IFRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZztcclxuICAgIHJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjI7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgc2NlbmUgYW5kIGNhbWVyYSBmb3IgcmVuZGVyaW5nXHJcbiAgICBjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gICAgY29uc3QgY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDQ1LCB3aWR0aCAvIGhlaWdodCwgMC4xLCAxMDAwKTtcclxuXHJcbiAgICAvLyBUaWx0IHRoZSBvYmplY3QgaXRzZWxmIChyb3RhdGUgdGhlIG1vZGVsKVxyXG4gICAgb2JqZWN0LnJvdGF0aW9uLnggPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoMCk7IC8vIFNsaWdodCB0aWx0IGRvd25cclxuICAgIG9iamVjdC5yb3RhdGlvbi55ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDApOyAgLy8gU2xpZ2h0IHJvdGF0aW9uIHRvIHRoZSBsZWZ0XHJcbiAgICBvYmplY3Qucm90YXRpb24ueiA9IDA7XHJcbiAgICBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICBzY2VuZS5hZGQob2JqZWN0KTtcclxuXHJcbiAgICAvLyBBZGQgbGlnaHRpbmcgdG8gdGhlIHNjZW5lXHJcbiAgICBjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAyKTsgLy8gQnJpZ2h0IGFtYmllbnQgbGlnaHRcclxuICAgIHNjZW5lLmFkZChhbWJpZW50TGlnaHQpO1xyXG5cclxuICAgIGNvbnN0IGRpcmVjdGlvbmFsTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMi41KTtcclxuICAgIGRpcmVjdGlvbmFsTGlnaHQucG9zaXRpb24uc2V0KDUsIDEwLCA1KTsgLy8gQWRqdXN0ZWQgbGlnaHQgcG9zaXRpb25cclxuICAgIC8vIGRpcmVjdGlvbmFsTGlnaHQuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICBzY2VuZS5hZGQoZGlyZWN0aW9uYWxMaWdodCk7XHJcblxyXG4gICAgLy8gQWRqdXN0IHRoZSBjYW1lcmEgcG9zaXRpb25cclxuICAgIGNvbnN0IG1heERpbWVuc2lvbiA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSBtYXhEaW1lbnNpb24gKiAyOyAvLyBJbmNyZWFzZSB6b29tLWluXHJcbiAgICBjYW1lcmEucG9zaXRpb24uc2V0KGNlbnRlci54IC0gZGlzdGFuY2UgKiAwLjMsIGNlbnRlci55ICsgZGlzdGFuY2UgKiAwLjMsIGRpc3RhbmNlKTsgLy8gVmlldyBmcm9tIGFib3ZlICYgZnJvbnRcclxuICAgIGNhbWVyYS5sb29rQXQoY2VudGVyKTtcclxuICAgIGNhbWVyYS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcclxuICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBzY2VuZSB3aXRoIHRoZSBjYW1lcmFcclxuICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcclxuXHJcbiAgICBjb25zdCBpbWFnZURhdGEgPSBvZmZzY3JlZW5DYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcclxuXHJcbiAgICByZW5kZXJlci5kaXNwb3NlKCk7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHNjZW5lKTtcclxuICAgIG9mZnNjcmVlbkNhbnZhcy5yZW1vdmUoKTtcclxuXHJcbiAgICByZXR1cm4gaW1hZ2VEYXRhO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBjcmVhdGVUaHVtYm5haWxJbWFnZShvYmplY3Q6IE9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIC8vIENyZWF0ZSBhIGNhbnZhcyBhbmQgV2ViR0wgcmVuZGVyZXIgd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmRcclxuICAgIGNvbnN0IG9mZnNjcmVlbkNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7XHJcbiAgICAgIGNhbnZhczogb2Zmc2NyZWVuQ2FudmFzLFxyXG4gICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgYW50aWFsaWFzOiB0cnVlLFxyXG4gICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsIC8vIEtlZXBzIHRoZSByZW5kZXJlZCBpbWFnZSBpbnRhY3RcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNldCBhIHJlYXNvbmFibGUgY2FudmFzIHNpemUgZm9yIHRoZSBvdXRwdXQgaW1hZ2VcclxuICAgIGNvbnN0IHdpZHRoID0gMjAwO1xyXG4gICAgY29uc3QgaGVpZ2h0ID0gMjAwO1xyXG4gICAgcmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAvLyBTZXQgdGhlIGNsZWFyIGNvbG9yIHRvIHRyYW5zcGFyZW50IChhbHBoYTogdHJ1ZSBtYWtlcyB0aGlzIGJhY2tncm91bmQgdHJhbnNwYXJlbnQpXHJcbiAgICByZW5kZXJlci5zZXRQaXhlbFJhdGlvKDEpO1xyXG4gICAgcmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweEZGRkZGRiwgMSk7IC8vIFRyYW5zcGFyZW50IGJhY2tncm91bmRcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBzY2VuZSBhbmQgY2FtZXJhIGZvciByZW5kZXJpbmdcclxuICAgIGNvbnN0IHNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNDUsIHdpZHRoIC8gaGVpZ2h0LCAwLjEsIDEwMDApO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgb2JqZWN0IHRvIHRoZSBzY2VuZVxyXG4gICAgLy8gVGlsdCB0aGUgb2JqZWN0IGl0c2VsZiAocm90YXRlIHRoZSBtb2RlbClcclxuICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDApOyAvLyBTbGlnaHQgdGlsdCBkb3duXHJcbiAgICBvYmplY3Qucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgwKTsgIC8vIFNsaWdodCByb3RhdGlvbiB0byB0aGUgbGVmdFxyXG4gICAgb2JqZWN0LnJvdGF0aW9uLnogPSAwO1xyXG4gICAgc2NlbmUuYWRkKG9iamVjdCk7XHJcblxyXG4gICAgLy8gQWRkIGxpZ2h0aW5nIHRvIHRoZSBzY2VuZVxyXG4gICAgY29uc3QgYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMik7IC8vIEJyaWdodCBhbWJpZW50IGxpZ2h0XHJcbiAgICBzY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcclxuXHJcbiAgICBjb25zdCBkaXJlY3Rpb25hbExpZ2h0ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsIDIuNSk7XHJcbiAgICBkaXJlY3Rpb25hbExpZ2h0LnBvc2l0aW9uLnNldCg1LCAxMCwgNSk7IC8vIEFkanVzdGVkIGxpZ2h0IHBvc2l0aW9uXHJcbiAgICBzY2VuZS5hZGQoZGlyZWN0aW9uYWxMaWdodCk7XHJcblxyXG4gICAgLy8gRW5zdXJlIHRoZSBvYmplY3Qgc3RheXMgY2VudGVyZWQgYnkgYWRqdXN0aW5nIHRoZSBjYW1lcmEncyB2aWV3XHJcbiAgICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpO1xyXG4gICAgY29uc3Qgc2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBjZW50ZXIgPSBib3VuZGluZ0JveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcblxyXG4gICAgLy8gQWRqdXN0IHRoZSBjYW1lcmEgcG9zaXRpb25cclxuICAgIGNvbnN0IG1heERpbWVuc2lvbiA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSBtYXhEaW1lbnNpb24gKiAxLjU7IC8vIEluY3JlYXNlIHpvb20taW5cclxuICAgIGNhbWVyYS5wb3NpdGlvbi5zZXQoY2VudGVyLnggLSBkaXN0YW5jZSAqIDAuMywgY2VudGVyLnkgKyBkaXN0YW5jZSAqIDAuMywgZGlzdGFuY2UpOyAvLyBWaWV3IGZyb20gYWJvdmUgJiBmcm9udFxyXG4gICAgY2FtZXJhLmxvb2tBdChjZW50ZXIpO1xyXG4gICAgY2FtZXJhLmFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xyXG4gICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcbiAgICAvLyBSZW5kZXIgdGhlIHNjZW5lIHdpdGggdGhlIGNhbWVyYVxyXG4gICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xyXG5cclxuICAgIGNvbnN0IGltYWdlRGF0YSA9IG9mZnNjcmVlbkNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjgpO1xyXG5cclxuICAgIHJlbmRlcmVyLmRpc3Bvc2UoKTtcclxuICAgIFV0aWxzLkRpc3Bvc2VPYmplY3Qoc2NlbmUpO1xyXG4gICAgb2Zmc2NyZWVuQ2FudmFzLnJlbW92ZSgpO1xyXG5cclxuICAgIHJldHVybiBpbWFnZURhdGE7XHJcbiAgICAvLyBOb3cgeW91IGNhbiB1c2UgdGhlIGBpbWFnZURhdGFgIFVSTCBmb3IgZGlzcGxheSBvciBkb3dubG9hZFxyXG4gICAgLy8gdGhpcy5fZG93bmxvYWRJbWFnZShgJHtvYmplY3QubmFtZX1fdGh1bWJuYWlsLmpwZ2AsIGltYWdlRGF0YSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfZG93bmxvYWRJbWFnZShmaWxlTmFtZTogc3RyaW5nLCBpbWFnZURhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gQ3JlYXRlIGEgbGluayBhbmQgdHJpZ2dlciB0aGUgZG93bmxvYWRcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSBpbWFnZURhdGE7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRHcm91cChub2RlOiBhbnkpOiBHcm91cCB7XHJcbiAgICBjb25zdCBncm91cDogR3JvdXAgPSBub2RlLmRldGFpbC5sb2FkZXJSb290Tm9kZTtcclxuICAgIGlmIChncm91cC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XHJcbiAgICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKG1lc2g6IE1lc2gpID0+IHtcclxuICAgICAgICBtZXNoLnBvc2l0aW9uLmNvcHkodGhpcy5fYWJzUG9zaXRpb24obWVzaCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIF9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoZ3JvdXA6IE9iamVjdDNELCBvYmo6IE9iamVjdDNELCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgZ3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoZ2M6IE9iamVjdDNEKSA9PiB7XHJcbiAgICAgIGlmIChjbGVhblVwICYmIGdjIGluc3RhbmNlb2YgR3JvdXApIHtcclxuICAgICAgICB0aGlzLl9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoZ2MsIG9iaik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZ2MudHJhbnNsYXRlWCgtZ3JvdXAucG9zaXRpb24ueCk7XHJcbiAgICAgICAgZ2MudHJhbnNsYXRlWShncm91cC5wb3NpdGlvbi55KTtcclxuICAgICAgICAvLyBnYy50cmFuc2xhdGVaKC1ncm91cC5wb3NpdGlvbi56KTtcclxuICAgICAgICBvYmouYWRkKGdjLmNsb25lKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2l0ZXJhdGVDaGlsZHJlbihjaGlsZHJlbjogT2JqZWN0M0RbXSwgY2FsbGJhY2s6IChjaGlsZDogTWVzaCkgPT4ge30pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQ6IE9iamVjdDNEID0gY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1lc2gpIHtcclxuICAgICAgICBjYWxsYmFjayhjaGlsZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faXRlcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBjYWxsYmFjayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luY2x1ZGVCYXNlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh1cmxbMF0gPT09ICcuJykge1xyXG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgnLicsICcnKTtcclxuICAgIH1cclxuICAgIGlmICh1cmxbMF0gPT09ICcvJykge1xyXG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgnLycsICcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoICsgdXJsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9ianM6IE9iamVjdDNEW10gPSBBcnJheS5mcm9tKHRoaXMuX29iamVjdENhY2hlLnZhbHVlcygpKTtcclxuICAgIG9ianMuZm9yRWFjaChvID0+IFV0aWxzLkRpc3Bvc2VPYmplY3QobykpO1xyXG4gICAgdGhpcy5fb2JqZWN0Q2FjaGUuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
820
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBb0IsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUVKLFFBQVEsRUFDUixZQUFZLEVBRVosY0FBYyxFQUNkLGNBQWMsRUFFZCxhQUFhLEVBQ2IsT0FBTyxFQUNSLE1BQU0sT0FBTyxDQUFDO0FBQ2Ysd0RBQXdEO0FBQ3hELHVEQUF1RDtBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFdkUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSx3RUFBd0U7QUFDeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBUXZFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUN6RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFJcEQsT0FBTyxLQUFLLG1CQUFtQixNQUFNLDhDQUE4QyxDQUFDO0FBQ3BGLE9B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QkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVc7UUFDakMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2xCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNsQixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUN4RCxDQUFDO0lBRU8sV0FBVztRQUNqQixNQUFNLElBQUksR0FBZSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7MEdBeDFCVSxZQUFZOzhHQUFaLFlBQVk7NEZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtcclxuICBCb3gzLFxyXG4gIENhbWVyYSxcclxuICBHcm91cCxcclxuICBMaWdodCxcclxuICBNZXNoLFxyXG4gIE1lc2hCYXNpY01hdGVyaWFsLFxyXG4gIE9iamVjdDNELFxyXG4gIE9iamVjdExvYWRlcixcclxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICBSZXBlYXRXcmFwcGluZyxcclxuICBTUkdCQ29sb3JTcGFjZSxcclxuICBUZXh0dXJlLFxyXG4gIFRleHR1cmVMb2FkZXIsXHJcbiAgVmVjdG9yM1xyXG59IGZyb20gJ3RocmVlJztcclxuLy8gaW1wb3J0IE9CSkxvYWRlciBmcm9tICdhcHAvdGhyZWUtbG9hZGVycy9PQkpMb2FkZXIyJztcclxuLy8gaW1wb3J0IE1UTExvYWRlciBmcm9tICdhcHAvdGhyZWUtbG9hZGVycy9NVExMb2FkZXInO1xyXG5pbXBvcnQge09CSkxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvT0JKTG9hZGVyJztcclxuaW1wb3J0IHtNVExMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7R0xURkxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvR0xURkxvYWRlcic7XHJcbmltcG9ydCB7R0xURkV4cG9ydGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL0dMVEZFeHBvcnRlcic7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtEUkFDT0xvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvRFJBQ09Mb2FkZXInO1xyXG5pbXBvcnQge0tUWDJMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG4vLyBpbXBvcnQge01lc2hvcHREZWNvZGVyfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9saWIvbWVzaG9wdF9kZWNvZGVyLmpzJztcclxuaW1wb3J0IHtVU0RaRXhwb3J0ZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvVVNEWkV4cG9ydGVyJztcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlL3NyYy9zY2VuZXMvU2NlbmUnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4vaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtKc29uVXRpbHNTZXJ2aWNlfSBmcm9tICcuL2pzb24tdXRpbHMuc2VydmljZSc7XHJcbmltcG9ydCB7UHJvZ3Jlc3NTZXJ2aWNlfSBmcm9tICcuL3Byb2dyZXNzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9zZXJ2aWNlL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7U2NlbmVTZXJ2aWNlfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9zZXJ2aWNlL3NjZW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9jb3JlL3V0aWxzJztcclxuaW1wb3J0IHtFeHBvcnREaWFsb2dDb21wb25lbnR9IGZyb20gJy4uLy4uL3NoYXJlZC9leHBvcnQtZGlhbG9nL2V4cG9ydC1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtFeHBvcnRUeXBlfSBmcm9tICcuLi9lbnVtL2V4cG9ydC10eXBlLmVudW0nO1xyXG5pbXBvcnQge0FwaVNlcnZpY2VNb2R1bGV9IGZyb20gJy4vM2RtLWFwaSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vcGx1Z2lucy9jb3JlM2Qvc2VydmljZS9jYW1lcmEuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4vbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIEJ1ZmZlckdlb21ldHJ5VXRpbHMgZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL3V0aWxzL0J1ZmZlckdlb21ldHJ5VXRpbHMnO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtUZXh0R2VvbWV0cnl9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9nZW9tZXRyaWVzL1RleHRHZW9tZXRyeSc7XHJcbmltcG9ydCB7V2FsbE1lYXN1cmVtZW50c1NlcnZpY2V9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvd2FsbC1tZWFzdXJlbWVudHMuc2VydmljZSc7XHJcblxyXG4vLyBjb25zdCBtdGxMb2FkZXIgPSBuZXcgTVRMTG9hZGVyKCk7XHJcbi8vIG10bExvYWRlci5zZXRNYXRlcmlhbE9wdGlvbnMoe2ludmVydFRyUHJvcGVydHk6IHRydWV9KTtcclxuLy8gY29uc3Qgbm9vcCA9ICgpID0+IHtcclxuLy8gfTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFV0aWxzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBjbGlwczogYW55ID0gW107XHJcblxyXG4gIHByaXZhdGUgX29iamVjdENhY2hlOiBNYXA8c3RyaW5nLCBPYmplY3QzRD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9rdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKTtcclxuICBwcml2YXRlIF91c2R6RXhwb3J0ZXIgPSBuZXcgVVNEWkV4cG9ydGVyKCk7XHJcbiAgcHJpdmF0ZSBfZ2x0ZkV4cG9ydGVyID0gbmV3IEdMVEZFeHBvcnRlcigpO1xyXG5cclxuICBwcml2YXRlIF9zY2VuZVJlbmRlck5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgX3NjZW5lQ2FjaGVkQ3VsbGluZzogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgYXBpU2VydmljZU1vZHVsZTogQXBpU2VydmljZU1vZHVsZSxcclxuICAgIHB1YmxpYyBtZXNzYWdlU2VydmljZTogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9qc29uVXRpbHNTZXJ2aWNlOiBKc29uVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcHJvZ3Jlc3NTZXJ2aWNlOiBQcm9ncmVzc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtc1NlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NlbmVTZXJ2aWNlOiBTY2VuZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX2NhbWVyYVNlcnZpY2U6IENhbWVyYVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5faXRlbXNTZXJ2aWNlLnJlbW92ZUFsbEl0ZW1zLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jbGVhckNhY2hlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5fY2xlYXJDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlYWRGaWxlQXNUZXh0KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcclxuICAgICAgZmlsZVJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbmV3IGZ1bmN0aW9uIHRoYXQgaXMgYSB0aHJvdHRsZWQgdmVyc2lvbiBvZiBnaXZlbiBmdW5jdGlvbiBmdW5jLiBFbmZvcmNlcyB0aGF0IHRoZXJlIGlzIGEgYWx3YXlzIG1pbmltdW0gYW1vdW50IG9mIHRpbWVcclxuICAgKiBiZXR3ZWVuIHR3byBzdWJzZXF1ZW50IGNhbGxzIG9mIHRoZSBmdW5jdGlvbi4gVGFpbCBjYWxscyBhcmUgYWx3YXlzIGV4ZWN1dGVkLiBJbi1iZXR3ZWVuIGNhbGxzIGFyZSBsb3N0IGFuZCBub3QgZXhlY3V0ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0dXJuIGFzIGEgdGhyb3R0bGVkIHZlcnNpb25cclxuICAgKiBAcGFyYW0gdGhyb3R0bGVNcyBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB0aHJvdHRsZTogdGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIGFueSB0d28gc3Vic2VxdWVudCBmdW5jdGlvbiBjYWxscyBvZiBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSBbdGhpc0FyZ10gT3B0aW9uYWxseSBzdXBwbHkgdGhlIHRoaXMgY29udGV4dCBvZiB0aGUgY2FsbGVyXHJcbiAgICogQHJldHVybnMgVGhlIGdpdmVuIGZ1bmN0aW9uLCB3aXRoIHRoZSBhYm92ZS1tZW50aW9uZWQgdGltZSBjb25zdHJhaW50c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRBc1Rocm90dGxlZEZ1bmN0aW9uKGZ1bmM6IGFueSwgdGhyb3R0bGVNczogbnVtYmVyID0gMjUwLCB0aGlzQXJnPzogYW55KTogYW55IHtcclxuICAgIGxldCBsYXN0Q2FsbFRpbWU6IG51bWJlcjtcclxuICAgIGxldCBkZWZlclRpbWVyOiBudW1iZXI7XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpOiBhbnkge1xyXG4gICAgICBjb25zdCBjb250ZXh0OiBhbnkgPSB0aGlzQXJnIHx8IHRoaXM7XHJcbiAgICAgIGNvbnN0IG5vdzogYW55ID0gK25ldyBEYXRlO1xyXG4gICAgICBjb25zdCBhcmdzOiBhbnkgPSBhcmd1bWVudHM7XHJcbiAgICAgIGlmIChsYXN0Q2FsbFRpbWUgJiYgbm93IDwgbGFzdENhbGxUaW1lICsgdGhyb3R0bGVNcykge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChkZWZlclRpbWVyKTtcclxuICAgICAgICBkZWZlclRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCk6IGFueSB7XHJcbiAgICAgICAgICBsYXN0Q2FsbFRpbWUgPSBub3c7XHJcbiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgIH0sIHRocm90dGxlTXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxhc3RDYWxsVGltZSA9IG5vdztcclxuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRKc29uTW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlUGF0aCkpO1xyXG4gICAgfVxyXG4gICAgZmlsZVBhdGggPSB0aGlzLl9pbmNsdWRlQmFzZVVybChmaWxlUGF0aCk7XHJcbiAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9qc29uVXRpbHNTZXJ2aWNlLnJlYWRKc29uRmlsZShmaWxlUGF0aCwgZmFsc2UpO1xyXG4gICAgY29uc3QgbG9hZGVyID0gbmV3IE9iamVjdExvYWRlcigpO1xyXG4gICAgbG9hZGVyLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IGxvYWRlci5wYXJzZShqc29uKTtcclxuICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQoZmlsZVBhdGgsIG9iaik7XHJcbiAgICAgICAgcmVzb2x2ZShvYmopO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkSnNvbk9iamVjdE1vZGVsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgZmlsZVBhdGggPSB0aGlzLl9pbmNsdWRlQmFzZVVybChmaWxlUGF0aCk7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlUGF0aCkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbG9hZGVyID0gbmV3IE9iamVjdExvYWRlcigpO1xyXG4gICAgbG9hZGVyLnNldENyb3NzT3JpZ2luKCdBbm9ueW1vdXMnKTtcclxuICAgIGxvYWRlci5zZXRSZXNvdXJjZVBhdGgoJycpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbG9hZGVyLmxvYWQoZmlsZVBhdGgsXHJcbiAgICAgICAgKG9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvYmo6IE9iamVjdDNEID0gKG9iamVjdC50eXBlID09PSAnU2NlbmUnICYmIG9iamVjdC5jaGlsZHJlblswXS50eXBlID09PSAnT2JqZWN0M0QnKSA/IG9iamVjdC5jaGlsZHJlblswXSA6IG9iamVjdDtcclxuICAgICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlUGF0aCwgb2JqKTtcclxuICAgICAgICAgIHJlc29sdmUob2JqIGFzIE9iamVjdDNEKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHhociA9PiB0aGlzLl9wcm9ncmVzc1NlcnZpY2Uuc2V0TG9hZGVkKGZpbGVQYXRoLCB4aHIubG9hZGVkKSxcclxuICAgICAgICBlcnJvciA9PiByZWplY3QoZXJyb3IpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgbG9hZE10bChtdGxVcmw6IHN0cmluZyk6IFByb21pc2U8TVRMTG9hZGVyLk1hdGVyaWFsQ3JlYXRvcj4ge1xyXG4gIC8vICAgLy8gbXRsVXJsID0gdGhpcy5faW5jbHVkZUJhc2VVcmwobXRsVXJsKTtcclxuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgLy9cclxuICAvLyAgICAgY29uc3QgbXRsRGlyZWN0b3J5OiBzdHJpbmcgPSBtdGxVcmwuc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpICsgJy8nO1xyXG4gIC8vICAgICAvLyBtdGxMb2FkZXIuc2V0VGV4dHVyZVBhdGgobXRsRGlyZWN0b3J5KTtcclxuICAvLyAgICAgLy8gbXRsTG9hZGVyLnNldFJlc291UGF0aCh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoKTtcclxuICAvLyAgICAgbXRsTG9hZGVyLnNldENyb3NzT3JpZ2luKCdBbm9ueW1vdXMnKTtcclxuICAvLyAgICAgbXRsTG9hZGVyLnNldFBhdGgodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aCk7XHJcbiAgLy9cclxuICAvLyAgICAgcmV0dXJuIG10bExvYWRlci5sb2FkKG10bFVybCwgcmVzb2x2ZSwgbm9vcCwgcmVqZWN0KTtcclxuICAvL1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIF9hYnNQb3NpdGlvbihiZ01lc2g6IE1lc2gpOiBWZWN0b3IzIHtcclxuICAgIGJnTWVzaC5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gYmdNZXNoLmdlb21ldHJ5LmJvdW5kaW5nQm94O1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgcG9zaXRpb24uc3ViVmVjdG9ycyhib3VuZGluZ0JveC5tYXgsIGJvdW5kaW5nQm94Lm1pbik7XHJcbiAgICBwb3NpdGlvbi5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG4gICAgcG9zaXRpb24uYWRkKGJvdW5kaW5nQm94Lm1pbik7XHJcbiAgICBwb3NpdGlvbi5hcHBseU1hdHJpeDQoYmdNZXNoLm1hdHJpeFdvcmxkKTtcclxuICAgIHJldHVybiBwb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkT2JqTW9kZWwoZmlsZVBhdGg6IHN0cmluZywgbXRsVXJsPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIGZpbGVQYXRoID0gdGhpcy5faW5jbHVkZUJhc2VVcmwoZmlsZVBhdGgpO1xyXG4gICAgLy8gY29uc3Qgb2JqTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xyXG4gICAgLy8gaWYgKG10bFVybCkge1xyXG4gICAgLy8gICBjb25zdCBtYXRlcmlhbENyZWF0b3IgPSBhd2FpdCB0aGlzLmxvYWRNdGwobXRsVXJsKTtcclxuICAgIC8vICAgbWF0ZXJpYWxDcmVhdG9yLnByZWxvYWQoKTtcclxuICAgIC8vICAgb2JqTG9hZGVyLnNldE1hdGVyaWFscyhtYXRlcmlhbENyZWF0b3IubWF0ZXJpYWxzKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAvLyAgIG9iakxvYWRlci5sb2FkKFxyXG4gICAgLy8gICAgIGZpbGVQYXRoLFxyXG4gICAgLy8gICAgIChub2RlOiBhbnkpID0+IHtcclxuICAgIC8vICAgICAgIHJlc29sdmUodGhpcy5sb2FkR3JvdXAobm9kZSkpO1xyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgdW5kZWZpbmVkLCByZWplY3RcclxuICAgIC8vICAgKTtcclxuICAgIC8vIH0pO1xyXG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlUGF0aCkpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9vYmplY3RDYWNoZS5nZXQoZmlsZVBhdGgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG5ldyBNVExMb2FkZXIoKVxyXG4gICAgICAgIC5zZXRQYXRoKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgpXHJcbiAgICAgICAgLmxvYWQobXRsVXJsLCAobWF0ZXJpYWxzKSA9PiB7XHJcbiAgICAgICAgICAgIG1hdGVyaWFscy5wcmVsb2FkKCk7XHJcbiAgICAgICAgICAgIG5ldyBPQkpMb2FkZXIoKVxyXG4gICAgICAgICAgICAgIC5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKVxyXG4gICAgICAgICAgICAgIC5zZXRQYXRoKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgpXHJcbiAgICAgICAgICAgICAgLmxvYWQoZmlsZVBhdGgsIChvYmplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9iajogT2JqZWN0M0QgPSB0aGlzLmNsZWFuZWRVcE9iamVjdHMob2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIG9iai50cmF2ZXJzZSgoY2hpbGQ6IE9iamVjdDNEIHwgTWVzaCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXNoICYmIGNoaWxkLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWw6IGFueVtdID0gIUFycmF5LmlzQXJyYXkoY2hpbGQubWF0ZXJpYWwpID8gW2NoaWxkLm1hdGVyaWFsXSA6IGNoaWxkLm1hdGVyaWFsO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbS5tYXAuY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlUGF0aCwgb2JqKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUob2JqKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB4aHIgPT4gdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLnNldExvYWRlZChmaWxlUGF0aCwgeGhyLmxvYWRlZClcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEdsYk1vZGVsKGZpbGU6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBib29sZWFuID0gdHJ1ZSwgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPE9iamVjdDNEPiB7XHJcbiAgICBpZiAocmVsYXRpdmVQYXRoKSB7XHJcbiAgICAgIGZpbGUgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoICsgZmlsZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9vYmplY3RDYWNoZS5oYXMoZmlsZSkpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9vYmplY3RDYWNoZS5nZXQoZmlsZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG4gICAgICBsb2FkZXIuc2V0RFJBQ09Mb2FkZXIobmV3IERSQUNPTG9hZGVyKCkpO1xyXG4gICAgICBsb2FkZXIuZHJhY29Mb2FkZXIuc2V0RGVjb2RlclBhdGgodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmRyYWNvUGF0aCk7XHJcbiAgICAgIGxvYWRlci5kcmFjb0xvYWRlci5zZXREZWNvZGVyQ29uZmlnKHt0eXBlOiAnanMnfSk7XHJcbiAgICAgIGxvYWRlci5sb2FkKGZpbGUsXHJcbiAgICAgICAgYXN5bmMgb2JqZWN0ID0+IHtcclxuICAgICAgICAgIC8vIGNvbnN0IG9iajogT2JqZWN0M0QgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgICAgICAgIC8vIG9iamVjdC5zY2VuZS5jaGlsZHJlbi5mb3JFYWNoKChjOiBPYmplY3QzRCkgPT4ge1xyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5jaGlsZHJlbi5mb3JFYWNoKGdjID0+IG9iai5hZGQoZ2MuY2xvbmUoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICovXHJcbiAgICAgICAgICAvLyByZXNldCBvcmlnaW4gb2YgY2hpbGRyZW4gZm9yIGdyb3Vwc1xyXG4gICAgICAgICAgLy8gaWYgKGMgaW5zdGFuY2VvZiBHcm91cCkge1xyXG4gICAgICAgICAgLy8gICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBCb3gzKCkuc2V0RnJvbU9iamVjdChjKTtcclxuICAgICAgICAgIC8vICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICAgICAgICAvLyAgIGJvdW5kaW5nQm94LmdldENlbnRlcihiYkNlbnRlclBpdm90KTtcclxuICAgICAgICAgIC8vICAgY29uc3QgZGVsdGE6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLmFkZChiYkNlbnRlclBpdm90KS5zdWIobmV3IFZlY3RvcjMoMCwgYy5wb3NpdGlvbi55LCAwKSk7XHJcbiAgICAgICAgICAvLyAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2MpID0+IHtcclxuICAgICAgICAgIC8vICAgICBjYy5wb3NpdGlvbi5hZGQobmV3IFZlY3RvcjMoMCwgYy5wb3NpdGlvbi55LCAwKSk7XHJcbiAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgLy8gICBjLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgdGhpcy5jbGlwcyA9IG9iamVjdC5hbmltYXRpb25zIHx8IFtdO1xyXG4gICAgICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IHRoaXMuY2xlYW5lZFVwT2JqZWN0cyhvYmplY3Quc2NlbmUsIGNsZWFuVXApO1xyXG4gICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGUsIG9iaik7XHJcbiAgICAgICAgICByZXNvbHZlKG9iaik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB4aHIgPT4gdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLnNldExvYWRlZChmaWxlLCB4aHIubG9hZGVkKSxcclxuICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IhICcsIGVycm9yKTtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEdsYkZyb21GaWxlKGZpbGU6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG4gICAgICBsb2FkZXIucGFyc2UoZmlsZSwgJycsXHJcbiAgICAgICAgYXN5bmMgb2JqZWN0ID0+IHtcclxuICAgICAgICAgIHJlc29sdmUob2JqZWN0KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEdsYlJvb20oZmlsZTogc3RyaW5nKTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3Byb2dyZXNzU2VydmljZS5wcmVwYXJlRG93bmxvYWRzKFt7bW9kZWxfdXJsOiBmaWxlfV0pO1xyXG4gICAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG4gICAgICBsb2FkZXIubG9hZChmaWxlLFxyXG4gICAgICAgIGFzeW5jIG9iamVjdCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvYmo6IE9iamVjdDNEID0gb2JqZWN0LnNjZW5lO1xyXG4gICAgICAgICAgb2JqLnRyYXZlcnNlKGMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZ2xhcycpIDwgMCAmJiAoKGMucGFyZW50ICYmIGMucGFyZW50Lm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdnbGFzJykgPCAwKSB8fCAhYy5wYXJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgYy5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBjLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlLCBvYmopO1xyXG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLmZpbmlzaERvd25sb2FkcygpO1xyXG4gICAgICAgICAgcmVzb2x2ZShvYmopO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeGhyID0+IHRoaXMuX3Byb2dyZXNzU2VydmljZS5zZXRMb2FkZWQoZmlsZSwgeGhyLmxvYWRlZCksXHJcbiAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yISAnLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc1NlcnZpY2UuZmluaXNoRG93bmxvYWRzKCk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNhdmVSb29tQXNHbGIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlID0gWydncm91bmQtcGxhbmUnLCAnaHVkLXJpbmcnLCAnaHVkLWNpcmNsZScsICdyb3RhdGlvbkNpcmNsZSddO1xyXG4gICAgbGV0IHNjZW5lOiBTY2VuZTtcclxuICAgIHNjZW5lID0gdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lLmNsb25lKCk7XHJcbiAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgc2NlbmUucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0OiBPYmplY3QzRCA9IHNjZW5lLmdldE9iamVjdEJ5TmFtZShlbGVtZW50TmFtZSk7XHJcbiAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICB9KTtcclxuICAgIHNjZW5lLm5hbWUgPSAnbXJwX3Jvb20nO1xyXG4gICAgdGhpcy5fZG93bmxvYWQzRE1vZGVsQXNHTEIoc2NlbmUpO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdChzY2VuZSk7XHJcbiAgICBzY2VuZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcFJvb21Gb3JSZW5kZXIoc3RhbmRhbG9uZTogYm9vbGVhbiA9IGZhbHNlLCByZW5kZXJQYXJhbWV0ZXJzOiBhbnksIHJlbmRlclByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgICAgY29uc3QgY2FtZXJhOiBQZXJzcGVjdGl2ZUNhbWVyYSA9IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhO1xyXG4gICAgbGV0IHVzZUNhY2hlZFJlbmRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyBBcyBvZiBub3cgQ3VsbGluZyBhbmQgY2FtZXJhV2l0aGluUm9vbSBhcmUgdGhlIG9ubHkgdmFsdWVzIHRoYXQgY2FuIG92ZXJ3cml0ZSBhbGwgb3RoZXIgdmFsdWVzLlxyXG4gICAgaWYgKHJlbmRlclBhcmFtZXRlcnMuYWxsb3dDdWxsaW5nKSB7XHJcbiAgICAgICAgdXNlQ2FjaGVkUmVuZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2NlbmVDYWNoZWRDdWxsaW5nID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9zY2VuZUNhY2hlZEN1bGxpbmcpIHtcclxuICAgICAgICB0aGlzLmNsZWFyU2F2ZWRSb29tUmVuZGVyU2V0dGluZ3MoKTtcclxuICAgICAgfVxyXG4gICAgICB1c2VDYWNoZWRSZW5kZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3NjZW5lUmVuZGVyTmFtZSAhPT0gJycgJiYgIXN0YW5kYWxvbmUgJiYgdXNlQ2FjaGVkUmVuZGVyKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTG9hZGluZ0luZGljYXRvcik7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TaG93TG9hZGluZ0luZGljYXRvciwge3RpdGxlOiAnUmVuZGVyaW5nLi4uJ30pO1xyXG4gICAgICBhd2FpdCB0aGlzLmFwaVNlcnZpY2VNb2R1bGUucmVxdWVzdFJlbmRlcih0aGlzLl9zY2VuZVJlbmRlck5hbWUsIGNhbWVyYSwgc3RhbmRhbG9uZSwgcmVuZGVyUGFyYW1ldGVycywgcmVuZGVyUHJldmlldyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlID0gWydncm91bmQtcGxhbmUnLCAnaHVkLXJpbmcnLCAnaHVkLWNpcmNsZScsICdyb3RhdGlvbkNpcmNsZSddO1xyXG4gICAgICBpZiAoc3RhbmRhbG9uZSkge1xyXG4gICAgICAgIGVsZW1lbnRzVG9SZW1vdmUucHVzaCgnZmxvb3ItcGxhbmUnKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2NlbmU6IFNjZW5lO1xyXG4gICAgICBzY2VuZSA9IHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZS5jbG9uZSgpO1xyXG4gICAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICAgIHNjZW5lLnJlbW92ZShjKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJQYXJhbWV0ZXJzLmFsbG93Q3VsbGluZykge1xyXG4gICAgICAgICAgbGV0IHJlbmFtZU1lc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChjLm5hbWUgJiYgYy5uYW1lLmluZGV4T2YoJ2VkZ2UnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGMudHJhdmVyc2UoY2MgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChjYyBpbnN0YW5jZW9mIE1lc2ggJiYgY2MubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNjLm1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICAgICAgICBjYy5tYXRlcmlhbC5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmFtZU1lc2ggPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjYy5tYXRlcmlhbC5vcGFjaXR5ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuYW1lTWVzaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlbmFtZU1lc2gpIHtcclxuICAgICAgICAgICAgYy5uYW1lID0gYENVTExJTkdfJHtjLm5hbWV9YDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgcmVuYW1lQ2VpbGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGMubmFtZSA9PT0gJ2NlaWxpbmdQbGFuZS1wbGFuZScpIHtcclxuICAgICAgICAgICAgYy50cmF2ZXJzZShjYyA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGNjIGluc3RhbmNlb2YgTWVzaCAmJiBjYy5tYXRlcmlhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2MubWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNjLm1hdGVyaWFsLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0uc2lkZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVuYW1lQ2VpbGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjYy5tYXRlcmlhbC5zaWRlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuYW1lQ2VpbGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlbmFtZUNlaWxpbmcpIHtcclxuICAgICAgICAgICAgYy5uYW1lID0gYENVTExJTkdfJHtjLm5hbWV9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoYy5uYW1lICYmIGMubmFtZS5pbmRleE9mKCdlZGdlJykgPiAtMSkgeyAvLyB3YWxscyBzaG91bGQgYWxsIGJlIHZpc2libGVcclxuICAgICAgICAgIGMudHJhdmVyc2UoY2MgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2MgaW5zdGFuY2VvZiBNZXNoICYmIGNjLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2MubWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgICAgICBjYy5tYXRlcmlhbC5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICBtLm9wYWNpdHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICBtLnRyYW5zcGFyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIG0uZGVwdGhXcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIG0uZGVwdGhUZXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjYy5tYXRlcmlhbC5vcGFjaXR5ID0gMDtcclxuICAgICAgICAgICAgICAgIGNjLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjYy5tYXRlcmlhbC5kZXB0aFdyaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNjLm1hdGVyaWFsLmRlcHRoVGVzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2MgaW5zdGFuY2VvZiBNZXNoICYmIGNjLmdlb21ldHJ5KSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFjYy5nZW9tZXRyeS5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgY2MuZ2VvbWV0cnkgPSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlVmVydGljZXMoY2MuZ2VvbWV0cnkpO1xyXG4gICAgICAgICAgICAgICAgY2MuZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY2MuZ2VvbWV0cnkuYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0ck5hbWUpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gY2MuZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyTmFtZV0uYXJyYXk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShhcnJheVtpXSkgfHwgaXNOYU4oYXJyYXlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSAwOyAvLyBTZXQgaXQgc28gc29tZSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYy5nZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJOYW1lXS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIWMudmlzaWJsZSAmJiByZW5kZXJQYXJhbWV0ZXJzLmFsbG93Q3VsbGluZykge1xyXG4gICAgICAgICAgICBjLm5hbWUgPSBgQ1VMTElOR18ke2MubmFtZX1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPYmplY3Q6IE9iamVjdDNEID0gc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB9KTtcclxuICAgICAgc2NlbmUubmFtZSA9ICdtcnBfcm9vbV8nICsgc2NlbmUudXVpZDtcclxuICAgICAgdGhpcy5fY3JlYXRlR0xCRm9yQVBJKHNjZW5lLCBjYW1lcmEsIHN0YW5kYWxvbmUsIHJlbmRlclBhcmFtZXRlcnMsIHJlbmRlclByZXZpZXcpO1xyXG4gICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRoZSBtYWtlIHN1cmUgY3VsbGluZyBrZWVwcyBvbiB3b3JraW5nLi4uLiBubyBzdXJlIHdoeSB0YmguLlxyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNvbnRyb2xzLnVwZGF0ZSgpO1xyXG4gICAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHNjZW5lKTtcclxuICAgICAgc2NlbmUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyU2F2ZWRSb29tUmVuZGVyU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zY2VuZVJlbmRlck5hbWUgPSAnJztcclxuICAgIHRoaXMuX3NjZW5lQ2FjaGVkQ3VsbGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlR0xCRm9yQVBJKFxyXG4gICAgb2JqZWN0OiBPYmplY3QzRCxcclxuICAgIGNhbWVyYTogUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgICBzdGFuZGFsb25lOiBib29sZWFuLFxyXG4gICAgcmVuZGVyUGFyYW1ldGVyczogYW55LFxyXG4gICAgcmVuZGVyUHJldmlldzogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gQ2hlY2sgaWYgd2UndmUgbWFkZSBhIHJlbmRlciBhbHJlYWR5LCBidXQgb25seSBpZiBpdCdzIG5vdCBzdGFuZGFsb25lXHJcbiAgICAvLyBEdWUgdG8gY3VsbGluZywgd2UgY2FuJ3QgcmV1c2UgdGhlIHNhbWUgR0xCLlxyXG4gICAgLy8gaWYgKHRoaXMuX3NjZW5lUmVuZGVyTmFtZSAhPT0gJycgJiYgIXN0YW5kYWxvbmUpIHtcclxuICAgIC8vICAgLy8gTG9va3MgbGlrZSB3ZSBkaWRcclxuICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMb2FkaW5nSW5kaWNhdG9yKTtcclxuICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNob3dMb2FkaW5nSW5kaWNhdG9yLCB7dGl0bGU6ICdSZW5kZXJpbmcuLi4nfSk7XHJcbiAgICAvLyAgIHRoaXMuYXBpU2VydmljZU1vZHVsZS5yZXF1ZXN0UmVuZGVyKHRoaXMuX3NjZW5lUmVuZGVyTmFtZSwgY2FtZXJhLCBzdGFuZGFsb25lLCByZW5kZXJQYXJhbWV0ZXJzLCByZW5kZXJQcmV2aWV3KTtcclxuICAgIC8vXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgdHJzOiBmYWxzZSxcclxuICAgICAgb25seVZpc2libGU6IHRydWUsXHJcbiAgICAgIHRydW5jYXRlRHJhd1JhbmdlOiB0cnVlLFxyXG4gICAgICBiaW5hcnk6IHRydWUsXHJcbiAgICAgIG1heFRleHR1cmVTaXplOiBJbmZpbml0eVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9nbHRmRXhwb3J0ZXIucGFyc2Uob2JqZWN0LCAocmVzdWx0OiBBcnJheUJ1ZmZlcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlbmFtZTogc3RyaW5nID0gYCR7b2JqZWN0Lm5hbWV9LmdsYmA7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbcmVzdWx0XSwgZmlsZW5hbWUsIHtcclxuICAgICAgICB0eXBlOiAnbW9kZWwvZ2x0Zi1iaW5hcnknLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fc2NlbmVSZW5kZXJOYW1lID0gZmlsZW5hbWU7XHJcbiAgICAgIC8vIHRoaXMuX2Rvd25sb2FkRmlsZShmaWxlbmFtZSwgZmlsZSk7XHJcbiAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTG9hZGluZ0luZGljYXRvcik7XHJcbiAgICAgIHRoaXMuX3NlbmRGaWxlVG9BcGkoZmlsZSwgZmlsZW5hbWUsIGNhbWVyYSwgc3RhbmRhbG9uZSwgcmVuZGVyUGFyYW1ldGVycywgcmVuZGVyUHJldmlldyk7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICB9LCBvcHRpb25zKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlbmRGaWxlVG9BcGkoXHJcbiAgICBmaWxlOiBGaWxlLFxyXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcclxuICAgIGNhbWVyYTogUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgICBzdGFuZGFsb25lOiBib29sZWFuLFxyXG4gICAgcmVuZGVyUGFyYW1ldGVyczogYW55LFxyXG4gICAgcmVuZGVyUHJldmlldzogYm9vbGVhblxyXG4gICkge1xyXG4gICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2dsYicsIGZpbGUpO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlTW9kdWxlLnVwbG9hZFRvQXBpR0xCKGZvcm1EYXRhLCBmaWxlbmFtZSwgY2FtZXJhLCBzdGFuZGFsb25lLCByZW5kZXJQYXJhbWV0ZXJzLCByZW5kZXJQcmV2aWV3KTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYlNvdXJjZShmaWxlOiBzdHJpbmcpOiBQcm9taXNlPE9iamVjdDNEPiB7XHJcbiAgICBjb25zdCBvYmogPSBhd2FpdCB0aGlzLmxvYWRHbGJNb2RlbChmaWxlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgb2JqLmNoaWxkcmVuID0gb2JqLmNoaWxkcmVuLmZpbHRlcihjID0+ICEoYyBpbnN0YW5jZW9mIENhbWVyYSkpO1xyXG4gICAgb2JqLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGFbJ25hbWUnXSA8IGJbJ25hbWUnXSA/IDEgOiAtMSk7XHJcbiAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoYzogT2JqZWN0M0QpID0+IHtcclxuICAgICAgYy50cmF2ZXJzZSgodDogT2JqZWN0M0QpID0+IHtcclxuICAgICAgICB0LnZpc2libGUgPSAhdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY18nKSAmJiAhdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncF8nKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgICBpZiAob2JqLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBvYmouY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBHcm91cCkgeyAvLyBmbGF0dGVuIGNoaWxkcmVuXHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuOiBhbnkgPSBvYmouY2hpbGRyZW5bMF0uY2hpbGRyZW4uc2xpY2UoKTtcclxuICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gb2JqLmNoaWxkcmVuWzBdLm5hbWU7XHJcbiAgICAgIG9iai5jaGlsZHJlbi5sZW5ndGggPSAwO1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IE9iamVjdDNEID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICAgIHBhcmVudC5uYW1lID0gbmFtZTtcclxuICAgICAgcGFyZW50LmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgIG9iai5hZGQocGFyZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0V4cG9ydERpYWxvZyhvYmplY3Q6IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBleHBvcnREaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihFeHBvcnREaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc0MDBweCdcclxuICAgIH0pO1xyXG4gICAgZXhwb3J0RGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jICh0eXBlOiBFeHBvcnRUeXBlKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IEV4cG9ydFR5cGUuR0xCKSB7XHJcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZDNETW9kZWxBc0dMQihvYmplY3QpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRXhwb3J0VHlwZS5VU0RaKSB7XHJcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZDNETW9kZWxBc1VTRFoob2JqZWN0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEV4cG9ydFR5cGUuQk9USCkge1xyXG4gICAgICAgICAgdGhpcy5fZG93bmxvYWQzRE1vZGVsQXNVU0RaKG9iamVjdCk7XHJcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZDNETW9kZWxBc0dMQihvYmplY3QpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRXhwb3J0VHlwZS5USFVNQikge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVDYW52YXNJbWFnZShvYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGFzeW5jIHRleHR1cmVGcm9tVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIHVybCA9IHRoaXMuX2luY2x1ZGVCYXNlVXJsKHVybCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcclxuICAgICAgLy8gdGV4dHVyZUxvYWRlci5zZXRCYXNlVSh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoKTtcclxuICAgICAgdGV4dHVyZUxvYWRlci5sb2FkKHVybCxcclxuICAgICAgICAodGV4dHVyZTogVGV4dHVyZSkgPT4ge1xyXG4gICAgICAgICAgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xyXG4gICAgICAgICAgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xyXG4gICAgICAgICAgdGV4dHVyZS5yZXBlYXQuc2V0KDEsIDEpO1xyXG4gICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0ZXh0dXJlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgcmVqZWN0XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JjZUNoYW5nZURldGVjdGlvbihjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIGNvbXBvbmVudDogYW55LCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBvbmVudFtwcm9wTmFtZV07XHJcbiAgICBjb21wb25lbnRbcHJvcE5hbWVdID0gbnVsbDtcclxuICAgIGNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGNvbXBvbmVudFtwcm9wTmFtZV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRLVFgyTG9hZGVyKCk6IEtUWDJMb2FkZXIge1xyXG4gICAgdGhpcy5fa3R4MkxvYWRlci5kZXRlY3RTdXBwb3J0KHRoaXMuX3NjZW5lU2VydmljZS5yZW5kZXJlcik7XHJcbiAgICByZXR1cm4gdGhpcy5fa3R4MkxvYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZFVTRFpmb3JBUklPUyhvYmplY3Q6IE9iamVjdDNEKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBVU0RaRXhwb3J0ZXIoKTtcclxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gYXdhaXQgZXhwb3J0ZXIucGFyc2VBc3luYyhvYmplY3QpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJheWJ1ZmZlcl0sIHt0eXBlOiAnbW9kZWwvdm5kLnVzZHoremlwJ30pO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGVsZW1lbnQuaHJlZiA9IHVybDtcclxuICAgIGVsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhbmVkVXBPYmplY3RzKG9iamVjdDogT2JqZWN0M0QsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogT2JqZWN0M0Qge1xyXG4gICAgbGV0IG9iajogT2JqZWN0M0QgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuY2xpcHMpO1xyXG4gICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGM6IE9iamVjdDNEKSA9PiB7XHJcbiAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBDYW1lcmEpKSB7XHJcbiAgICAgICAgaWYgKGNsZWFuVXAgJiYgYyBpbnN0YW5jZW9mIEdyb3VwIHx8IChjLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBjLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgR3JvdXApKSB7XHJcbiAgICAgICAgICB0aGlzLl9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoYywgb2JqKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChjbGVhblVwICYmICEoYyBpbnN0YW5jZW9mIE1lc2gpKSB8fCAoIShjIGluc3RhbmNlb2YgTWVzaCkgJiYgIWMubmFtZSAmJiBjLmNoaWxkcmVuLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGNoaWxkLnRyYW5zbGF0ZVkoYy5wb3NpdGlvbi55KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgaWYgKG9iai5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9iai5hZGQoYy5jbG9uZSgpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9iaiA9IGMuY2xvbmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gaWYgKGMucG9zaXRpb24ueSA+IDAgfHwgYy5wb3NpdGlvbi55IDwgMCkge1xyXG4gICAgICAgICAgLy8gICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAvLyAgICAgY2hpbGQudHJhbnNsYXRlWShjLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAgIC8vICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgb2JqLmFkZChjLmNsb25lKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBCb3gzKCkuc2V0RnJvbU9iamVjdChvYmopO1xyXG4gICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBib3VuZGluZ0JveC5nZXRDZW50ZXIoYmJDZW50ZXJQaXZvdCk7XHJcbiAgICBjb25zdCBkZWx0YTogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuYWRkKGJiQ2VudGVyUGl2b3QpLm5lZ2F0ZSgpO1xyXG4gICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNjKSA9PiB7XHJcbiAgICAgIGNjLnBvc2l0aW9uLmFkZChkZWx0YSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kb3dubG9hZDNETW9kZWxBc0dMQihvYmplY3Q6IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICB0cnM6IGZhbHNlLFxyXG4gICAgICBvbmx5VmlzaWJsZTogdHJ1ZSxcclxuICAgICAgdHJ1bmNhdGVEcmF3UmFuZ2U6IHRydWUsXHJcbiAgICAgIGJpbmFyeTogdHJ1ZSxcclxuICAgICAgbWF4VGV4dHVyZVNpemU6IDIwNDhcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fZ2x0ZkV4cG9ydGVyLnBhcnNlKG9iamVjdCwgKHJlc3VsdDogQXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtyZXN1bHRdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9KTtcclxuICAgICAgdGhpcy5fZG93bmxvYWRGaWxlKGAke29iamVjdC5uYW1lfS5nbGJgLCBmaWxlKTtcclxuICAgIH0sICgpID0+IHtcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZG93bmxvYWQzRE1vZGVsQXNVU0RaKG9iamVjdDogT2JqZWN0M0QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGNvbnN0IGFycmF5YnVmZmVyOiBhbnkgPSAgYXdhaXQgdGhpcy5fdXNkekV4cG9ydGVyLnBhcnNlKG9iamVjdCk7XHJcbiAgICAvLyBjb25zdCBibG9iOiBCbG9iID0gbmV3IEJsb2IoW2FycmF5YnVmZmVyXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSk7XHJcblxyXG4gICAgY29uc3QgZXhwb3J0ZXIgPSBuZXcgVVNEWkV4cG9ydGVyKCk7XHJcbiAgICBjb25zdCBhcnJheWJ1ZmZlciA9IGF3YWl0IGV4cG9ydGVyLnBhcnNlQXN5bmMob2JqZWN0KTtcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyYXlidWZmZXJdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9KTtcclxuXHJcblxyXG4gICAgdGhpcy5fZG93bmxvYWRGaWxlKGAke29iamVjdC5uYW1lfS51c2R6YCwgYmxvYik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kb3dubG9hZEZpbGUoZmlsZU5hbWU6IHN0cmluZywgYmxvYjogQmxvYik6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgZWxlbWVudC5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGVsZW1lbnQuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICBlbGVtZW50LmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUNhbnZhc0ltYWdlKG9iamVjdDogT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgLy8gQ3JlYXRlIGEgY2FudmFzIGFuZCBXZWJHTCByZW5kZXJlciB3aXRoIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZFxyXG4gICAgY29uc3Qgb2Zmc2NyZWVuQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCByZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHtcclxuICAgICAgY2FudmFzOiBvZmZzY3JlZW5DYW52YXMsXHJcbiAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICBhbnRpYWxpYXM6IHRydWUsXHJcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSwgLy8gS2VlcHMgdGhlIHJlbmRlcmVkIGltYWdlIGludGFjdFxyXG4gICAgICBsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW5zdXJlIHRoZSBvYmplY3Qgc3RheXMgY2VudGVyZWQgYnkgYWRqdXN0aW5nIHRoZSBjYW1lcmEncyB2aWV3XHJcbiAgICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpO1xyXG4gICAgY29uc3Qgc2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBjZW50ZXIgPSBib3VuZGluZ0JveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcblxyXG4gICAgLy8gU2V0IGEgcmVhc29uYWJsZSBjYW52YXMgc2l6ZSBmb3IgdGhlIG91dHB1dCBpbWFnZVxyXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSBzaXplLnggLyBzaXplLnk7XHJcbiAgICBsZXQgd2lkdGggPSAxNjAwO1xyXG4gICAgbGV0IGhlaWdodCA9IDE2MDA7XHJcbiAgICBpZiAoYXNwZWN0UmF0aW8gPiAyKSB7XHJcbiAgICAgIC8vIFdpZGUgbW9kZWwg4oaSIGFkanVzdCBoZWlnaHQgdG8gbWFpbnRhaW4gYXNwZWN0IHJhdGlvXHJcbiAgICAgIGhlaWdodCA9IDEyMDA7XHJcbiAgICB9IGVsc2UgaWYgKGFzcGVjdFJhdGlvIDwgMikge1xyXG4gICAgICAvLyBUYWxsIG1vZGVsIOKGkiBhZGp1c3Qgd2lkdGggdG8gbWFpbnRhaW4gYXNwZWN0IHJhdGlvXHJcbiAgICAgIHdpZHRoID0gMTIwMDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgIC8vIFNldCB0aGUgY2xlYXIgY29sb3IgdG8gdHJhbnNwYXJlbnQgKGFscGhhOiB0cnVlIG1ha2VzIHRoaXMgYmFja2dyb3VuZCB0cmFuc3BhcmVudClcclxuICAgIHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oMik7XHJcbiAgICByZW5kZXJlci5zZXRDbGVhckNvbG9yKDB4MDAwMDAwLCAwKTsgLy8gVHJhbnNwYXJlbnQgYmFja2dyb3VuZFxyXG4gICAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwO1xyXG4gICAgcmVuZGVyZXIudG9uZU1hcHBpbmcgPSBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7XHJcbiAgICByZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4yO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHNjZW5lIGFuZCBjYW1lcmEgZm9yIHJlbmRlcmluZ1xyXG4gICAgY29uc3Qgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcclxuICAgIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSg0NSwgd2lkdGggLyBoZWlnaHQsIDAuMSwgMTAwMCk7XHJcblxyXG4gICAgLy8gVGlsdCB0aGUgb2JqZWN0IGl0c2VsZiAocm90YXRlIHRoZSBtb2RlbClcclxuICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDApOyAvLyBTbGlnaHQgdGlsdCBkb3duXHJcbiAgICBvYmplY3Qucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgwKTsgIC8vIFNsaWdodCByb3RhdGlvbiB0byB0aGUgbGVmdFxyXG4gICAgb2JqZWN0LnJvdGF0aW9uLnogPSAwO1xyXG4gICAgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgc2NlbmUuYWRkKG9iamVjdCk7XHJcblxyXG4gICAgLy8gQWRkIGxpZ2h0aW5nIHRvIHRoZSBzY2VuZVxyXG4gICAgY29uc3QgYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMik7IC8vIEJyaWdodCBhbWJpZW50IGxpZ2h0XHJcbiAgICBzY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcclxuXHJcbiAgICBjb25zdCBkaXJlY3Rpb25hbExpZ2h0ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsIDIuNSk7XHJcbiAgICBkaXJlY3Rpb25hbExpZ2h0LnBvc2l0aW9uLnNldCg1LCAxMCwgNSk7IC8vIEFkanVzdGVkIGxpZ2h0IHBvc2l0aW9uXHJcbiAgICAvLyBkaXJlY3Rpb25hbExpZ2h0LmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgc2NlbmUuYWRkKGRpcmVjdGlvbmFsTGlnaHQpO1xyXG5cclxuICAgIC8vIEFkanVzdCB0aGUgY2FtZXJhIHBvc2l0aW9uXHJcbiAgICBjb25zdCBtYXhEaW1lbnNpb24gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IGRpc3RhbmNlID0gbWF4RGltZW5zaW9uICogMjsgLy8gSW5jcmVhc2Ugem9vbS1pblxyXG4gICAgY2FtZXJhLnBvc2l0aW9uLnNldChjZW50ZXIueCAtIGRpc3RhbmNlICogMC4zLCBjZW50ZXIueSArIGRpc3RhbmNlICogMC4zLCBkaXN0YW5jZSk7IC8vIFZpZXcgZnJvbSBhYm92ZSAmIGZyb250XHJcbiAgICBjYW1lcmEubG9va0F0KGNlbnRlcik7XHJcbiAgICBjYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuICAgIC8vIFJlbmRlciB0aGUgc2NlbmUgd2l0aCB0aGUgY2FtZXJhXHJcbiAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XHJcblxyXG4gICAgY29uc3QgaW1hZ2VEYXRhID0gb2Zmc2NyZWVuQ2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XHJcblxyXG4gICAgcmVuZGVyZXIuZGlzcG9zZSgpO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdChzY2VuZSk7XHJcbiAgICBvZmZzY3JlZW5DYW52YXMucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIGltYWdlRGF0YTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgY3JlYXRlVGh1bWJuYWlsSW1hZ2Uob2JqZWN0OiBPYmplY3QzRCk6IHN0cmluZyB7XHJcbiAgICAvLyBDcmVhdGUgYSBjYW52YXMgYW5kIFdlYkdMIHJlbmRlcmVyIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kXHJcbiAgICBjb25zdCBvZmZzY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe1xyXG4gICAgICBjYW52YXM6IG9mZnNjcmVlbkNhbnZhcyxcclxuICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgIGFudGlhbGlhczogdHJ1ZSxcclxuICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLCAvLyBLZWVwcyB0aGUgcmVuZGVyZWQgaW1hZ2UgaW50YWN0XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTZXQgYSByZWFzb25hYmxlIGNhbnZhcyBzaXplIGZvciB0aGUgb3V0cHV0IGltYWdlXHJcbiAgICBjb25zdCB3aWR0aCA9IDIwMDtcclxuICAgIGNvbnN0IGhlaWdodCA9IDIwMDtcclxuICAgIHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjbGVhciBjb2xvciB0byB0cmFuc3BhcmVudCAoYWxwaGE6IHRydWUgbWFrZXMgdGhpcyBiYWNrZ3JvdW5kIHRyYW5zcGFyZW50KVxyXG4gICAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbygxKTtcclxuICAgIHJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhGRkZGRkYsIDEpOyAvLyBUcmFuc3BhcmVudCBiYWNrZ3JvdW5kXHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgc2NlbmUgYW5kIGNhbWVyYSBmb3IgcmVuZGVyaW5nXHJcbiAgICBjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gICAgY29uc3QgY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDQ1LCB3aWR0aCAvIGhlaWdodCwgMC4xLCAxMDAwKTtcclxuXHJcbiAgICAvLyBBZGQgdGhlIG9iamVjdCB0byB0aGUgc2NlbmVcclxuICAgIC8vIFRpbHQgdGhlIG9iamVjdCBpdHNlbGYgKHJvdGF0ZSB0aGUgbW9kZWwpXHJcbiAgICBvYmplY3Qucm90YXRpb24ueCA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgwKTsgLy8gU2xpZ2h0IHRpbHQgZG93blxyXG4gICAgb2JqZWN0LnJvdGF0aW9uLnkgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoMCk7ICAvLyBTbGlnaHQgcm90YXRpb24gdG8gdGhlIGxlZnRcclxuICAgIG9iamVjdC5yb3RhdGlvbi56ID0gMDtcclxuICAgIHNjZW5lLmFkZChvYmplY3QpO1xyXG5cclxuICAgIC8vIEFkZCBsaWdodGluZyB0byB0aGUgc2NlbmVcclxuICAgIGNvbnN0IGFtYmllbnRMaWdodCA9IG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoMHhmZmZmZmYsIDIpOyAvLyBCcmlnaHQgYW1iaWVudCBsaWdodFxyXG4gICAgc2NlbmUuYWRkKGFtYmllbnRMaWdodCk7XHJcblxyXG4gICAgY29uc3QgZGlyZWN0aW9uYWxMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAyLjUpO1xyXG4gICAgZGlyZWN0aW9uYWxMaWdodC5wb3NpdGlvbi5zZXQoNSwgMTAsIDUpOyAvLyBBZGp1c3RlZCBsaWdodCBwb3NpdGlvblxyXG4gICAgc2NlbmUuYWRkKGRpcmVjdGlvbmFsTGlnaHQpO1xyXG5cclxuICAgIC8vIEVuc3VyZSB0aGUgb2JqZWN0IHN0YXlzIGNlbnRlcmVkIGJ5IGFkanVzdGluZyB0aGUgY2FtZXJhJ3Mgdmlld1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IHNpemUgPSBib3VuZGluZ0JveC5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgY29uc3QgY2VudGVyID0gYm91bmRpbmdCb3guZ2V0Q2VudGVyKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG5cclxuICAgIC8vIEFkanVzdCB0aGUgY2FtZXJhIHBvc2l0aW9uXHJcbiAgICBjb25zdCBtYXhEaW1lbnNpb24gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IGRpc3RhbmNlID0gbWF4RGltZW5zaW9uICogMS41OyAvLyBJbmNyZWFzZSB6b29tLWluXHJcbiAgICBjYW1lcmEucG9zaXRpb24uc2V0KGNlbnRlci54IC0gZGlzdGFuY2UgKiAwLjMsIGNlbnRlci55ICsgZGlzdGFuY2UgKiAwLjMsIGRpc3RhbmNlKTsgLy8gVmlldyBmcm9tIGFib3ZlICYgZnJvbnRcclxuICAgIGNhbWVyYS5sb29rQXQoY2VudGVyKTtcclxuICAgIGNhbWVyYS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcclxuICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBzY2VuZSB3aXRoIHRoZSBjYW1lcmFcclxuICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcclxuXHJcbiAgICBjb25zdCBpbWFnZURhdGEgPSBvZmZzY3JlZW5DYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC44KTtcclxuXHJcbiAgICByZW5kZXJlci5kaXNwb3NlKCk7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHNjZW5lKTtcclxuICAgIG9mZnNjcmVlbkNhbnZhcy5yZW1vdmUoKTtcclxuXHJcbiAgICByZXR1cm4gaW1hZ2VEYXRhO1xyXG4gICAgLy8gTm93IHlvdSBjYW4gdXNlIHRoZSBgaW1hZ2VEYXRhYCBVUkwgZm9yIGRpc3BsYXkgb3IgZG93bmxvYWRcclxuICAgIC8vIHRoaXMuX2Rvd25sb2FkSW1hZ2UoYCR7b2JqZWN0Lm5hbWV9X3RodW1ibmFpbC5qcGdgLCBpbWFnZURhdGEpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2Rvd25sb2FkSW1hZ2UoZmlsZU5hbWU6IHN0cmluZywgaW1hZ2VEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIENyZWF0ZSBhIGxpbmsgYW5kIHRyaWdnZXIgdGhlIGRvd25sb2FkXHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgbGluay5ocmVmID0gaW1hZ2VEYXRhO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkR3JvdXAobm9kZTogYW55KTogR3JvdXAge1xyXG4gICAgY29uc3QgZ3JvdXA6IEdyb3VwID0gbm9kZS5kZXRhaWwubG9hZGVyUm9vdE5vZGU7XHJcbiAgICBpZiAoZ3JvdXAuY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xyXG4gICAgICBncm91cC5jaGlsZHJlbi5mb3JFYWNoKChtZXNoOiBNZXNoKSA9PiB7XHJcbiAgICAgICAgbWVzaC5wb3NpdGlvbi5jb3B5KHRoaXMuX2Fic1Bvc2l0aW9uKG1lc2gpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXA7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfYWRkR3JvdXBDaGlsZHJlblRvT2JqZWN0KGdyb3VwOiBPYmplY3QzRCwgb2JqOiBPYmplY3QzRCwgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGdjOiBPYmplY3QzRCkgPT4ge1xyXG4gICAgICBpZiAoY2xlYW5VcCAmJiBnYyBpbnN0YW5jZW9mIEdyb3VwKSB7XHJcbiAgICAgICAgdGhpcy5fYWRkR3JvdXBDaGlsZHJlblRvT2JqZWN0KGdjLCBvYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGdjLnRyYW5zbGF0ZVgoLWdyb3VwLnBvc2l0aW9uLngpO1xyXG4gICAgICAgIGdjLnRyYW5zbGF0ZVkoZ3JvdXAucG9zaXRpb24ueSk7XHJcbiAgICAgICAgLy8gZ2MudHJhbnNsYXRlWigtZ3JvdXAucG9zaXRpb24ueik7XHJcbiAgICAgICAgb2JqLmFkZChnYy5jbG9uZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pdGVyYXRlQ2hpbGRyZW4oY2hpbGRyZW46IE9iamVjdDNEW10sIGNhbGxiYWNrOiAoY2hpbGQ6IE1lc2gpID0+IHt9KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkOiBPYmplY3QzRCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXNoKSB7XHJcbiAgICAgICAgY2FsbGJhY2soY2hpbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2l0ZXJhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbmNsdWRlQmFzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodXJsWzBdID09PSAnLicpIHtcclxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJy4nLCAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodXJsWzBdID09PSAnLycpIHtcclxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJy8nLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aCArIHVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvYmpzOiBPYmplY3QzRFtdID0gQXJyYXkuZnJvbSh0aGlzLl9vYmplY3RDYWNoZS52YWx1ZXMoKSk7XHJcbiAgICBvYmpzLmZvckVhY2gobyA9PiBVdGlscy5EaXNwb3NlT2JqZWN0KG8pKTtcclxuICAgIHRoaXMuX29iamVjdENhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==