ca-components 1.0.70 → 1.0.72

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 (119) hide show
  1. package/esm2022/lib/ca-components.module.mjs +7 -1
  2. package/esm2022/lib/components/ca-chart/ca-chart.component.mjs +331 -118
  3. package/esm2022/lib/components/ca-chart/enums/chart-colors.enum.mjs +1 -1
  4. package/esm2022/lib/components/ca-chart/enums/chart-event-types.enum.mjs +1 -1
  5. package/esm2022/lib/components/ca-chart/enums/chart-font-properties.enum.mjs +1 -1
  6. package/esm2022/lib/components/ca-chart/enums/chart-plugin-ids.enum.mjs +2 -1
  7. package/esm2022/lib/components/ca-chart/models/chart-annotation.model.mjs +1 -1
  8. package/esm2022/lib/components/ca-chart/models/chart-base-dataset.model.mjs +1 -1
  9. package/esm2022/lib/components/ca-chart/models/chart-center-label.model.mjs +2 -0
  10. package/esm2022/lib/components/ca-chart/models/chart-config.model.mjs +1 -1
  11. package/esm2022/lib/components/ca-chart/models/chart-dataset-hover.model.mjs +2 -0
  12. package/esm2022/lib/components/ca-chart/models/chart-line-dataset.model.mjs +1 -1
  13. package/esm2022/lib/components/ca-chart/models/index.mjs +3 -1
  14. package/esm2022/lib/components/ca-chart/utils/constants/chart.constants.mjs +4 -0
  15. package/esm2022/lib/components/ca-chart/utils/constants/index.mjs +2 -0
  16. package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +74 -6
  17. package/esm2022/lib/components/ca-chart-manager/ca-chart-manager.component.mjs +108 -0
  18. package/esm2022/lib/components/ca-chart-manager/models/hover-state.model.mjs +2 -0
  19. package/esm2022/lib/components/ca-chart-manager/models/index.mjs +2 -0
  20. package/esm2022/lib/components/ca-chart-manager/services/chart-manager.service.mjs +21 -0
  21. package/esm2022/lib/components/ca-chart-manager/services/index.mjs +2 -0
  22. package/esm2022/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.mjs +2 -1
  23. package/esm2022/lib/components/ca-dropdown-menu/models/dropdown-menu-option-emit.model.mjs +2 -0
  24. package/esm2022/lib/components/ca-dropdown-menu/models/index.mjs +2 -2
  25. package/esm2022/lib/components/ca-period-content/components/ca-period-content-payment/ca-period-content-payment.component.mjs +1 -1
  26. package/esm2022/lib/components/ca-pickup-delivery-block/components/ca-load/components/ca-load-single/ca-load-single.component.mjs +1 -1
  27. package/esm2022/lib/components/ca-tooltip-list/ca-tooltip-list.component.mjs +5 -4
  28. package/esm2022/lib/components/ca-tooltip-list/models/tooltip-list-item.model.mjs +1 -1
  29. package/esm2022/lib/components/ca-tooltip-list/models/tooltip-list.model.mjs +1 -1
  30. package/esm2022/lib/utils/helpers/dropdown-menu-content-conditional-items.helper.mjs +1 -1
  31. package/esm2022/lib/utils/helpers/dropdown-menu-content.helper.mjs +3 -1
  32. package/esm2022/public-api.mjs +2 -1
  33. package/fesm2022/ca-components.mjs +530 -129
  34. package/fesm2022/ca-components.mjs.map +1 -1
  35. package/lib/ca-components.module.d.ts +7 -6
  36. package/lib/components/ca-chart/ca-chart.component.d.ts +18 -10
  37. package/lib/components/ca-chart/enums/chart-colors.enum.d.ts +2 -1
  38. package/lib/components/ca-chart/enums/chart-plugin-ids.enum.d.ts +2 -1
  39. package/lib/components/ca-chart/models/chart-annotation.model.d.ts +1 -1
  40. package/lib/components/ca-chart/models/chart-base-dataset.model.d.ts +5 -2
  41. package/lib/components/ca-chart/models/chart-center-label.model.d.ts +11 -0
  42. package/lib/components/ca-chart/models/chart-config.model.d.ts +10 -3
  43. package/lib/components/ca-chart/models/chart-dataset-hover.model.d.ts +5 -0
  44. package/lib/components/ca-chart/models/chart-line-dataset.model.d.ts +0 -3
  45. package/lib/components/ca-chart/models/index.d.ts +2 -0
  46. package/lib/components/ca-chart/utils/constants/chart.constants.d.ts +3 -0
  47. package/lib/components/ca-chart/utils/constants/index.d.ts +1 -0
  48. package/lib/components/ca-chart/utils/helpers/chart.helper.d.ts +7 -1
  49. package/lib/components/ca-chart-manager/ca-chart-manager.component.d.ts +27 -0
  50. package/lib/components/ca-chart-manager/models/hover-state.model.d.ts +4 -0
  51. package/lib/components/ca-chart-manager/models/index.d.ts +1 -0
  52. package/lib/components/ca-chart-manager/services/chart-manager.service.d.ts +10 -0
  53. package/lib/components/ca-chart-manager/services/index.d.ts +1 -0
  54. package/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.d.ts +2 -2
  55. package/lib/components/ca-dropdown-menu/models/{dropdown-option-emit.model.d.ts → dropdown-menu-option-emit.model.d.ts} +1 -1
  56. package/lib/components/ca-dropdown-menu/models/index.d.ts +1 -1
  57. package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
  58. package/lib/components/ca-period-content/components/ca-period-content-payment/ca-period-content-payment.component.d.ts +3 -3
  59. package/lib/components/ca-pickup-delivery-block/components/ca-load/components/ca-load-single/ca-load-single.component.d.ts +2 -2
  60. package/lib/components/ca-tooltip-list/ca-tooltip-list.component.d.ts +1 -1
  61. package/lib/components/ca-tooltip-list/models/tooltip-list-item.model.d.ts +0 -1
  62. package/lib/components/ca-tooltip-list/models/tooltip-list.model.d.ts +1 -3
  63. package/package.json +1 -1
  64. package/public-api.d.ts +1 -0
  65. package/src/assets/ca-components/svg/common/states/ic_alabama.svg +3 -0
  66. package/src/assets/ca-components/svg/common/states/ic_alaska.svg +14 -0
  67. package/src/assets/ca-components/svg/common/states/ic_arizona.svg +3 -0
  68. package/src/assets/ca-components/svg/common/states/ic_arkansas.svg +3 -0
  69. package/src/assets/ca-components/svg/common/states/ic_california.svg +3 -0
  70. package/src/assets/ca-components/svg/common/states/ic_colorado.svg +3 -0
  71. package/src/assets/ca-components/svg/common/states/ic_connecticut.svg +3 -0
  72. package/src/assets/ca-components/svg/common/states/ic_delaware.svg +3 -0
  73. package/src/assets/ca-components/svg/common/states/ic_florida.svg +3 -0
  74. package/src/assets/ca-components/svg/common/states/ic_georgia.svg +3 -0
  75. package/src/assets/ca-components/svg/common/states/ic_hawaii.svg +10 -0
  76. package/src/assets/ca-components/svg/common/states/ic_idaho.svg +3 -0
  77. package/src/assets/ca-components/svg/common/states/ic_illinois.svg +3 -0
  78. package/src/assets/ca-components/svg/common/states/ic_indiana.svg +3 -0
  79. package/src/assets/ca-components/svg/common/states/ic_iowa.svg +3 -0
  80. package/src/assets/ca-components/svg/common/states/ic_kansas.svg +3 -0
  81. package/src/assets/ca-components/svg/common/states/ic_kentucky.svg +3 -0
  82. package/src/assets/ca-components/svg/common/states/ic_louisiana.svg +4 -0
  83. package/src/assets/ca-components/svg/common/states/ic_maine.svg +9 -0
  84. package/src/assets/ca-components/svg/common/states/ic_maryland.svg +7 -0
  85. package/src/assets/ca-components/svg/common/states/ic_massachusetts.svg +7 -0
  86. package/src/assets/ca-components/svg/common/states/ic_michigan.svg +11 -0
  87. package/src/assets/ca-components/svg/common/states/ic_minnesota.svg +4 -0
  88. package/src/assets/ca-components/svg/common/states/ic_mississippi.svg +3 -0
  89. package/src/assets/ca-components/svg/common/states/ic_missouri.svg +3 -0
  90. package/src/assets/ca-components/svg/common/states/ic_montana.svg +3 -0
  91. package/src/assets/ca-components/svg/common/states/ic_nebraska.svg +3 -0
  92. package/src/assets/ca-components/svg/common/states/ic_nevada.svg +3 -0
  93. package/src/assets/ca-components/svg/common/states/ic_new_hampshire.svg +3 -0
  94. package/src/assets/ca-components/svg/common/states/ic_new_jersey.svg +5 -0
  95. package/src/assets/ca-components/svg/common/states/ic_new_mexico.svg +3 -0
  96. package/src/assets/ca-components/svg/common/states/ic_new_york.svg +4 -0
  97. package/src/assets/ca-components/svg/common/states/ic_north_carolina.svg +3 -0
  98. package/src/assets/ca-components/svg/common/states/ic_north_dakota.svg +3 -0
  99. package/src/assets/ca-components/svg/common/states/ic_ohio.svg +4 -0
  100. package/src/assets/ca-components/svg/common/states/ic_oklahoma.svg +3 -0
  101. package/src/assets/ca-components/svg/common/states/ic_oregon.svg +3 -0
  102. package/src/assets/ca-components/svg/common/states/ic_pennsylvania.svg +3 -0
  103. package/src/assets/ca-components/svg/common/states/ic_rhode_island.svg +8 -0
  104. package/src/assets/ca-components/svg/common/states/ic_south_carolina.svg +3 -0
  105. package/src/assets/ca-components/svg/common/states/ic_south_dakota.svg +3 -0
  106. package/src/assets/ca-components/svg/common/states/ic_tennessee.svg +3 -0
  107. package/src/assets/ca-components/svg/common/states/ic_texas.svg +3 -0
  108. package/src/assets/ca-components/svg/common/states/ic_utah.svg +3 -0
  109. package/src/assets/ca-components/svg/common/states/ic_vermont.svg +7 -0
  110. package/src/assets/ca-components/svg/common/states/ic_virginia.svg +4 -0
  111. package/src/assets/ca-components/svg/common/states/ic_washington.svg +15 -0
  112. package/src/assets/ca-components/svg/common/states/ic_west_virginia.svg +3 -0
  113. package/src/assets/ca-components/svg/common/states/ic_wisconsin.svg +4 -0
  114. package/src/assets/ca-components/svg/common/states/ic_wyoming.svg +3 -0
  115. package/esm2022/lib/components/ca-chart/config/ca-base-chart-dataset.config.mjs +0 -10
  116. package/esm2022/lib/components/ca-chart/config/index.mjs +0 -2
  117. package/esm2022/lib/components/ca-dropdown-menu/models/dropdown-option-emit.model.mjs +0 -2
  118. package/lib/components/ca-chart/config/ca-base-chart-dataset.config.d.ts +0 -4
  119. package/lib/components/ca-chart/config/index.d.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { Component, Input, ViewChild, } from '@angular/core';
1
+ import { Component, Input, Output, Optional, ViewChild, EventEmitter, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { AngularSvgIconModule } from 'angular-svg-icon';
4
4
  // Charts
@@ -10,16 +10,24 @@ import { EChartEventProperties, ChartPluginIdsStringEnum, CubicInterpolationStri
10
10
  import { ChartHelper } from './utils/helpers';
11
11
  // Guards
12
12
  import { ChartTypeGuard } from './utils/guards';
13
- //Config
14
- import { CaBaseChartDatasetConfig } from './config';
13
+ // Constants
14
+ import { ChartConstants } from './utils/constants';
15
15
  import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/common";
17
- import * as i2 from "angular-svg-icon";
16
+ import * as i1 from "../ca-chart-manager/services";
17
+ import * as i2 from "@angular/common";
18
+ import * as i3 from "angular-svg-icon";
18
19
  export class CaChartComponent {
20
+ set chartDatasetHover(value) {
21
+ if (value)
22
+ this.updateDatasetBackgroundOnHover(value);
23
+ }
19
24
  set chartConfig(value) {
20
25
  this._chartConfig = value;
21
26
  this.isChartDataAvailable = false;
22
- this._chartConfig.chartData.datasets.forEach((item) => {
27
+ this._chartConfig?.
28
+ chartData?.
29
+ datasets?.
30
+ forEach((item) => {
23
31
  item.data.forEach((value) => {
24
32
  if (Array.isArray(value)) {
25
33
  if (value[0] !== 0 || value[1] !== 0)
@@ -29,21 +37,29 @@ export class CaChartComponent {
29
37
  this.isChartDataAvailable = true;
30
38
  });
31
39
  });
32
- }
33
- //for testing hover state on dataset
34
- set isDatasetHovered(value) {
35
- this._isDatasetHovered = value;
36
- if (this.chart) {
37
- this.updateDatasetBackgroundOnHover('Sales', '#6692F1', this._isDatasetHovered);
38
- }
39
- }
40
- constructor() {
41
- this.originalChartDataset = CaBaseChartDatasetConfig.getBaseChartDatasetConfig();
42
- this.isChartDataAvailable = true;
43
- }
44
- ngOnChanges(changes) {
45
- if (this.isChartDataAvailable && !changes['chartConfig'].firstChange)
40
+ this.changeDetector.detectChanges();
41
+ if (this.isChartDataAvailable)
46
42
  this.updateChart();
43
+ this._chartConfig.chartData.datasets.forEach((item) => {
44
+ item.data.forEach((value) => {
45
+ if (Array.isArray(value)) {
46
+ if (value[0] !== 0 || value[1] !== 0)
47
+ this.isChartDataAvailable = true;
48
+ }
49
+ else {
50
+ if (value !== 0)
51
+ this.isChartDataAvailable = true;
52
+ }
53
+ });
54
+ });
55
+ }
56
+ constructor(changeDetector, chartManagerService) {
57
+ this.changeDetector = changeDetector;
58
+ this.chartManagerService = chartManagerService;
59
+ this.hoveredIndex = new EventEmitter();
60
+ this.areAnimationsCompleated = false;
61
+ this._hoveredIndex = null;
62
+ this.isChartDataAvailable = false;
47
63
  }
48
64
  ngAfterViewInit() {
49
65
  if (this.isChartDataAvailable) {
@@ -51,77 +67,145 @@ export class CaChartComponent {
51
67
  this.createChart();
52
68
  }
53
69
  }
70
+ ngOnInit() {
71
+ this.initializeChartManagerService();
72
+ }
73
+ initializeChartManagerService() {
74
+ if (!this.chartManagerService)
75
+ return;
76
+ this.subscription = this.chartManagerService.hoverState$.subscribe(({ index, chartId }) => {
77
+ if (chartId !== this.chartId) {
78
+ this._hoveredIndex = index;
79
+ if (this.chart)
80
+ this.chart.draw();
81
+ }
82
+ });
83
+ }
54
84
  initializeAnnotationPlugin() {
55
85
  Chart.register(annotationPlugin);
56
86
  }
57
- updateDatasetBackgroundOnHover(dataSetLabel, color, isDatasetHovered) {
58
- if (isDatasetHovered) {
59
- this.originalChartDataset = JSON.parse(JSON.stringify(this._chartConfig.chartData.datasets));
60
- const gradient = ChartHelper.createGradient(this.chartContext, this.chartCanvas, color, color);
61
- this._chartConfig.chartData.datasets =
62
- this._chartConfig.chartData.datasets.map((dataset) => {
63
- if (dataset.label === dataSetLabel) {
64
- return {
65
- ...dataset,
66
- fill: true,
67
- backgroundColor: gradient,
68
- borderColor: color,
69
- };
70
- }
71
- else {
72
- const borderColorWithOpacity = ChartHelper.rgbToRgba(dataset.borderColor, 0.2);
73
- return {
74
- ...dataset,
75
- fill: false,
76
- borderColor: borderColorWithOpacity,
77
- };
78
- }
79
- });
87
+ updateDatasetBackgroundOnHover(chartDatasetHover) {
88
+ if (!this.chart || !this.chart.data.datasets)
89
+ return;
90
+ if (chartDatasetHover.isHoverd) {
91
+ const gradient = ChartHelper.createGradient(this.chartContext, this.chartCanvas, chartDatasetHover.color, chartDatasetHover.color, 0.6, 0.1, true);
92
+ this.chart.data.datasets = this.chart.data.datasets.map((dataset) => {
93
+ if (dataset.hidden)
94
+ return dataset;
95
+ if (dataset.label?.toUpperCase() === chartDatasetHover.label.toUpperCase()) {
96
+ const hoverdDataSet = {
97
+ ...dataset,
98
+ fill: true,
99
+ backgroundColor: gradient,
100
+ borderColor: chartDatasetHover.color,
101
+ order: 1,
102
+ };
103
+ return hoverdDataSet;
104
+ }
105
+ else {
106
+ const borderColorWithOpacity = ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 0.2);
107
+ return {
108
+ ...dataset,
109
+ fill: false,
110
+ borderColor: borderColorWithOpacity,
111
+ };
112
+ }
113
+ });
114
+ }
115
+ else {
116
+ this.chart.data.datasets = this.chart.data.datasets.map((dataset) => {
117
+ if (!dataset.hidden) {
118
+ const originalColor = dataset.borderColor
119
+ ? ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 1)
120
+ : ChartConstants.STRING_EMPTY;
121
+ return {
122
+ ...dataset,
123
+ fill: false,
124
+ borderColor: originalColor,
125
+ backgroundColor: ChartConstants.STRING_EMPTY,
126
+ };
127
+ }
128
+ else
129
+ return dataset;
130
+ });
80
131
  }
81
- else
82
- this._chartConfig.chartData.datasets = JSON.parse(JSON.stringify(this.originalChartDataset));
83
132
  this.chart.update();
84
133
  }
85
134
  createChart() {
86
- this.chartContext = this.chartCanvas.nativeElement.getContext('2d');
135
+ this.chartContext = this.chartCanvas?.
136
+ nativeElement?.
137
+ getContext('2d');
87
138
  this.setChartOptionsProperties();
88
139
  this.setChartDataProperties();
89
140
  this.setChartPluginsProperties();
141
+ if (this.chart)
142
+ this.chart.destroy();
143
+ this.initializeAnnotationPlugin();
144
+ if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
145
+ Chart.overrides.doughnut.cutout = '80%';
90
146
  this.chart = new Chart(this.chartContext, {
91
147
  type: this._chartConfig.chartType,
92
148
  data: this._chartConfig.chartData,
93
149
  options: this._chartConfig.chartOptions,
94
150
  plugins: this.plugins,
95
151
  });
96
- this.chart.config.data.datasets = [
97
- ...this._chartConfig?.
98
- chartData?.
99
- datasets?.map((item, indx) => {
100
- if (!item.shiftValue)
101
- return {
152
+ if (!this._chartConfig.isDashboardChart) {
153
+ this.chart.config.data.datasets = [
154
+ ...this._chartConfig?.
155
+ chartData?.
156
+ datasets?.
157
+ map((item, indx) => {
158
+ const pointConfig = {
159
+ pointBackgroundColor: "#FFFFFF" /* ChartColorsStringEnum.WHITE */,
160
+ pointBorderWidth: 2,
161
+ pointRadius: 3,
162
+ };
163
+ this.updateChartAnnotations(item, indx);
164
+ const yScale = this.chart.scales[EChartEventProperties.Y_AXIS_0];
165
+ const datasetConfig = {
102
166
  ...item,
167
+ pointBorderColor: item.color,
168
+ ...pointConfig,
103
169
  backgroundColor: item?.color &&
104
170
  item?.color2 &&
105
171
  item?.color !== item?.color2 ?
106
172
  ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2) : item?.color,
107
173
  fill: item?.fill
108
174
  };
109
- this.updateChartAnnotations(item, indx);
110
- const yScale = this.chart.scales[EChartEventProperties.Y_AXIS_0];
111
- const shiftValuePx = yScale.getPixelForValue(item.shiftValue || 0);
112
- const shiftValueAdjusted = shiftValuePx / yScale.maxHeight;
113
- return {
114
- ...item,
115
- backgroundColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, item.color || '', item.color2 || '', shiftValueAdjusted, true),
116
- borderColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, item.color || '', item.color2 || '', shiftValueAdjusted),
117
- fill: true
118
- };
119
- })
120
- ];
175
+ if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */) {
176
+ return {
177
+ ...datasetConfig,
178
+ backgroundColor: item.backgroundColor
179
+ };
180
+ }
181
+ if (!item.shiftValue) {
182
+ return {
183
+ ...datasetConfig,
184
+ backgroundColor: item?.color &&
185
+ item?.color2 &&
186
+ item?.color !== item?.color2 ?
187
+ ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2) : item?.color,
188
+ };
189
+ }
190
+ const shiftValuePx = yScale.getPixelForValue(item.shiftValue || 0);
191
+ const shiftValueAdjusted = shiftValuePx / yScale.maxHeight;
192
+ const borderColor = ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, item.color || ChartConstants.STRING_EMPTY, item.color2 || ChartConstants.STRING_EMPTY, shiftValueAdjusted);
193
+ return {
194
+ ...item,
195
+ ...pointConfig,
196
+ pointBorderColor: borderColor,
197
+ backgroundColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, item.color || ChartConstants.STRING_EMPTY, item.color2 || ChartConstants.STRING_EMPTY, shiftValueAdjusted, true),
198
+ borderColor,
199
+ fill: true
200
+ };
201
+ })
202
+ ];
203
+ }
121
204
  this.chart.update();
122
205
  }
123
206
  updateChart() {
124
- this.chart?.destroy();
207
+ if (this.chart)
208
+ this.chart?.destroy();
125
209
  this.createChart();
126
210
  }
127
211
  setChartOptionsProperties() {
@@ -130,16 +214,37 @@ export class CaChartComponent {
130
214
  responsive: true,
131
215
  maintainAspectRatio: false,
132
216
  clip: false,
217
+ animation: {
218
+ onComplete: () => {
219
+ this.areAnimationsCompleated = true;
220
+ this.chart.draw();
221
+ },
222
+ onProgress: () => {
223
+ this.areAnimationsCompleated = false;
224
+ this.chart.draw();
225
+ },
226
+ },
133
227
  layout: {
134
228
  padding: {
135
229
  top: 0,
136
- bottom: -25
137
- }
230
+ bottom: 0,
231
+ left: this._chartConfig.chartType === "bar" /* ChartTypesStringEnum.BAR */ &&
232
+ this._chartConfig.verticalyAlignBarChartWithLineCart
233
+ ? 6
234
+ : 0,
235
+ right: this._chartConfig.chartType === "bar" /* ChartTypesStringEnum.BAR */ &&
236
+ this._chartConfig.verticalyAlignBarChartWithLineCart
237
+ ? 6
238
+ : 0,
239
+ },
138
240
  },
139
241
  plugins: {
140
242
  legend: {
141
243
  display: false,
142
244
  },
245
+ tooltip: {
246
+ enabled: false,
247
+ },
143
248
  },
144
249
  scales: {
145
250
  x: {
@@ -151,6 +256,7 @@ export class CaChartComponent {
151
256
  display: false,
152
257
  },
153
258
  ticks: {
259
+ display: true,
154
260
  padding: 0,
155
261
  color: "#919191" /* ChartColorsStringEnum.X_AXIS_LABEL_COLOR */,
156
262
  font: {
@@ -162,7 +268,7 @@ export class CaChartComponent {
162
268
  autoSkipPadding: 12,
163
269
  maxRotation: 0,
164
270
  minRotation: 0,
165
- //ispis lable u 2 reda za dane - ceka se dizaj za prikaz dana
271
+ //Label written in 2 lines, will be ujusted with new design
166
272
  callback: function (value, index) {
167
273
  const label = labels[index];
168
274
  const multiLineLabel = label ? label.split(' ') : [];
@@ -178,20 +284,44 @@ export class CaChartComponent {
178
284
  beginAtZero: true,
179
285
  min: 0,
180
286
  max: 1,
287
+ offset: false,
181
288
  },
182
289
  },
183
- onHover: (event, dataItem) => {
184
- if (!this._chartConfig.hasVerticalDashedAnnotation)
185
- return;
186
- this.resetAnnotations();
187
- if (!dataItem || !dataItem?.length)
290
+ onHover: (event, item) => {
291
+ if (this._chartConfig.hasVerticalDashedAnnotation)
292
+ this.resetAnnotations();
293
+ if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */) {
294
+ const colors = this.chart.data.datasets[0].backgroundColor;
295
+ this.chart.data.datasets[0].backgroundColor =
296
+ colors.map((color) => {
297
+ return ChartHelper.convertRgbToRgba(color);
298
+ });
299
+ this.chart.update();
300
+ }
301
+ if (!item ||
302
+ !item?.length) {
303
+ this.hoveredIndex.emit(null);
188
304
  return;
189
- this.setVerticalDashedAnnotationLine(dataItem[0].element.x);
305
+ }
306
+ this.hoveredIndex.emit(item[0].index);
307
+ if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */) {
308
+ const colors = this.chart.data.datasets[0].backgroundColor;
309
+ const updatedColors = colors.map((color, indx) => {
310
+ if (indx === item[0].index)
311
+ return color;
312
+ const convertedValue = ChartHelper.convertRgbToRgba(color, 0.2);
313
+ return convertedValue;
314
+ });
315
+ this.chart.data.datasets[0].backgroundColor = updatedColors;
316
+ }
317
+ if (this._chartConfig.hasVerticalDashedAnnotation)
318
+ this.setVerticalDashedAnnotationLine(item[0].element.x);
319
+ this.chart.update();
190
320
  },
191
321
  };
192
322
  }
193
323
  setChartDataProperties() {
194
- if ((this._chartConfig.chartType = "line" /* ChartTypesStringEnum.LINE */)) {
324
+ if ((this._chartConfig.chartType === "line" /* ChartTypesStringEnum.LINE */)) {
195
325
  this._chartConfig.chartData.datasets.forEach((dataset) => {
196
326
  dataset.order = dataset.order;
197
327
  if (ChartTypeGuard.isLineDataset(dataset)) {
@@ -217,43 +347,110 @@ export class CaChartComponent {
217
347
  {
218
348
  id: ChartPluginIdsStringEnum.HIGHLIGHT_SEGMENT_ON_HOVER,
219
349
  afterEvent: (chart, event) => {
220
- if (!this._chartConfig.showTooltipBackground) {
350
+ if (!this._chartConfig.showTooltipBackground)
221
351
  return;
222
- }
223
352
  const nativeEvent = event.event.native;
224
- if (event.event.type === ChartEventTypesStringEnum.MOUSE_OUT &&
225
- hoveredIndex !== null) {
226
- hoveredIndex = null;
353
+ if (event.event.type === ChartEventTypesStringEnum.MOUSE_OUT) {
354
+ const boundingRect = this.chart.canvas.getBoundingClientRect();
355
+ const isMouseOutsideChart = nativeEvent.clientX < boundingRect.left ||
356
+ nativeEvent.clientX > boundingRect.right ||
357
+ nativeEvent.clientY < boundingRect.top ||
358
+ nativeEvent.clientY > boundingRect.bottom;
359
+ if (isMouseOutsideChart) {
360
+ this._hoveredIndex = null;
361
+ this.chartManagerService?.setHoverState(null, this.chartId);
362
+ this.chart.draw();
363
+ }
364
+ return;
365
+ }
366
+ const boundingRect = this.chart.canvas.getBoundingClientRect();
367
+ const mouseHorizontalCoordinate = nativeEvent.clientX - boundingRect.left;
368
+ const { left, right } = this.chart.chartArea;
369
+ if (mouseHorizontalCoordinate < left ||
370
+ mouseHorizontalCoordinate > right) {
371
+ this._hoveredIndex = null;
372
+ this.chartManagerService?.setHoverState(null, this.chartId);
227
373
  this.chart.draw();
228
374
  return;
229
375
  }
230
- const mouseHorizontalCoordinate = nativeEvent[EChartEventProperties.X];
231
376
  const xScale = this.chart.scales[EChartEventProperties.X];
232
- const tickPositions = ChartHelper.calculateTickPositions(xScale);
233
- const newHoveredIndex = tickPositions.findIndex((tickPos) => mouseHorizontalCoordinate >
234
- tickPos - (tickPositions[1] - tickPositions[0]) / 2 &&
235
- mouseHorizontalCoordinate <=
236
- tickPos + (tickPositions[1] - tickPositions[0]) / 2);
237
- if (newHoveredIndex !== hoveredIndex) {
238
- hoveredIndex = newHoveredIndex === -1 ? null : newHoveredIndex;
377
+ const tickPositions = xScale.ticks.map((tick) => xScale.getPixelForValue(tick.value));
378
+ const segmentBoundaries = tickPositions.map((tickPos, index) => {
379
+ const leftBoundary = index === 0 ? left : (tickPos + tickPositions[index - 1]) / 2;
380
+ const rightBoundary = index === tickPositions.length - 1
381
+ ? right
382
+ : (tickPos + tickPositions[index + 1]) / 2;
383
+ return { leftBoundary, rightBoundary };
384
+ });
385
+ const newHoveredIndex = segmentBoundaries.findIndex((boundary) => mouseHorizontalCoordinate >= boundary.leftBoundary &&
386
+ mouseHorizontalCoordinate < boundary.rightBoundary);
387
+ if (newHoveredIndex !== this._hoveredIndex) {
388
+ this._hoveredIndex = newHoveredIndex === -1 ? null : newHoveredIndex;
389
+ this.chartManagerService?.setHoverState(this._hoveredIndex, this.chartId);
239
390
  this.chart.draw();
240
391
  }
241
392
  },
242
393
  beforeDraw: () => {
243
- if (hoveredIndex !== null) {
394
+ if (this._hoveredIndex !== null) {
244
395
  const { chartArea, scales: { x: xScale }, } = this.chart;
245
- ChartHelper.highlightSegment(this.chartContext, xScale, chartArea, this._chartConfig.height, hoveredIndex);
396
+ ChartHelper.highlightSegment(this.chartContext, xScale, chartArea, this._chartConfig.height, this._hoveredIndex);
246
397
  }
247
398
  },
248
399
  },
249
400
  {
250
401
  id: ChartPluginIdsStringEnum.HIGHLIGHT_POINT_ON_HOVER,
251
402
  afterDraw: () => {
252
- if (hoveredIndex !== null)
253
- ChartHelper.highlightPoint(this.chartContext, this.chart, hoveredIndex, this._chartConfig.chartData);
403
+ if (this._hoveredIndex !== null &&
404
+ this._chartConfig.showHighlightPointOnHover &&
405
+ this.areAnimationsCompleated) {
406
+ const visibleDatasets = this._chartConfig.chartData.datasets.filter((dataset) => !dataset.hidden);
407
+ ChartHelper.highlightPoint(this.chartContext, this.chart, this._hoveredIndex, { ...this._chartConfig.chartData, datasets: visibleDatasets });
408
+ }
409
+ },
410
+ },
411
+ {
412
+ id: ChartPluginIdsStringEnum.BORDER_BOTTOM_LINE_CHART,
413
+ beforeDraw: () => {
414
+ if (this._chartConfig?.showBottomLineOnLineChart) {
415
+ const { ctx, data, chartArea, scales: { x: xScale }, } = this.chart;
416
+ const dataset = data.datasets[0];
417
+ const firstIndex = 0;
418
+ const lastIndex = dataset.data.length - 1;
419
+ const firstValue = dataset.data[firstIndex];
420
+ const lastValue = dataset.data[lastIndex];
421
+ if (firstValue !== undefined && lastValue !== undefined) {
422
+ const xStart = xScale.getPixelForValue(firstIndex);
423
+ const xEnd = xScale.getPixelForValue(lastIndex);
424
+ const yBottom = chartArea.bottom;
425
+ ctx.save();
426
+ ctx.strokeStyle =
427
+ "#DADADA" /* ChartColorsStringEnum.BORDER_BOTTOM_LINE_CHART_COLOR */;
428
+ ctx.lineWidth = 1;
429
+ ctx.beginPath();
430
+ ctx.moveTo(xStart, yBottom);
431
+ ctx.lineTo(xEnd, yBottom);
432
+ ctx.stroke();
433
+ ctx.restore();
434
+ }
435
+ }
254
436
  },
255
437
  },
256
438
  ];
439
+ if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
440
+ this.plugins = [
441
+ ...this.plugins,
442
+ {
443
+ id: 'doughnut-label',
444
+ beforeDatasetDraw: (chart) => {
445
+ this._chartConfig.centerLabels?.map((label, indx) => {
446
+ ChartHelper.drawDoughnutLegend(chart, {
447
+ indx,
448
+ offsetTop: label.position?.top || 0
449
+ }, label.value, label.fontSize, label.color);
450
+ });
451
+ },
452
+ }
453
+ ];
257
454
  }
258
455
  updateChartAnnotations(item, indx) {
259
456
  if (!this._chartConfig.annotations?.length)
@@ -274,7 +471,7 @@ export class CaChartComponent {
274
471
  [`${item.label}-${indx}-${key}`]: {
275
472
  id: annotation.id || `annotation-${indx}-${key}`,
276
473
  type: annotation.type,
277
- scaleID: annotation.axis || item.yAxisId,
474
+ scaleID: annotation.axis || item.yAxisID,
278
475
  value: annotation.value || item.shiftValue,
279
476
  borderColor: annotation.color || '#DADADA',
280
477
  borderWidth: annotation.borderWidth || 2,
@@ -284,37 +481,45 @@ export class CaChartComponent {
284
481
  },
285
482
  };
286
483
  });
484
+ this.chart.update();
287
485
  }
288
486
  setMultipleYAxis(chartData) {
289
487
  let absoluteMax;
290
488
  chartData.datasets.forEach((dataset, index) => {
291
- if (dataset.type == "line" /* ChartTypesStringEnum.LINE */ ||
292
- dataset.type == "bar" /* ChartTypesStringEnum.BAR */) {
489
+ if (dataset.type === "line" /* ChartTypesStringEnum.LINE */ ||
490
+ dataset.type === "bar" /* ChartTypesStringEnum.BAR */) {
293
491
  const yAxisID = this._chartConfig.isMultiYAxis
294
492
  ? `y-axis-${index}`
295
- : dataset.yAxisId || 'y-axis-0';
296
- chartData.datasets[index] = {
297
- ...dataset,
298
- yAxisID,
299
- };
300
- const minValue = ChartHelper.calculateMinValue(dataset.data);
301
- const maxValue = ChartHelper.calculateMaxValue(dataset.data);
302
- if (!absoluteMax || maxValue > absoluteMax)
303
- absoluteMax = maxValue;
493
+ : dataset.yAxisID || 'y-axis-0';
494
+ // Detect if the dataset is all 0
495
+ const isAllZeroDataset = dataset.data.every((val) => val === 0);
496
+ let minValue = ChartHelper.calculateMinValue(dataset.data);
497
+ let maxValue = ChartHelper.calculateMaxValue(dataset.data);
304
498
  const padding = maxValue * 0.03;
305
- const minValueAdjusted = padding == 0 ? minValue : 0;
306
- const maxValueAdjusted = absoluteMax + padding;
499
+ // Adjust scaling for all 0 datasets
500
+ if (isAllZeroDataset) {
501
+ minValue = 0;
502
+ maxValue = 1;
503
+ }
504
+ else {
505
+ minValue = maxValue === minValue ? minValue - 0.1 : minValue;
506
+ maxValue =
507
+ maxValue === minValue ? maxValue + 0.1 : maxValue + padding;
508
+ }
307
509
  this._chartConfig.chartOptions.scales = {
308
510
  ...this._chartConfig.chartOptions.scales,
309
511
  [yAxisID]: {
310
512
  display: false,
311
513
  beginAtZero: true,
312
- min: minValueAdjusted,
313
- max: maxValueAdjusted,
314
- // Ovo je jako bitno, moramo ovu osu sa stacked parametrom namjestiti
514
+ min: minValue,
515
+ max: maxValue,
315
516
  stacked: this._chartConfig.isStacked,
316
517
  },
317
518
  };
519
+ chartData.datasets[index] = {
520
+ ...dataset,
521
+ yAxisID,
522
+ };
318
523
  }
319
524
  });
320
525
  }
@@ -353,20 +558,28 @@ export class CaChartComponent {
353
558
  },
354
559
  },
355
560
  };
356
- this.chart.update();
357
561
  }
358
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
359
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CaChartComponent, isStandalone: true, selector: "app-ca-chart", inputs: { chartConfig: "chartConfig", isDatasetHovered: "isDatasetHovered" }, viewQueries: [{ propertyName: "chartCanvas", first: true, predicate: ["chartCanvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"isChartDataAvailable; else noDataTemplate\">\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas> </canvas>\n </div>\n</ng-container>\n<ng-template #noDataTemplate>\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n</ng-template>\n", styles: [".no-data-svg{width:100%;height:auto;max-width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i2.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }] }); }
562
+ ngOnDestroy() {
563
+ this.subscription?.unsubscribe();
564
+ }
565
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaChartComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ChartManagerService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
566
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CaChartComponent, isStandalone: true, selector: "app-ca-chart", inputs: { chartId: "chartId", chartDatasetHover: "chartDatasetHover", chartConfig: "chartConfig" }, outputs: { hoveredIndex: "hoveredIndex" }, viewQueries: [{ propertyName: "chartCanvas", first: true, predicate: ["chartCanvas"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"isChartDataAvailable; else noDataTemplate\">\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n</ng-container>\n<ng-template #noDataTemplate>\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n</ng-template>\n", styles: [".no-data-svg{width:100%;height:auto;max-width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i3.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }] }); }
360
567
  }
361
568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaChartComponent, decorators: [{
362
569
  type: Component,
363
- args: [{ selector: 'app-ca-chart', standalone: true, imports: [CommonModule, AngularSvgIconModule], template: "<ng-container *ngIf=\"isChartDataAvailable; else noDataTemplate\">\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas> </canvas>\n </div>\n</ng-container>\n<ng-template #noDataTemplate>\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n</ng-template>\n", styles: [".no-data-svg{width:100%;height:auto;max-width:100%}\n"] }]
364
- }], ctorParameters: () => [], propDecorators: { chartCanvas: [{
570
+ args: [{ selector: 'app-ca-chart', standalone: true, imports: [CommonModule, AngularSvgIconModule], template: "<ng-container *ngIf=\"isChartDataAvailable; else noDataTemplate\">\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n</ng-container>\n<ng-template #noDataTemplate>\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n</ng-template>\n", styles: [".no-data-svg{width:100%;height:auto;max-width:100%}\n"] }]
571
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.ChartManagerService, decorators: [{
572
+ type: Optional
573
+ }] }], propDecorators: { chartCanvas: [{
365
574
  type: ViewChild,
366
- args: ['chartCanvas']
367
- }], chartConfig: [{
575
+ args: ['chartCanvas', { static: false }]
576
+ }], chartId: [{
368
577
  type: Input
369
- }], isDatasetHovered: [{
578
+ }], chartDatasetHover: [{
579
+ type: Input
580
+ }], chartConfig: [{
370
581
  type: Input
582
+ }], hoveredIndex: [{
583
+ type: Output
371
584
  }] } });
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEVBRUwsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4RCxTQUFTO0FBQ1QsT0FBTyxFQUVMLEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBRXpELFFBQVE7QUFDUixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QixvQkFBb0IsR0FDckIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWWhELFFBQVE7QUFDUixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7QUFTcEQsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixJQUFhLFdBQVcsQ0FBQyxLQUEwQjtRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMs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QUdaLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzt3REFHbkIsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUVYLFdBQVc7c0JBQXZCLEtBQUs7Z0JBa0JPLGdCQUFnQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQW55T2JqZWN0IH0gZnJvbSAnY2hhcnQuanMvZGlzdC90eXBlcy9iYXNpYyc7XG5pbXBvcnQgeyBBbmd1bGFyU3ZnSWNvbk1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItc3ZnLWljb24nO1xuXG4vLyBDaGFydHNcbmltcG9ydCB7XG4gIENhdGVnb3J5U2NhbGUsXG4gIENoYXJ0LFxuICBDaGFydEV2ZW50LFxuICBDaGFydFR5cGUsXG4gIExpbmVhclNjYWxlLFxuICBQbHVnaW4sXG59IGZyb20gJ2NoYXJ0LmpzL2F1dG8nO1xuaW1wb3J0IGFubm90YXRpb25QbHVnaW4gZnJvbSAnY2hhcnRqcy1wbHVnaW4tYW5ub3RhdGlvbic7XG5cbi8vIEVudW1zXG5pbXBvcnQge1xuICBDaGFydENvbG9yc1N0cmluZ0VudW0sXG4gIEVDaGFydEV2ZW50UHJvcGVydGllcyxcbiAgQ2hhcnRQbHVnaW5JZHNTdHJpbmdFbnVtLFxuICBDaGFydFR5cGVzU3RyaW5nRW51bSxcbiAgQ3ViaWNJbnRlcnBvbGF0aW9uU3RyaW5nRW51bSxcbiAgQ2hhcnRFdmVudFR5cGVzU3RyaW5nRW51bSxcbiAgQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0sXG4gIEVDaGFydEFubm90YXRpb25UeXBlLFxufSBmcm9tICcuL2VudW1zJztcblxuLy8gSGVscGVyc1xuaW1wb3J0IHsgQ2hhcnRIZWxwZXIgfSBmcm9tICcuL3V0aWxzL2hlbHBlcnMnO1xuXG4vLyBHdWFyZHNcbmltcG9ydCB7IENoYXJ0VHlwZUd1YXJkIH0gZnJvbSAnLi91dGlscy9ndWFyZHMnO1xuXG4vL01vZGVsc1xuaW1wb3J0IHtcbiAgSUNoYXJ0RGF0YSxcbiAgSUxpbmVEYXRhc2V0LFxuICBJQ2hhcnRDb25maWd1cmF0aW9uLFxuICBJQmFzZURhdGFzZXQsXG4gIElDaGFydEFubm90YXRpb25cbn0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvcGx1Z2lucy9wbHVnaW4udG9vbHRpcCc7XG5cbi8vQ29uZmlnXG5pbXBvcnQgeyBDYUJhc2VDaGFydERhdGFzZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jYS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEFuZ3VsYXJTdmdJY29uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycpIGNoYXJ0Q2FudmFzITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBzZXQgY2hhcnRDb25maWcodmFsdWU6IElDaGFydENvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9jaGFydENvbmZpZyA9IHZhbHVlO1xuICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSBmYWxzZTtcblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cy5mb3JFYWNoKChpdGVtOiBJQmFzZURhdGFzZXQpID0+IHtcbiAgICAgIGl0ZW0uZGF0YS5mb3JFYWNoKCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlWzBdICE9PSAwIHx8IHZhbHVlWzFdICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLy9mb3IgdGVzdGluZyBob3ZlciBzdGF0ZSBvbiBkYXRhc2V0XG4gIEBJbnB1dCgpIHNldCBpc0RhdGFzZXRIb3ZlcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEYXRhc2V0SG92ZXJlZCA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmNoYXJ0KSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3ZlcihcbiAgICAgICAgJ1NhbGVzJyxcbiAgICAgICAgJyM2NjkyRjEnLFxuICAgICAgICB0aGlzLl9pc0RhdGFzZXRIb3ZlcmVkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hhcnQhOiBDaGFydDtcbiAgcHJpdmF0ZSBjaGFydENvbnRleHQhOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgcGx1Z2lucz86IFBsdWdpbjxDaGFydFR5cGUsIEFueU9iamVjdD5bXTtcbiAgcHJpdmF0ZSBfaXNEYXRhc2V0SG92ZXJlZCE6IGJvb2xlYW47XG4gIHByaXZhdGUgb3JpZ2luYWxDaGFydERhdGFzZXQgPVxuICAgIENhQmFzZUNoYXJ0RGF0YXNldENvbmZpZy5nZXRCYXNlQ2hhcnREYXRhc2V0Q29uZmlnKCk7XG5cbiAgcHVibGljIF9jaGFydENvbmZpZyE6IElDaGFydENvbmZpZ3VyYXRpb247XG4gIHB1YmxpYyBpc0NoYXJ0RGF0YUF2YWlsYWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgJiYgIWNoYW5nZXNbJ2NoYXJ0Q29uZmlnJ10uZmlyc3RDaGFuZ2UpXG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25QbHVnaW4oKTtcbiAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk6IHZvaWQge1xuICAgIENoYXJ0LnJlZ2lzdGVyKGFubm90YXRpb25QbHVnaW4pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3ZlcihcbiAgICBkYXRhU2V0TGFiZWw6IHN0cmluZyxcbiAgICBjb2xvcjogc3RyaW5nLFxuICAgIGlzRGF0YXNldEhvdmVyZWQ6IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKGlzRGF0YXNldEhvdmVyZWQpIHtcbiAgICAgIHRoaXMub3JpZ2luYWxDaGFydERhdGFzZXQgPSBKU09OLnBhcnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMpXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjb2xvclxuICAgICAgKTtcblxuICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzID1cbiAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzLm1hcCgoZGF0YXNldCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhc2V0LmxhYmVsID09PSBkYXRhU2V0TGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgICAgIGZpbGw6IHRydWUsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZ3JhZGllbnQsXG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBjb2xvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckNvbG9yV2l0aE9wYWNpdHkgPSBDaGFydEhlbHBlci5yZ2JUb1JnYmEoXG4gICAgICAgICAgICAgIGRhdGFzZXQuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgIDAuMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cyA9IEpTT04ucGFyc2UoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMub3JpZ2luYWxDaGFydERhdGFzZXQpXG4gICAgICApO1xuXG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydENvbnRleHQgPSB0aGlzLmNoYXJ0Q2FudmFzLm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB0aGlzLnNldENoYXJ0T3B0aW9uc1Byb3BlcnRpZXMoKTtcbiAgICB0aGlzLnNldENoYXJ0RGF0YVByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnNldENoYXJ0UGx1Z2luc1Byb3BlcnRpZXMoKTtcblxuICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQodGhpcy5jaGFydENvbnRleHQsIHtcbiAgICAgIHR5cGU6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSxcbiAgICAgIGRhdGE6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucyxcbiAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucyxcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhcnQuY29uZmlnLmRhdGEuZGF0YXNldHMgPSBbXG4gICAgICAuLi50aGlzLl9jaGFydENvbmZpZz8uXG4gICAgICAgIGNoYXJ0RGF0YT8uXG4gICAgICAgIGRhdGFzZXRzPy5tYXAoKGl0ZW06IElCYXNlRGF0YXNldCwgaW5keDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtLnNoaWZ0VmFsdWUpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgJiZcbiAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yMiAmJlxuICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgIT09IGl0ZW0/LmNvbG9yMiA/XG4gICAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgLFxuICAgICAgICAgICAgICAgICAgKSA6IGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICBmaWxsOiBpdGVtPy5maWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0QW5ub3RhdGlvbnMoaXRlbSwgaW5keCk7XG5cbiAgICAgICAgICBjb25zdCB5U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWV9BWElTXzBdIGFzXG4gICAgICAgICAgICB8IENhdGVnb3J5U2NhbGVcbiAgICAgICAgICAgIHwgTGluZWFyU2NhbGU7XG5cbiAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlUHg6IG51bWJlciA9IHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGl0ZW0uc2hpZnRWYWx1ZSB8fCAwKTtcbiAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlQWRqdXN0ZWQ6IG51bWJlciA9XG4gICAgICAgICAgICBzaGlmdFZhbHVlUHggLyB5U2NhbGUubWF4SGVpZ2h0O1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB5U2NhbGUubWF4SGVpZ2h0LFxuICAgICAgICAgICAgICBpdGVtLmNvbG9yIHx8ICcnLFxuICAgICAgICAgICAgICBpdGVtLmNvbG9yMiB8fCAnJyxcbiAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6XG4gICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yIHx8ICcnLFxuICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IyIHx8ICcnLFxuICAgICAgICAgICAgICAgIHNoaWZ0VmFsdWVBZGp1c3RlZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbGw6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgXTtcbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0Py5kZXN0cm95KCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5sYWJlbHM7XG4gICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zID0ge1xuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgICAgY2xpcDogZmFsc2UsXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgcGFkZGluZzoge1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBib3R0b206IC0yNVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGx1Z2luczoge1xuICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzY2FsZXM6IHtcbiAgICAgICAgeDoge1xuICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICBjb2xvcjogQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlhfQVhJU19MQUJFTF9DT0xPUixcbiAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgc2l6ZTogMTEsXG4gICAgICAgICAgICAgIGZhbWlseTogQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0uRk9OVF9GQU1JTFlfTU9OVFNFUlJBVCxcbiAgICAgICAgICAgICAgd2VpZ2h0OiBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bS5GT05UX1dFSUdIVF9CT0xERVIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b1NraXA6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2tpcFBhZGRpbmc6IDEyLFxuICAgICAgICAgICAgbWF4Um90YXRpb246IDAsXG4gICAgICAgICAgICBtaW5Sb3RhdGlvbjogMCxcbiAgICAgICAgICAgIC8vaXNwaXMgbGFibGUgdSAyIHJlZGEgemEgZGFuZSAtIGNla2Egc2UgZGl6YWogemEgcHJpa2F6IGRhbmFcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAodmFsdWU6IHN0cmluZyB8IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICAgICAgICBjb25zdCBtdWx0aUxpbmVMYWJlbCA9IGxhYmVsID8gbGFiZWwuc3BsaXQoJyAnKSA6IFtdO1xuICAgICAgICAgICAgICByZXR1cm4gbXVsdGlMaW5lTGFiZWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheTogdGhpcy5fY2hhcnRDb25maWcuc2hvd1hBeGlzTGFiZWxzLFxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgIG9mZnNldDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgeToge1xuICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25Ib3ZlcjogKGV2ZW50OiBDaGFydEV2ZW50LCBkYXRhSXRlbTogQWN0aXZlRWxlbWVudFtdKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuaGFzVmVydGljYWxEYXNoZWRBbm5vdGF0aW9uKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5yZXNldEFubm90YXRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFkYXRhSXRlbSB8fCAhZGF0YUl0ZW0/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc2V0VmVydGljYWxEYXNoZWRBbm5vdGF0aW9uTGluZShkYXRhSXRlbVswXS5lbGVtZW50LngpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydERhdGFQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uTElORSkpIHtcbiAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KSA9PiB7XG4gICAgICAgIGRhdGFzZXQub3JkZXIgPSBkYXRhc2V0Lm9yZGVyO1xuICAgICAgICBpZiAoQ2hhcnRUeXBlR3VhcmQuaXNMaW5lRGF0YXNldChkYXRhc2V0KSkge1xuICAgICAgICAgIGRhdGFzZXQudGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbiA/PyAwLjU7XG4gICAgICAgICAgZGF0YXNldC5jdWJpY0ludGVycG9sYXRpb25Nb2RlID1cbiAgICAgICAgICAgIGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA/P1xuICAgICAgICAgICAgQ3ViaWNJbnRlcnBvbGF0aW9uU3RyaW5nRW51bS5NT05PVE9ORTtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyQ29sb3IgPVxuICAgICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID8/IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5UUkFOU1BBUkVOVDtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IgPz8gQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlRSQU5TUEFSRU5UO1xuICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA9IGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA/PyAyO1xuICAgICAgICAgIGRhdGFzZXQuc3BhbkdhcHMgPSBkYXRhc2V0LnNwYW5HYXBzID8/IGZhbHNlO1xuICAgICAgICAgIGRhdGFzZXQuc2hvd0xpbmUgPSBkYXRhc2V0LnNob3dMaW5lID8/IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRNdWx0aXBsZVlBeGlzKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydFBsdWdpbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGxldCBob3ZlcmVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgdGhpcy5wbHVnaW5zID0gW1xuICAgICAge1xuICAgICAgICBpZDogQ2hhcnRQbHVnaW5JZHNTdHJpbmdFbnVtLkhJR0hMSUdIVF9TRUdNRU5UX09OX0hPVkVSLFxuICAgICAgICBhZnRlckV2ZW50OiAoY2hhcnQsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5zaG93VG9vbHRpcEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50LmV2ZW50Lm5hdGl2ZSBhcyBNb3VzZUV2ZW50O1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQuZXZlbnQudHlwZSA9PT0gQ2hhcnRFdmVudFR5cGVzU3RyaW5nRW51bS5NT1VTRV9PVVQgJiZcbiAgICAgICAgICAgIGhvdmVyZWRJbmRleCAhPT0gbnVsbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaG92ZXJlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPSBuYXRpdmVFdmVudFtFQ2hhcnRFdmVudFByb3BlcnRpZXMuWF07XG4gICAgICAgICAgY29uc3QgeFNjYWxlID0gdGhpcy5jaGFydC5zY2FsZXNbRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLlhdIGFzXG4gICAgICAgICAgICB8IENhdGVnb3J5U2NhbGVcbiAgICAgICAgICAgIHwgTGluZWFyU2NhbGU7XG5cbiAgICAgICAgICBjb25zdCB0aWNrUG9zaXRpb25zID0gQ2hhcnRIZWxwZXIuY2FsY3VsYXRlVGlja1Bvc2l0aW9ucyh4U2NhbGUpO1xuICAgICAgICAgIGNvbnN0IG5ld0hvdmVyZWRJbmRleCA9IHRpY2tQb3NpdGlvbnMuZmluZEluZGV4KFxuICAgICAgICAgICAgKHRpY2tQb3MpID0+XG4gICAgICAgICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPlxuICAgICAgICAgICAgICB0aWNrUG9zIC0gKHRpY2tQb3NpdGlvbnNbMV0gLSB0aWNrUG9zaXRpb25zWzBdKSAvIDIgJiZcbiAgICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA8PVxuICAgICAgICAgICAgICB0aWNrUG9zICsgKHRpY2tQb3NpdGlvbnNbMV0gLSB0aWNrUG9zaXRpb25zWzBdKSAvIDJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG5ld0hvdmVyZWRJbmRleCAhPT0gaG92ZXJlZEluZGV4KSB7XG4gICAgICAgICAgICBob3ZlcmVkSW5kZXggPSBuZXdIb3ZlcmVkSW5kZXggPT09IC0xID8gbnVsbCA6IG5ld0hvdmVyZWRJbmRleDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYmVmb3JlRHJhdzogKCkgPT4ge1xuICAgICAgICAgIGlmIChob3ZlcmVkSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICBzY2FsZXM6IHsgeDogeFNjYWxlIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5jaGFydDtcbiAgICAgICAgICAgIENoYXJ0SGVscGVyLmhpZ2hsaWdodFNlZ21lbnQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB4U2NhbGUgYXMgQ2F0ZWdvcnlTY2FsZSB8IExpbmVhclNjYWxlLFxuICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmhlaWdodCxcbiAgICAgICAgICAgICAgaG92ZXJlZEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uSElHSExJR0hUX1BPSU5UX09OX0hPVkVSLFxuICAgICAgICBhZnRlckRyYXc6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaG92ZXJlZEluZGV4ICE9PSBudWxsKVxuICAgICAgICAgICAgQ2hhcnRIZWxwZXIuaGlnaGxpZ2h0UG9pbnQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0LFxuICAgICAgICAgICAgICBob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhcnRBbm5vdGF0aW9ucyhpdGVtOiBJQmFzZURhdGFzZXQsIGluZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuYW5ub3RhdGlvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY2hhcnRDb25maWcuXG4gICAgICBhbm5vdGF0aW9ucz8uXG4gICAgICBmb3JFYWNoKChhbm5vdGF0aW9uOiBJQ2hhcnRBbm5vdGF0aW9uLCBrZXk6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyA9IHtcbiAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyxcbiAgICAgICAgICBhbm5vdGF0aW9uOiB7XG4gICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnM/LnBsdWdpbnM/LmFubm90YXRpb24sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5cbiAgICAgICAgICAgICAgICBjaGFydE9wdGlvbnM/LlxuICAgICAgICAgICAgICAgIHBsdWdpbnM/LlxuICAgICAgICAgICAgICAgIGFubm90YXRpb24/LlxuICAgICAgICAgICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICAgICAgICBbYCR7aXRlbS5sYWJlbH0tJHtpbmR4fS0ke2tleX1gXToge1xuICAgICAgICAgICAgICAgIGlkOiBhbm5vdGF0aW9uLmlkIHx8IGBhbm5vdGF0aW9uLSR7aW5keH0tJHtrZXl9YCxcbiAgICAgICAgICAgICAgICB0eXBlOiBhbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgc2NhbGVJRDogYW5ub3RhdGlvbi5heGlzIHx8IGl0ZW0ueUF4aXNJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYW5ub3RhdGlvbi52YWx1ZSB8fCBpdGVtLnNoaWZ0VmFsdWUsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGFubm90YXRpb24uY29sb3IgfHwgJyNEQURBREEnLFxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiBhbm5vdGF0aW9uLmJvcmRlcldpZHRoIHx8IDIsXG4gICAgICAgICAgICAgICAgYm9yZGVyRGFzaDogYW5ub3RhdGlvbi5ib3JkZXJEYXNoIHx8IFswLCAwXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNdWx0aXBsZVlBeGlzKGNoYXJ0RGF0YTogSUNoYXJ0RGF0YTxJTGluZURhdGFzZXQ+KTogdm9pZCB7XG4gICAgbGV0IGFic29sdXRlTWF4OiBudW1iZXI7XG4gICAgY2hhcnREYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGFzZXQudHlwZSA9PSBDaGFydFR5cGVzU3RyaW5nRW51bS5MSU5FIHx8XG4gICAgICAgIGRhdGFzZXQudHlwZSA9PSBDaGFydFR5cGVzU3RyaW5nRW51bS5CQVJcbiAgICAgICkge1xuICAgICAgICBjb25zdCB5QXhpc0lEID0gdGhpcy5fY2hhcnRDb25maWcuaXNNdWx0aVlBeGlzXG4gICAgICAgICAgPyBgeS1heGlzLSR7aW5kZXh9YFxuICAgICAgICAgIDogZGF0YXNldC55QXhpc0lkIHx8ICd5LWF4aXMtMCc7XG5cbiAgICAgICAgY2hhcnREYXRhLmRhdGFzZXRzW2luZGV4XSA9IHtcbiAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgIHlBeGlzSUQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gQ2hhcnRIZWxwZXIuY2FsY3VsYXRlTWluVmFsdWUoXG4gICAgICAgICAgZGF0YXNldC5kYXRhIGFzIG51bWJlcltdXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gQ2hhcnRIZWxwZXIuY2FsY3VsYXRlTWF4VmFsdWUoXG4gICAgICAgICAgZGF0YXNldC5kYXRhIGFzIG51bWJlcltdXG4gICAgICAgICk7XG4gICAgICAgIGlmICghYWJzb2x1dGVNYXggfHwgbWF4VmFsdWUgPiBhYnNvbHV0ZU1heCkgYWJzb2x1dGVNYXggPSBtYXhWYWx1ZTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heFZhbHVlICogMC4wMztcbiAgICAgICAgY29uc3QgbWluVmFsdWVBZGp1c3RlZCA9IHBhZGRpbmcgPT0gMCA/IG1pblZhbHVlIDogMDtcbiAgICAgICAgY29uc3QgbWF4VmFsdWVBZGp1c3RlZCA9IGFic29sdXRlTWF4ICsgcGFkZGluZztcblxuICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMuc2NhbGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5zY2FsZXMsXG4gICAgICAgICAgW3lBeGlzSURdOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgICAgbWluOiBtaW5WYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgbWF4OiBtYXhWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgLy8gT3ZvIGplIGpha28gYml0bm8sIG1vcmFtbyBvdnUgb3N1IHNhIHN0YWNrZWQgcGFyYW1ldHJvbSBuYW1qZXN0aXRpXG4gICAgICAgICAgICBzdGFja2VkOiB0aGlzLl9jaGFydENvbmZpZy5pc1N0YWNrZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBbm5vdGF0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyA9XG4gICAge1xuICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMsXG4gICAgICBhbm5vdGF0aW9uOiB7fVxuICAgIH1cbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWZXJ0aWNhbERhc2hlZEFubm90YXRpb25MaW5lKHhDb3JkOiBudW1iZXIsIGNvbG9yPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgeFNjYWxlID0gdGhpcy5jaGFydC5zY2FsZXNbRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLlhdIGFzXG4gICAgICB8IENhdGVnb3J5U2NhbGVcbiAgICAgIHwgTGluZWFyU2NhbGU7XG5cbiAgICBjb25zdCB2YWx1ZUZyb21QaXhlbDogbnVtYmVyIHwgdW5kZWZpbmVkID0geFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeENvcmQpO1xuXG4gICAgaWYgKHZhbHVlRnJvbVBpeGVsID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zID0ge1xuICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMsXG4gICAgICBhbm5vdGF0aW9uOiB7XG4gICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucz8ucGx1Z2lucz8uYW5ub3RhdGlvbixcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5cbiAgICAgICAgICAgIGNoYXJ0T3B0aW9ucz8uXG4gICAgICAgICAgICBwbHVnaW5zPy5cbiAgICAgICAgICAgIGFubm90YXRpb24/LlxuICAgICAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgICAgW2B4LWRhc2hlZGBdOiB7XG4gICAgICAgICAgICBpZDogYHgtZGFzaGVkYCxcbiAgICAgICAgICAgIHR5cGU6IEVDaGFydEFubm90YXRpb25UeXBlLkxJTkUsXG4gICAgICAgICAgICBzY2FsZUlEOiBFQ2hhcnRFdmVudFByb3BlcnRpZXMuWCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUZyb21QaXhlbCxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBjb2xvciB8fCAnI0RBREFEQScsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgICAgIGJvcmRlckRhc2g6IFs1LCA1XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NoYXJ0RGF0YUF2YWlsYWJsZTsgZWxzZSBub0RhdGFUZW1wbGF0ZVwiPlxuICA8ZGl2XG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgaGVpZ2h0OiBfY2hhcnRDb25maWcuaGVpZ2h0ICsgJ3B4JyxcbiAgICAgIHdpZHRoOiBfY2hhcnRDb25maWcud2lkdGggKyAnJScsXG4gICAgfVwiXG4gID5cbiAgICA8Y2FudmFzICNjaGFydENhbnZhcz4gPC9jYW52YXM+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI25vRGF0YVRlbXBsYXRlPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgIH1cIlxuICA+XG4gICAgPHN2Zy1pY29uXG4gICAgICBbc3JjXT1cIl9jaGFydENvbmZpZy5ub0RhdGFJbWFnZVwiXG4gICAgICBhbHQ9XCJObyBkYXRhIGF2YWlsYWJsZVwiXG4gICAgICBjbGFzcz1cIm5vLWRhdGEtc3ZnXCJcbiAgICA+PC9zdmctaWNvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
585
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd4RCxTQUFTO0FBQ1QsT0FBTyxFQUVMLEtBQUssR0FJTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBR3pELFFBQVE7QUFDUixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QixvQkFBb0IsR0FDckIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBaUJoRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7OztBQVNuRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCLElBQ0ksaUJBQWlCLENBQUMsS0FBZ0M7UUFDcEQsSUFBSSxLQUFLO1lB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RjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzsrR0F2dEJVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLG1VQ3RFN0IsK25CQXlCQSw4R0QyQ1ksWUFBWSx1TkFBRSxvQkFBb0I7OzRGQUVqQyxnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0UsY0FBYyxjQUdaLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzs7MEJBMEQxQyxRQUFRO3lDQXZEa0MsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVsQyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBa0NJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFueU9iamVjdCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvdHlwZXMvYmFzaWMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vLyBDaGFydHNcbmltcG9ydCB7XG4gIENhdGVnb3J5U2NhbGUsXG4gIENoYXJ0LFxuICBDaGFydEV2ZW50LFxuICBMaW5lYXJTY2FsZSxcbiAgUGx1Z2luLFxufSBmcm9tICdjaGFydC5qcy9hdXRvJztcbmltcG9ydCBhbm5vdGF0aW9uUGx1Z2luIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWFubm90YXRpb24nO1xuaW1wb3J0IHsgQ2hhcnRUeXBlIH0gZnJvbSAnY2hhcnQuanMnO1xuXG4vLyBFbnVtc1xuaW1wb3J0IHtcbiAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLFxuICBFQ2hhcnRFdmVudFByb3BlcnRpZXMsXG4gIENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bSxcbiAgQ2hhcnRUeXBlc1N0cmluZ0VudW0sXG4gIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0sXG4gIENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0sXG4gIENoYXJ0Rm9udFByb3BlcnRpZXNTdHJpbmdFbnVtLFxuICBFQ2hhcnRBbm5vdGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9lbnVtcyc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IENoYXJ0SGVscGVyIH0gZnJvbSAnLi91dGlscy9oZWxwZXJzJztcblxuLy8gR3VhcmRzXG5pbXBvcnQgeyBDaGFydFR5cGVHdWFyZCB9IGZyb20gJy4vdXRpbHMvZ3VhcmRzJztcblxuLy9Nb2RlbHNcbmltcG9ydCB7XG4gIElDaGFydERhdGEsXG4gIElMaW5lRGF0YXNldCxcbiAgSUNoYXJ0Q29uZmlndXJhdGlvbixcbiAgSUJhc2VEYXRhc2V0LFxuICBJQ2hhcnRBbm5vdGF0aW9uLFxuICBJQ2hhcnREYXRhc2V0SG92ZXIsXG4gIElDaGFydENlbnRlckxhYmVsXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnQgfSBmcm9tICdjaGFydC5qcy9kaXN0L3BsdWdpbnMvcGx1Z2luLnRvb2x0aXAnO1xuXG4vL1NlcnZpY2VzXG5pbXBvcnQgeyBDaGFydE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY2EtY2hhcnQtbWFuYWdlci9zZXJ2aWNlcyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHsgQ2hhcnRDb25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jYS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEFuZ3VsYXJTdmdJY29uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycsIHsgc3RhdGljOiBmYWxzZSB9KSBjaGFydENhbnZhcyE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgY2hhcnRJZCE6IHN0cmluZztcbiAgQElucHV0KClcbiAgc2V0IGNoYXJ0RGF0YXNldEhvdmVyKHZhbHVlOiBJQ2hhcnREYXRhc2V0SG92ZXIgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlKSB0aGlzLnVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3Zlcih2YWx1ZSk7XG4gIH1cbiAgQElucHV0KCkgc2V0IGNoYXJ0Q29uZmlnKHZhbHVlOiBJQ2hhcnRDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY2hhcnRDb25maWcgPSB2YWx1ZTtcbiAgICB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5fY2hhcnRDb25maWc/LlxuICAgICAgY2hhcnREYXRhPy5cbiAgICAgIGRhdGFzZXRzPy5cbiAgICAgIGZvckVhY2goKGl0ZW06IElCYXNlRGF0YXNldCkgPT4ge1xuICAgICAgICBpdGVtLmRhdGEuZm9yRWFjaCgodmFsdWU6IG51bWJlciB8IG51bWJlcltdKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0gIT09IDAgfHwgdmFsdWVbMV0gIT09IDApXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IDApXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUpXG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG5cblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cy5mb3JFYWNoKChpdGVtOiBJQmFzZURhdGFzZXQpID0+IHtcbiAgICAgIGl0ZW0uZGF0YS5mb3JFYWNoKCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlWzBdICE9PSAwIHx8IHZhbHVlWzFdICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSAwKSB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBAT3V0cHV0KCkgaG92ZXJlZEluZGV4OiBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBjaGFydCE6IENoYXJ0O1xuICBwcml2YXRlIGNoYXJ0Q29udGV4dCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcGx1Z2lucz86IFBsdWdpbjxDaGFydFR5cGUsIEFueU9iamVjdD5bXTtcbiAgcHJpdmF0ZSBhcmVBbmltYXRpb25zQ29tcGxlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9ob3ZlcmVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBfY2hhcnRDb25maWchOiBJQ2hhcnRDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgaXNDaGFydERhdGFBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNoYXJ0TWFuYWdlclNlcnZpY2U/OiBDaGFydE1hbmFnZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2UuaG92ZXJTdGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgKHsgaW5kZXgsIGNoYXJ0SWQgfSkgPT4ge1xuICAgICAgICBpZiAoY2hhcnRJZCAhPT0gdGhpcy5jaGFydElkKSB7XG4gICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgaWYgKHRoaXMuY2hhcnQpIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQW5ub3RhdGlvblBsdWdpbigpOiB2b2lkIHtcbiAgICBDaGFydC5yZWdpc3Rlcihhbm5vdGF0aW9uUGx1Z2luKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVEYXRhc2V0QmFja2dyb3VuZE9uSG92ZXIoXG4gICAgY2hhcnREYXRhc2V0SG92ZXI6IElDaGFydERhdGFzZXRIb3ZlclxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnQgfHwgIXRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cykgcmV0dXJuO1xuXG4gICAgaWYgKGNoYXJ0RGF0YXNldEhvdmVyLmlzSG92ZXJkKSB7XG4gICAgICBjb25zdCBncmFkaWVudCA9IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgdGhpcy5jaGFydENhbnZhcyxcbiAgICAgICAgY2hhcnREYXRhc2V0SG92ZXIuY29sb3IsXG4gICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAwLjYsXG4gICAgICAgIDAuMSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5tYXAoKGRhdGFzZXQpID0+IHtcbiAgICAgICAgaWYgKGRhdGFzZXQuaGlkZGVuKSByZXR1cm4gZGF0YXNldDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YXNldC5sYWJlbD8udG9VcHBlckNhc2UoKSA9PT0gY2hhcnREYXRhc2V0SG92ZXIubGFiZWwudG9VcHBlckNhc2UoKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob3ZlcmREYXRhU2V0ID0ge1xuICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgIGZpbGw6IHRydWUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGdyYWRpZW50LFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaG92ZXJkRGF0YVNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcldpdGhPcGFjaXR5ID0gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgZGF0YXNldC5ib3JkZXJDb2xvciBhcyBzdHJpbmcsXG4gICAgICAgICAgICAwLjJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLm1hcCgoZGF0YXNldCkgPT4ge1xuICAgICAgICBpZiAoIWRhdGFzZXQuaGlkZGVuKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2xvciA9IGRhdGFzZXQuYm9yZGVyQ29sb3JcbiAgICAgICAgICAgID8gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgICBkYXRhc2V0LmJvcmRlckNvbG9yIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9yaWdpbmFsQ29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgcmV0dXJuIGRhdGFzZXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0Q29udGV4dCA9IHRoaXMuY2hhcnRDYW52YXM/LlxuICAgICAgbmF0aXZlRWxlbWVudD8uXG4gICAgICBnZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgdGhpcy5zZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5zZXRDaGFydERhdGFQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5zZXRDaGFydFBsdWdpbnNQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5jaGFydCkgdGhpcy5jaGFydC5kZXN0cm95KCk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpXG4gICAgICBDaGFydC5vdmVycmlkZXMuZG91Z2hudXQuY3V0b3V0ID0gJzgwJSc7XG4gICAgdGhpcy5jaGFydCA9IG5ldyBDaGFydCh0aGlzLmNoYXJ0Q29udGV4dCwge1xuICAgICAgdHlwZTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlLFxuICAgICAgZGF0YTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLFxuICAgICAgb3B0aW9uczogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLFxuICAgICAgcGx1Z2luczogdGhpcy5wbHVnaW5zLFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5pc0Rhc2hib2FyZENoYXJ0KSB7XG4gICAgICB0aGlzLmNoYXJ0LmNvbmZpZy5kYXRhLmRhdGFzZXRzID0gW1xuICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZz8uXG4gICAgICAgICAgY2hhcnREYXRhPy5cbiAgICAgICAgICBkYXRhc2V0cz8uXG4gICAgICAgICAgbWFwKChpdGVtOiBJQmFzZURhdGFzZXQsIGluZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgIHBvaW50QmFja2dyb3VuZENvbG9yOiBDaGFydENvbG9yc1N0cmluZ0VudW0uV0hJVEUsXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgICAgIHBvaW50UmFkaXVzOiAzLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGFydEFubm90YXRpb25zKGl0ZW0sIGluZHgpO1xuXG4gICAgICAgICAgICBjb25zdCB5U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWV9BWElTXzBdIGFzXG4gICAgICAgICAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgICAgICAgICB8IExpbmVhclNjYWxlO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgICAgICAuLi5wb2ludENvbmZpZyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yICYmXG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgJiZcbiAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yICE9PSBpdGVtPy5jb2xvcjIgP1xuICAgICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuY3JlYXRlR3JhZGllbnQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICxcbiAgICAgICAgICAgICAgICAgICkgOiBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgZmlsbDogaXRlbT8uZmlsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXRDb25maWcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtLmJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXRlbS5zaGlmdFZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YXNldENvbmZpZyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvciAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgIT09IGl0ZW0/LmNvbG9yMiA/XG4gICAgICAgICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICxcbiAgICAgICAgICAgICAgICAgICAgKSA6IGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0VmFsdWVQeDogbnVtYmVyID0geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoaXRlbS5zaGlmdFZhbHVlIHx8IDApO1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRWYWx1ZUFkanVzdGVkOiBudW1iZXIgPVxuICAgICAgICAgICAgICBzaGlmdFZhbHVlUHggLyB5U2NhbGUubWF4SGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcjogQ2FudmFzR3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudFdpdGhTaGlmdFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgaXRlbS5jb2xvciB8fCBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFksXG4gICAgICAgICAgICAgIGl0ZW0uY29sb3IyIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgLi4ucG9pbnRDb25maWcsXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yMiB8fCBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFksXG4gICAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgIGZpbGw6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgXTtcbiAgICB9XG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnQpXG4gICAgICB0aGlzLmNoYXJ0Py5kZXN0cm95KCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5sYWJlbHM7XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMgPSB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBjbGlwOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUHJvZ3Jlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgIGxlZnQ6XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUiAmJlxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy52ZXJ0aWNhbHlBbGlnbkJhckNoYXJ0V2l0aExpbmVDYXJ0XG4gICAgICAgICAgICAgID8gNlxuICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgcmlnaHQ6XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUiAmJlxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy52ZXJ0aWNhbHlBbGlnbkJhckNoYXJ0V2l0aExpbmVDYXJ0XG4gICAgICAgICAgICAgID8gNlxuICAgICAgICAgICAgICA6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGx1Z2luczoge1xuICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjYWxlczoge1xuICAgICAgICB4OiB7XG4gICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICBjb2xvcjogQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlhfQVhJU19MQUJFTF9DT0xPUixcbiAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgc2l6ZTogMTEsXG4gICAgICAgICAgICAgIGZhbWlseTogQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0uRk9OVF9GQU1JTFlfTU9OVFNFUlJBVCxcbiAgICAgICAgICAgICAgd2VpZ2h0OiBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bS5GT05UX1dFSUdIVF9CT0xERVIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b1NraXA6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2tpcFBhZGRpbmc6IDEyLFxuICAgICAgICAgICAgbWF4Um90YXRpb246IDAsXG4gICAgICAgICAgICBtaW5Sb3RhdGlvbjogMCxcbiAgICAgICAgICAgIC8vTGFiZWwgd3JpdHRlbiBpbiAyIGxpbmVzLCB3aWxsIGJlIHVqdXN0ZWQgd2l0aCBuZXcgZGVzaWduXG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKFxuICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgICAgICBpbmRleDogbnVtYmVyXG4gICAgICAgICAgICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2luZGV4XTtcbiAgICAgICAgICAgICAgY29uc3QgbXVsdGlMaW5lTGFiZWwgPSBsYWJlbCA/IGxhYmVsLnNwbGl0KCcgJykgOiBbXTtcbiAgICAgICAgICAgICAgcmV0dXJuIG11bHRpTGluZUxhYmVsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3BsYXk6IHRoaXMuX2NoYXJ0Q29uZmlnLnNob3dYQXhpc0xhYmVscyxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25Ib3ZlcjogKGV2ZW50OiBDaGFydEV2ZW50LCBpdGVtOiBBY3RpdmVFbGVtZW50W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmhhc1ZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbilcbiAgICAgICAgICB0aGlzLnJlc2V0QW5ub3RhdGlvbnMoKTtcblxuICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yczogc3RyaW5nW10gPVxuICAgICAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgY29sb3JzLm1hcCgoY29sb3I6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gQ2hhcnRIZWxwZXIuY29udmVydFJnYlRvUmdiYShjb2xvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFpdGVtIHx8XG4gICAgICAgICAgIWl0ZW0/Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhvdmVyZWRJbmRleC5lbWl0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQoaXRlbVswXS5pbmRleCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciBhcyBzdHJpbmdbXTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkQ29sb3JzOiBzdHJpbmdbXSA9IGNvbG9ycy5tYXAoKGNvbG9yOiBzdHJpbmcsIGluZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGluZHggPT09IGl0ZW1bMF0uaW5kZXgpIHJldHVybiBjb2xvcjtcblxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBDaGFydEhlbHBlci5jb252ZXJ0UmdiVG9SZ2JhKGNvbG9yLCAwLjIpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7XG5cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgPSB1cGRhdGVkQ29sb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmhhc1ZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbilcbiAgICAgICAgICB0aGlzLnNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoaXRlbVswXS5lbGVtZW50LngpO1xuXG4gICAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldENoYXJ0RGF0YVByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkxJTkUpKSB7XG4gICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCkgPT4ge1xuICAgICAgICBkYXRhc2V0Lm9yZGVyID0gZGF0YXNldC5vcmRlcjtcbiAgICAgICAgaWYgKENoYXJ0VHlwZUd1YXJkLmlzTGluZURhdGFzZXQoZGF0YXNldCkpIHtcbiAgICAgICAgICBkYXRhc2V0LnRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb24gPz8gMC41O1xuICAgICAgICAgIGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9XG4gICAgICAgICAgICBkYXRhc2V0LmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPz9cbiAgICAgICAgICAgIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0uTU9OT1RPTkU7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID1cbiAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvciA/PyBDaGFydENvbG9yc1N0cmluZ0VudW0uVFJBTlNQQVJFTlQ7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICBkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yID8/IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5UUkFOU1BBUkVOVDtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPSBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPz8gMjtcbiAgICAgICAgICBkYXRhc2V0LnNwYW5HYXBzID0gZGF0YXNldC5zcGFuR2FwcyA/PyBmYWxzZTtcbiAgICAgICAgICBkYXRhc2V0LnNob3dMaW5lID0gZGF0YXNldC5zaG93TGluZSA/PyB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0TXVsdGlwbGVZQXhpcyh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhcnRQbHVnaW5zUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICBsZXQgaG92ZXJlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHRoaXMucGx1Z2lucyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfU0VHTUVOVF9PTl9IT1ZFUixcbiAgICAgICAgYWZ0ZXJFdmVudDogKGNoYXJ0LCBldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuc2hvd1Rvb2x0aXBCYWNrZ3JvdW5kKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50LmV2ZW50Lm5hdGl2ZSBhcyBNb3VzZUV2ZW50O1xuXG4gICAgICAgICAgaWYgKGV2ZW50LmV2ZW50LnR5cGUgPT09IENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0uTU9VU0VfT1VUKSB7XG4gICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLmNoYXJ0LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTW91c2VPdXRzaWRlQ2hhcnQgPVxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRYIDwgYm91bmRpbmdSZWN0LmxlZnQgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCA+IGJvdW5kaW5nUmVjdC5yaWdodCB8fFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRZIDwgYm91bmRpbmdSZWN0LnRvcCB8fFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRZID4gYm91bmRpbmdSZWN0LmJvdHRvbTtcblxuICAgICAgICAgICAgaWYgKGlzTW91c2VPdXRzaWRlQ2hhcnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKG51bGwsIHRoaXMuY2hhcnRJZCk7XG4gICAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IHRoaXMuY2hhcnQuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIGNvbnN0IG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPVxuICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCAtIGJvdW5kaW5nUmVjdC5sZWZ0O1xuXG4gICAgICAgICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5jaGFydC5jaGFydEFyZWE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgbGVmdCB8fFxuICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA+IHJpZ2h0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKG51bGwsIHRoaXMuY2hhcnRJZCk7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB4U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWF0gYXNcbiAgICAgICAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgICAgICAgfCBMaW5lYXJTY2FsZTtcblxuICAgICAgICAgIGNvbnN0IHRpY2tQb3NpdGlvbnMgPSB4U2NhbGUudGlja3MubWFwKCh0aWNrKSA9PlxuICAgICAgICAgICAgeFNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGljay52YWx1ZSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgc2VnbWVudEJvdW5kYXJpZXMgPSB0aWNrUG9zaXRpb25zLm1hcCgodGlja1BvcywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRCb3VuZGFyeSA9XG4gICAgICAgICAgICAgIGluZGV4ID09PSAwID8gbGVmdCA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCAtIDFdKSAvIDI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvdW5kYXJ5ID1cbiAgICAgICAgICAgICAgaW5kZXggPT09IHRpY2tQb3NpdGlvbnMubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgID8gcmlnaHRcbiAgICAgICAgICAgICAgICA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCArIDFdKSAvIDI7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGxlZnRCb3VuZGFyeSwgcmlnaHRCb3VuZGFyeSB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbmV3SG92ZXJlZEluZGV4ID0gc2VnbWVudEJvdW5kYXJpZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKGJvdW5kYXJ5KSA9PlxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID49IGJvdW5kYXJ5LmxlZnRCb3VuZGFyeSAmJlxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgYm91bmRhcnkucmlnaHRCb3VuZGFyeVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobmV3SG92ZXJlZEluZGV4ICE9PSB0aGlzLl9ob3ZlcmVkSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IG5ld0hvdmVyZWRJbmRleCA9PT0gLTEgPyBudWxsIDogbmV3SG92ZXJlZEluZGV4O1xuICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBiZWZvcmVEcmF3OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2hvdmVyZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgIHNjYWxlczogeyB4OiB4U2NhbGUgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmNoYXJ0O1xuXG4gICAgICAgICAgICBDaGFydEhlbHBlci5oaWdobGlnaHRTZWdtZW50KFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgeFNjYWxlIGFzIENhdGVnb3J5U2NhbGUgfCBMaW5lYXJTY2FsZSxcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5oZWlnaHQsXG4gICAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogQ2hhcnRQbHVnaW5JZHNTdHJpbmdFbnVtLkhJR0hMSUdIVF9QT0lOVF9PTl9IT1ZFUixcbiAgICAgICAgYWZ0ZXJEcmF3OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ICE9PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5zaG93SGlnaGxpZ2h0UG9pbnRPbkhvdmVyICYmXG4gICAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlRGF0YXNldHMgPSB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZGF0YXNldCkgPT4gIWRhdGFzZXQuaGlkZGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ2hhcnRIZWxwZXIuaGlnaGxpZ2h0UG9pbnQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0LFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHsgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLCBkYXRhc2V0czogdmlzaWJsZURhdGFzZXRzIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5CT1JERVJfQk9UVE9NX0xJTkVfQ0hBUlQsXG4gICAgICAgIGJlZm9yZURyYXc6ICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWc/LnNob3dCb3R0b21MaW5lT25MaW5lQ2hhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgIHNjYWxlczogeyB4OiB4U2NhbGUgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmNoYXJ0O1xuICAgICAgICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGEuZGF0YXNldHNbMF07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSAwO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gZGF0YXNldC5kYXRhLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBkYXRhc2V0LmRhdGFbZmlyc3RJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsdWUgPSBkYXRhc2V0LmRhdGFbbGFzdEluZGV4XTtcblxuICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBsYXN0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCB4U3RhcnQgPSB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShmaXJzdEluZGV4KTtcblxuICAgICAgICAgICAgICBjb25zdCB4RW5kID0geFNjYWxlLmdldFBpeGVsRm9yVmFsdWUobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgY29uc3QgeUJvdHRvbSA9IGNoYXJ0QXJlYS5ib3R0b207XG5cbiAgICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID1cbiAgICAgICAgICAgICAgICBDaGFydENvbG9yc1N0cmluZ0VudW0uQk9SREVSX0JPVFRPTV9MSU5FX0NIQVJUX0NPTE9SO1xuICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTtcbiAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICBjdHgubW92ZVRvKHhTdGFydCwgeUJvdHRvbSk7XG4gICAgICAgICAgICAgIGN0eC5saW5lVG8oeEVuZCwgeUJvdHRvbSk7XG4gICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVClcbiAgICAgIHRoaXMucGx1Z2lucyA9IFtcbiAgICAgICAgLi4udGhpcy5wbHVnaW5zLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdkb3VnaG51dC1sYWJlbCcsXG4gICAgICAgICAgYmVmb3JlRGF0YXNldERyYXc6IChjaGFydDogQ2hhcnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNlbnRlckxhYmVscz8ubWFwKFxuICAgICAgICAgICAgICAobGFiZWw6IElDaGFydENlbnRlckxhYmVsLCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5kcmF3RG91Z2hudXRMZWdlbmQoXG4gICAgICAgICAgICAgICAgICBjaGFydCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaW5keCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VG9wOiBsYWJlbC5wb3NpdGlvbj8udG9wIHx8IDBcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBsYWJlbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLmZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgbGFiZWwuY29sb3IpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIF07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNoYXJ0QW5ub3RhdGlvbnMoaXRlbTogSUJhc2VEYXRhc2V0LCBpbmR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NoYXJ0Q29uZmlnLmFubm90YXRpb25zPy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLlxuICAgICAgYW5ub3RhdGlvbnM/LlxuICAgICAgZm9yRWFjaCgoYW5ub3RhdGlvbjogSUNoYXJ0QW5ub3RhdGlvbiwga2V5OiBudW1iZXIpID0+IHtcbiAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMgPSB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMsXG4gICAgICAgICAgYW5ub3RhdGlvbjoge1xuICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuXG4gICAgICAgICAgICAgICAgY2hhcnRPcHRpb25zPy5cbiAgICAgICAgICAgICAgICBwbHVnaW5zPy5cbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uPy5cbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgICAgICAgW2Ake2l0ZW0ubGFiZWx9LSR7aW5keH0tJHtrZXl9YF06IHtcbiAgICAgICAgICAgICAgICBpZDogYW5ub3RhdGlvbi5pZCB8fCBgYW5ub3RhdGlvbi0ke2luZHh9LSR7a2V5fWAsXG4gICAgICAgICAgICAgICAgdHlwZTogYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgIHNjYWxlSUQ6IGFubm90YXRpb24uYXhpcyB8fCBpdGVtLnlBeGlzSUQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFubm90YXRpb24udmFsdWUgfHwgaXRlbS5zaGlmdFZhbHVlLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBhbm5vdGF0aW9uLmNvbG9yIHx8ICcjREFEQURBJyxcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogYW5ub3RhdGlvbi5ib3JkZXJXaWR0aCB8fCAyLFxuICAgICAgICAgICAgICAgIGJvcmRlckRhc2g6IGFubm90YXRpb24uYm9yZGVyRGFzaCB8fCBbMCwgMF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuXG4gIH1cblxuICBwcml2YXRlIHNldE11bHRpcGxlWUF4aXMoY2hhcnREYXRhOiBJQ2hhcnREYXRhPElMaW5lRGF0YXNldD4pOiB2b2lkIHtcbiAgICBsZXQgYWJzb2x1dGVNYXg6IG51bWJlcjtcbiAgICBjaGFydERhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YXNldC50eXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5MSU5FIHx8XG4gICAgICAgIGRhdGFzZXQudHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uQkFSXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeUF4aXNJRCA9IHRoaXMuX2NoYXJ0Q29uZmlnLmlzTXVsdGlZQXhpc1xuICAgICAgICAgID8gYHktYXhpcy0ke2luZGV4fWBcbiAgICAgICAgICA6IGRhdGFzZXQueUF4aXNJRCB8fCAneS1heGlzLTAnO1xuXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGUgZGF0YXNldCBpcyBhbGwgMFxuICAgICAgICBjb25zdCBpc0FsbFplcm9EYXRhc2V0ID0gKGRhdGFzZXQuZGF0YSBhcyBudW1iZXJbXSkuZXZlcnkoXG4gICAgICAgICAgKHZhbDogbnVtYmVyKSA9PiB2YWwgPT09IDBcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbWluVmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNaW5WYWx1ZShkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pO1xuICAgICAgICBsZXQgbWF4VmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNYXhWYWx1ZShkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4VmFsdWUgKiAwLjAzO1xuXG4gICAgICAgIC8vIEFkanVzdCBzY2FsaW5nIGZvciBhbGwgMCBkYXRhc2V0c1xuICAgICAgICBpZiAoaXNBbGxaZXJvRGF0YXNldCkge1xuICAgICAgICAgIG1pblZhbHVlID0gMDtcbiAgICAgICAgICBtYXhWYWx1ZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWluVmFsdWUgPSBtYXhWYWx1ZSA9PT0gbWluVmFsdWUgPyBtaW5WYWx1ZSAtIDAuMSA6IG1pblZhbHVlO1xuICAgICAgICAgIG1heFZhbHVlID1cbiAgICAgICAgICAgIG1heFZhbHVlID09PSBtaW5WYWx1ZSA/IG1heFZhbHVlICsgMC4xIDogbWF4VmFsdWUgKyBwYWRkaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnNjYWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMuc2NhbGVzLFxuICAgICAgICAgIFt5QXhpc0lEXToge1xuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICAgIG1pbjogbWluVmFsdWUsXG4gICAgICAgICAgICBtYXg6IG1heFZhbHVlLFxuICAgICAgICAgICAgc3RhY2tlZDogdGhpcy5fY2hhcnRDb25maWcuaXNTdGFja2VkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnREYXRhLmRhdGFzZXRzW2luZGV4XSA9IHtcbiAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgIHlBeGlzSUQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QW5ub3RhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMgPVxuICAgIHtcbiAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgYW5ub3RhdGlvbjoge31cbiAgICB9XG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmVydGljYWxEYXNoZWRBbm5vdGF0aW9uTGluZSh4Q29yZDogbnVtYmVyLCBjb2xvcj86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHhTY2FsZSA9IHRoaXMuY2hhcnQuc2NhbGVzW0VDaGFydEV2ZW50UHJvcGVydGllcy5YXSBhc1xuICAgICAgfCBDYXRlZ29yeVNjYWxlXG4gICAgICB8IExpbmVhclNjYWxlO1xuXG4gICAgY29uc3QgdmFsdWVGcm9tUGl4ZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHhTY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHhDb3JkKTtcblxuICAgIGlmICh2YWx1ZUZyb21QaXhlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyA9IHtcbiAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgYW5ub3RhdGlvbjoge1xuICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnM/LnBsdWdpbnM/LmFubm90YXRpb24sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuXG4gICAgICAgICAgICBjaGFydE9wdGlvbnM/LlxuICAgICAgICAgICAgcGx1Z2lucz8uXG4gICAgICAgICAgICBhbm5vdGF0aW9uPy5cbiAgICAgICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICAgIFtgeC1kYXNoZWRgXToge1xuICAgICAgICAgICAgaWQ6IGB4LWRhc2hlZGAsXG4gICAgICAgICAgICB0eXBlOiBFQ2hhcnRBbm5vdGF0aW9uVHlwZS5MSU5FLFxuICAgICAgICAgICAgc2NhbGVJRDogRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLlgsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVGcm9tUGl4ZWwsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogY29sb3IgfHwgJyNEQURBREEnLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgICBib3JkZXJEYXNoOiBbNSwgNV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFydERhdGFBdmFpbGFibGU7IGVsc2Ugbm9EYXRhVGVtcGxhdGVcIj5cbiAgPGRpdlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgIH1cIlxuICA+XG4gICAgPGNhbnZhcyAjY2hhcnRDYW52YXM+PC9jYW52YXM+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI25vRGF0YVRlbXBsYXRlPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgIH1cIlxuICA+XG4gICAgPHN2Zy1pY29uXG4gICAgICBbc3JjXT1cIl9jaGFydENvbmZpZy5ub0RhdGFJbWFnZVwiXG4gICAgICBhbHQ9XCJObyBkYXRhIGF2YWlsYWJsZVwiXG4gICAgICBjbGFzcz1cIm5vLWRhdGEtc3ZnXCJcbiAgICA+PC9zdmctaWNvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19