@one-grid-core/angular 0.2.1 → 0.4.0

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 (102) hide show
  1. package/README.md +55 -9
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +244 -11
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +446 -34
  4. package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +6 -5
  5. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +3 -3
  6. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +3 -3
  7. package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +7 -18
  8. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +6 -6
  9. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +221 -17
  10. package/esm2022/lib/components/one-grid-header-menu/one-grid-header-menu.component.mjs +137 -0
  11. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +6 -5
  12. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +4 -4
  13. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +5 -3
  14. package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +4 -4
  15. package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +3 -3
  16. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +3 -3
  17. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +3 -3
  18. package/esm2022/lib/core/icons/one-grid-icons.mjs +38 -0
  19. package/esm2022/lib/core/instants/one-grid-api.class.mjs +296 -3
  20. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  22. package/esm2022/lib/core/models/one-filter.model.mjs +1 -1
  23. package/esm2022/lib/core/pipes/aria-sort.pipe.mjs +31 -0
  24. package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +3 -3
  25. package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +3 -3
  26. package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +3 -3
  27. package/esm2022/lib/core/pipes/cell-key.pipe.mjs +3 -3
  28. package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +3 -3
  29. package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +3 -3
  30. package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +3 -3
  31. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -3
  32. package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +3 -3
  33. package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +3 -3
  34. package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +3 -3
  35. package/esm2022/lib/core/services/og-column.service.mjs +153 -30
  36. package/esm2022/lib/core/services/one-grid-cell.service.mjs +16 -14
  37. package/esm2022/lib/helpers/one-cell.helper.mjs +30 -1
  38. package/esm2022/lib/helpers/one-column-def.helper.mjs +16 -1
  39. package/esm2022/lib/helpers/one-csv.helper.mjs +58 -0
  40. package/esm2022/lib/helpers/one-filter.helper.mjs +11 -1
  41. package/esm2022/lib/helpers/one-row-grouping.helper.mjs +103 -0
  42. package/esm2022/lib/index.mjs +3 -1
  43. package/esm2022/lib/one-grid.module.mjs +24 -114
  44. package/fesm2022/one-grid-core-angular.mjs +2328 -851
  45. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  46. package/lib/components/one-grid/one-grid.component.d.ts +101 -4
  47. package/lib/components/one-grid-body/one-grid-body.component.d.ts +83 -2
  48. package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +1 -1
  49. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +1 -1
  50. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +1 -1
  51. package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +1 -1
  52. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +1 -1
  53. package/lib/components/one-grid-header/one-grid-header.component.d.ts +69 -4
  54. package/lib/components/one-grid-header-menu/one-grid-header-menu.component.d.ts +52 -0
  55. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +1 -1
  56. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +1 -1
  57. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +1 -1
  58. package/lib/components/one-grid-status/one-grid-status.component.d.ts +1 -1
  59. package/lib/core/directives/one-cell-input-validator.directive.d.ts +1 -1
  60. package/lib/core/directives/one-cell-renderer-component.directive.d.ts +1 -1
  61. package/lib/core/directives/one-cell-text-expand.directive.d.ts +1 -1
  62. package/lib/core/icons/one-grid-icons.d.ts +35 -0
  63. package/lib/core/instants/one-grid-api.class.d.ts +115 -1
  64. package/lib/core/models/one-column-def-types.model.d.ts +77 -2
  65. package/lib/core/models/one-event-types.model.d.ts +19 -0
  66. package/lib/core/models/one-filter.model.d.ts +8 -1
  67. package/lib/core/pipes/aria-sort.pipe.d.ts +15 -0
  68. package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +1 -1
  69. package/lib/core/pipes/cell-editable.pipe.d.ts +1 -1
  70. package/lib/core/pipes/cell-invalid.pipe.d.ts +1 -1
  71. package/lib/core/pipes/cell-key.pipe.d.ts +1 -1
  72. package/lib/core/pipes/cell-level-padding.pipe.d.ts +1 -1
  73. package/lib/core/pipes/cell-selected.pipe.d.ts +1 -1
  74. package/lib/core/pipes/cell-state-renderer.pipe.d.ts +1 -1
  75. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  76. package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +1 -1
  77. package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +1 -1
  78. package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +1 -1
  79. package/lib/core/services/og-column.service.d.ts +46 -2
  80. package/lib/core/services/one-grid-cell.service.d.ts +0 -3
  81. package/lib/helpers/one-cell.helper.d.ts +17 -0
  82. package/lib/helpers/one-column-def.helper.d.ts +9 -0
  83. package/lib/helpers/one-csv.helper.d.ts +29 -0
  84. package/lib/helpers/one-row-grouping.helper.d.ts +35 -0
  85. package/lib/index.d.ts +2 -0
  86. package/lib/one-grid.module.d.ts +15 -37
  87. package/package.json +1 -1
  88. package/scss/_one-grid.scss +127 -0
  89. package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +0 -17
  90. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +0 -26
  91. package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +0 -25
  92. package/esm2022/lib/core/pipes/cell-field.pipe.mjs +0 -20
  93. package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +0 -19
  94. package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +0 -21
  95. package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +0 -23
  96. package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +0 -9
  97. package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +0 -7
  98. package/lib/core/pipes/cell-field-value.pipe.d.ts +0 -7
  99. package/lib/core/pipes/cell-field.pipe.d.ts +0 -7
  100. package/lib/core/pipes/cell-number-value.pipe.d.ts +0 -7
  101. package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +0 -9
  102. package/lib/core/pipes/cell-value-getter.pipe.d.ts +0 -9
@@ -1,5 +1,7 @@
1
1
  import { OneRowNode } from "./one-row-node.class";
2
2
  import { filterTreeNode, isFilterActive } from "../../helpers/one-filter.helper";
3
+ import { buildCsv } from "../../helpers/one-csv.helper";
4
+ import { buildGroupedRows, ONE_GROUP_ID_FIELD } from "../../helpers/one-row-grouping.helper";
3
5
  import { getFieldValue } from "../../helpers/one-cell.helper";
4
6
  import { v4 as uuidv4 } from 'uuid';
5
7
  import { Injectable } from "@angular/core";
@@ -62,6 +64,23 @@ export class OneGridApi {
62
64
  this.treeDataChildrenField = null;
63
65
  this.groupDefaultExpanded = 0;
64
66
  this.masterDetail = false;
67
+ // ---------------------------------------------------------------------------
68
+ // Row grouping
69
+ // ---------------------------------------------------------------------------
70
+ this._rowGroupFields = [];
71
+ this._aggColumns = [];
72
+ // ---------------------------------------------------------------------------
73
+ // Undo / redo of cell edits
74
+ // ---------------------------------------------------------------------------
75
+ this._undoLimit = 0;
76
+ this._undoStack = [];
77
+ this._redoStack = [];
78
+ // ---------------------------------------------------------------------------
79
+ // Client-side pagination
80
+ // ---------------------------------------------------------------------------
81
+ this._clientPagination = false;
82
+ this._pageSize = 25;
83
+ this._currentPage = 1;
65
84
  }
66
85
  /**
67
86
  * Stand the grid up. Called by `OneGridComponent` from `ngOnInit`.
@@ -84,7 +103,13 @@ export class OneGridApi {
84
103
  this.detailRendererComponent = detailRendererComponent;
85
104
  this.treeData = treeData;
86
105
  this.selectionService.setSelectionMode(rowSelection);
87
- this.rowService.setGetRowIdFn(context?.componentParent?.getRowId ?? null);
106
+ // Synthetic group rows carry their own stable id — the path of group
107
+ // values — which no host getRowId knows how to derive. The wrapper reads
108
+ // it first and defers to the host's function (or the uuid fallback) for
109
+ // real rows, so grouping keeps expansion across rebuilds even when the
110
+ // host provided no id function at all.
111
+ const hostGetRowId = context?.componentParent?.getRowId ?? null;
112
+ this.rowService.setGetRowIdFn((params) => params?.data?.[ONE_GROUP_ID_FIELD] ?? hostGetRowId?.(params) ?? null);
88
113
  this.cellService.applyColumnDefs(columnDefs, context);
89
114
  this.cellService.setGridApi(this);
90
115
  this.columnService.initColumnDefs(defaultColumnDef, columnDefs, groupColumnDefs, context);
@@ -122,6 +147,12 @@ export class OneGridApi {
122
147
  this.selectionService.deselectAll();
123
148
  this.expansionService.clear();
124
149
  }
150
+ // Row grouping is a transform on the way in: the host keeps handing the
151
+ // grid flat rows, and the tree pipeline below sees synthetic group rows
152
+ // with children — the same shape tree data arrives in.
153
+ if (this._rowGroupFields.length) {
154
+ rowData = buildGroupedRows(rowData, this._rowGroupFields, this._aggColumns);
155
+ }
125
156
  const validRowIds = new Set();
126
157
  this.buildRowNodes(rowData, null, 0, validRowIds);
127
158
  // Re-apply the active sort. `buildRowNodes` rebuilds the row list in the
@@ -375,7 +406,7 @@ export class OneGridApi {
375
406
  return;
376
407
  this._sortModel = sortModel;
377
408
  this.applySorting();
378
- this.eventService.dispatchEvent('sortChanged', { nodes: this._rowNodes });
409
+ this.eventService.dispatchEvent('sortChanged', { nodes: this._rowNodes, sortModel: this._sortModel });
379
410
  }
380
411
  applySorting() {
381
412
  if (this._sortModel.length === 0) {
@@ -449,6 +480,50 @@ export class OneGridApi {
449
480
  });
450
481
  }
451
482
  }
483
+ /**
484
+ * Select or deselect one row, honouring the grid's selection mode.
485
+ *
486
+ * The mode rule used to live in the checkbox component, which meant the only
487
+ * way to select a row was to click that checkbox — anything else reaching for
488
+ * `toggleSelection` got multi-select behaviour on a single-select grid. It
489
+ * lives here so every path into selection obeys the same rule.
490
+ *
491
+ * @returns `false` when the grid has no selection mode, so a caller can tell
492
+ * a refused request from an applied one.
493
+ */
494
+ toggleRowSelection(rowId, selected) {
495
+ if (this._destroyed || !this._rowSelection)
496
+ return false;
497
+ const node = this.getRowNodeById(rowId);
498
+ if (!node)
499
+ return false;
500
+ // Single select is "this row and no other", which means clearing first.
501
+ if (this._rowSelection === 'single')
502
+ this.deselectAll();
503
+ this.toggleSelection(rowId, selected);
504
+ node.cellStates = { ...node.cellStates };
505
+ return true;
506
+ }
507
+ /**
508
+ * Select every row between two, inclusive, in display order.
509
+ *
510
+ * What a shift-extended keyboard selection needs. Multi-select only — a
511
+ * single-select grid has no meaningful range.
512
+ */
513
+ selectRowRange(fromRowId, toRowId) {
514
+ if (this._destroyed || this._rowSelection !== 'multiple')
515
+ return false;
516
+ const order = this._visibleRowNodes.length ? this._visibleRowNodes : this._rowNodes;
517
+ const from = order.findIndex(node => node.rowId === fromRowId);
518
+ const to = order.findIndex(node => node.rowId === toRowId);
519
+ if (from === -1 || to === -1)
520
+ return false;
521
+ const ids = order
522
+ .slice(Math.min(from, to), Math.max(from, to) + 1)
523
+ .map(node => node.rowId);
524
+ this.setSelectedByIds(ids, true);
525
+ return true;
526
+ }
452
527
  toggleSelection(rowId, selected) {
453
528
  const node = this.getRowNodeById(rowId);
454
529
  if (node) {
@@ -673,19 +748,237 @@ export class OneGridApi {
673
748
  this.columnService.setColumnDefs(columnDefs);
674
749
  const columnState = this.columnService.getColumnState();
675
750
  this.cellService.applyColumnDefs(columnState.columns, this._context);
751
+ // Cell state is derived from the columns, so replacing them wholesale
752
+ // stales every node built before this ran. Tree and grouping mode hit
753
+ // this on every load: the group column registers from a deferred
754
+ // setColumnDefs, after the host has typically already loaded rows —
755
+ // hosts used to have to defer setRowData themselves to dodge it.
756
+ this.regenerateCellStates();
676
757
  this.eventService.dispatchEvent('columnChanged', columnState);
677
758
  }
678
759
  updateColumn(id, changes) {
760
+ const before = this.visibleColumnFields();
679
761
  this.columnService.updateColumnDef(id, changes);
680
762
  const columnState = this.columnService.getColumnState();
681
763
  this.cellService.applyColumnDefs(columnState.columns, this._context);
764
+ // Only when the set of visible columns changed (a hide, a show): a cell
765
+ // state can appear or disappear then. Width patches — this method runs
766
+ // per mousemove during a resize — skip the O(rows × columns) pass.
767
+ if (this.visibleColumnFields() !== before)
768
+ this.regenerateCellStates();
682
769
  this.eventService.dispatchEvent('columnChanged', columnState);
683
770
  }
771
+ /** The visible fields as one comparable key. */
772
+ visibleColumnFields() {
773
+ return this.columnService.getColumnState().columns?.map(column => column.field).join('|') ?? '';
774
+ }
775
+ /** Recompute every node's cell states against the current columns. */
776
+ regenerateCellStates() {
777
+ const refresh = (node) => node.setCellStates(this.cellService.generateCellStates(node));
778
+ this._rowNodes.forEach(refresh);
779
+ this._pinnedRowNodes.top.forEach(refresh);
780
+ this._pinnedRowNodes.bottom.forEach(refresh);
781
+ }
684
782
  reorderColumnDefs(fromIndex, toIndex) {
685
783
  this.columnService.reorderColumnDefs(fromIndex, toIndex);
686
784
  const columnState = this.columnService.getColumnState();
687
785
  this.eventService.dispatchEvent('columnChanged', columnState);
688
786
  }
787
+ /** The fields the rows are grouped by, in nesting order. Empty when off. */
788
+ get rowGroupFields() {
789
+ return this._rowGroupFields;
790
+ }
791
+ /**
792
+ * Turn row grouping on. Called by `OneGridComponent` when column
793
+ * definitions declare `rowGroup`; the grid then behaves as a tree over
794
+ * synthetic group rows, and `setRowData` / `updateRowData` keep taking the
795
+ * flat rows they always took.
796
+ */
797
+ setRowGrouping(groupFields, aggregations = []) {
798
+ this._rowGroupFields = groupFields ?? [];
799
+ this._aggColumns = aggregations ?? [];
800
+ }
801
+ /**
802
+ * Start recording committed cell edits for undo/redo. Called by
803
+ * `OneGridComponent` from `[undoRedoCellEditing]`; the stack keeps the last
804
+ * `limit` edits. Programmatic `setDataValue` writes are not recorded — only
805
+ * commits, the ones that raise `cellValueChanged` without a source.
806
+ */
807
+ enableUndoRedoCellEditing(limit = 10) {
808
+ if (this._undoLimit > 0)
809
+ return;
810
+ this._undoLimit = Math.max(Math.floor(limit), 1);
811
+ this.eventService.addEventListener('cellValueChanged', (event) => {
812
+ if (event.source)
813
+ return;
814
+ this._undoStack.push({ rowId: event.node.rowId, field: event.field, oldValue: event.oldValue, newValue: event.newValue });
815
+ if (this._undoStack.length > this._undoLimit)
816
+ this._undoStack.shift();
817
+ // A new edit forks history; what was undone can no longer be redone.
818
+ this._redoStack = [];
819
+ });
820
+ }
821
+ /** Revert the most recent committed edit. Returns whether one was undone. */
822
+ undoCellEditing() {
823
+ return this.replayEdit(this._undoStack, this._redoStack, 'undo');
824
+ }
825
+ /** Re-apply the most recently undone edit. Returns whether one was redone. */
826
+ redoCellEditing() {
827
+ return this.replayEdit(this._redoStack, this._undoStack, 'redo');
828
+ }
829
+ getCurrentUndoSize() {
830
+ return this._undoStack.length;
831
+ }
832
+ getCurrentRedoSize() {
833
+ return this._redoStack.length;
834
+ }
835
+ replayEdit(from, to, source) {
836
+ if (this._destroyed)
837
+ return false;
838
+ const edit = from.pop();
839
+ if (!edit)
840
+ return false;
841
+ const node = this.getRowNodeById(edit.rowId);
842
+ // The row can be gone — a setRowData replaced the data under the stack.
843
+ // The edit is dropped rather than replayed onto nothing.
844
+ if (!node)
845
+ return false;
846
+ const value = source === 'undo' ? edit.oldValue : edit.newValue;
847
+ const previous = source === 'undo' ? edit.newValue : edit.oldValue;
848
+ node.data[edit.field] = value;
849
+ this.updateCellStates(node);
850
+ to.push(edit);
851
+ const column = this.columnService.getColumnState().columns?.find(col => col.field === edit.field) ?? null;
852
+ this.eventService.dispatchEvent('cellValueChanged', {
853
+ node,
854
+ data: node.data,
855
+ column: column,
856
+ field: edit.field,
857
+ oldValue: previous,
858
+ newValue: value,
859
+ source,
860
+ });
861
+ return true;
862
+ }
863
+ /** The paging state, when the grid pages its own rows. */
864
+ get paginationState() {
865
+ return { enabled: this._clientPagination, pageSize: this._pageSize, currentPage: this._currentPage };
866
+ }
867
+ /**
868
+ * Turn grid-owned paging on or off. Called by `OneGridComponent` from its
869
+ * `clientSidePagination` input; the display slice is what changes — the
870
+ * full dataset stays behind the API (selection, filters and sorting keep
871
+ * operating on all of it).
872
+ */
873
+ setClientSidePagination(enabled, pageSize) {
874
+ this._clientPagination = enabled;
875
+ if (pageSize && pageSize > 0)
876
+ this._pageSize = pageSize;
877
+ this._currentPage = 1;
878
+ }
879
+ /** Change the page size and return to the first page. */
880
+ setPageSize(pageSize) {
881
+ if (this._destroyed || !(pageSize > 0))
882
+ return;
883
+ this._pageSize = Math.floor(pageSize);
884
+ this._currentPage = 1;
885
+ this.applyFilters();
886
+ }
887
+ /** Move to a page (1-based). Clamped to at least 1; the top end clamps when the slice is taken. */
888
+ setCurrentPage(page) {
889
+ if (this._destroyed)
890
+ return;
891
+ const target = Math.max(Math.floor(page), 1);
892
+ if (target === this._currentPage)
893
+ return;
894
+ this._currentPage = target;
895
+ this.applyFilters();
896
+ }
897
+ /**
898
+ * The slice of rows the current page shows — a passthrough while paging is
899
+ * off. The body routes its render list through here, after reporting the
900
+ * full count, so `rowCountChanged` keeps meaning "rows after filtering"
901
+ * whether or not the grid pages.
902
+ */
903
+ pageNodes(nodes) {
904
+ if (!this._clientPagination)
905
+ return (nodes ?? []);
906
+ const lastPage = Math.max(Math.ceil((nodes?.length ?? 0) / this._pageSize), 1);
907
+ // A shrinking dataset (a filter, a delete) can strand the page past the
908
+ // end; clamping here shows the last page instead of an empty one.
909
+ if (this._currentPage > lastPage)
910
+ this._currentPage = lastPage;
911
+ const start = (this._currentPage - 1) * this._pageSize;
912
+ return (nodes ?? []).slice(start, start + this._pageSize);
913
+ }
914
+ /**
915
+ * Size the flex columns into the given width.
916
+ *
917
+ * Called by the grid body with its own viewport width — on first render, on
918
+ * container resize and after column changes — so `columnDef.flex` works
919
+ * without the host doing anything. Also callable directly with any width.
920
+ * A no-op when no visible column declares `flex` or nothing would change.
921
+ */
922
+ applyFlexWidths(availableWidth) {
923
+ if (this._destroyed)
924
+ return;
925
+ if (!this.columnService.applyFlexWidths(availableWidth))
926
+ return;
927
+ const columnState = this.columnService.getColumnState();
928
+ this.cellService.applyColumnDefs(columnState.columns, this._context);
929
+ this.eventService.dispatchEvent('columnChanged', columnState);
930
+ }
931
+ /**
932
+ * The current grid as CSV: visible columns in display order, visible rows
933
+ * in current sort order, values through the same getter/formatter pipeline
934
+ * the cells render with. Pinned rows and detail grids are not data and are
935
+ * not included.
936
+ */
937
+ getDataAsCsv(options = {}) {
938
+ const nodes = options.onlySelected ? this.getSelectedRowNodes() : this._visibleRowNodes;
939
+ return buildCsv(nodes, this.columnService.getColumnState().columns, this._context, options);
940
+ }
941
+ /** Build the CSV and hand it to the browser as a download. */
942
+ exportDataAsCsv(options = {}) {
943
+ if (typeof document === 'undefined')
944
+ return;
945
+ const blob = new Blob([this.getDataAsCsv(options)], { type: 'text/csv;charset=utf-8;' });
946
+ const link = document.createElement('a');
947
+ link.href = URL.createObjectURL(blob);
948
+ link.download = options.fileName ?? 'export.csv';
949
+ link.click();
950
+ URL.revokeObjectURL(link.href);
951
+ }
952
+ /**
953
+ * Show or hide one column. A hidden column keeps its order, width and pin,
954
+ * so showing it again restores it exactly.
955
+ */
956
+ setColumnVisible(id, visible) {
957
+ this.updateColumn(id, { hide: !visible });
958
+ }
959
+ /**
960
+ * Persistable layout state: one JSON-safe entry per column — hidden ones
961
+ * included — in display order. Feed it back through `applyColumnState`.
962
+ */
963
+ getColumnStateSnapshot() {
964
+ return this.columnService.getColumnStateSnapshot();
965
+ }
966
+ /**
967
+ * Restore a snapshot from `getColumnStateSnapshot`: order, width, pin and
968
+ * visibility. Ids the grid no longer has are skipped, so a stale snapshot
969
+ * degrades to a partial restore rather than an error.
970
+ */
971
+ applyColumnState(entries) {
972
+ if (this._destroyed)
973
+ return;
974
+ this.columnService.applyColumnState(entries);
975
+ const columnState = this.columnService.getColumnState();
976
+ this.cellService.applyColumnDefs(columnState.columns, this._context);
977
+ // A restore can show columns that were hidden when the rows were built,
978
+ // and their cells have no state yet.
979
+ this.regenerateCellStates();
980
+ this.eventService.dispatchEvent('columnChanged', columnState);
981
+ }
689
982
  /**
690
983
  * Update checkbox selection features
691
984
  */
@@ -851,4 +1144,4 @@ export class OneGridApi {
851
1144
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, decorators: [{
852
1145
  type: Injectable
853
1146
  }], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridRowService }, { type: i3.OneGridCellService }, { type: i4.OneGridEventService }, { type: i5.OneGridSelectionService }, { type: i6.OneGridExpansionService }] });
854
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBK0JELFlBQ1UsYUFBOEIsRUFDOUIsVUFBNkIsRUFDN0IsV0FBK0IsRUFD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RUFBMkU7UUFDM0UseURBQXlEO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxJQUFXLFNBQVM7UUFFbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7K0dBeHBDVSxVQUFVO21IQUFWLFVBQVU7OzRGQUFWLFVBQVU7a0JBRHRCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gXCIuL29uZS1yb3ctbm9kZS5jbGFzc1wiO1xuaW1wb3J0IHsgT25lR3JpZEluaXRPcHRpb25zLCBPbmVHcmlkVHlwZSwgT25lU29ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUm93VmFsaWRhdGlvbkVycm9ycywgT25lVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9vbmUtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBPbmVGaWx0ZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgZmlsdGVyVHJlZU5vZGUsIGlzRmlsdGVyQWN0aXZlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWZpbHRlci5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZVJvd0RyYWdTdXBwcmVzc2VkUmVhc29uIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWxcIjtcbmltcG9ydCB7IGdldEZpZWxkVmFsdWUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY2VsbC5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEluamVjdGFibGUsIFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29sdW1uQ2hhbmdlZEV2ZW50LCBPbmVQaW5uZWRSb3dTaWRlLCBSb3dTZWxlY3Rpb25Nb2RlIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9uZUdyb3VwQ29sdW1uRGVmIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbFwiO1xuaW1wb3J0IHsgT2dDb2x1bW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQXBpPFQgPSBhbnk+IHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHVibGljIHN0YXRlXG4gIC8vXG4gIC8vIEV4cG9zZWQgYXMgZ2V0dGVycywgbm90IGZpZWxkcy4gVGhlc2Ugd2VyZSB3cml0YWJsZSwgc28gYSBjb25zdW1lciBjb3VsZFxuICAvLyBjb3JydXB0IHRoZSBncmlkIGJ5IGFzc2lnbmluZyB0byB0aGVtIOKAlCBzd2FwcGluZyBgcm93Tm9kZXNgIGZvciBhblxuICAvLyB1bnJlbGF0ZWQgYXJyYXksIG9yIHNldHRpbmcgYHNvcnRNb2RlbGAgd2l0aG91dCB0aGUgcm93cyBldmVyIGJlaW5nXG4gIC8vIHJlLXNvcnRlZC4gUmVhZHMgYXJlIHVuY2hhbmdlZDsgb25seSBhc3NpZ25tZW50IGlzIG5vdyBhIGNvbXBpbGUgZXJyb3IuXG4gIC8vXG4gIC8vIFRoZSBhcnJheS12YWx1ZWQgb25lcyBhcmUgdHlwZWQgYHJlYWRvbmx5IFRbXWAsIHdoaWNoIHN0b3BzIGBwdXNoYCBhbmRcbiAgLy8gYHNwbGljZWAgYXQgY29tcGlsZSB0aW1lIHdpdGhvdXQgY29weWluZyBvbiBldmVyeSByZWFkLiBVc2VcbiAgLy8gYGdldEFsbFJvd05vZGVzKClgIHdoZW4geW91IHdhbnQgYSBjb3B5IHlvdSBvd24uXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBwcml2YXRlIF9pZDogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBhbnkgPSBudWxsO1xuICBwcml2YXRlIF9yb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk1vZGUgPSBudWxsO1xuICBwcml2YXRlIF9hcGlUeXBlOiBPbmVHcmlkVHlwZSA9IG51bGw7XG4gIHByaXZhdGUgX3Jvd05vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBfc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSA9IFtdO1xuXG4gIC8qKiBVbmlxdWUgcGVyIGdyaWQgaW5zdGFuY2UsIGFzc2lnbmVkIGR1cmluZyBgaW5pdGAuICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKiogVGhlIGBbY29udGV4dF1gIHRoZSBncmlkIHdhcyBnaXZlbi4gKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICAvKiogU2VsZWN0aW9uIG1vZGUsIGNhcHR1cmVkIGR1cmluZyBgaW5pdGAuIENoYW5naW5nIHRoZSBpbnB1dCBsYXRlciBoYXMgbm8gZWZmZWN0LiAqL1xuICBwdWJsaWMgZ2V0IHJvd1NlbGVjdGlvbigpOiBSb3dTZWxlY3Rpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fcm93U2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqIFdoaWNoIHJvbGUgdGhpcyBpbnN0YW5jZSBwbGF5czogc2ltcGxlLCBtYXN0ZXIsIGRldGFpbCBvciB0cmVlLiAqL1xuICBwdWJsaWMgZ2V0IGFwaVR5cGUoKTogT25lR3JpZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9hcGlUeXBlO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IG5vZGUgdGhlIGdyaWQgaG9sZHMsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGdldCByb3dOb2RlcygpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dOb2RlcztcbiAgfVxuXG4gIC8qKiBUaGUgc29ydCBtb2RlbCBjdXJyZW50bHkgYXBwbGllZC4gQ2hhbmdlIGl0IHdpdGggYG9uU29ydENoYW5nZWRgLiAqL1xuICBwdWJsaWMgZ2V0IHNvcnRNb2RlbCgpOiByZWFkb25seSBPbmVTb3J0TW9kZWw8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRNb2RlbDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSByb3dIZWlnaHQ6IG51bWJlciA9IDI2O1xuICBwcml2YXRlIGhlYWRlclJvd0hlaWdodDogbnVtYmVyID0gMzI7XG4gIHByaXZhdGUgX2N1cnJlbnRJbmRleDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfcXVpY2tGaWx0ZXJWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBfYWN0aXZlRmlsdGVyczogT25lRmlsdGVyTW9kZWxbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3Zpc2libGVSb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Bpbm5lZFJvd05vZGVzOiBSZWNvcmQ8T25lUGlubmVkUm93U2lkZSwgT25lUm93Tm9kZTxUPltdPiA9IHsgdG9wOiBbXSwgYm90dG9tOiBbXSB9O1xuICBwcml2YXRlIF9vcmlnaW5hbFJvd05vZGVzOiBNYXA8c3RyaW5nLCBPbmVSb3dOb2RlPFQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfbm9kZUNsZWFudXBNYXAgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8KCkgPT4gdm9pZD4+KCk7IC8vIENsZWFudXAgcmVnaXN0cnkgKHByZXZlbnRzIG1lbW9yeSBsZWFrcylcbiAgcHJpdmF0ZSBfZGVzdHJveWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gQWR2YW5jZWQgRmVhdHVyZXNcbiAgcHJpdmF0ZSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBwcml2YXRlIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50PzogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBTdXBwbGllcyBhIG1hc3RlciByb3cncyBkZXRhaWwgcm93cy4gU2V0IHRocm91Z2ggYHNldEdldERldGFpbFJvd0RhdGFgO1xuICAgKiBwcmV2aW91c2x5IGEgd3JpdGFibGUgcHVibGljIGZpZWxkIHdpdGggYSBzZXR0ZXIgYmVzaWRlIGl0LCB3aGljaCBsZWZ0IHR3b1xuICAgKiB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBvbmUgb2YgdGhlbSB1bmNoZWNrZWQuXG4gICAqL1xuICBwcml2YXRlIF9nZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29sdW1uU2VydmljZTogT2dDb2x1bW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm93U2VydmljZTogT25lR3JpZFJvd1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZWxsU2VydmljZTogT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZTogT25lR3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBleHBhbnNpb25TZXJ2aWNlOiBPbmVHcmlkRXhwYW5zaW9uU2VydmljZVxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBTdGFuZCB0aGUgZ3JpZCB1cC4gQ2FsbGVkIGJ5IGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGBuZ09uSW5pdGAuXG4gICAqXG4gICAqIFRha2VzIGEgc2luZ2xlIGBPbmVHcmlkSW5pdE9wdGlvbnNgIHJhdGhlciB0aGFuIHRoZSB0ZW4gcG9zaXRpb25hbFxuICAgKiBhcmd1bWVudHMgaXQgdXNlZCB0bywgc28gYSBjYWxsIHNpdGUgcmVhZHMgYXMgdGhlIGNvbmZpZ3VyYXRpb24gaXQgaXMgYW5kXG4gICAqIGEgbmV3IG9wdGlvbiBubyBsb25nZXIgbWVhbnMgZWRpdGluZyBldmVyeSBjYWxsZXIuXG4gICAqXG4gICAqIEBpbnRlcm5hbCBBcHBsaWNhdGlvbnMgb2J0YWluIGEgcmVhZHktbWFkZSBBUEkgZnJvbSBgKG9uR3JpZFJlYWR5KWA7IHRoZXlcbiAgICogc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgaW5pdChvcHRpb25zOiBPbmVHcmlkSW5pdE9wdGlvbnM8VD4pOiB2b2lkIHtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdyaWRUeXBlLFxuICAgICAgY29sdW1uRGVmcyxcbiAgICAgIGRlZmF1bHRDb2x1bW5EZWYgPSB7fSxcbiAgICAgIGdyb3VwQ29sdW1uRGVmcyA9IFtdLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICByb3dTZWxlY3Rpb24gPSBudWxsLFxuICAgICAgbWFzdGVyRGV0YWlsID0gZmFsc2UsXG4gICAgICBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsLFxuICAgICAgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsLFxuICAgICAgdHJlZURhdGEgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIHRoaXMuX2lkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5fYXBpVHlwZSA9IGdyaWRUeXBlO1xuICAgIHRoaXMuX3Jvd1NlbGVjdGlvbiA9IHJvd1NlbGVjdGlvbjtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IG1hc3RlckRldGFpbDtcbiAgICB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcyA9IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG4gICAgdGhpcy50cmVlRGF0YSA9IHRyZWVEYXRhO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNldFNlbGVjdGlvbk1vZGUocm93U2VsZWN0aW9uKTtcbiAgICB0aGlzLnJvd1NlcnZpY2Uuc2V0R2V0Um93SWRGbihjb250ZXh0Py5jb21wb25lbnRQYXJlbnQ/LmdldFJvd0lkID8/IG51bGwpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmcywgY29udGV4dCk7XG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKHRoaXMpO1xuICAgIHRoaXMuY29sdW1uU2VydmljZS5pbml0Q29sdW1uRGVmcyhkZWZhdWx0Q29sdW1uRGVmLCBjb2x1bW5EZWZzLCBncm91cENvbHVtbkRlZnMsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlIGFzIENvbHVtbkNoYW5nZWRFdmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZXZlcnkgcm93LCBkaXNjYXJkaW5nIHNlbGVjdGlvbiBhbmQgZXhwYW5zaW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHRoZSByb3dzIHJlcHJlc2VudCBzb21ldGhpbmcgbmV3LiBUbyBzd2FwIHRoZSBkYXRhIHdoaWxlXG4gICAqIGtlZXBpbmcgd2hhdCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgYW5kIG9wZW5lZCwgdXNlIGB1cGRhdGVSb3dEYXRhYC5cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dEYXRhKHJvd0RhdGE6IFRbXSkge1xuXG4gICAgdGhpcy5yZWJ1aWxkUm93cyhyb3dEYXRhLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywga2VlcGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogU3RhdGUgaXMga2V5ZWQgYnkgcm93IGlkLCBzbyB0aGlzIG9ubHkgcHJlc2VydmVzIGFueXRoaW5nIGlmIHRoZSBncmlkIGhhcyBhXG4gICAqIGBjb250ZXh0LmNvbXBvbmVudFBhcmVudC5nZXRSb3dJZGAg4oCUIG90aGVyd2lzZSBlYWNoIHJlYnVpbGQgbWludHMgbmV3IGlkc1xuICAgKiBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIG1hdGNoIGFnYWluc3QuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUm93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUgcm93LWxvYWRpbmcgcGF0aC4gYHNldFJvd0RhdGFgIGFuZCBgdXBkYXRlUm93RGF0YWAgZGlmZmVyZWQgb25seSBpblxuICAgKiB3aGV0aGVyIHRoZXkgY2xlYXJlZCB0aGUgc3RhdGUgc2VydmljZXMgZmlyc3QsIHNvIGV2ZXJ5dGhpbmcgZWxzZSDigJQgYnVpbGQsXG4gICAqIGZpbHRlciwgcHJ1bmUg4oCUIGxpdmVzIGhlcmUgb25jZS5cbiAgICovXG4gIHByaXZhdGUgcmVidWlsZFJvd3Mocm93RGF0YTogVFtdLCByZXNldFN0YXRlOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBpZiAocmVzZXRTdGF0ZSkge1xuXG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RBbGwoKTtcbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmJ1aWxkUm93Tm9kZXMocm93RGF0YSwgbnVsbCwgMCwgdmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUmUtYXBwbHkgdGhlIGFjdGl2ZSBzb3J0LiBgYnVpbGRSb3dOb2Rlc2AgcmVidWlsZHMgdGhlIHJvdyBsaXN0IGluIHRoZVxuICAgIC8vIG9yZGVyIHRoZSBkYXRhIGFycml2ZWQsIHNvIHdpdGhvdXQgdGhpcyBhIGRhdGEgdXBkYXRlIHNpbGVudGx5IHJldHVybmVkXG4gICAgLy8gdGhlIHJvd3MgdG8gdGhhdCBvcmRlciB3aGlsZSBgc29ydE1vZGVsYCDigJQgYW5kIHRoZXJlZm9yZSB0aGUgaGVhZGVyJ3NcbiAgICAvLyBzb3J0IGFycm93IOKAlCBzdGlsbCBzYWlkIHRoZXkgd2VyZSBzb3J0ZWQuIFNvcnRpbmcgYmVmb3JlIGZpbHRlcmluZ1xuICAgIC8vIGJlY2F1c2UgZmlsdGVyaW5nIG9ubHkgc2V0cyB2aXNpYmlsaXR5IG9uIHdoYXRldmVyIG9yZGVyIHRoaXMgbGVhdmVzLlxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgdGhpcy5hcHBseVNvcnRpbmcoKTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG5cbiAgICB0aGlzLnBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmUgQnVpbGQgUm93IE5vZGVzIChPcHRpbWl6ZWQpXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUm93Tm9kZXMoXG4gICAgcm93RGF0YTogVFtdLFxuICAgIHBhcmVudDogT25lUm93Tm9kZTxUPiB8IG51bGwgPSBudWxsLFxuICAgIGxldmVsOiBudW1iZXIgPSAwLFxuICAgIHZhbGlkUm93SWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKSxcbiAgICBleHBhbmRlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRFeHBhbmRlZElkcygpKSxcbiAgICBjb2xsYXBzZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmV4cGFuc2lvblNlcnZpY2UuZ2V0Q29sbGFwc2VkSWRzKCkpLFxuICAgIHNlbGVjdGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkSWRzKCkpXG4gICk6IE9uZVJvd05vZGVbXSB7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG5cbiAgICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIGlmICghcm93RGF0YT8ubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygcm93RGF0YSkge1xuXG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93U2VydmljZS5nZW5lcmF0ZVJvd0lkKGRhdGEsIHRoaXMuX2N1cnJlbnRJbmRleCk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IChkYXRhIGFzIGFueSlbdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGRdIHx8IG51bGw7XG5cbiAgICAgIGxldCBub2RlOiBPbmVSb3dOb2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgICB2YWxpZFJvd0lkcy5hZGQocm93SWQpO1xuXG4gICAgICBpZiAobm9kZSkge1xuXG4gICAgICAgIG5vZGUuZGF0YSA9IGRhdGE7XG4gICAgICAgIG5vZGUuc2V0Um93SW5kZXgodGhpcy5fY3VycmVudEluZGV4KTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlID0gbmV3IE9uZVJvd05vZGU8VD4ocm93SWQsIGRhdGEsIHRoaXMuX2N1cnJlbnRJbmRleCk7XG4gICAgICAgIG5vZGUubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIG5vZGUuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuc2V0KHJvd0lkLCBub2RlKTtcblxuICAgICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuRXhpc3QgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPj0gMDtcblxuICAgICAgLy8gQ29lcmNlZCwgYmVjYXVzZSBgY2hpbGRyZW5FeGlzdGAgaXMgYGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwYFxuICAgICAgLy8g4oCUIHdoaWNoIGlzIGBudWxsYCBmb3IgYSByb3cgd2l0aCBubyBjaGlsZHJlbiBmaWVsZCwgbm90IGBmYWxzZWAuIFRoZXNlXG4gICAgICAvLyBhcmUgZGVjbGFyZWQgYGJvb2xlYW5gLCBhbmQgYXNzaWduaW5nIG51bGwgbWFkZSBldmVyeSBjb25zdW1lciBjb21wYXJlXG4gICAgICAvLyB0cnV0aGluZXNzIGluc3RlYWQgb2YgdGhlIHZhbHVlLlxuICAgICAgbm9kZS5ncm91cCA9IHRoaXMubWFzdGVyRGV0YWlsID8gZmFsc2UgOiAhIWNoaWxkcmVuRXhpc3Q7XG4gICAgICBub2RlLmxlYWYgPSB0aGlzLm1hc3RlckRldGFpbCA/IHRydWUgOiAhbm9kZS5ncm91cDtcbiAgICAgIG5vZGUubGVhZkdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6IChub2RlLmdyb3VwICYmICFjaGlsZHJlbkV4aXN0KTtcbiAgICAgIG5vZGUuZXhwYW5kYWJsZSA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6IChub2RlLmdyb3VwICYmICFub2RlLmxlYWZHcm91cCk7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRFeHBhbmRlZCA9IG5vZGUuZXhwYW5kYWJsZSAmJiAobGV2ZWwgPCB0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkIHx8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPT09IC0xKTtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZElkcy5oYXMocm93SWQpID8gdHJ1ZSA6IGNvbGxhcHNlZElkcy5oYXMocm93SWQpID8gZmFsc2UgOiBkZWZhdWx0RXhwYW5kZWQpO1xuICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3RlZElkcy5oYXMocm93SWQpKTtcbiAgICAgIG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCAmJiB0aGlzLl9hcGlUeXBlID09PSAnbWFzdGVyJykge1xuXG4gICAgICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEoeyBkYXRhLCBub2RlOiBub2RlLCBzdWNjZXNzQ2FsbGJhY2s6IChkZXRhaWxSb3dEYXRhKSA9PiBub2RlLnNldERldGFpbFJvd0RhdGEoZGV0YWlsUm93RGF0YSkgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrO1xuICAgICAgdGhpcy5fcm93Tm9kZXMucHVzaChub2RlKTtcblxuICAgICAgbm9kZXMucHVzaChub2RlKTtcblxuICAgICAgbm9kZS5jaGlsZHJlbiA9IHRoaXMudHJlZURhdGEgJiYgY2hpbGRyZW5FeGlzdCA/IHRoaXMuYnVpbGRSb3dOb2RlcyhjaGlsZHJlbiB8fCBbXSwgbm9kZSwgbGV2ZWwgKyAxLCB2YWxpZFJvd0lkcywgZXhwYW5kZWRJZHMsIGNvbGxhcHNlZElkcywgc2VsZWN0ZWRJZHMpIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBGZWF0dXJlXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuXG4gICAgY29uc3QgcXVpY2sgPSB0aGlzLl9xdWlja0ZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgLy8gVGhlIGZpZWxkcyB0aGUgZ3JpZCBhY3R1YWxseSBzaG93cy4gV2l0aG91dCB0aGVtIHRoZSBxdWljayBmaWx0ZXIgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGV2ZXJ5IHByb3BlcnR5IG9uIHRoZSByb3csIHdoaWNoIGxldHMgYSB1c2VyIG1hdGNoIG9uIGRhdGEgdGhhdFxuICAgIC8vIGhhcyBubyBjb2x1bW4gYW5kIG5ldmVyIGFwcGVhcnMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucXVpY2tGaWx0ZXJGaWVsZHMoKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBmaWx0ZXJUcmVlTm9kZShub2RlLCBmaWx0ZXJzLCBxdWljaywgZmllbGRzKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBmaWVsZHMgdGhlIHF1aWNrIGZpbHRlciBzZWFyY2hlczogZXZlcnkgY29sdW1uIHRoYXQgaGFzIG9uZS5cbiAgICpcbiAgICogRW1wdHkgd2hpbGUgdGhlIGNvbHVtbnMgYXJlIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqIGhlbHBlciBmYWxscyBiYWNrIHRvIHNlYXJjaGluZyB0aGUgcm93IOKAlCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgYmVmb3JlLCBhbmRcbiAgICogdGhlIG9ubHkgc2Vuc2libGUgYW5zd2VyIHdoZW4gdGhlIGdyaWQgZG9lcyBub3QgeWV0IGtub3cgaXRzIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHF1aWNrRmlsdGVyRmllbGRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2VcbiAgICAgIC5nZXRDb2x1bW5TdGF0ZSgpXG4gICAgICAuY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkIGFzIHN0cmluZylcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+ICEhZmllbGQgJiYgZmllbGQgIT09ICdfb25lUm93TnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFJvdyBOb2RlcyBEaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hWaXNpYmxlTm9kZXMoZGlzcGF0Y2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB2aXNpYmxlTm9kZXM6IE9uZVJvd05vZGVbXSA9IFtdO1xuXG4gICAgbGV0IHJvd051bWJlciA9IDE7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBjb25zdCBwYXJlbnRWaXNpYmxlID0gbm9kZS5wYXJlbnQgPyB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUucGFyZW50LnJvd0lkKSA6IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG5vZGUudmlzaWJsZSAmJiBwYXJlbnRWaXNpYmxlICYmICghbm9kZS5wYXJlbnQgfHwgbm9kZS5wYXJlbnQuZXhwYW5kZWQpO1xuXG4gICAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUucm93SWQsIGlzVmlzaWJsZSk7XG5cbiAgICAgIGlmIChpc1Zpc2libGUpIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogcm93TnVtYmVyKysgfTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAnbm9uZScsIHZhbHVlOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gWy4uLnZpc2libGVOb2Rlc107XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd0RhdGFDaGFuZ2VkJywgeyBub2RlczogdmlzaWJsZU5vZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHJvd3MgYW5jaG9yZWQgdG8gb25lIGVkZ2Ugb2YgdGhlIGdyaWQuXG4gICAqXG4gICAqIFBpbm5lZCByb3dzIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBvdXQgb2YgYHJvd05vZGVzYCBhbmRcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYDogdGhleSBhcmUgbm90IGRhdGEuIFNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uLFxuICAgKiBleHBhbnNpb24sIHBhZ2luYXRpb24gYW5kIHRoZSB2aXNpYmxlIHJvdyBjb3VudCBhbGwgaWdub3JlIHRoZW0sIHdoaWNoIGlzXG4gICAqIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN1bW1hcnkgcm93LiBUaGV5IHJlbmRlciB3aXRoIHRoZSBzYW1lIGNvbHVtblxuICAgKiBkZWZpbml0aW9ucywgc28gcmVuZGVyZXJzIGFuZCB2YWx1ZSBnZXR0ZXJzIHdvcmsgYXMgdGhleSBkbyBldmVyeXdoZXJlXG4gICAqIGVsc2UuXG4gICAqL1xuICBwdWJsaWMgc2V0UGlubmVkUm93RGF0YShzaWRlOiBPbmVQaW5uZWRSb3dTaWRlLCByb3dEYXRhOiBUW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSkgbm9kZS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IChyb3dEYXRhID8/IFtdKS5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG5cbiAgICAgIC8vIElkcyBhcmUgbmFtZXNwYWNlZCBieSBzaWRlIGFuZCBwb3NpdGlvbi4gVGhleSBuZXZlciBjb2xsaWRlIHdpdGggYSBkYXRhXG4gICAgICAvLyByb3cncyBpZCwgYW5kIHRoZXkgYXJlIHN0YWJsZSBhY3Jvc3MgcmVidWlsZHMsIHdoaWNoIGtlZXBzIHRoZSByZW5kZXJlZFxuICAgICAgLy8gYGRhdGEtY2VsbC1pZGAgYXR0cmlidXRlcyBzdGFibGUgdG9vLlxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KGBvbmUtcGlubmVkLSR7c2lkZX0tJHtpbmRleH1gLCBkYXRhLCBpbmRleCk7XG5cbiAgICAgIG5vZGUubGV2ZWwgPSAwO1xuICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcbiAgICAgIG5vZGUudmlzaWJsZSA9IHRydWU7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywge1xuICAgICAgc2lkZSxcbiAgICAgIG5vZGVzOiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZS4gUmVhZC1vbmx5OyBjaGFuZ2UgdGhlbSB3aXRoIGBzZXRQaW5uZWRSb3dEYXRhYC4gKi9cbiAgcHVibGljIGdldFBpbm5lZFJvd05vZGVzKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyByZW9yZGVyaW5nXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqXG4gICAqIGBfb3JpZ2luYWxSb3dOb2Rlc2AgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3Igcm93IG9yZGVyOiBpdHMgaW5zZXJ0aW9uXG4gICAqIG9yZGVyIGlzIHdoYXQgYGFwcGx5U29ydGluZ2AgZmFsbHMgYmFjayB0byB3aGVuIHRoZSBzb3J0IG1vZGVsIGVtcHRpZXMsIGFuZFxuICAgKiB3aGF0IGEgcmVidWlsZCB3YWxrcy4gYF9yb3dOb2Rlc2AgaXMgb25seSB0aGUgY3VycmVudCBkaXNwbGF5IG9yZGVyLiBBIG1vdmVcbiAgICogdGhhdCB0b3VjaGVkIG9uZSBhbmQgbm90IHRoZSBvdGhlciB3b3VsZCBlaXRoZXIgYmUgdW5kb25lIGJ5IHRoZSBuZXh0IHNvcnRcbiAgICogY2hhbmdlIG9yIGludmlzaWJsZSB1bnRpbCBvbmUgaGFwcGVuZWQsIHNvIGJvdGggYXJlIHJld3JpdHRlbiB0b2dldGhlci5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRpc3BsYXllZCBvcmRlciBpcyB0aGUgZGF0YSBvcmRlciwgYW5kIHNvIHdoZXRoZXIgYSBtYW51YWwgbW92ZVxuICAgKiB3b3VsZCBzdXJ2aXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVhc29uIHJlb3JkZXJpbmcgaXMgdW5hdmFpbGFibGUsIG9yIGBudWxsYCB3aGVuIGl0IGlzIGZpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKTogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsIHtcblxuICAgIGlmICh0aGlzLnRyZWVEYXRhKSByZXR1cm4gJ3RyZWVEYXRhJztcblxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgcmV0dXJuICdzb3J0ZWQnO1xuXG4gICAgaWYgKGlzRmlsdGVyQWN0aXZlKHRoaXMuX2FjdGl2ZUZpbHRlcnMsIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPz8gJycpKSByZXR1cm4gJ2ZpbHRlcmVkJztcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlIGludmVyc2Ugb2Yge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufS4gKi9cbiAgcHVibGljIGNhblJlb3JkZXJSb3dzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKSA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGZyb20gb25lIHBvc2l0aW9uIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIHBvc2l0aW9ucyBpbiB0aGUgZ3JpZCdzIHJvdyBvcmRlciwgdGhlIHNhbWUgb3JkZXJcbiAgICogYGdldEFsbFJvd05vZGVzKClgIHJldHVybnMuIGB0YXJnZXRJbmRleGAgaXMgd2hlcmUgdGhlIHJvdyBlbmRzIHVwICphZnRlcipcbiAgICogaXQgaGFzIGJlZW4gbGlmdGVkIG91dCBvZiBgc291cmNlSW5kZXhgIOKAlCBkcmFnZ2luZyByb3cgMCB0byB0aGUgYm90dG9tIG9mIGFcbiAgICogNS1yb3cgZ3JpZCBpcyBgbW92ZVJvdygwLCA0KWAsIG5vdCBgbW92ZVJvdygwLCA1KWAuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcm93cyBtb3ZlZC4gYGZhbHNlYCB3aGVuIHRoZSBtb3ZlIHdhcyByZWplY3RlZCDigJRcbiAgICogICAgICAgICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIGEgbm8tb3AsIG9yIGFuIG9yZGVyIHRoZSBncmlkIGRvZXMgbm90IG93blxuICAgKiAgICAgICAgICAoc2VlIHtAbGluayBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbn0pIOKAlCBzbyBhIGNhbGxlciBjYW4gdGVsbCBhXG4gICAqICAgICAgICAgIHJlZnVzZWQgbW92ZSBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3coc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNhblJlb3JkZXJSb3dzKCkpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZUluZGV4KSB8fCAhTnVtYmVyLmlzSW50ZWdlcih0YXJnZXRJbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChzb3VyY2VJbmRleCA8IDAgfHwgc291cmNlSW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IG9yZGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IG9yZGVyLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBvcmRlci5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIC8vIFJlYnVpbHQgcmF0aGVyIHRoYW4gbXV0YXRlZDogYSBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciwgYW5kIHRoZXJlXG4gICAgLy8gaXMgbm8gd2F5IHRvIHJlcG9zaXRpb24gYSBrZXkgd2l0aGluIG9uZS5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzID0gbmV3IE1hcChvcmRlci5tYXAobm9kZSA9PiBbbm9kZS5yb3dJZCwgbm9kZV0pKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gb3JkZXI7XG5cbiAgICB0aGlzLnJlaW5kZXhSb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dPcmRlckNoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLl92aXNpYmxlUm93Tm9kZXMgYXMgT25lUm93Tm9kZTxUPltdLCBub2RlOiBtb3ZlZCwgZnJvbUluZGV4OiBzb3VyY2VJbmRleCwgdG9JbmRleDogdGFyZ2V0SW5kZXggfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGlkZW50aWZpZWQgYnkgaWQuIENvbnZlbmllbnQgd2hlbiB0aGUgY2FsbGVyIGhvbGRzIGEgbm9kZSByYXRoZXJcbiAgICogdGhhbiBhIHBvc2l0aW9uIOKAlCB0aGUgaW5kZXggaXQgd2FzIGJ1aWx0IHdpdGggZ29lcyBzdGFsZSBhZnRlciBhbnkgbW92ZS5cbiAgICovXG4gIHB1YmxpYyBtb3ZlUm93QnlJZChyb3dJZDogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSByb3dJZCk7XG5cbiAgICByZXR1cm4gc291cmNlSW5kZXggPT09IC0xID8gZmFsc2UgOiB0aGlzLm1vdmVSb3coc291cmNlSW5kZXgsIHRhcmdldEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zdGFtcCBgcm93SW5kZXhgIGZyb20gdGhlIGN1cnJlbnQgb3JkZXIuXG4gICAqXG4gICAqIFJvdyBpbmRleCBpcyBkZW5vcm1hbGlzZWQgb250byBldmVyeSBub2RlLCBhbmQgaGFsZiB0aGUgZ3JpZCByZWFkcyBpdCDigJRcbiAgICogY2VsbCBwYXJhbXMsIHRoZSByYW5nZSBzZWxlY3Rpb24sIHRoZSBkZXRhaWwgbG9va3VwLiBMZWF2aW5nIGl0IHN0YWxlIGFmdGVyXG4gICAqIGEgbW92ZSBwdXRzIGV2ZXJ5IHJvdyBiZWxvdyB0aGUgZHJvcCBwb2ludCBvbmUgb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWluZGV4Um93cygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBub2RlLnNldFJvd0luZGV4KGluZGV4KSk7XG5cbiAgICAvLyBTaWxlbnQ6IHJvdyBudW1iZXJzIGFuZCB0aGUgdmlzaWJsZSBsaXN0IGhhdmUgdG8gYmUgcmVidWlsdCwgYnV0IHRoZVxuICAgIC8vIGByb3dEYXRhQ2hhbmdlZGAgdGhhdCBub3JtYWxseSBmb2xsb3dzIGRlZmVycyBhIGZyYW1lIGFuZCByZS1zZWVkcyBkZXRhaWxcbiAgICAvLyByb3dzLiBBIGtleWJvYXJkIGRyYWcgZmlyZXMgb25lIG9mIHRoZXNlIHBlciBhcnJvdyBrZXksIGFuZCBgbW92ZVJvd2BcbiAgICAvLyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggYHJvd09yZGVyQ2hhbmdlZGAgaW5zdGVhZC5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc2libGVSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0aW5nIE1vZGVsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3NvcnRNb2RlbCA9IHNvcnRNb2RlbDtcblxuICAgIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzb3J0Q2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Jvd05vZGVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA9PT0gMCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IHtcblxuICAgICAgZm9yIChjb25zdCBzb3J0SXRlbSBvZiB0aGlzLl9zb3J0TW9kZWwpIHtcblxuICAgICAgICBjb25zdCB7IGNvbElkLCBzb3J0IH0gPSBzb3J0SXRlbTtcbiAgICAgICAgY29uc3QgdmFsQSA9IGdldEZpZWxkVmFsdWUoYS5kYXRhLCBjb2xJZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCB2YWxCID0gZ2V0RmllbGRWYWx1ZShiLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGNvbXBhcmlzb25SZXN1bHQgPSB0aGlzLmNvbXBhcmVWYWx1ZXModmFsQSwgdmFsQiwgc29ydCk7XG5cbiAgICAgICAgaWYgKGNvbXBhcmlzb25SZXN1bHQgIT09IDApIHtcblxuICAgICAgICAgIHJldHVybiBjb21wYXJpc29uUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyh2YWxBOiBhbnksIHZhbEI6IGFueSwgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBudW1iZXIge1xuXG4gICAgLy8gYHVuZGVmaW5lZGAgaGFzIHRvIGJlIHRyZWF0ZWQgYXMgZW1wdHkgYWxvbmdzaWRlIGBudWxsYDogZ2V0RmllbGRWYWx1ZVxuICAgIC8vIHJldHVybnMgdW5kZWZpbmVkIGZvciBhIG1pc3NpbmcgZmllbGQgb3IgYW4gdW5yZXNvbHZlZCBkb3R0ZWQgcGF0aCwgYW5kXG4gICAgLy8gY29tcGFyaW5nIHVuZGVmaW5lZCB3aXRoIDwgLyA+IHlpZWxkcyBmYWxzZSBib3RoIHdheXMsIHdoaWNoIG1hZGUgc3VjaFxuICAgIC8vIHJvd3Mgc2V0dGxlIGluIHdoYXRldmVyIG9yZGVyIHRoZSBzb3J0IGhhcHBlbmVkIHRvIGVuY291bnRlciB0aGVtLlxuICAgIGNvbnN0IGFFbXB0eSA9IHZhbEEgPT09IG51bGwgfHwgdmFsQSA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJFbXB0eSA9IHZhbEIgPT09IG51bGwgfHwgdmFsQiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFFbXB0eSAmJiBiRW1wdHkpIHJldHVybiAwO1xuICAgIGlmIChhRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBpZiAoYkVtcHR5KSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG5cbiAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xuXG4gICAgICBjb25zdCBjb21wYXJpc29uID0gdmFsQS5sb2NhbGVDb21wYXJlKHZhbEIsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyaXNvbiA6IC1jb21wYXJpc29uO1xuICAgIH1cblxuICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xuICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyBTZWxlY3Rpb24gRmVhdHVyZSAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcblxuICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgcm93SWRzLnB1c2gobm9kZS5yb3dJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsKHJvd0lkcyk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBhbGxOb2Rlc05vdFNlbGVjdGVkOiBmYWxzZSwgYWxsTm9kZXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWQ6IHRydWUsIG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgYWxsIG5vZGVzIChvcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywge1xuICAgICAgICBhbGxOb2Rlc05vdFNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBhbGxOb2Rlc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBub2RlOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBzZWxlY3RlZDogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICYgU2V0IEZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM/Lmxlbmd0aCA+IDAgPyBbLi4udGhpcy5fcm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCkubWFwKG5vZGUgPT4gKHsgLi4ubm9kZS5kYXRhIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDAgPyBbLi4ubm9kZXNdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1uIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJNb2RlbCgpOiBPbmVGaWx0ZXJNb2RlbFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlck1vZGVsKG1vZGVsOiBPbmVGaWx0ZXJNb2RlbFtdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gbW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckFjdGl2ZShmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycy5zb21lKGYgPT4gZi5maWVsZCA9PT0gZmllbGQgJiYgZi5jb25kaXRpb25zLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aWNrIGZpbHRlclxuICAgKi9cbiAgcHVibGljIHNldFF1aWNrRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBvbmUgcm93LlxuICAgKlxuICAgKiBSdWxlcyBydW4gaW4gb3JkZXIgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUsIHNvIGEgZmllbGQgYXBwZWFycyBhdFxuICAgKiBtb3N0IG9uY2UuIEZpZWxkcyB0aGF0IHBhc3NlZCBhcmUgYWJzZW50IHJhdGhlciB0aGFuIG1hcHBlZCB0byBgbnVsbGAuXG4gICAqXG4gICAqIFRoZSByb3cgdHlwZSBjb21lcyBmcm9tIHRoZSBncmlkJ3Mgb3duIGBUYCDigJQgdGhpcyB1c2VkIHRvIGRlY2xhcmUgaXRzIG93blxuICAgKiBgPFQ+YCwgd2hpY2ggc2hhZG93ZWQgdGhlIGNsYXNzIHBhcmFtZXRlciBhbmQgbGV0IGFuIGBPbmVHcmlkQXBpPEVtcGxveWVlPmBcbiAgICogaGFwcGlseSB2YWxpZGF0ZSBhbiB1bnJlbGF0ZWQgc2hhcGUgYWdhaW5zdCBlbXBsb3llZSBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUm93KHJvdzogVCwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+IHtcblxuICAgIGNvbnN0IGVycm9yczogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXG4gICAgICAvLyBBIGNvbHVtbiBjYW4gb25seSBjb250cmlidXRlIGFuIGVycm9yIGlmIGl0IGhhcyBib3RoIHJ1bGVzIGFuZCBhIGZpZWxkXG4gICAgICAvLyB0byBrZXkgdGhlbSB1bmRlci5cbiAgICAgIGlmICghY29sdW1uLmZpZWxkIHx8ICFjb2x1bW4udmFsaWRhdGlvblJ1bGVzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY29sdW1uLnZhbGlkYXRpb25SdWxlcykge1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sdW1uLmZpZWxkXSwgcm93KTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcblxuICAgICAgICAgIGVycm9yc1tjb2x1bW4uZmllbGRdID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gZmlyc3QgZmFpbHVyZSBwZXIgY29sdW1uIHdpbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIGEgd2hvbGUgZGF0YXNldC5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGB2YWxpZGF0ZVJvd2Agc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBjb3VudHNcbiAgICogYXMgaW52YWxpZCDigJQgdGhleSBwcmV2aW91c2x5IGNhcnJpZWQgc2VwYXJhdGUgY29waWVzIG9mIHRoZSBzYW1lIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVBbGxSb3dzKHJvd0RhdGE6IFRbXSwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IHJvd0RhdGEubWFwKHJvdyA9PiB0aGlzLnZhbGlkYXRlUm93KHJvdywgY29sdW1ucykpO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID0gYWxsRXJyb3JzLnNvbWUoZXJyb3JzID0+IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4geyBlcnJvcnM6IGFsbEVycm9ycywgdmFsaWQ6ICFoYXNFcnJvcnMsIGludmFsaWQ6IGhhc0Vycm9ycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGV2ZXJ5IG5vZGUsIGRlcHRoLWZpcnN0LCBvbmNlIGVhY2guXG4gICAqXG4gICAqIGByb3dOb2Rlc2AgaXMgYWxyZWFkeSB0aGUgZmxhdHRlbmVkIHRyZWUg4oCUIGBidWlsZFJvd05vZGVzYCBwdXNoZXMgZXZlcnlcbiAgICogbm9kZSBpbnRvIGl0IGFzIGl0IGRlc2NlbmRzIOKAlCBzbyB3YWxraW5nIGl0IGlzIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIFRoZVxuICAgKiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3YWxrZWQgdGhhdCBmbGF0IGxpc3QgKmFuZCogcmVjdXJzZWQgaW50b1xuICAgKiBgY2hpbGRyZW5gLCB2aXNpdGluZyBldmVyeSBuZXN0ZWQgbm9kZSB0d2ljZSBhbmQgZXZlcnkgZGVwdGgtMyBub2RlIHRocmVlXG4gICAqIHRpbWVzLiBgaW5kZXhgIGlzIHRoZSBub2RlJ3MgcG9zaXRpb24gaW4gdGhlIGZsYXR0ZW5lZCBvcmRlciwgbWF0Y2hpbmdcbiAgICogYG5vZGUucm93SW5kZXhgLCByYXRoZXIgdGhhbiBpdHMgcG9zaXRpb24gYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IGNhbGxiYWNrKG5vZGUsIGluZGV4KSk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzLCBvbmNlIGVhY2gsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGZvckVhY2hMZWFmTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIGxldCBsZWFmSW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGlmIChub2RlLmxlYWYpIGNhbGxiYWNrKG5vZGUsIGxlYWZJbmRleCsrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5zaW9uIHN0YXRlIGxpdmVzIGluIHR3byBwbGFjZXMsIGFuZCB0aGV5IGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICAgKlxuICAgKiBgT25lR3JpZEV4cGFuc2lvblNlcnZpY2VgIHJlY29yZHMgb25seSAqZGVsaWJlcmF0ZSogY2hhbmdlcyDigJQgYSBjbGljaywgb3JcbiAgICogb25lIG9mIHRoZSBtZXRob2RzIGJlbG93LiBJdCBpcyBhbiBvdmVycmlkZSBsYXllcjogYGJ1aWxkUm93Tm9kZXNgIGNvbnN1bHRzXG4gICAqIGl0IGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGBncm91cERlZmF1bHRFeHBhbmRlZGAgZm9yIGV2ZXJ5IHJvdyB0aGUgdXNlclxuICAgKiBoYXMgbm90IHRvdWNoZWQuIFRoYXQgaXMgd2hhdCBsZXRzIGEgbGF0ZXIgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBjaGFuZ2VcbiAgICogdGFrZSBlZmZlY3QsIGFuZCB3aGF0IGxldHMgYSBjb2xsYXBzZSBzdXJ2aXZlIGEgcmVidWlsZC5cbiAgICpcbiAgICogYG5vZGUuZXhwYW5kZWRgIGlzIHRoZSByZXNvbHZlZCB0cnV0aCBmb3IgYSByb3csIGRlZmF1bHRzIGluY2x1ZGVkLiBQdWJsaWNcbiAgICogcmVhZHMgcmVwb3J0IHRoYXQ7IHRoZSBvdmVycmlkZSBzZXRzIHN0YXkgaW50ZXJuYWwuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdGhlIHNldHRlcnMgYmVsb3cgbWFpbnRhaW46IGBleHBhbmRlZGAgaXMgb25seSBldmVyIHRydWUgZm9yXG4gICAqIGEgbm9kZSB0aGF0IGNhbiBleHBhbmQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBpZiAoIW5vZGUuZXhwYW5kYWJsZSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgaW4gdHJlZSBvcmRlci5cbiAgICpcbiAgICogRGVyaXZlZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgb3ZlcnJpZGUgcmVjb3JkLCBzbyByb3dzXG4gICAqIG9wZW5lZCBieSBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGFyZSBpbmNsdWRlZCDigJQgcHJldmlvdXNseSB0aGlzIHJldHVybmVkXG4gICAqIG9ubHkgcm93cyBzb21lb25lIGhhZCBleHBsaWNpdGx5IHRvZ2dsZWQsIGFuZCBjYW1lIGJhY2sgZW1wdHkgb24gZmlyc3QgbG9hZFxuICAgKiB3aGlsZSB0aGUgZmlyc3QgbGV2ZWwgd2FzIHZpc2libHkgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBhbmRlZEJ5SWRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlc1xuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlICYmIG5vZGUuZXhwYW5kZWQpXG5cbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBzZXREZXRhaWxSb3dEYXRhKG5vZGU6IE9uZVJvd05vZGU8VD4sIGRldGFpbERhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2V0RGV0YWlsUm93RGF0YShnZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uKGlkOiBzdHJpbmcsIGNoYW5nZXM6IFBhcnRpYWw8T25lQ29sdW1uRGVmPFQ+Pik6IHZvaWQge1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkRlZihpZCwgY2hhbmdlcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5yZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoZWNrYm94IHNlbGVjdGlvbiBmZWF0dXJlc1xuICAgKi9cbiAgcHVibGljIHNldE5vZGVBbmRDaGlsZHJlblNlbGVjdGVkKG5vZGU6IE9uZVJvd05vZGUsIHNlbGVjdGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCByb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3QgPSAobjogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICByb3dJZHMuYWRkKG4ucm93SWQpO1xuXG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCkge1xuXG4gICAgICAgIG4uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjb2xsZWN0KGNoaWxkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbGxlY3Qobm9kZSk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoQXJyYXkuZnJvbShyb3dJZHMpLCBzZWxlY3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgSWRlbnRpY2FsIHRvIGB1cGRhdGVDZWxsU3RhdGVzYC4gS2VwdCBhcyBhbiBhbGlhcyBzbyBleGlzdGluZ1xuICAgKiBjYWxsZXJzIGtlZXAgd29ya2luZzsgcHJlZmVyIGB1cGRhdGVDZWxsU3RhdGVzYCwgd2hpY2ggc2F5cyB3aGF0IGl0IGRvZXMuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTm9kZVN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKSB7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZShyb3dOb2RlLCBjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZXZlcnkgY2VsbCBvZiBvbmUgcm93IGFuZCByZXBhaW50IGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWludCBpcyB0aGUgcG9pbnQ6IHRoaXMgaXMgd2hhdCBhIGNhbGxlciByZWFjaGVzIGZvciBhZnRlciBtdXRhdGluZ1xuICAgKiBhIHJvdyBpbiBwbGFjZSwgYW5kIGl0IHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhdGUgYW5kIHN0b3AgdGhlcmUuIFRoZVxuICAgKiBib2R5IHJlbmRlcnMgd2l0aCBPblB1c2gsIHNvIG5vdGhpbmcgbWFya2VkIGl0IGRpcnR5IGFuZCB0aGUgbmV3IHN0YXRlIHNhdFxuICAgKiB1bnJlYWQgdW50aWwgc29tZSB1bnJlbGF0ZWQgZXZlbnQgaGFwcGVuZWQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIOKAlFxuICAgKiB3aGljaCBpcyB3aHkgY2FsbGVycyBlbmRlZCB1cCBudWRnaW5nIHRoZSBncmlkIHdpdGggYSBzeW50aGV0aWMgRE9NIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNlbGxTdGF0ZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAoIXJvd05vZGUpIHJldHVybjtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFN0YXRlQ2hhbmdlZCcsIHsgZGF0YTogcm93Tm9kZS5kYXRhLCBub2RlOiByb3dOb2RlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgdGhhdCBSZWFjdHMgdG8gRGV0YWlsIENoYW5nZXNcbiAgICovXG4gIC8qKlxuICAgKiBLZWVwIGEgbWFzdGVyIHJvdydzIHJlc2VydmVkIGhlaWdodCBpbiBzdGVwIHdpdGggaXRzIGRldGFpbCByb3dzLlxuICAgKlxuICAgKiBUd28gbGlzdGVuZXJzIHVzZWQgdG8gYmUgcmVnaXN0ZXJlZCBoZXJlIGFuZCB0aHJvd24gYXdheTogYW4gZW1wdHlcbiAgICogYHJvd0RhdGFDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIHVuc3Vic2NyaWJlIHdhcyBuZXZlciBrZXB0LCBhbmQgYW5cbiAgICogYGV4cGFuZGVkQ2hhbmdlZGAgaGFuZGxlciB3aG9zZSBib2R5IHdhcyBlbnRpcmVseSBjb21tZW50ZWQgb3V0LiBCb3RoIGFyZVxuICAgKiBnb25lIOKAlCBhIGxpc3RlbmVyIHdpdGggbm8gYmVoYXZpb3VyIGlzIGEgbGVhayB3aXRoIG5vIHVwc2lkZS5cbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlRGV0YWlsID0gbm9kZS5vbignZGV0YWlsUm93RGF0YUNoYW5nZWQnLCAoeyBub2RlIH0pID0+IHtcblxuICAgICAgaWYgKHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3Rlck5vZGVDbGVhbnVwKG5vZGUucm93SWQsIFt1bnN1YnNjcmliZURldGFpbF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck5vZGVDbGVhbnVwKHJvd0lkOiBzdHJpbmcsIHVuc3ViczogQXJyYXk8KCkgPT4gdm9pZD4pOiB2b2lkIHtcblxuICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nIGNsZWFudXBzIGZvciB0aGlzIHJvd0lkXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9ub2RlQ2xlYW51cE1hcC5nZXQocm93SWQpID8/IFtdO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuc2V0KHJvd0lkLCBbLi4uZXhpc3RpbmcsIC4uLnVuc3Vic10pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTm9kZShyb3dJZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCk7XG5cbiAgICBjbGVhbnVwcz8uZm9yRWFjaChmbiA9PiBmbigpKTtcblxuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmRlbGV0ZShyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRhdGEsIHJlbGVhc2luZyB3aGF0IHRoZXkgaG9sZC5cbiAgICpcbiAgICogVGhpcyBleGlzdGVkIGJ1dCB3YXMgbmV2ZXIgY2FsbGVkOiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBlYWNoXG4gICAqIGRlbGV0ZWQgc3RyYWlnaHQgb3V0IG9mIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIHNvIGEgcmVtb3ZlZCBub2RlIGtlcHQgaXRzXG4gICAqIGxpc3RlbmVycyBhbmQgaXRzIGVudHJ5IGluIGBfbm9kZUNsZWFudXBNYXBgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGdyaWQuXG4gICAqIEJvdGggbm93IGNvbWUgdGhyb3VnaCBoZXJlLCB3aGljaCB1bnN1YnNjcmliZXMgYW5kIGNsZWFycyB0aGUgbm9kZSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgcHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG5cbiAgICBmb3IgKGNvbnN0IFtyb3dJZCwgbm9kZV0gb2YgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcykge1xuXG4gICAgICBpZiAoIXZhbGlkUm93SWRzLmhhcyhyb3dJZCkpIHtcblxuICAgICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTsgIC8vIHVuc3Vic2NyaWJlIGxpc3RlbmVyc1xuXG4gICAgICAgIG5vZGUuZGVzdHJveSgpOyAgICAgICAgICAgLy8gY2xlYXIgbm9kZSdzIG93biBsaXN0ZW5lciBtYXBcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmRlbGV0ZShyb3dJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlaWdodCBhIG1hc3RlciByb3cgbXVzdCByZXNlcnZlIGZvciBpdHMgZGV0YWlsIGdyaWQ6XG4gICAqIHJvd0hlaWdodCB4IGNsYW1wKHJvd3MsIG1pblJvd3MsIG1heFJvd3MpICsgaGVhZGVySGVpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IGhlaWdodE9wdGlvbnMgPSB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsR3JpZE9wdGlvbnM/LmRldGFpbFJvd0hlaWdodE9wdGlvbnM7XG5cbiAgICAvLyBSZWFjaGFibGUgd2hlbmV2ZXIgbWFzdGVyRGV0YWlsIGlzIG9uIGJ1dCBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgaXNcbiAgICAvLyBpbmNvbXBsZXRlOyB3aXRob3V0IHRoZSBndWFyZCB0aGlzIHRocmV3IGZyb20gaW5zaWRlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICghaGVpZ2h0T3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWluUm93cyA9IGhlaWdodE9wdGlvbnMubWluUm93cztcbiAgICBjb25zdCBtYXhSb3dzID0gaGVpZ2h0T3B0aW9ucy5tYXhSb3dzO1xuXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gKHRoaXMucm93SGVpZ2h0ICogbWluUm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtYXhSb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuXG4gICAgY29uc3Qgcm93cyA9IG5vZGUuZGV0YWlsUm93RGF0YSAmJiBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoID8gbm9kZS5kZXRhaWxSb3dEYXRhLmxlbmd0aCA6IDA7XG5cbiAgICBub2RlLmRldGFpbFJvd0hlaWdodCA9IHJvd3MgPD0gbWluUm93cyA/IG1pbkhlaWdodCA6IHJvd3MgPj0gbWF4Um93cyA/IG1heEhlaWdodCA6ICh0aGlzLnJvd0hlaWdodCAqIHJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBldmVyeXRoaW5nIHRoZSBncmlkIGhvbGRzLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnQubmdPbkRlc3Ryb3lgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBudWxsZWQgb3V0IGFueSBtb3JlLiBUaGV5IGFyZSBpbmplY3RlZCxcbiAgICogQW5ndWxhciBvd25zIHRoZWlyIGxpZmV0aW1lLCBhbmQgbnVsbGluZyB0aGVtIG9ubHkgZ3VhcmFudGVlZCBhXG4gICAqIGBUeXBlRXJyb3JgIGZvciBhbnkgY2FsbGJhY2sgdGhhdCBhcnJpdmVkIGFmdGVyIHRlYXJkb3duIOKAlCBhIGRldGFpbC1yb3dcbiAgICogZmV0Y2ggcmVzb2x2aW5nIGxhdGUsIG9yIHRoZSBib2R5J3MgZGVmZXJyZWQgdXBkYXRlLiBgX2Rlc3Ryb3llZGAgbWFrZXNcbiAgICogdGhvc2UgY2FsbHMgbm8tb3BzIGluc3RlYWQsIHdoaWNoIGlzIHdoYXQgYSB0b3JuLWRvd24gb2JqZWN0IHNob3VsZCBkby5cbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGV2ZXJ5IHBlci1ub2RlIGxpc3RlbmVyIGJlZm9yZSBkcm9wcGluZyB0aGUgbm9kZXMuXG4gICAgZm9yIChjb25zdCByb3dJZCBvZiBBcnJheS5mcm9tKHRoaXMuX25vZGVDbGVhbnVwTWFwLmtleXMoKSkpIHtcblxuICAgICAgdGhpcy5jbGVhbnVwTm9kZShyb3dJZCk7XG4gICAgfVxuXG4gICAgLy8gYGRlc3Ryb3lgIGRyb3BzIHRoZSB0cmVlIGxpbmtzIGFuZCB0aGUgbGlzdGVuZXJzOyB0aGUgQVBJIG5vIGxvbmdlciBoYXNcbiAgICAvLyB0byByZWFjaCBpbiBhbmQgdW5waWNrIGVhY2ggbm9kZSBpdHNlbGYuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZS5kZXN0cm95KCkpO1xuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNpZGUgb2YgWyd0b3AnLCAnYm90dG9tJ10gYXMgT25lUGlubmVkUm93U2lkZVtdKSB7XG5cbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gW107XG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5jbGVhcigpO1xuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcblxuICAgIC8vIFJlbGVhc2UgdGhlIGJhY2stcmVmZXJlbmNlIHRoZSBjZWxsIHNlcnZpY2UgaG9sZHMsIHNvIGEgdG9ybi1kb3duIGFwaSBpc1xuICAgIC8vIG5vdCBrZXB0IGFsaXZlIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgb3V0bGl2ZXMgdGhpcyBjYWxsLlxuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaShudWxsKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IFtdO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX3NvcnRNb2RlbCA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSAwO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbDtcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBkZXN0cm95YCBoYXMgcnVuLiBMYXRlIGNhbGxiYWNrcyBjaGVjayB0aGlzIGJlZm9yZSBkb2luZyB3b3JrLiAqL1xuICBwdWJsaWMgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLl9kZXN0cm95ZWQ7XG4gIH1cbn1cbiJdfQ==
1147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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L21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lQ29sdW1uU3RhdGVFbnRyeSB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSBcIi4vb25lLXJvdy1ub2RlLmNsYXNzXCI7XG5pbXBvcnQgeyBPbmVHcmlkSW5pdE9wdGlvbnMsIE9uZUdyaWRUeXBlLCBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzLCBPbmVWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL29uZS12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE9uZUZpbHRlck1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcywgT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcyB9IGZyb20gXCIuLi9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWxcIjtcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL29uZS1ncmlkLXJvdy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBmaWx0ZXJUcmVlTm9kZSwgaXNGaWx0ZXJBY3RpdmUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtZmlsdGVyLmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRDc3YsIE9uZUNzdkV4cG9ydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY3N2LmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRHcm91cGVkUm93cywgT25lQWdnQ29sdW1uLCBPTkVfR1JPVVBfSURfRklFTEQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgT25lUGlubmVkUm93U2lkZSwgUm93U2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZEFwaTxUID0gYW55PiB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBzdGF0ZVxuICAvL1xuICAvLyBFeHBvc2VkIGFzIGdldHRlcnMsIG5vdCBmaWVsZHMuIFRoZXNlIHdlcmUgd3JpdGFibGUsIHNvIGEgY29uc3VtZXIgY291bGRcbiAgLy8gY29ycnVwdCB0aGUgZ3JpZCBieSBhc3NpZ25pbmcgdG8gdGhlbSDigJQgc3dhcHBpbmcgYHJvd05vZGVzYCBmb3IgYW5cbiAgLy8gdW5yZWxhdGVkIGFycmF5LCBvciBzZXR0aW5nIGBzb3J0TW9kZWxgIHdpdGhvdXQgdGhlIHJvd3MgZXZlciBiZWluZ1xuICAvLyByZS1zb3J0ZWQuIFJlYWRzIGFyZSB1bmNoYW5nZWQ7IG9ubHkgYXNzaWdubWVudCBpcyBub3cgYSBjb21waWxlIGVycm9yLlxuICAvL1xuICAvLyBUaGUgYXJyYXktdmFsdWVkIG9uZXMgYXJlIHR5cGVkIGByZWFkb25seSBUW11gLCB3aGljaCBzdG9wcyBgcHVzaGAgYW5kXG4gIC8vIGBzcGxpY2VgIGF0IGNvbXBpbGUgdGltZSB3aXRob3V0IGNvcHlpbmcgb24gZXZlcnkgcmVhZC4gVXNlXG4gIC8vIGBnZXRBbGxSb3dOb2RlcygpYCB3aGVuIHlvdSB3YW50IGEgY29weSB5b3Ugb3duLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHJpdmF0ZSBfYXBpVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBwcml2YXRlIF9yb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgX3NvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuICAvKiogVW5pcXVlIHBlciBncmlkIGluc3RhbmNlLCBhc3NpZ25lZCBkdXJpbmcgYGluaXRgLiAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqIFRoZSBgW2NvbnRleHRdYCB0aGUgZ3JpZCB3YXMgZ2l2ZW4uICovXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlLCBjYXB0dXJlZCBkdXJpbmcgYGluaXRgLiBDaGFuZ2luZyB0aGUgaW5wdXQgbGF0ZXIgaGFzIG5vIGVmZmVjdC4gKi9cbiAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKTogUm93U2VsZWN0aW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGljaCByb2xlIHRoaXMgaW5zdGFuY2UgcGxheXM6IHNpbXBsZSwgbWFzdGVyLCBkZXRhaWwgb3IgdHJlZS4gKi9cbiAgcHVibGljIGdldCBhcGlUeXBlKCk6IE9uZUdyaWRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVHlwZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBub2RlIHRoZSBncmlkIGhvbGRzLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBnZXQgcm93Tm9kZXMoKTogcmVhZG9ubHkgT25lUm93Tm9kZTxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM7XG4gIH1cblxuICAvKiogVGhlIHNvcnQgbW9kZWwgY3VycmVudGx5IGFwcGxpZWQuIENoYW5nZSBpdCB3aXRoIGBvblNvcnRDaGFuZ2VkYC4gKi9cbiAgcHVibGljIGdldCBzb3J0TW9kZWwoKTogcmVhZG9ubHkgT25lU29ydE1vZGVsPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TW9kZWw7XG4gIH1cblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9waW5uZWRSb3dOb2RlczogUmVjb3JkPE9uZVBpbm5lZFJvd1NpZGUsIE9uZVJvd05vZGU8VD5bXT4gPSB7IHRvcDogW10sIGJvdHRvbTogW10gfTtcbiAgcHJpdmF0ZSBfb3JpZ2luYWxSb3dOb2RlczogTWFwPHN0cmluZywgT25lUm93Tm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX25vZGVDbGVhbnVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PigpOyAvLyBDbGVhbnVwIHJlZ2lzdHJ5IChwcmV2ZW50cyBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgX2Rlc3Ryb3llZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEFkdmFuY2VkIEZlYXR1cmVzXG4gIHByaXZhdGUgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgcHJpdmF0ZSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudD86IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogU3VwcGxpZXMgYSBtYXN0ZXIgcm93J3MgZGV0YWlsIHJvd3MuIFNldCB0aHJvdWdoIGBzZXRHZXREZXRhaWxSb3dEYXRhYDtcbiAgICogcHJldmlvdXNseSBhIHdyaXRhYmxlIHB1YmxpYyBmaWVsZCB3aXRoIGEgc2V0dGVyIGJlc2lkZSBpdCwgd2hpY2ggbGVmdCB0d29cbiAgICogd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZyBhbmQgb25lIG9mIHRoZW0gdW5jaGVja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbHVtblNlcnZpY2U6IE9nQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJvd1NlcnZpY2U6IE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlcnZpY2U6IE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2U6IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXhwYW5zaW9uU2VydmljZTogT25lR3JpZEV4cGFuc2lvblNlcnZpY2VcbiAgKSB7IH1cblxuICAvKipcbiAgICogU3RhbmQgdGhlIGdyaWQgdXAuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgZnJvbSBgbmdPbkluaXRgLlxuICAgKlxuICAgKiBUYWtlcyBhIHNpbmdsZSBgT25lR3JpZEluaXRPcHRpb25zYCByYXRoZXIgdGhhbiB0aGUgdGVuIHBvc2l0aW9uYWxcbiAgICogYXJndW1lbnRzIGl0IHVzZWQgdG8sIHNvIGEgY2FsbCBzaXRlIHJlYWRzIGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IGlzIGFuZFxuICAgKiBhIG5ldyBvcHRpb24gbm8gbG9uZ2VyIG1lYW5zIGVkaXRpbmcgZXZlcnkgY2FsbGVyLlxuICAgKlxuICAgKiBAaW50ZXJuYWwgQXBwbGljYXRpb25zIG9idGFpbiBhIHJlYWR5LW1hZGUgQVBJIGZyb20gYChvbkdyaWRSZWFkeSlgOyB0aGV5XG4gICAqIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGluaXQob3B0aW9uczogT25lR3JpZEluaXRPcHRpb25zPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCB7XG4gICAgICBncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnMsXG4gICAgICBkZWZhdWx0Q29sdW1uRGVmID0ge30sXG4gICAgICBncm91cENvbHVtbkRlZnMgPSBbXSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcm93U2VsZWN0aW9uID0gbnVsbCxcbiAgICAgIG1hc3RlckRldGFpbCA9IGZhbHNlLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbCxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIHRyZWVEYXRhID0gZmFsc2UsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLl9pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuX2FwaVR5cGUgPSBncmlkVHlwZTtcbiAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSByb3dTZWxlY3Rpb247XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBtYXN0ZXJEZXRhaWw7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gICAgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgIHRoaXMudHJlZURhdGEgPSB0cmVlRGF0YTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb25Nb2RlKHJvd1NlbGVjdGlvbik7XG5cbiAgICAvLyBTeW50aGV0aWMgZ3JvdXAgcm93cyBjYXJyeSB0aGVpciBvd24gc3RhYmxlIGlkIOKAlCB0aGUgcGF0aCBvZiBncm91cFxuICAgIC8vIHZhbHVlcyDigJQgd2hpY2ggbm8gaG9zdCBnZXRSb3dJZCBrbm93cyBob3cgdG8gZGVyaXZlLiBUaGUgd3JhcHBlciByZWFkc1xuICAgIC8vIGl0IGZpcnN0IGFuZCBkZWZlcnMgdG8gdGhlIGhvc3QncyBmdW5jdGlvbiAob3IgdGhlIHV1aWQgZmFsbGJhY2spIGZvclxuICAgIC8vIHJlYWwgcm93cywgc28gZ3JvdXBpbmcga2VlcHMgZXhwYW5zaW9uIGFjcm9zcyByZWJ1aWxkcyBldmVuIHdoZW4gdGhlXG4gICAgLy8gaG9zdCBwcm92aWRlZCBubyBpZCBmdW5jdGlvbiBhdCBhbGwuXG4gICAgY29uc3QgaG9zdEdldFJvd0lkID0gY29udGV4dD8uY29tcG9uZW50UGFyZW50Py5nZXRSb3dJZCA/PyBudWxsO1xuXG4gICAgdGhpcy5yb3dTZXJ2aWNlLnNldEdldFJvd0lkRm4oKHBhcmFtczogeyBkYXRhOiBhbnk7IHJvd0luZGV4OiBudW1iZXIgfSkgPT5cbiAgICAgIHBhcmFtcz8uZGF0YT8uW09ORV9HUk9VUF9JRF9GSUVMRF0gPz8gaG9zdEdldFJvd0lkPy4ocGFyYW1zKSA/PyBudWxsKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtbkRlZnMsIGNvbnRleHQpO1xuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaSh0aGlzKTtcbiAgICB0aGlzLmNvbHVtblNlcnZpY2UuaW5pdENvbHVtbkRlZnMoZGVmYXVsdENvbHVtbkRlZiwgY29sdW1uRGVmcywgZ3JvdXBDb2x1bW5EZWZzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSBhcyBDb2x1bW5DaGFuZ2VkRXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywgZGlzY2FyZGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgcm93cyByZXByZXNlbnQgc29tZXRoaW5nIG5ldy4gVG8gc3dhcCB0aGUgZGF0YSB3aGlsZVxuICAgKiBrZWVwaW5nIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFuZCBvcGVuZWQsIHVzZSBgdXBkYXRlUm93RGF0YWAuXG4gICAqL1xuICBwdWJsaWMgc2V0Um93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGtlZXBpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFN0YXRlIGlzIGtleWVkIGJ5IHJvdyBpZCwgc28gdGhpcyBvbmx5IHByZXNlcnZlcyBhbnl0aGluZyBpZiB0aGUgZ3JpZCBoYXMgYVxuICAgKiBgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWRgIOKAlCBvdGhlcndpc2UgZWFjaCByZWJ1aWxkIG1pbnRzIG5ldyBpZHNcbiAgICogYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIHJvdy1sb2FkaW5nIHBhdGguIGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGRpZmZlcmVkIG9ubHkgaW5cbiAgICogd2hldGhlciB0aGV5IGNsZWFyZWQgdGhlIHN0YXRlIHNlcnZpY2VzIGZpcnN0LCBzbyBldmVyeXRoaW5nIGVsc2Ug4oCUIGJ1aWxkLFxuICAgKiBmaWx0ZXIsIHBydW5lIOKAlCBsaXZlcyBoZXJlIG9uY2UuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRSb3dzKHJvd0RhdGE6IFRbXSwgcmVzZXRTdGF0ZTogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgaWYgKHJlc2V0U3RhdGUpIHtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBSb3cgZ3JvdXBpbmcgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIHdheSBpbjogdGhlIGhvc3Qga2VlcHMgaGFuZGluZyB0aGVcbiAgICAvLyBncmlkIGZsYXQgcm93cywgYW5kIHRoZSB0cmVlIHBpcGVsaW5lIGJlbG93IHNlZXMgc3ludGhldGljIGdyb3VwIHJvd3NcbiAgICAvLyB3aXRoIGNoaWxkcmVuIOKAlCB0aGUgc2FtZSBzaGFwZSB0cmVlIGRhdGEgYXJyaXZlcyBpbi5cbiAgICBpZiAodGhpcy5fcm93R3JvdXBGaWVsZHMubGVuZ3RoKSB7XG5cbiAgICAgIHJvd0RhdGEgPSBidWlsZEdyb3VwZWRSb3dzKHJvd0RhdGEsIHRoaXMuX3Jvd0dyb3VwRmllbGRzLCB0aGlzLl9hZ2dDb2x1bW5zKSBhcyBUW107XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRoaXMuYnVpbGRSb3dOb2Rlcyhyb3dEYXRhLCBudWxsLCAwLCB2YWxpZFJvd0lkcyk7XG5cbiAgICAvLyBSZS1hcHBseSB0aGUgYWN0aXZlIHNvcnQuIGBidWlsZFJvd05vZGVzYCByZWJ1aWxkcyB0aGUgcm93IGxpc3QgaW4gdGhlXG4gICAgLy8gb3JkZXIgdGhlIGRhdGEgYXJyaXZlZCwgc28gd2l0aG91dCB0aGlzIGEgZGF0YSB1cGRhdGUgc2lsZW50bHkgcmV0dXJuZWRcbiAgICAvLyB0aGUgcm93cyB0byB0aGF0IG9yZGVyIHdoaWxlIGBzb3J0TW9kZWxgIOKAlCBhbmQgdGhlcmVmb3JlIHRoZSBoZWFkZXInc1xuICAgIC8vIHNvcnQgYXJyb3cg4oCUIHN0aWxsIHNhaWQgdGhleSB3ZXJlIHNvcnRlZC4gU29ydGluZyBiZWZvcmUgZmlsdGVyaW5nXG4gICAgLy8gYmVjYXVzZSBmaWx0ZXJpbmcgb25seSBzZXRzIHZpc2liaWxpdHkgb24gd2hhdGV2ZXIgb3JkZXIgdGhpcyBsZWF2ZXMuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPiAwKSB0aGlzLmFwcGx5U29ydGluZygpO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcblxuICAgIHRoaXMucHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSlcbiAgKTogT25lUm93Tm9kZVtdIHtcblxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKCFyb3dEYXRhPy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZGF0YSBvZiByb3dEYXRhKSB7XG5cbiAgICAgIGNvbnN0IHJvd0lkID0gdGhpcy5yb3dTZXJ2aWNlLmdlbmVyYXRlUm93SWQoZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcykgOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIEZlYXR1cmVcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2FjdGl2ZUZpbHRlcnM7XG5cbiAgICBjb25zdCBxdWljayA9IHRoaXMuX3F1aWNrRmlsdGVyVmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG5cbiAgICAvLyBUaGUgZmllbGRzIHRoZSBncmlkIGFjdHVhbGx5IHNob3dzLiBXaXRob3V0IHRoZW0gdGhlIHF1aWNrIGZpbHRlciBmYWxsc1xuICAgIC8vIGJhY2sgdG8gZXZlcnkgcHJvcGVydHkgb24gdGhlIHJvdywgd2hpY2ggbGV0cyBhIHVzZXIgbWF0Y2ggb24gZGF0YSB0aGF0XG4gICAgLy8gaGFzIG5vIGNvbHVtbiBhbmQgbmV2ZXIgYXBwZWFycyBvbiBzY3JlZW4uXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5xdWlja0ZpbHRlckZpZWxkcygpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IGZpbHRlclRyZWVOb2RlKG5vZGUsIGZpbHRlcnMsIHF1aWNrLCBmaWVsZHMpKTtcblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIGZpZWxkcyB0aGUgcXVpY2sgZmlsdGVyIHNlYXJjaGVzOiBldmVyeSBjb2x1bW4gdGhhdCBoYXMgb25lLlxuICAgKlxuICAgKiBFbXB0eSB3aGlsZSB0aGUgY29sdW1ucyBhcmUgc3RpbGwgYmVpbmcgcmVnaXN0ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICogaGVscGVyIGZhbGxzIGJhY2sgdG8gc2VhcmNoaW5nIHRoZSByb3cg4oCUIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBiZWZvcmUsIGFuZFxuICAgKiB0aGUgb25seSBzZW5zaWJsZSBhbnN3ZXIgd2hlbiB0aGUgZ3JpZCBkb2VzIG5vdCB5ZXQga25vdyBpdHMgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgcXVpY2tGaWx0ZXJGaWVsZHMoKTogc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZVxuICAgICAgLmdldENvbHVtblN0YXRlKClcbiAgICAgIC5jb2x1bW5zXG4gICAgICAubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQgYXMgc3RyaW5nKVxuICAgICAgLmZpbHRlcigoZmllbGQpOiBmaWVsZCBpcyBzdHJpbmcgPT4gISFmaWVsZCAmJiBmaWVsZCAhPT0gJ19vbmVSb3dOdW1iZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgUm93IE5vZGVzIERpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFZpc2libGVOb2RlcyhkaXNwYXRjaDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHZpc2libGVOb2RlczogT25lUm93Tm9kZVtdID0gW107XG5cbiAgICBsZXQgcm93TnVtYmVyID0gMTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGNvbnN0IHBhcmVudFZpc2libGUgPSBub2RlLnBhcmVudCA/IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZS5wYXJlbnQucm93SWQpIDogdHJ1ZTtcblxuICAgICAgY29uc3QgaXNWaXNpYmxlID0gbm9kZS52aXNpYmxlICYmIHBhcmVudFZpc2libGUgJiYgKCFub2RlLnBhcmVudCB8fCBub2RlLnBhcmVudC5leHBhbmRlZCk7XG5cbiAgICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZS5yb3dJZCwgaXNWaXNpYmxlKTtcblxuICAgICAgaWYgKGlzVmlzaWJsZSkge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAndGV4dCcsIHZhbHVlOiByb3dOdW1iZXIrKyB9O1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgICAgdmlzaWJsZU5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzWydfb25lUm93TnVtYmVyJ10gPSB7IHR5cGU6ICdub25lJywgdmFsdWU6IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbLi4udmlzaWJsZU5vZGVzXTtcblxuICAgIGlmIChkaXNwYXRjaCkgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncm93RGF0YUNoYW5nZWQnLCB7IG5vZGVzOiB2aXNpYmxlTm9kZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZSBvZiB0aGUgZ3JpZC5cbiAgICpcbiAgICogUGlubmVkIHJvd3MgYXJlIGRlbGliZXJhdGVseSBrZXB0IG91dCBvZiBgcm93Tm9kZXNgIGFuZFxuICAgKiBgX29yaWdpbmFsUm93Tm9kZXNgOiB0aGV5IGFyZSBub3QgZGF0YS4gU29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24sXG4gICAqIGV4cGFuc2lvbiwgcGFnaW5hdGlvbiBhbmQgdGhlIHZpc2libGUgcm93IGNvdW50IGFsbCBpZ25vcmUgdGhlbSwgd2hpY2ggaXNcbiAgICogdGhlIHdob2xlIHBvaW50IG9mIGEgc3VtbWFyeSByb3cuIFRoZXkgcmVuZGVyIHdpdGggdGhlIHNhbWUgY29sdW1uXG4gICAqIGRlZmluaXRpb25zLCBzbyByZW5kZXJlcnMgYW5kIHZhbHVlIGdldHRlcnMgd29yayBhcyB0aGV5IGRvIGV2ZXJ5d2hlcmVcbiAgICogZWxzZS5cbiAgICovXG4gIHB1YmxpYyBzZXRQaW5uZWRSb3dEYXRhKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUsIHJvd0RhdGE6IFRbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdKSBub2RlLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gKHJvd0RhdGEgPz8gW10pLm1hcCgoZGF0YSwgaW5kZXgpID0+IHtcblxuICAgICAgLy8gSWRzIGFyZSBuYW1lc3BhY2VkIGJ5IHNpZGUgYW5kIHBvc2l0aW9uLiBUaGV5IG5ldmVyIGNvbGxpZGUgd2l0aCBhIGRhdGFcbiAgICAgIC8vIHJvdydzIGlkLCBhbmQgdGhleSBhcmUgc3RhYmxlIGFjcm9zcyByZWJ1aWxkcywgd2hpY2gga2VlcHMgdGhlIHJlbmRlcmVkXG4gICAgICAvLyBgZGF0YS1jZWxsLWlkYCBhdHRyaWJ1dGVzIHN0YWJsZSB0b28uXG4gICAgICBjb25zdCBub2RlID0gbmV3IE9uZVJvd05vZGU8VD4oYG9uZS1waW5uZWQtJHtzaWRlfS0ke2luZGV4fWAsIGRhdGEsIGluZGV4KTtcblxuICAgICAgbm9kZS5sZXZlbCA9IDA7XG4gICAgICBub2RlLmxlYWYgPSB0cnVlO1xuICAgICAgbm9kZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncGlubmVkUm93RGF0YUNoYW5nZWQnLCB7XG4gICAgICBzaWRlLFxuICAgICAgbm9kZXM6IHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSByb3dzIGFuY2hvcmVkIHRvIG9uZSBlZGdlLiBSZWFkLW9ubHk7IGNoYW5nZSB0aGVtIHdpdGggYHNldFBpbm5lZFJvd0RhdGFgLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkUm93Tm9kZXMoc2lkZTogT25lUGlubmVkUm93U2lkZSk6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV07XG4gIH1cblxuICAvKipcbiAgICogUm93IHJlb3JkZXJpbmdcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICpcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYCBpcyB0aGUgc291cmNlIG9mIHRydXRoIGZvciByb3cgb3JkZXI6IGl0cyBpbnNlcnRpb25cbiAgICogb3JkZXIgaXMgd2hhdCBgYXBwbHlTb3J0aW5nYCBmYWxscyBiYWNrIHRvIHdoZW4gdGhlIHNvcnQgbW9kZWwgZW1wdGllcywgYW5kXG4gICAqIHdoYXQgYSByZWJ1aWxkIHdhbGtzLiBgX3Jvd05vZGVzYCBpcyBvbmx5IHRoZSBjdXJyZW50IGRpc3BsYXkgb3JkZXIuIEEgbW92ZVxuICAgKiB0aGF0IHRvdWNoZWQgb25lIGFuZCBub3QgdGhlIG90aGVyIHdvdWxkIGVpdGhlciBiZSB1bmRvbmUgYnkgdGhlIG5leHQgc29ydFxuICAgKiBjaGFuZ2Ugb3IgaW52aXNpYmxlIHVudGlsIG9uZSBoYXBwZW5lZCwgc28gYm90aCBhcmUgcmV3cml0dGVuIHRvZ2V0aGVyLlxuICAgKi9cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGlzcGxheWVkIG9yZGVyIGlzIHRoZSBkYXRhIG9yZGVyLCBhbmQgc28gd2hldGhlciBhIG1hbnVhbCBtb3ZlXG4gICAqIHdvdWxkIHN1cnZpdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSByZWFzb24gcmVvcmRlcmluZyBpcyB1bmF2YWlsYWJsZSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgZmluZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpOiBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB8IG51bGwge1xuXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHJldHVybiAndHJlZURhdGEnO1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPiAwKSByZXR1cm4gJ3NvcnRlZCc7XG5cbiAgICBpZiAoaXNGaWx0ZXJBY3RpdmUodGhpcy5fYWN0aXZlRmlsdGVycywgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA/PyAnJykpIHJldHVybiAnZmlsdGVyZWQnO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ29udmVuaWVuY2UgaW52ZXJzZSBvZiB7QGxpbmsgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb259LiAqL1xuICBwdWJsaWMgY2FuUmVvcmRlclJvd3MoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgZnJvbSBvbmUgcG9zaXRpb24gdG8gYW5vdGhlci5cbiAgICpcbiAgICogSW5kaWNlcyBhcmUgcG9zaXRpb25zIGluIHRoZSBncmlkJ3Mgcm93IG9yZGVyLCB0aGUgc2FtZSBvcmRlclxuICAgKiBgZ2V0QWxsUm93Tm9kZXMoKWAgcmV0dXJucy4gYHRhcmdldEluZGV4YCBpcyB3aGVyZSB0aGUgcm93IGVuZHMgdXAgKmFmdGVyKlxuICAgKiBpdCBoYXMgYmVlbiBsaWZ0ZWQgb3V0IG9mIGBzb3VyY2VJbmRleGAg4oCUIGRyYWdnaW5nIHJvdyAwIHRvIHRoZSBib3R0b20gb2YgYVxuICAgKiA1LXJvdyBncmlkIGlzIGBtb3ZlUm93KDAsIDQpYCwgbm90IGBtb3ZlUm93KDAsIDUpYC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByb3dzIG1vdmVkLiBgZmFsc2VgIHdoZW4gdGhlIG1vdmUgd2FzIHJlamVjdGVkIOKAlFxuICAgKiAgICAgICAgICBvdXQtb2YtcmFuZ2UgaW5kaWNlcywgYSBuby1vcCwgb3IgYW4gb3JkZXIgdGhlIGdyaWQgZG9lcyBub3Qgb3duXG4gICAqICAgICAgICAgIChzZWUge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufSkg4oCUIHNvIGEgY2FsbGVyIGNhbiB0ZWxsIGFcbiAgICogICAgICAgICAgcmVmdXNlZCBtb3ZlIGZyb20gYW4gYXBwbGllZCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW92ZVJvdyhzb3VyY2VJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuY2FuUmVvcmRlclJvd3MoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgb3JkZXIgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc291cmNlSW5kZXgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHRhcmdldEluZGV4KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4IDwgMCB8fCBzb3VyY2VJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBbbW92ZWRdID0gb3JkZXIuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIG9yZGVyLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgLy8gUmVidWlsdCByYXRoZXIgdGhhbiBtdXRhdGVkOiBhIE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyLCBhbmQgdGhlcmVcbiAgICAvLyBpcyBubyB3YXkgdG8gcmVwb3NpdGlvbiBhIGtleSB3aXRoaW4gb25lLlxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMgPSBuZXcgTWFwKG9yZGVyLm1hcChub2RlID0+IFtub2RlLnJvd0lkLCBub2RlXSkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBvcmRlcjtcblxuICAgIHRoaXMucmVpbmRleFJvd3MoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd09yZGVyQ2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Zpc2libGVSb3dOb2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIG5vZGU6IG1vdmVkLCBmcm9tSW5kZXg6IHNvdXJjZUluZGV4LCB0b0luZGV4OiB0YXJnZXRJbmRleCB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgaWRlbnRpZmllZCBieSBpZC4gQ29udmVuaWVudCB3aGVuIHRoZSBjYWxsZXIgaG9sZHMgYSBub2RlIHJhdGhlclxuICAgKiB0aGFuIGEgcG9zaXRpb24g4oCUIHRoZSBpbmRleCBpdCB3YXMgYnVpbHQgd2l0aCBnb2VzIHN0YWxlIGFmdGVyIGFueSBtb3ZlLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3dCeUlkKHJvd0lkOiBzdHJpbmcsIHRhcmdldEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcblxuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IHJvd0lkKTtcblxuICAgIHJldHVybiBzb3VyY2VJbmRleCA9PT0gLTEgPyBmYWxzZSA6IHRoaXMubW92ZVJvdyhzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXN0YW1wIGByb3dJbmRleGAgZnJvbSB0aGUgY3VycmVudCBvcmRlci5cbiAgICpcbiAgICogUm93IGluZGV4IGlzIGRlbm9ybWFsaXNlZCBvbnRvIGV2ZXJ5IG5vZGUsIGFuZCBoYWxmIHRoZSBncmlkIHJlYWRzIGl0IOKAlFxuICAgKiBjZWxsIHBhcmFtcywgdGhlIHJhbmdlIHNlbGVjdGlvbiwgdGhlIGRldGFpbCBsb29rdXAuIExlYXZpbmcgaXQgc3RhbGUgYWZ0ZXJcbiAgICogYSBtb3ZlIHB1dHMgZXZlcnkgcm93IGJlbG93IHRoZSBkcm9wIHBvaW50IG9uZSBvdXQuXG4gICAqL1xuICBwcml2YXRlIHJlaW5kZXhSb3dzKCk6IHZvaWQge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IG5vZGUuc2V0Um93SW5kZXgoaW5kZXgpKTtcblxuICAgIC8vIFNpbGVudDogcm93IG51bWJlcnMgYW5kIHRoZSB2aXNpYmxlIGxpc3QgaGF2ZSB0byBiZSByZWJ1aWx0LCBidXQgdGhlXG4gICAgLy8gYHJvd0RhdGFDaGFuZ2VkYCB0aGF0IG5vcm1hbGx5IGZvbGxvd3MgZGVmZXJzIGEgZnJhbWUgYW5kIHJlLXNlZWRzIGRldGFpbFxuICAgIC8vIHJvd3MuIEEga2V5Ym9hcmQgZHJhZyBmaXJlcyBvbmUgb2YgdGhlc2UgcGVyIGFycm93IGtleSwgYW5kIGBtb3ZlUm93YFxuICAgIC8vIGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCBgcm93T3JkZXJDaGFuZ2VkYCBpbnN0ZWFkLlxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcyhmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzaWJsZVJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRpbmcgTW9kZWwgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIG9uU29ydENoYW5nZWQoc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSkge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc29ydE1vZGVsID0gc29ydE1vZGVsO1xuXG4gICAgdGhpcy5hcHBseVNvcnRpbmcoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NvcnRDaGFuZ2VkJywgeyBub2RlczogdGhpcy5fcm93Tm9kZXMsIHNvcnRNb2RlbDogdGhpcy5fc29ydE1vZGVsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA9PT0gMCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IHtcblxuICAgICAgZm9yIChjb25zdCBzb3J0SXRlbSBvZiB0aGlzLl9zb3J0TW9kZWwpIHtcblxuICAgICAgICBjb25zdCB7IGNvbElkLCBzb3J0IH0gPSBzb3J0SXRlbTtcbiAgICAgICAgY29uc3QgdmFsQSA9IGdldEZpZWxkVmFsdWUoYS5kYXRhLCBjb2xJZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCB2YWxCID0gZ2V0RmllbGRWYWx1ZShiLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGNvbXBhcmlzb25SZXN1bHQgPSB0aGlzLmNvbXBhcmVWYWx1ZXModmFsQSwgdmFsQiwgc29ydCk7XG5cbiAgICAgICAgaWYgKGNvbXBhcmlzb25SZXN1bHQgIT09IDApIHtcblxuICAgICAgICAgIHJldHVybiBjb21wYXJpc29uUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyh2YWxBOiBhbnksIHZhbEI6IGFueSwgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBudW1iZXIge1xuXG4gICAgLy8gYHVuZGVmaW5lZGAgaGFzIHRvIGJlIHRyZWF0ZWQgYXMgZW1wdHkgYWxvbmdzaWRlIGBudWxsYDogZ2V0RmllbGRWYWx1ZVxuICAgIC8vIHJldHVybnMgdW5kZWZpbmVkIGZvciBhIG1pc3NpbmcgZmllbGQgb3IgYW4gdW5yZXNvbHZlZCBkb3R0ZWQgcGF0aCwgYW5kXG4gICAgLy8gY29tcGFyaW5nIHVuZGVmaW5lZCB3aXRoIDwgLyA+IHlpZWxkcyBmYWxzZSBib3RoIHdheXMsIHdoaWNoIG1hZGUgc3VjaFxuICAgIC8vIHJvd3Mgc2V0dGxlIGluIHdoYXRldmVyIG9yZGVyIHRoZSBzb3J0IGhhcHBlbmVkIHRvIGVuY291bnRlciB0aGVtLlxuICAgIGNvbnN0IGFFbXB0eSA9IHZhbEEgPT09IG51bGwgfHwgdmFsQSA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJFbXB0eSA9IHZhbEIgPT09IG51bGwgfHwgdmFsQiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFFbXB0eSAmJiBiRW1wdHkpIHJldHVybiAwO1xuICAgIGlmIChhRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBpZiAoYkVtcHR5KSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG5cbiAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xuXG4gICAgICBjb25zdCBjb21wYXJpc29uID0gdmFsQS5sb2NhbGVDb21wYXJlKHZhbEIsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyaXNvbiA6IC1jb21wYXJpc29uO1xuICAgIH1cblxuICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xuICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyBTZWxlY3Rpb24gRmVhdHVyZSAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcblxuICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgcm93SWRzLnB1c2gobm9kZS5yb3dJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsKHJvd0lkcyk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBhbGxOb2Rlc05vdFNlbGVjdGVkOiBmYWxzZSwgYWxsTm9kZXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWQ6IHRydWUsIG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgYWxsIG5vZGVzIChvcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywge1xuICAgICAgICBhbGxOb2Rlc05vdFNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBhbGxOb2Rlc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBub2RlOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IG9yIGRlc2VsZWN0IG9uZSByb3csIGhvbm91cmluZyB0aGUgZ3JpZCdzIHNlbGVjdGlvbiBtb2RlLlxuICAgKlxuICAgKiBUaGUgbW9kZSBydWxlIHVzZWQgdG8gbGl2ZSBpbiB0aGUgY2hlY2tib3ggY29tcG9uZW50LCB3aGljaCBtZWFudCB0aGUgb25seVxuICAgKiB3YXkgdG8gc2VsZWN0IGEgcm93IHdhcyB0byBjbGljayB0aGF0IGNoZWNrYm94IOKAlCBhbnl0aGluZyBlbHNlIHJlYWNoaW5nIGZvclxuICAgKiBgdG9nZ2xlU2VsZWN0aW9uYCBnb3QgbXVsdGktc2VsZWN0IGJlaGF2aW91ciBvbiBhIHNpbmdsZS1zZWxlY3QgZ3JpZC4gSXRcbiAgICogbGl2ZXMgaGVyZSBzbyBldmVyeSBwYXRoIGludG8gc2VsZWN0aW9uIG9iZXlzIHRoZSBzYW1lIHJ1bGUuXG4gICAqXG4gICAqIEByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGUgZ3JpZCBoYXMgbm8gc2VsZWN0aW9uIG1vZGUsIHNvIGEgY2FsbGVyIGNhbiB0ZWxsXG4gICAqICAgICAgICAgIGEgcmVmdXNlZCByZXF1ZXN0IGZyb20gYW4gYXBwbGllZCBvbmUuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlUm93U2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8ICF0aGlzLl9yb3dTZWxlY3Rpb24pIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gU2luZ2xlIHNlbGVjdCBpcyBcInRoaXMgcm93IGFuZCBubyBvdGhlclwiLCB3aGljaCBtZWFucyBjbGVhcmluZyBmaXJzdC5cbiAgICBpZiAodGhpcy5fcm93U2VsZWN0aW9uID09PSAnc2luZ2xlJykgdGhpcy5kZXNlbGVjdEFsbCgpO1xuXG4gICAgdGhpcy50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcblxuICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgZXZlcnkgcm93IGJldHdlZW4gdHdvLCBpbmNsdXNpdmUsIGluIGRpc3BsYXkgb3JkZXIuXG4gICAqXG4gICAqIFdoYXQgYSBzaGlmdC1leHRlbmRlZCBrZXlib2FyZCBzZWxlY3Rpb24gbmVlZHMuIE11bHRpLXNlbGVjdCBvbmx5IOKAlCBhXG4gICAqIHNpbmdsZS1zZWxlY3QgZ3JpZCBoYXMgbm8gbWVhbmluZ2Z1bCByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSb3dSYW5nZShmcm9tUm93SWQ6IHN0cmluZywgdG9Sb3dJZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8IHRoaXMuX3Jvd1NlbGVjdGlvbiAhPT0gJ211bHRpcGxlJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLl92aXNpYmxlUm93Tm9kZXMubGVuZ3RoID8gdGhpcy5fdmlzaWJsZVJvd05vZGVzIDogdGhpcy5fcm93Tm9kZXM7XG5cbiAgICBjb25zdCBmcm9tID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gZnJvbVJvd0lkKTtcbiAgICBjb25zdCB0byA9IG9yZGVyLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IHRvUm93SWQpO1xuXG4gICAgaWYgKGZyb20gPT09IC0xIHx8IHRvID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaWRzID0gb3JkZXJcbiAgICAgIC5zbGljZShNYXRoLm1pbihmcm9tLCB0byksIE1hdGgubWF4KGZyb20sIHRvKSArIDEpXG4gICAgICAubWFwKG5vZGUgPT4gbm9kZS5yb3dJZCk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoaWRzLCB0cnVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZSwgZGF0YTogbm9kZS5kYXRhLCBzZWxlY3RlZCB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkKHJvd0lkOiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlKSB7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnc2luZ2xlJykge1xuXG4gICAgICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHJvd05vZGUucm93SWQgPT09IG5vZGUucm93SWQpKTtcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHJvd05vZGUucm93SWQgPT09IG5vZGUucm93SWQpKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCB0cnVlKTtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZSwgc2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgc2VsZWN0ZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG5cbiAgICByb3dJZHMuZm9yRWFjaChyb3dJZCA9PiB7XG5cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCBzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlOiBudWxsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCAmIFNldCBGdW5jdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzPy5sZW5ndGggPiAwID8gWy4uLnRoaXMuX3Jvd05vZGVzXSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0RhdGFTZWxlY3RlZCgpOiBUW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpLm1hcChub2RlID0+ICh7IC4uLm5vZGUuZGF0YSB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKTtcblxuICAgIHJldHVybiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPiAwID8gWy4uLm5vZGVzXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbHVtbiBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyTW9kZWwoKTogT25lRmlsdGVyTW9kZWxbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXJNb2RlbChtb2RlbDogT25lRmlsdGVyTW9kZWxbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IG1vZGVsO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJBY3RpdmUoZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlcnMuc29tZShmID0+IGYuZmllbGQgPT09IGZpZWxkICYmIGYuY29uZGl0aW9ucy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWljayBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBzZXRRdWlja0ZpbHRlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9xdWlja0ZpbHRlclZhbHVlID0gKHZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGNvbHVtbiB2YWxpZGF0b3JzIG92ZXIgb25lIHJvdy5cbiAgICpcbiAgICogUnVsZXMgcnVuIGluIG9yZGVyIGFuZCBzdG9wIGF0IHRoZSBmaXJzdCBmYWlsdXJlLCBzbyBhIGZpZWxkIGFwcGVhcnMgYXRcbiAgICogbW9zdCBvbmNlLiBGaWVsZHMgdGhhdCBwYXNzZWQgYXJlIGFic2VudCByYXRoZXIgdGhhbiBtYXBwZWQgdG8gYG51bGxgLlxuICAgKlxuICAgKiBUaGUgcm93IHR5cGUgY29tZXMgZnJvbSB0aGUgZ3JpZCdzIG93biBgVGAg4oCUIHRoaXMgdXNlZCB0byBkZWNsYXJlIGl0cyBvd25cbiAgICogYDxUPmAsIHdoaWNoIHNoYWRvd2VkIHRoZSBjbGFzcyBwYXJhbWV0ZXIgYW5kIGxldCBhbiBgT25lR3JpZEFwaTxFbXBsb3llZT5gXG4gICAqIGhhcHBpbHkgdmFsaWRhdGUgYW4gdW5yZWxhdGVkIHNoYXBlIGFnYWluc3QgZW1wbG95ZWUgY29sdW1ucy5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZVJvdyhyb3c6IFQsIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiB7XG5cbiAgICBjb25zdCBlcnJvcnM6IE9uZVJvd1ZhbGlkYXRpb25FcnJvcnM8VD4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblxuICAgICAgLy8gQSBjb2x1bW4gY2FuIG9ubHkgY29udHJpYnV0ZSBhbiBlcnJvciBpZiBpdCBoYXMgYm90aCBydWxlcyBhbmQgYSBmaWVsZFxuICAgICAgLy8gdG8ga2V5IHRoZW0gdW5kZXIuXG4gICAgICBpZiAoIWNvbHVtbi5maWVsZCB8fCAhY29sdW1uLnZhbGlkYXRpb25SdWxlcz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbHVtbi52YWxpZGF0aW9uUnVsZXMpIHtcblxuICAgICAgICBjb25zdCBlcnJvciA9IHJ1bGUocm93W2NvbHVtbi5maWVsZF0sIHJvdyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG5cbiAgICAgICAgICBlcnJvcnNbY29sdW1uLmZpZWxkXSA9IGVycm9yO1xuXG4gICAgICAgICAgYnJlYWs7IC8vIGZpcnN0IGZhaWx1cmUgcGVyIGNvbHVtbiB3aW5zXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBhIHdob2xlIGRhdGFzZXQuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byBgdmFsaWRhdGVSb3dgIHNvIHRoZSB0d28gY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoYXQgY291bnRzXG4gICAqIGFzIGludmFsaWQg4oCUIHRoZXkgcHJldmlvdXNseSBjYXJyaWVkIHNlcGFyYXRlIGNvcGllcyBvZiB0aGUgc2FtZSBsb29wLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQWxsUm93cyhyb3dEYXRhOiBUW10sIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogT25lVmFsaWRhdGlvblJlc3VsdDxUPiB7XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSByb3dEYXRhLm1hcChyb3cgPT4gdGhpcy52YWxpZGF0ZVJvdyhyb3csIGNvbHVtbnMpKTtcblxuICAgIGNvbnN0IGhhc0Vycm9ycyA9IGFsbEVycm9ycy5zb21lKGVycm9ycyA9PiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIHsgZXJyb3JzOiBhbGxFcnJvcnMsIHZhbGlkOiAhaGFzRXJyb3JzLCBpbnZhbGlkOiBoYXNFcnJvcnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSBldmVyeSBub2RlLCBkZXB0aC1maXJzdCwgb25jZSBlYWNoLlxuICAgKlxuICAgKiBgcm93Tm9kZXNgIGlzIGFscmVhZHkgdGhlIGZsYXR0ZW5lZCB0cmVlIOKAlCBgYnVpbGRSb3dOb2Rlc2AgcHVzaGVzIGV2ZXJ5XG4gICAqIG5vZGUgaW50byBpdCBhcyBpdCBkZXNjZW5kcyDigJQgc28gd2Fsa2luZyBpdCBpcyB0aGUgd2hvbGUgdHJhdmVyc2FsLiBUaGVcbiAgICogcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd2Fsa2VkIHRoYXQgZmxhdCBsaXN0ICphbmQqIHJlY3Vyc2VkIGludG9cbiAgICogYGNoaWxkcmVuYCwgdmlzaXRpbmcgZXZlcnkgbmVzdGVkIG5vZGUgdHdpY2UgYW5kIGV2ZXJ5IGRlcHRoLTMgbm9kZSB0aHJlZVxuICAgKiB0aW1lcy4gYGluZGV4YCBpcyB0aGUgbm9kZSdzIHBvc2l0aW9uIGluIHRoZSBmbGF0dGVuZWQgb3JkZXIsIG1hdGNoaW5nXG4gICAqIGBub2RlLnJvd0luZGV4YCwgcmF0aGVyIHRoYW4gaXRzIHBvc2l0aW9uIGFtb25nIGl0cyBzaWJsaW5ncy5cbiAgICovXG4gIHB1YmxpYyBmb3JFYWNoTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBjYWxsYmFjayhub2RlLCBpbmRleCkpO1xuICB9XG5cbiAgLyoqIFRyYXZlcnNlIG9ubHkgbGVhZiBub2Rlcywgb25jZSBlYWNoLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBmb3JFYWNoTGVhZk5vZGUoY2FsbGJhY2s6IChub2RlOiBPbmVSb3dOb2RlPFQ+LCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKSB7XG5cbiAgICBsZXQgbGVhZkluZGV4ID0gMDtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBpZiAobm9kZS5sZWFmKSBjYWxsYmFjayhub2RlLCBsZWFmSW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFJvd05vZGVCeUlkKHJvd0lkOiBzdHJpbmcpOiBPbmVSb3dOb2RlPFQ+IHtcblxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kL2NvbGxhcHNlIGEgbm9kZVxuICAgKi9cbiAgcHVibGljIHNldFRyZWVEYXRhQ2hpbGRyZW5GaWVsZChmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IGZpZWxkO1xuICB9XG5cbiAgcHVibGljIHNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKGRlZmF1bHRFeHBhbmRlZDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkID0gZGVmYXVsdEV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuc2lvbiBzdGF0ZSBsaXZlcyBpbiB0d28gcGxhY2VzLCBhbmQgdGhleSBhbnN3ZXIgZGlmZmVyZW50IHF1ZXN0aW9ucy5cbiAgICpcbiAgICogYE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlYCByZWNvcmRzIG9ubHkgKmRlbGliZXJhdGUqIGNoYW5nZXMg4oCUIGEgY2xpY2ssIG9yXG4gICAqIG9uZSBvZiB0aGUgbWV0aG9kcyBiZWxvdy4gSXQgaXMgYW4gb3ZlcnJpZGUgbGF5ZXI6IGBidWlsZFJvd05vZGVzYCBjb25zdWx0c1xuICAgKiBpdCBmaXJzdCBhbmQgZmFsbHMgYmFjayB0byBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGZvciBldmVyeSByb3cgdGhlIHVzZXJcbiAgICogaGFzIG5vdCB0b3VjaGVkLiBUaGF0IGlzIHdoYXQgbGV0cyBhIGxhdGVyIGBncm91cERlZmF1bHRFeHBhbmRlZGAgY2hhbmdlXG4gICAqIHRha2UgZWZmZWN0LCBhbmQgd2hhdCBsZXRzIGEgY29sbGFwc2Ugc3Vydml2ZSBhIHJlYnVpbGQuXG4gICAqXG4gICAqIGBub2RlLmV4cGFuZGVkYCBpcyB0aGUgcmVzb2x2ZWQgdHJ1dGggZm9yIGEgcm93LCBkZWZhdWx0cyBpbmNsdWRlZC4gUHVibGljXG4gICAqIHJlYWRzIHJlcG9ydCB0aGF0OyB0aGUgb3ZlcnJpZGUgc2V0cyBzdGF5IGludGVybmFsLlxuICAgKlxuICAgKiBUaGUgaW52YXJpYW50IHRoZSBzZXR0ZXJzIGJlbG93IG1haW50YWluOiBgZXhwYW5kZWRgIGlzIG9ubHkgZXZlciB0cnVlIGZvclxuICAgKiBhIG5vZGUgdGhhdCBjYW4gZXhwYW5kLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZUV4cGFuZEFsbChleHBhbmRlZDogYm9vbGVhbikge1xuXG4gICAgdGhpcy5mb3JFYWNoTm9kZShub2RlID0+IHtcblxuICAgICAgaWYgKCFub2RlLmV4cGFuZGFibGUpIHJldHVybjtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChub2RlLnJvd0lkLCBleHBhbmRlZClcbiAgICB9KTtcblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZChyb3dJZDogc3RyaW5nLCBleHBhbmRlZDogYm9vbGVhbikge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgIGlmIChub2RlPy5leHBhbmRhYmxlKSB7XG5cbiAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpO1xuXG4gICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHBhbmRlZEJ5SWRzKHJvd0lkczogc3RyaW5nW10sIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBpZiAocm93SWRzICYmIHJvd0lkcy5sZW5ndGggPiAwKSB7XG5cbiAgICAgIGZvciAobGV0IHJvd0lkIG9mIHJvd0lkcykge1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpO1xuXG4gICAgICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKHJvd0lkLCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGN1cnJlbnRseSBleHBhbmRlZCByb3csIGluIHRyZWUgb3JkZXIuXG4gICAqXG4gICAqIERlcml2ZWQgZnJvbSB0aGUgbm9kZXMgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIG92ZXJyaWRlIHJlY29yZCwgc28gcm93c1xuICAgKiBvcGVuZWQgYnkgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBhcmUgaW5jbHVkZWQg4oCUIHByZXZpb3VzbHkgdGhpcyByZXR1cm5lZFxuICAgKiBvbmx5IHJvd3Mgc29tZW9uZSBoYWQgZXhwbGljaXRseSB0b2dnbGVkLCBhbmQgY2FtZSBiYWNrIGVtcHR5IG9uIGZpcnN0IGxvYWRcbiAgICogd2hpbGUgdGhlIGZpcnN0IGxldmVsIHdhcyB2aXNpYmx5IG9wZW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhwYW5kZWRCeUlkcygpOiBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXNcblxuICAgICAgLmZpbHRlcihub2RlID0+IG5vZGUuZXhwYW5kYWJsZSAmJiBub2RlLmV4cGFuZGVkKVxuXG4gICAgICAubWFwKG5vZGUgPT4gbm9kZS5yb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBwdWJsaWMgc2V0RGV0YWlsUm93RGF0YShub2RlOiBPbmVSb3dOb2RlPFQ+LCBkZXRhaWxEYXRhOiBhbnlbXSkge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLnNldERldGFpbFJvd0RhdGEoZGV0YWlsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEdldERldGFpbFJvd0RhdGEoZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSA9IGdldERldGFpbFJvd0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1ucyBTdGF0ZVxuICAgKi9cbiAgcHVibGljIGdldENvbHVtblN0YXRlKCk6IENvbHVtbkNoYW5nZWRFdmVudCB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBDZWxsIHN0YXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgY29sdW1ucywgc28gcmVwbGFjaW5nIHRoZW0gd2hvbGVzYWxlXG4gICAgLy8gc3RhbGVzIGV2ZXJ5IG5vZGUgYnVpbHQgYmVmb3JlIHRoaXMgcmFuLiBUcmVlIGFuZCBncm91cGluZyBtb2RlIGhpdFxuICAgIC8vIHRoaXMgb24gZXZlcnkgbG9hZDogdGhlIGdyb3VwIGNvbHVtbiByZWdpc3RlcnMgZnJvbSBhIGRlZmVycmVkXG4gICAgLy8gc2V0Q29sdW1uRGVmcywgYWZ0ZXIgdGhlIGhvc3QgaGFzIHR5cGljYWxseSBhbHJlYWR5IGxvYWRlZCByb3dzIOKAlFxuICAgIC8vIGhvc3RzIHVzZWQgdG8gaGF2ZSB0byBkZWZlciBzZXRSb3dEYXRhIHRoZW1zZWx2ZXMgdG8gZG9kZ2UgaXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW4oaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY8VD4+KTogdm9pZCB7XG5cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKTtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS51cGRhdGVDb2x1bW5EZWYoaWQsIGNoYW5nZXMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gT25seSB3aGVuIHRoZSBzZXQgb2YgdmlzaWJsZSBjb2x1bW5zIGNoYW5nZWQgKGEgaGlkZSwgYSBzaG93KTogYSBjZWxsXG4gICAgLy8gc3RhdGUgY2FuIGFwcGVhciBvciBkaXNhcHBlYXIgdGhlbi4gV2lkdGggcGF0Y2hlcyDigJQgdGhpcyBtZXRob2QgcnVuc1xuICAgIC8vIHBlciBtb3VzZW1vdmUgZHVyaW5nIGEgcmVzaXplIOKAlCBza2lwIHRoZSBPKHJvd3Mgw5cgY29sdW1ucykgcGFzcy5cbiAgICBpZiAodGhpcy52aXNpYmxlQ29sdW1uRmllbGRzKCkgIT09IGJlZm9yZSkgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlzaWJsZSBmaWVsZHMgYXMgb25lIGNvbXBhcmFibGUga2V5LiAqL1xuICBwcml2YXRlIHZpc2libGVDb2x1bW5GaWVsZHMoKTogc3RyaW5nIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZCkuam9pbignfCcpID8/ICcnO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZSBldmVyeSBub2RlJ3MgY2VsbCBzdGF0ZXMgYWdhaW5zdCB0aGUgY3VycmVudCBjb2x1bW5zLiAqL1xuICBwcml2YXRlIHJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk6IHZvaWQge1xuXG4gICAgY29uc3QgcmVmcmVzaCA9IChub2RlOiBPbmVSb3dOb2RlKSA9PiBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyZWZyZXNoKTtcbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlcy50b3AuZm9yRWFjaChyZWZyZXNoKTtcbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlcy5ib3R0b20uZm9yRWFjaChyZWZyZXNoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2UucmVvcmRlckNvbHVtbkRlZnMoZnJvbUluZGV4LCB0b0luZGV4KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJvdyBncm91cGluZ1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9yb3dHcm91cEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWdnQ29sdW1uczogT25lQWdnQ29sdW1uPFQ+W10gPSBbXTtcblxuICAvKiogVGhlIGZpZWxkcyB0aGUgcm93cyBhcmUgZ3JvdXBlZCBieSwgaW4gbmVzdGluZyBvcmRlci4gRW1wdHkgd2hlbiBvZmYuICovXG4gIHB1YmxpYyBnZXQgcm93R3JvdXBGaWVsZHMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd0dyb3VwRmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gcm93IGdyb3VwaW5nIG9uLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIHdoZW4gY29sdW1uXG4gICAqIGRlZmluaXRpb25zIGRlY2xhcmUgYHJvd0dyb3VwYDsgdGhlIGdyaWQgdGhlbiBiZWhhdmVzIGFzIGEgdHJlZSBvdmVyXG4gICAqIHN5bnRoZXRpYyBncm91cCByb3dzLCBhbmQgYHNldFJvd0RhdGFgIC8gYHVwZGF0ZVJvd0RhdGFgIGtlZXAgdGFraW5nIHRoZVxuICAgKiBmbGF0IHJvd3MgdGhleSBhbHdheXMgdG9vay5cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dHcm91cGluZyhncm91cEZpZWxkczogc3RyaW5nW10sIGFnZ3JlZ2F0aW9uczogT25lQWdnQ29sdW1uPFQ+W10gPSBbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5fcm93R3JvdXBGaWVsZHMgPSBncm91cEZpZWxkcyA/PyBbXTtcbiAgICB0aGlzLl9hZ2dDb2x1bW5zID0gYWdncmVnYXRpb25zID8/IFtdO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFVuZG8gLyByZWRvIG9mIGNlbGwgZWRpdHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfdW5kb0xpbWl0ID0gMDtcbiAgcHJpdmF0ZSBfdW5kb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG4gIHByaXZhdGUgX3JlZG9TdGFjazogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdGFydCByZWNvcmRpbmcgY29tbWl0dGVkIGNlbGwgZWRpdHMgZm9yIHVuZG8vcmVkby4gQ2FsbGVkIGJ5XG4gICAqIGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGBbdW5kb1JlZG9DZWxsRWRpdGluZ11gOyB0aGUgc3RhY2sga2VlcHMgdGhlIGxhc3RcbiAgICogYGxpbWl0YCBlZGl0cy4gUHJvZ3JhbW1hdGljIGBzZXREYXRhVmFsdWVgIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIOKAlCBvbmx5XG4gICAqIGNvbW1pdHMsIHRoZSBvbmVzIHRoYXQgcmFpc2UgYGNlbGxWYWx1ZUNoYW5nZWRgIHdpdGhvdXQgYSBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlVW5kb1JlZG9DZWxsRWRpdGluZyhsaW1pdDogbnVtYmVyID0gMTApOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl91bmRvTGltaXQgPiAwKSByZXR1cm47XG5cbiAgICB0aGlzLl91bmRvTGltaXQgPSBNYXRoLm1heChNYXRoLmZsb29yKGxpbWl0KSwgMSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsVmFsdWVDaGFuZ2VkJywgKGV2ZW50OiBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgaWYgKGV2ZW50LnNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl91bmRvU3RhY2sucHVzaCh7IHJvd0lkOiBldmVudC5ub2RlLnJvd0lkLCBmaWVsZDogZXZlbnQuZmllbGQsIG9sZFZhbHVlOiBldmVudC5vbGRWYWx1ZSwgbmV3VmFsdWU6IGV2ZW50Lm5ld1ZhbHVlIH0pO1xuXG4gICAgICBpZiAodGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuX3VuZG9MaW1pdCkgdGhpcy5fdW5kb1N0YWNrLnNoaWZ0KCk7XG5cbiAgICAgIC8vIEEgbmV3IGVkaXQgZm9ya3MgaGlzdG9yeTsgd2hhdCB3YXMgdW5kb25lIGNhbiBubyBsb25nZXIgYmUgcmVkb25lLlxuICAgICAgdGhpcy5fcmVkb1N0YWNrID0gW107XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV2ZXJ0IHRoZSBtb3N0IHJlY2VudCBjb21taXR0ZWQgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgdW5kb25lLiAqL1xuICBwdWJsaWMgdW5kb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl91bmRvU3RhY2ssIHRoaXMuX3JlZG9TdGFjaywgJ3VuZG8nKTtcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgcmVkb25lLiAqL1xuICBwdWJsaWMgcmVkb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl9yZWRvU3RhY2ssIHRoaXMuX3VuZG9TdGFjaywgJ3JlZG8nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50VW5kb1NpemUoKTogbnVtYmVyIHtcblxuICAgIHJldHVybiB0aGlzLl91bmRvU3RhY2subGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRSZWRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHJlcGxheUVkaXQoXG4gICAgZnJvbTogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICB0bzogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICBzb3VyY2U6ICd1bmRvJyB8ICdyZWRvJyxcbiAgKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlZGl0ID0gZnJvbS5wb3AoKTtcblxuICAgIGlmICghZWRpdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQoZWRpdC5yb3dJZCk7XG5cbiAgICAvLyBUaGUgcm93IGNhbiBiZSBnb25lIOKAlCBhIHNldFJvd0RhdGEgcmVwbGFjZWQgdGhlIGRhdGEgdW5kZXIgdGhlIHN0YWNrLlxuICAgIC8vIFRoZSBlZGl0IGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gcmVwbGF5ZWQgb250byBub3RoaW5nLlxuICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQub2xkVmFsdWUgOiBlZGl0Lm5ld1ZhbHVlO1xuICAgIGNvbnN0IHByZXZpb3VzID0gc291cmNlID09PSAndW5kbycgPyBlZGl0Lm5ld1ZhbHVlIDogZWRpdC5vbGRWYWx1ZTtcblxuICAgIChub2RlLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2VkaXQuZmllbGRdID0gdmFsdWU7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG5cbiAgICB0by5wdXNoKGVkaXQpO1xuXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucz8uZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBlZGl0LmZpZWxkKSA/PyBudWxsO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFZhbHVlQ2hhbmdlZCcsIHtcbiAgICAgIG5vZGUsXG4gICAgICBkYXRhOiBub2RlLmRhdGEsXG4gICAgICBjb2x1bW46IGNvbHVtbiBhcyBPbmVDb2x1bW5EZWY8VD4sXG4gICAgICBmaWVsZDogZWRpdC5maWVsZCxcbiAgICAgIG9sZFZhbHVlOiBwcmV2aW91cyxcbiAgICAgIG5ld1ZhbHVlOiB2YWx1ZSxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENsaWVudC1zaWRlIHBhZ2luYXRpb25cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfY2xpZW50UGFnaW5hdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIF9jdXJyZW50UGFnZSA9IDE7XG5cbiAgLyoqIFRoZSBwYWdpbmcgc3RhdGUsIHdoZW4gdGhlIGdyaWQgcGFnZXMgaXRzIG93biByb3dzLiAqL1xuICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25TdGF0ZSgpOiBSZWFkb25seTx7IGVuYWJsZWQ6IGJvb2xlYW47IHBhZ2VTaXplOiBudW1iZXI7IGN1cnJlbnRQYWdlOiBudW1iZXIgfT4ge1xuXG4gICAgcmV0dXJuIHsgZW5hYmxlZDogdGhpcy5fY2xpZW50UGFnaW5hdGlvbiwgcGFnZVNpemU6IHRoaXMuX3BhZ2VTaXplLCBjdXJyZW50UGFnZTogdGhpcy5fY3VycmVudFBhZ2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIGdyaWQtb3duZWQgcGFnaW5nIG9uIG9yIG9mZi4gQ2FsbGVkIGJ5IGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGl0c1xuICAgKiBgY2xpZW50U2lkZVBhZ2luYXRpb25gIGlucHV0OyB0aGUgZGlzcGxheSBzbGljZSBpcyB3aGF0IGNoYW5nZXMg4oCUIHRoZVxuICAgKiBmdWxsIGRhdGFzZXQgc3RheXMgYmVoaW5kIHRoZSBBUEkgKHNlbGVjdGlvbiwgZmlsdGVycyBhbmQgc29ydGluZyBrZWVwXG4gICAqIG9wZXJhdGluZyBvbiBhbGwgb2YgaXQpLlxuICAgKi9cbiAgcHVibGljIHNldENsaWVudFNpZGVQYWdpbmF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4sIHBhZ2VTaXplPzogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLl9jbGllbnRQYWdpbmF0aW9uID0gZW5hYmxlZDtcblxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSA+IDApIHRoaXMuX3BhZ2VTaXplID0gcGFnZVNpemU7XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBwYWdlIHNpemUgYW5kIHJldHVybiB0byB0aGUgZmlyc3QgcGFnZS4gKi9cbiAgcHVibGljIHNldFBhZ2VTaXplKHBhZ2VTaXplOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIShwYWdlU2l6ZSA+IDApKSByZXR1cm47XG5cbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE1hdGguZmxvb3IocGFnZVNpemUpO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKiogTW92ZSB0byBhIHBhZ2UgKDEtYmFzZWQpLiBDbGFtcGVkIHRvIGF0IGxlYXN0IDE7IHRoZSB0b3AgZW5kIGNsYW1wcyB3aGVuIHRoZSBzbGljZSBpcyB0YWtlbi4gKi9cbiAgcHVibGljIHNldEN1cnJlbnRQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5mbG9vcihwYWdlKSwgMSk7XG5cbiAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9jdXJyZW50UGFnZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB0YXJnZXQ7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzbGljZSBvZiByb3dzIHRoZSBjdXJyZW50IHBhZ2Ugc2hvd3Mg4oCUIGEgcGFzc3Rocm91Z2ggd2hpbGUgcGFnaW5nIGlzXG4gICAqIG9mZi4gVGhlIGJvZHkgcm91dGVzIGl0cyByZW5kZXIgbGlzdCB0aHJvdWdoIGhlcmUsIGFmdGVyIHJlcG9ydGluZyB0aGVcbiAgICogZnVsbCBjb3VudCwgc28gYHJvd0NvdW50Q2hhbmdlZGAga2VlcHMgbWVhbmluZyBcInJvd3MgYWZ0ZXIgZmlsdGVyaW5nXCJcbiAgICogd2hldGhlciBvciBub3QgdGhlIGdyaWQgcGFnZXMuXG4gICAqL1xuICBwdWJsaWMgcGFnZU5vZGVzKG5vZGVzOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10pOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRQYWdpbmF0aW9uKSByZXR1cm4gKG5vZGVzID8/IFtdKSBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICBjb25zdCBsYXN0UGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbCgobm9kZXM/Lmxlbmd0aCA/PyAwKSAvIHRoaXMuX3BhZ2VTaXplKSwgMSk7XG5cbiAgICAvLyBBIHNocmlua2luZyBkYXRhc2V0IChhIGZpbHRlciwgYSBkZWxldGUpIGNhbiBzdHJhbmQgdGhlIHBhZ2UgcGFzdCB0aGVcbiAgICAvLyBlbmQ7IGNsYW1waW5nIGhlcmUgc2hvd3MgdGhlIGxhc3QgcGFnZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IG9uZS5cbiAgICBpZiAodGhpcy5fY3VycmVudFBhZ2UgPiBsYXN0UGFnZSkgdGhpcy5fY3VycmVudFBhZ2UgPSBsYXN0UGFnZTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMuX2N1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLl9wYWdlU2l6ZTtcblxuICAgIHJldHVybiAobm9kZXMgPz8gW10pLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMuX3BhZ2VTaXplKSBhcyBPbmVSb3dOb2RlPFQ+W107XG4gIH1cblxuICAvKipcbiAgICogU2l6ZSB0aGUgZmxleCBjb2x1bW5zIGludG8gdGhlIGdpdmVuIHdpZHRoLlxuICAgKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyaWQgYm9keSB3aXRoIGl0cyBvd24gdmlld3BvcnQgd2lkdGgg4oCUIG9uIGZpcnN0IHJlbmRlciwgb25cbiAgICogY29udGFpbmVyIHJlc2l6ZSBhbmQgYWZ0ZXIgY29sdW1uIGNoYW5nZXMg4oCUIHNvIGBjb2x1bW5EZWYuZmxleGAgd29ya3NcbiAgICogd2l0aG91dCB0aGUgaG9zdCBkb2luZyBhbnl0aGluZy4gQWxzbyBjYWxsYWJsZSBkaXJlY3RseSB3aXRoIGFueSB3aWR0aC5cbiAgICogQSBuby1vcCB3aGVuIG5vIHZpc2libGUgY29sdW1uIGRlY2xhcmVzIGBmbGV4YCBvciBub3RoaW5nIHdvdWxkIGNoYW5nZS5cbiAgICovXG4gIHB1YmxpYyBhcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtblNlcnZpY2UuYXBwbHlGbGV4V2lkdGhzKGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBncmlkIGFzIENTVjogdmlzaWJsZSBjb2x1bW5zIGluIGRpc3BsYXkgb3JkZXIsIHZpc2libGUgcm93c1xuICAgKiBpbiBjdXJyZW50IHNvcnQgb3JkZXIsIHZhbHVlcyB0aHJvdWdoIHRoZSBzYW1lIGdldHRlci9mb3JtYXR0ZXIgcGlwZWxpbmVcbiAgICogdGhlIGNlbGxzIHJlbmRlciB3aXRoLiBQaW5uZWQgcm93cyBhbmQgZGV0YWlsIGdyaWRzIGFyZSBub3QgZGF0YSBhbmQgYXJlXG4gICAqIG5vdCBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREYXRhQXNDc3Yob3B0aW9uczogT25lQ3N2RXhwb3J0T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcblxuICAgIGNvbnN0IG5vZGVzID0gb3B0aW9ucy5vbmx5U2VsZWN0ZWQgPyB0aGlzLmdldFNlbGVjdGVkUm93Tm9kZXMoKSA6IHRoaXMuX3Zpc2libGVSb3dOb2RlcztcblxuICAgIHJldHVybiBidWlsZENzdihub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnMgYXMgT25lQ29sdW1uRGVmPFQ+W10sIHRoaXMuX2NvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBDU1YgYW5kIGhhbmQgaXQgdG8gdGhlIGJyb3dzZXIgYXMgYSBkb3dubG9hZC4gKi9cbiAgcHVibGljIGV4cG9ydERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiB2b2lkIHtcblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3RoaXMuZ2V0RGF0YUFzQ3N2KG9wdGlvbnMpXSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgbGluay5kb3dubG9hZCA9IG9wdGlvbnMuZmlsZU5hbWUgPz8gJ2V4cG9ydC5jc3YnO1xuICAgIGxpbmsuY2xpY2soKTtcblxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwobGluay5ocmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgb25lIGNvbHVtbi4gQSBoaWRkZW4gY29sdW1uIGtlZXBzIGl0cyBvcmRlciwgd2lkdGggYW5kIHBpbixcbiAgICogc28gc2hvd2luZyBpdCBhZ2FpbiByZXN0b3JlcyBpdCBleGFjdGx5LlxuICAgKi9cbiAgcHVibGljIHNldENvbHVtblZpc2libGUoaWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgdGhpcy51cGRhdGVDb2x1bW4oaWQsIHsgaGlkZTogIXZpc2libGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGFibGUgbGF5b3V0IHN0YXRlOiBvbmUgSlNPTi1zYWZlIGVudHJ5IHBlciBjb2x1bW4g4oCUIGhpZGRlbiBvbmVzXG4gICAqIGluY2x1ZGVkIOKAlCBpbiBkaXNwbGF5IG9yZGVyLiBGZWVkIGl0IGJhY2sgdGhyb3VnaCBgYXBwbHlDb2x1bW5TdGF0ZWAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdCgpOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNuYXBzaG90IGZyb20gYGdldENvbHVtblN0YXRlU25hcHNob3RgOiBvcmRlciwgd2lkdGgsIHBpbiBhbmRcbiAgICogdmlzaWJpbGl0eS4gSWRzIHRoZSBncmlkIG5vIGxvbmdlciBoYXMgYXJlIHNraXBwZWQsIHNvIGEgc3RhbGUgc25hcHNob3RcbiAgICogZGVncmFkZXMgdG8gYSBwYXJ0aWFsIHJlc3RvcmUgcmF0aGVyIHRoYW4gYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlDb2x1bW5TdGF0ZShlbnRyaWVzOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5hcHBseUNvbHVtblN0YXRlKGVudHJpZXMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gQSByZXN0b3JlIGNhbiBzaG93IGNvbHVtbnMgdGhhdCB3ZXJlIGhpZGRlbiB3aGVuIHRoZSByb3dzIHdlcmUgYnVpbHQsXG4gICAgLy8gYW5kIHRoZWlyIGNlbGxzIGhhdmUgbm8gc3RhdGUgeWV0LlxuICAgIHRoaXMucmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoZWNrYm94IHNlbGVjdGlvbiBmZWF0dXJlc1xuICAgKi9cbiAgcHVibGljIHNldE5vZGVBbmRDaGlsZHJlblNlbGVjdGVkKG5vZGU6IE9uZVJvd05vZGUsIHNlbGVjdGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCByb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3QgPSAobjogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICByb3dJZHMuYWRkKG4ucm93SWQpO1xuXG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCkge1xuXG4gICAgICAgIG4uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjb2xsZWN0KGNoaWxkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbGxlY3Qobm9kZSk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoQXJyYXkuZnJvbShyb3dJZHMpLCBzZWxlY3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgSWRlbnRpY2FsIHRvIGB1cGRhdGVDZWxsU3RhdGVzYC4gS2VwdCBhcyBhbiBhbGlhcyBzbyBleGlzdGluZ1xuICAgKiBjYWxsZXJzIGtlZXAgd29ya2luZzsgcHJlZmVyIGB1cGRhdGVDZWxsU3RhdGVzYCwgd2hpY2ggc2F5cyB3aGF0IGl0IGRvZXMuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTm9kZVN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKSB7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZShyb3dOb2RlLCBjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZXZlcnkgY2VsbCBvZiBvbmUgcm93IGFuZCByZXBhaW50IGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWludCBpcyB0aGUgcG9pbnQ6IHRoaXMgaXMgd2hhdCBhIGNhbGxlciByZWFjaGVzIGZvciBhZnRlciBtdXRhdGluZ1xuICAgKiBhIHJvdyBpbiBwbGFjZSwgYW5kIGl0IHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhdGUgYW5kIHN0b3AgdGhlcmUuIFRoZVxuICAgKiBib2R5IHJlbmRlcnMgd2l0aCBPblB1c2gsIHNvIG5vdGhpbmcgbWFya2VkIGl0IGRpcnR5IGFuZCB0aGUgbmV3IHN0YXRlIHNhdFxuICAgKiB1bnJlYWQgdW50aWwgc29tZSB1bnJlbGF0ZWQgZXZlbnQgaGFwcGVuZWQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIOKAlFxuICAgKiB3aGljaCBpcyB3aHkgY2FsbGVycyBlbmRlZCB1cCBudWRnaW5nIHRoZSBncmlkIHdpdGggYSBzeW50aGV0aWMgRE9NIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNlbGxTdGF0ZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAoIXJvd05vZGUpIHJldHVybjtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFN0YXRlQ2hhbmdlZCcsIHsgZGF0YTogcm93Tm9kZS5kYXRhLCBub2RlOiByb3dOb2RlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgdGhhdCBSZWFjdHMgdG8gRGV0YWlsIENoYW5nZXNcbiAgICovXG4gIC8qKlxuICAgKiBLZWVwIGEgbWFzdGVyIHJvdydzIHJlc2VydmVkIGhlaWdodCBpbiBzdGVwIHdpdGggaXRzIGRldGFpbCByb3dzLlxuICAgKlxuICAgKiBUd28gbGlzdGVuZXJzIHVzZWQgdG8gYmUgcmVnaXN0ZXJlZCBoZXJlIGFuZCB0aHJvd24gYXdheTogYW4gZW1wdHlcbiAgICogYHJvd0RhdGFDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIHVuc3Vic2NyaWJlIHdhcyBuZXZlciBrZXB0LCBhbmQgYW5cbiAgICogYGV4cGFuZGVkQ2hhbmdlZGAgaGFuZGxlciB3aG9zZSBib2R5IHdhcyBlbnRpcmVseSBjb21tZW50ZWQgb3V0LiBCb3RoIGFyZVxuICAgKiBnb25lIOKAlCBhIGxpc3RlbmVyIHdpdGggbm8gYmVoYXZpb3VyIGlzIGEgbGVhayB3aXRoIG5vIHVwc2lkZS5cbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlRGV0YWlsID0gbm9kZS5vbignZGV0YWlsUm93RGF0YUNoYW5nZWQnLCAoeyBub2RlIH0pID0+IHtcblxuICAgICAgaWYgKHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3Rlck5vZGVDbGVhbnVwKG5vZGUucm93SWQsIFt1bnN1YnNjcmliZURldGFpbF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck5vZGVDbGVhbnVwKHJvd0lkOiBzdHJpbmcsIHVuc3ViczogQXJyYXk8KCkgPT4gdm9pZD4pOiB2b2lkIHtcblxuICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nIGNsZWFudXBzIGZvciB0aGlzIHJvd0lkXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9ub2RlQ2xlYW51cE1hcC5nZXQocm93SWQpID8/IFtdO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuc2V0KHJvd0lkLCBbLi4uZXhpc3RpbmcsIC4uLnVuc3Vic10pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTm9kZShyb3dJZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCk7XG5cbiAgICBjbGVhbnVwcz8uZm9yRWFjaChmbiA9PiBmbigpKTtcblxuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmRlbGV0ZShyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRhdGEsIHJlbGVhc2luZyB3aGF0IHRoZXkgaG9sZC5cbiAgICpcbiAgICogVGhpcyBleGlzdGVkIGJ1dCB3YXMgbmV2ZXIgY2FsbGVkOiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBlYWNoXG4gICAqIGRlbGV0ZWQgc3RyYWlnaHQgb3V0IG9mIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIHNvIGEgcmVtb3ZlZCBub2RlIGtlcHQgaXRzXG4gICAqIGxpc3RlbmVycyBhbmQgaXRzIGVudHJ5IGluIGBfbm9kZUNsZWFudXBNYXBgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGdyaWQuXG4gICAqIEJvdGggbm93IGNvbWUgdGhyb3VnaCBoZXJlLCB3aGljaCB1bnN1YnNjcmliZXMgYW5kIGNsZWFycyB0aGUgbm9kZSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgcHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG5cbiAgICBmb3IgKGNvbnN0IFtyb3dJZCwgbm9kZV0gb2YgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcykge1xuXG4gICAgICBpZiAoIXZhbGlkUm93SWRzLmhhcyhyb3dJZCkpIHtcblxuICAgICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTsgIC8vIHVuc3Vic2NyaWJlIGxpc3RlbmVyc1xuXG4gICAgICAgIG5vZGUuZGVzdHJveSgpOyAgICAgICAgICAgLy8gY2xlYXIgbm9kZSdzIG93biBsaXN0ZW5lciBtYXBcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmRlbGV0ZShyb3dJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlaWdodCBhIG1hc3RlciByb3cgbXVzdCByZXNlcnZlIGZvciBpdHMgZGV0YWlsIGdyaWQ6XG4gICAqIHJvd0hlaWdodCB4IGNsYW1wKHJvd3MsIG1pblJvd3MsIG1heFJvd3MpICsgaGVhZGVySGVpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IGhlaWdodE9wdGlvbnMgPSB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsR3JpZE9wdGlvbnM/LmRldGFpbFJvd0hlaWdodE9wdGlvbnM7XG5cbiAgICAvLyBSZWFjaGFibGUgd2hlbmV2ZXIgbWFzdGVyRGV0YWlsIGlzIG9uIGJ1dCBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgaXNcbiAgICAvLyBpbmNvbXBsZXRlOyB3aXRob3V0IHRoZSBndWFyZCB0aGlzIHRocmV3IGZyb20gaW5zaWRlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICghaGVpZ2h0T3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWluUm93cyA9IGhlaWdodE9wdGlvbnMubWluUm93cztcbiAgICBjb25zdCBtYXhSb3dzID0gaGVpZ2h0T3B0aW9ucy5tYXhSb3dzO1xuXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gKHRoaXMucm93SGVpZ2h0ICogbWluUm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtYXhSb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuXG4gICAgY29uc3Qgcm93cyA9IG5vZGUuZGV0YWlsUm93RGF0YSAmJiBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoID8gbm9kZS5kZXRhaWxSb3dEYXRhLmxlbmd0aCA6IDA7XG5cbiAgICBub2RlLmRldGFpbFJvd0hlaWdodCA9IHJvd3MgPD0gbWluUm93cyA/IG1pbkhlaWdodCA6IHJvd3MgPj0gbWF4Um93cyA/IG1heEhlaWdodCA6ICh0aGlzLnJvd0hlaWdodCAqIHJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBldmVyeXRoaW5nIHRoZSBncmlkIGhvbGRzLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnQubmdPbkRlc3Ryb3lgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBudWxsZWQgb3V0IGFueSBtb3JlLiBUaGV5IGFyZSBpbmplY3RlZCxcbiAgICogQW5ndWxhciBvd25zIHRoZWlyIGxpZmV0aW1lLCBhbmQgbnVsbGluZyB0aGVtIG9ubHkgZ3VhcmFudGVlZCBhXG4gICAqIGBUeXBlRXJyb3JgIGZvciBhbnkgY2FsbGJhY2sgdGhhdCBhcnJpdmVkIGFmdGVyIHRlYXJkb3duIOKAlCBhIGRldGFpbC1yb3dcbiAgICogZmV0Y2ggcmVzb2x2aW5nIGxhdGUsIG9yIHRoZSBib2R5J3MgZGVmZXJyZWQgdXBkYXRlLiBgX2Rlc3Ryb3llZGAgbWFrZXNcbiAgICogdGhvc2UgY2FsbHMgbm8tb3BzIGluc3RlYWQsIHdoaWNoIGlzIHdoYXQgYSB0b3JuLWRvd24gb2JqZWN0IHNob3VsZCBkby5cbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGV2ZXJ5IHBlci1ub2RlIGxpc3RlbmVyIGJlZm9yZSBkcm9wcGluZyB0aGUgbm9kZXMuXG4gICAgZm9yIChjb25zdCByb3dJZCBvZiBBcnJheS5mcm9tKHRoaXMuX25vZGVDbGVhbnVwTWFwLmtleXMoKSkpIHtcblxuICAgICAgdGhpcy5jbGVhbnVwTm9kZShyb3dJZCk7XG4gICAgfVxuXG4gICAgLy8gYGRlc3Ryb3lgIGRyb3BzIHRoZSB0cmVlIGxpbmtzIGFuZCB0aGUgbGlzdGVuZXJzOyB0aGUgQVBJIG5vIGxvbmdlciBoYXNcbiAgICAvLyB0byByZWFjaCBpbiBhbmQgdW5waWNrIGVhY2ggbm9kZSBpdHNlbGYuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZS5kZXN0cm95KCkpO1xuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNpZGUgb2YgWyd0b3AnLCAnYm90dG9tJ10gYXMgT25lUGlubmVkUm93U2lkZVtdKSB7XG5cbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gW107XG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5jbGVhcigpO1xuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcblxuICAgIC8vIFJlbGVhc2UgdGhlIGJhY2stcmVmZXJlbmNlIHRoZSBjZWxsIHNlcnZpY2UgaG9sZHMsIHNvIGEgdG9ybi1kb3duIGFwaSBpc1xuICAgIC8vIG5vdCBrZXB0IGFsaXZlIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgb3V0bGl2ZXMgdGhpcyBjYWxsLlxuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaShudWxsKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IFtdO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX3NvcnRNb2RlbCA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSAwO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbDtcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBkZXN0cm95YCBoYXMgcnVuLiBMYXRlIGNhbGxiYWNrcyBjaGVjayB0aGlzIGJlZm9yZSBkb2luZyB3b3JrLiAqL1xuICBwdWJsaWMgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLl9kZXN0cm95ZWQ7XG4gIH1cbn1cbiJdfQ==