@rivet-health/design-system 2.19.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,4 +33,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
33
33
  }], itemClick: [{
34
34
  type: Output
35
35
  }] } });
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9sZWdlbmQtaXRlbS9sZWdlbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2QixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBUUUsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUduQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBR3hCLFVBQUssR0FBd0IsT0FBTyxDQUFDO1FBR3JDLGVBQVUsR0FBb0MsU0FBUyxDQUFDO1FBVXhELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBQ2hDO0lBTkMsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUM7SUFDbkMsQ0FBQzs7Z0hBbEJVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdOQ2RoQyxzaEJBZ0JBOzJGREZhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTs4QkFJL0MsS0FBSztzQkFESixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFRTixTQUFTO3NCQURSLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtbGVnZW5kLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vbGVnZW5kLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sZWdlbmQtaXRlbS5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBMZWdlbmRJdGVtQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yVG9rZW46IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIHN0eWxlOiAnc29saWQnIHwgJ3N0cmlwZWQnID0gJ3NvbGlkJztcblxuICBASW5wdXQoKVxuICB2aXNpYmlsaXR5OiAndmlzaWJsZScgfCAnaGlkZGVuJyB8ICdsb2NrZWQnID0gJ3Zpc2libGUnO1xuXG4gIEBJbnB1dCgpXG4gIGljb25Ub29sdGlwPzogc3RyaW5nO1xuXG4gIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHZhcigke3RoaXMuY29sb3JUb2tlbn0pYDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG59XG4iLCI8YnV0dG9uIChjbGljayk9XCJpdGVtQ2xpY2suZW1pdCgpXCIgW3JpdlRvb2x0aXBdPVwiaWNvblRvb2x0aXBcIj5cbiAgPGlcbiAgICAqbmdJZj1cInZpc2liaWxpdHkgPT09ICd2aXNpYmxlJ1wiXG4gICAgW2NsYXNzLnN0cmlwZWRdPVwic3R5bGUgPT09ICdzdHJpcGVkJ1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgPjwvaT5cbiAgPHJpdi1pY29uXG4gICAgKm5nSWY9XCJ2aXNpYmlsaXR5ID09PSAnaGlkZGVuJ1wiXG4gICAgbmFtZT1cIkV5ZU9mZlwiXG4gICAgW3NpemVdPVwiMTZcIlxuICA+PC9yaXYtaWNvbj5cbiAgPHJpdi1pY29uICpuZ0lmPVwidmlzaWJpbGl0eSA9PT0gJ2xvY2tlZCdcIiBuYW1lPVwiTG9ja1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbjwvYnV0dG9uPlxuPHNwYW4gW2NsYXNzLmxvdy1jb250cmFzdF09XCJ2aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCB2aXNpYmlsaXR5ID09PSAnbG9ja2VkJ1wiPlxuICB7eyBsYWJlbCB9fVxuPC9zcGFuPlxuIl19
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9sZWdlbmQtaXRlbS9sZWdlbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7OztBQWN2QixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBUUUsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUduQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBR3hCLFVBQUssR0FBd0IsT0FBTyxDQUFDO1FBR3JDLGVBQVUsR0FBb0MsU0FBUyxDQUFDO1FBVXhELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBQ2hDO0lBTkMsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUM7SUFDbkMsQ0FBQzs7Z0hBbEJVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdOQ3BCaEMsc2hCQWdCQTsyRkRJYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBSS9DLEtBQUs7c0JBREosS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBUU4sU0FBUztzQkFEUixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTGVnZW5kSXRlbSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3JUb2tlbjogc3RyaW5nO1xuICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtbGVnZW5kLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vbGVnZW5kLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sZWdlbmQtaXRlbS5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBMZWdlbmRJdGVtQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yVG9rZW46IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIHN0eWxlOiAnc29saWQnIHwgJ3N0cmlwZWQnID0gJ3NvbGlkJztcblxuICBASW5wdXQoKVxuICB2aXNpYmlsaXR5OiAndmlzaWJsZScgfCAnaGlkZGVuJyB8ICdsb2NrZWQnID0gJ3Zpc2libGUnO1xuXG4gIEBJbnB1dCgpXG4gIGljb25Ub29sdGlwPzogc3RyaW5nO1xuXG4gIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHZhcigke3RoaXMuY29sb3JUb2tlbn0pYDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG59XG4iLCI8YnV0dG9uIChjbGljayk9XCJpdGVtQ2xpY2suZW1pdCgpXCIgW3JpdlRvb2x0aXBdPVwiaWNvblRvb2x0aXBcIj5cbiAgPGlcbiAgICAqbmdJZj1cInZpc2liaWxpdHkgPT09ICd2aXNpYmxlJ1wiXG4gICAgW2NsYXNzLnN0cmlwZWRdPVwic3R5bGUgPT09ICdzdHJpcGVkJ1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgPjwvaT5cbiAgPHJpdi1pY29uXG4gICAgKm5nSWY9XCJ2aXNpYmlsaXR5ID09PSAnaGlkZGVuJ1wiXG4gICAgbmFtZT1cIkV5ZU9mZlwiXG4gICAgW3NpemVdPVwiMTZcIlxuICA+PC9yaXYtaWNvbj5cbiAgPHJpdi1pY29uICpuZ0lmPVwidmlzaWJpbGl0eSA9PT0gJ2xvY2tlZCdcIiBuYW1lPVwiTG9ja1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbjwvYnV0dG9uPlxuPHNwYW4gW2NsYXNzLmxvdy1jb250cmFzdF09XCJ2aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCB2aXNpYmlsaXR5ID09PSAnbG9ja2VkJ1wiPlxuICB7eyBsYWJlbCB9fVxuPC9zcGFuPlxuIl19
@@ -6,7 +6,8 @@ import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/common";
7
7
  import * as i2 from "../../modal/callout/callout.component";
8
8
  import * as i3 from "../../modal/callout/callout.directive";
9
- import * as i4 from "../zero-state/zero-state.component";
9
+ import * as i4 from "../legend-item/legend-item.component";
10
+ import * as i5 from "../zero-state/zero-state.component";
10
11
  // TODO: once we upgrade to Angular 16, this component can be cleaned up with
11
12
  // signals instead of RxJS.
12
13
  export class StackedRowComponent {
@@ -19,6 +20,7 @@ export class StackedRowComponent {
19
20
  this.height$ = new BehaviorSubject(256);
20
21
  // ValueFormatter determines how we style the values in a metric and the x-axis
21
22
  this.valueFormatter = v => v.toString();
23
+ this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
22
24
  /*
23
25
  The layout we are shooting for is:
24
26
 
@@ -96,6 +98,12 @@ export class StackedRowComponent {
96
98
  get height() {
97
99
  return this.height$.getValue();
98
100
  }
101
+ set zeroStateMessage(v) {
102
+ this.zeroStateMessage$.next(v);
103
+ }
104
+ get zeroStateMessage() {
105
+ return this.zeroStateMessage$.getValue();
106
+ }
99
107
  // Zero on the X axis is after the left padding and the row name.
100
108
  locationOfXAxisZero() {
101
109
  return this.SECTION_PADDING.OUTER_LEFT_RIGHT + this.SECTION_WIDTHS.ROW_NAME;
@@ -124,9 +132,10 @@ export class StackedRowComponent {
124
132
  return null;
125
133
  }
126
134
  const viewBox = `0 0 ${width} ${height}`;
127
- const standardizedRows = this.standardizeRowStacks(rowStacks);
135
+ const keysInOrder = StackedRowHelpers.getKeyOrder(rowStacks);
136
+ const standardizedRows = StackedRowHelpers.standardizeRowStacks(rowStacks, keysInOrder);
128
137
  const rowsForDisplay = standardizedRows.map(stackData => {
129
- return this.getRowDisplayInfo(stackData);
138
+ return StackedRowHelpers.getRowDisplayInfo(stackData);
130
139
  });
131
140
  // The maximum value of the domain should be the highest total value from the rows.
132
141
  const domainMax = Math.max(0, ...rowsForDisplay.map(row => row.rowTotal));
@@ -137,7 +146,9 @@ export class StackedRowComponent {
137
146
  const rects = this.createRectanglesFromRows(rowsForDisplay, xScale);
138
147
  const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay);
139
148
  const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width);
149
+ const legendItems = StackedRowHelpers.getLegendItems(rowsForDisplay, keysInOrder);
140
150
  return {
151
+ legendItems: legendItems,
141
152
  rowHeight: this.SECTION_HEIGHTS.PER_RECTANGLE,
142
153
  rects: rects,
143
154
  rowNames: rowNamesToDraw,
@@ -147,58 +158,6 @@ export class StackedRowComponent {
147
158
  xTicks: xTicks,
148
159
  };
149
160
  }
150
- // Make sure we have input in a standard format.
151
- standardizeRowStacks(rowStacks) {
152
- const standardizedRows = [];
153
- const keysInOrder = this.getKeyOrder(rowStacks);
154
- for (const rowStack of rowStacks) {
155
- const standardizedData = [];
156
- for (const key of keysInOrder) {
157
- const elementMatchingKey = rowStack.data.find(element => element.label == key);
158
- if (elementMatchingKey) {
159
- standardizedData.push({
160
- ...elementMatchingKey,
161
- value: Math.abs(elementMatchingKey.value),
162
- });
163
- }
164
- }
165
- standardizedRows.push({
166
- rowName: rowStack.rowName,
167
- data: standardizedData,
168
- });
169
- }
170
- return standardizedRows;
171
- }
172
- getKeyOrder(rowStacks) {
173
- const allRowElements = [];
174
- for (const rowStack of rowStacks) {
175
- allRowElements.push(...rowStack.data);
176
- }
177
- const orderedKeys = union([
178
- ...allRowElements.map(rowElement => rowElement.label),
179
- ]);
180
- return orderedKeys;
181
- }
182
- // Stacks the elements and creates the baselines and toplines
183
- getRowDisplayInfo(rowStack) {
184
- const elementsButStacked = [];
185
- let currentBaseline = 0;
186
- let currentTopline = 0;
187
- for (const currentElement of rowStack.data) {
188
- currentTopline += currentElement.value ?? 0;
189
- elementsButStacked.push({
190
- ...currentElement,
191
- baseline: currentBaseline,
192
- topline: currentTopline,
193
- });
194
- currentBaseline = currentTopline;
195
- }
196
- return {
197
- rowName: rowStack.rowName,
198
- elementsButStacked: elementsButStacked,
199
- rowTotal: currentTopline,
200
- };
201
- }
202
161
  // Get data for all the rectangles for all the rows
203
162
  createRectanglesFromRows(displayRows, xScale) {
204
163
  const rectangles = [];
@@ -256,10 +215,10 @@ export class StackedRowComponent {
256
215
  }
257
216
  }
258
217
  StackedRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
259
- StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n >\n {{ rowNameToDraw.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
218
+ StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n >\n {{ rowNameToDraw.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip"], outputs: ["itemClick"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
260
219
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, decorators: [{
261
220
  type: Component,
262
- args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n >\n {{ rowNameToDraw.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"] }]
221
+ args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n >\n {{ rowNameToDraw.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"] }]
263
222
  }], propDecorators: { input: [{
264
223
  type: Input
265
224
  }], width: [{
@@ -268,5 +227,85 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
268
227
  type: Input
269
228
  }], valueFormatter: [{
270
229
  type: Input
230
+ }], zeroStateMessage: [{
231
+ type: Input
271
232
  }] } });
272
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBYSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUMsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUE2RGQsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBT0UsK0VBQStFO1FBQzlELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBYSxFQUFFLENBQUMsQ0FBQztRQVM5RCw2RUFBNkU7UUFDNUQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLEdBQUcsQ0FBQyxDQUFDO1FBUzNELDhFQUE4RTtRQUM3RCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQVMsR0FBRyxDQUFDLENBQUM7UUFTNUQsK0VBQStFO1FBRXhFLG1CQUFjLEdBQTBCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpFOzs7OztVQUtFO1FBQ08sb0JBQWUsR0FBRztZQUN6Qix1Q0FBdUM7WUFDdkMsWUFBWSxFQUFFLEVBQUU7WUFDaEIscUJBQXFCO1lBQ3JCLE9BQU8s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Q0FBQyxNQUFNOzhCQU1wQyxLQUFLO3NCQURmLEtBQUs7Z0JBV0ssS0FBSztzQkFEZixLQUFLO2dCQVdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBVUMsY0FBYztzQkFEcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcm5TZXQsIHVuaW9uIH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHsgU2NhbGVMaW5lYXIsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcblxuLy8gQSBzcGVjaWZpY2FsbHkgY29sb3JlZCBzZWN0aW9uIG9mIG9uZSByb3cuXG5leHBvcnQgZGVjbGFyZSB0eXBlIFJvd0VsZW1lbnQgPSB7XG4gIGxhYmVsOiBzdHJpbmc7IC8vIExlZ2VuZCBlbGVtZW50IG5hbWVcbiAgdmFsdWU6IG51bWJlcjtcbiAgY29sb3JUb2tlbjogc3RyaW5nO1xuICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG59O1xuXG4vLyBUaGUgaW5wdXQgdGhhdCBkZXRlcm1pbmVzIG9uZSByb3cuXG5kZWNsYXJlIHR5cGUgUm93U3RhY2sgPSB7XG4gIHJvd05hbWU6IHN0cmluZztcbiAgZGF0YTogUm93RWxlbWVudFtdO1xufTtcblxuLy8gQSByb3cgZWxlbWVudCB3aXRoIGEgYmFzZWxpbmUsIHRvcGxpbmUsIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgc3RhY2sgaXQgYmVsb25ncyB0b1xudHlwZSBTdGFja2VkUm93RWxlbWVudCA9IFJvd0VsZW1lbnQgJiB7XG4gIGJhc2VsaW5lOiBudW1iZXI7XG4gIHRvcGxpbmU6IG51bWJlcjtcbn07XG5cbi8vIEV2ZXJ5dGhpbmcgdGhhdCBkZXNjcmliZXMgYSByb3cgd2Ugd2lsbCBkaXNwbGF5XG50eXBlIFJvd0Rpc3BsYXlJbmZvID0ge1xuICByb3dOYW1lOiBzdHJpbmc7XG4gIGVsZW1lbnRzQnV0U3RhY2tlZDogU3RhY2tlZFJvd0VsZW1lbnRbXTtcbiAgcm93VG90YWw6IG51bWJlcjtcbn07XG5cbi8vIFRoZSBkYXRhIGFib3V0IGEgcmVjdGFuZ2xlIHdlIGRpc3BsYXkgb24gc2NyZWVuXG50eXBlIFJvd1JlY3RhbmdsZSA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmaWxsOiBzdHJpbmc7XG4gIHN0cmlwZWQ6IGJvb2xlYW47XG4gIHJvd05hbWU6IHN0cmluZztcbiAgc3RhY2tlZFJvd0VsZW1lbnQ6IFN0YWNrZWRSb3dFbGVtZW50O1xufTtcblxuLy8gVGhlIGRhdGEgYWJvdXQgYSByb3cgbGFiZWwgd2UgZGlzcGxheSBvbiBzY3JlZW5cbnR5cGUgUm93TGFiZWwgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufTtcblxuLy8gVGhlIGRhdGEgd2UgYXJlIGRpc3BsYXlpbmcgaW4gdGhpcyBjb21wb25lbnRcbnR5cGUgU3RhY2tlZFJvd0RyYXdEYXRhID0ge1xuICByb3dIZWlnaHQ6IG51bWJlcjtcbiAgcmVjdHM6IFJvd1JlY3RhbmdsZVtdO1xuICByb3dOYW1lczogUm93TGFiZWxbXTtcbiAgcm93VG90YWxzOiBSb3dMYWJlbFtdO1xuICB2aWV3Qm94OiBzdHJpbmc7XG4gIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgeFRpY2tzOiBudW1iZXJbXTtcbn07XG5cbnR5cGUgQ2FsbG91dE1ldHJpYyA9IHsgcm93TmFtZTogc3RyaW5nOyBlbGVtZW50TGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93U3RhY2tbXT4oW10pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogUm93U3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBXaWR0aCBoZWxwcyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHZpZXdib3ggdGhpcyBncmFwaCBpcyBkaXNwbGF5aW5nIGluLlxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndpZHRoJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gSGVpZ2h0IGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyNTYpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlaWdodCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICAvKlxuICAgIFRoZSBsYXlvdXQgd2UgYXJlIHNob290aW5nIGZvciBpczpcblxuICAgICAgICAgICAgICB8ICAgWCBBeGlzIExhYmVscyAgfFxuICAgIFJvdyBOYW1lICB8ICAgUmVjdGFuZ2xlcyAgICAgfCAgIFRvdGFsc1xuICAqL1xuICByZWFkb25seSBTRUNUSU9OX0hFSUdIVFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB4LWF4aXMgbGFiZWxzXG4gICAgWF9BWElTX0xBQkVMOiAxNCxcbiAgICAvLyBIZWlnaHQgb2YgZWFjaCByb3dcbiAgICBQRVJfUk9XOiAyMCxcbiAgICAvLyBIZWlnaCBvZiBlYWNoIHJlY3RhbmdsZVxuICAgIFBFUl9SRUNUQU5HTEU6IDgsXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9XSURUSFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSBuYW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgcm93XG4gICAgUk9XX05BTUU6IDEwMCxcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHRvdGFscyBhdCB0aGUgZW5kIG9mIHRoZSByb3dcbiAgICBST1dfVE9UQUxfTEFCRUw6IDcyLFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fUEFERElORyA9IHtcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gZWFjaCBlZGdlIG9mIHRoZSB2aWV3Ym94IGFuZCB0aGUgY29udGVudFxuICAgIE9VVEVSX1RPUF9CT1RUT006IDQsXG4gICAgT1VURVJfTEVGVF9SSUdIVDogNCxcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gdGhlIGJvdHRvbSBvZiBvbmUgcm93IGFuZCB0aGUgdG9wIG9mIHRoZSBuZXh0IHJvd1xuICAgIEJFVFdFRU5fUk9XOiA0LFxuICAgIC8vIFNwYWNlIGJldHdlZW4gdGhlIHJvdyBhbmQgdGhlIHRvcCBvZiBhIHJlY3RhbmdsZSBpbiB0aGF0IHJvd1xuICAgIFJFQ1RBTkdMRV9UT19ST1c6IDYsXG4gIH07XG5cbiAgLy8gVGhlIG51bWJlciBvZiBYLWF4aXMgc2VnbWVudHMgdG8gY3JlYXRlLCB3aXRoIGxhYmVscyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzZWdtZW50LlxuICByZWFkb25seSBYX1RJQ0tfQ09VTlQgPSA4O1xuXG4gIC8vIFplcm8gb24gdGhlIFggYXhpcyBpcyBhZnRlciB0aGUgbGVmdCBwYWRkaW5nIGFuZCB0aGUgcm93IG5hbWUuXG4gIGxvY2F0aW9uT2ZYQXhpc1plcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQgKyB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FO1xuICB9XG4gIC8vIFRoZSBlbmQgb2YgdGhlIFggYXhpcyBpcyByaWdodCBiZWZvcmUgdGhlIHJvdyB0b3RhbCBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gIGxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3BhY2VPblJpZ2h0OiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfVE9UQUxfTEFCRUwgK1xuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICByZXR1cm4gd2lkdGggLSBzcGFjZU9uUmlnaHQ7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHgtYXhpcyB0aWNrc1xuICBsb2NhdGlvbk9mWEF4aXNUaWNrKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICsgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMXG4gICAgKTtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHJvd1xuICBnZXRUb3BPZlJvdyhyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3BhY2VBYm92ZVJvd3M6IG51bWJlciA9XG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICsgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMO1xuXG4gICAgY29uc3QgYWJvdmVSb3dzOiBudW1iZXIgPSByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9ST1c7XG4gICAgY29uc3QgYWJvdmVSb3dQYWRkaW5nczogbnVtYmVyID1cbiAgICAgIHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1c7XG4gICAgY29uc3QgYWxsQWJvdmVSb3dzOiBudW1iZXIgPSBhYm92ZVJvd3MgKyBhYm92ZVJvd1BhZGRpbmdzO1xuXG4gICAgcmV0dXJuIHNwYWNlQWJvdmVSb3dzICsgYWxsQWJvdmVSb3dzO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGFsbCB0aGUgdmFsdWVzIHdlIG5lZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGdyYXBoIG9uIHNjcmVlbi5cbiAgZ2V0RHJhd25EYXRhKHJvd1N0YWNrczogUm93U3RhY2tbXSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBpZiAocm93U3RhY2tzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YDtcblxuICAgIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFJvd1N0YWNrW10gPSB0aGlzLnN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgcm93c0ZvckRpc3BsYXk6IFJvd0Rpc3BsYXlJbmZvW10gPSBzdGFuZGFyZGl6ZWRSb3dzLm1hcChzdGFja0RhdGEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Um93RGlzcGxheUluZm8oc3RhY2tEYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkb21haW4gc2hvdWxkIGJlIHRoZSBoaWdoZXN0IHRvdGFsIHZhbHVlIGZyb20gdGhlIHJvd3MuXG4gICAgY29uc3QgZG9tYWluTWF4ID0gTWF0aC5tYXgoMCwgLi4ucm93c0ZvckRpc3BsYXkubWFwKHJvdyA9PiByb3cucm93VG90YWwpKTtcbiAgICBjb25zdCB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4gPSBzY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgLnJhbmdlKFt0aGlzLmxvY2F0aW9uT2ZYQXhpc1plcm8oKSwgdGhpcy5sb2NhdGlvbk9mWEF4aXNFbmQod2lkdGgpXSk7XG4gICAgY29uc3QgeFRpY2tzID0geFNjYWxlLnRpY2tzKHRoaXMuWF9USUNLX0NPVU5UKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhyb3dzRm9yRGlzcGxheSk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93SGVpZ2h0OiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFLFxuICAgICAgcmVjdHM6IHJlY3RzLFxuICAgICAgcm93TmFtZXM6IHJvd05hbWVzVG9EcmF3LFxuICAgICAgcm93VG90YWxzOiByb3dUb3RhbHNUb0RyYXcsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgeFNjYWxlOiB4U2NhbGUsXG4gICAgICB4VGlja3M6IHhUaWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgaW5wdXQgaW4gYSBzdGFuZGFyZCBmb3JtYXQuXG4gIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrczogUm93U3RhY2tbXSk6IFJvd1N0YWNrW10ge1xuICAgIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFJvd1N0YWNrW10gPSBbXTtcbiAgICBjb25zdCBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4gPSB0aGlzLmdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgZm9yIChjb25zdCByb3dTdGFjayBvZiByb3dTdGFja3MpIHtcbiAgICAgIGNvbnN0IHN0YW5kYXJkaXplZERhdGE6IFJvd0VsZW1lbnRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0luT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudE1hdGNoaW5nS2V5OiBSb3dFbGVtZW50IHwgdW5kZWZpbmVkID0gcm93U3RhY2suZGF0YS5maW5kKFxuICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5sYWJlbCA9PSBrZXksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbGVtZW50TWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgICBzdGFuZGFyZGl6ZWREYXRhLnB1c2goe1xuICAgICAgICAgICAgLi4uZWxlbWVudE1hdGNoaW5nS2V5LFxuICAgICAgICAgICAgdmFsdWU6IE1hdGguYWJzKGVsZW1lbnRNYXRjaGluZ0tleS52YWx1ZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YW5kYXJkaXplZFJvd3MucHVzaCh7XG4gICAgICAgIHJvd05hbWU6IHJvd1N0YWNrLnJvd05hbWUsXG4gICAgICAgIGRhdGE6IHN0YW5kYXJkaXplZERhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YW5kYXJkaXplZFJvd3M7XG4gIH1cblxuICBnZXRLZXlPcmRlcihyb3dTdGFja3M6IFJvd1N0YWNrW10pOiBJbnRlcm5TZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgYWxsUm93RWxlbWVudHM6IFJvd0VsZW1lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93U3RhY2sgb2Ygcm93U3RhY2tzKSB7XG4gICAgICBhbGxSb3dFbGVtZW50cy5wdXNoKC4uLnJvd1N0YWNrLmRhdGEpO1xuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkS2V5czogSW50ZXJuU2V0PHN0cmluZz4gPSB1bmlvbihbXG4gICAgICAuLi5hbGxSb3dFbGVtZW50cy5tYXAocm93RWxlbWVudCA9PiByb3dFbGVtZW50LmxhYmVsKSxcbiAgICBdKTtcbiAgICByZXR1cm4gb3JkZXJlZEtleXM7XG4gIH1cblxuICAvLyBTdGFja3MgdGhlIGVsZW1lbnRzIGFuZCBjcmVhdGVzIHRoZSBiYXNlbGluZXMgYW5kIHRvcGxpbmVzXG4gIGdldFJvd0Rpc3BsYXlJbmZvKHJvd1N0YWNrOiBSb3dTdGFjayk6IFJvd0Rpc3BsYXlJbmZvIHtcbiAgICBjb25zdCBlbGVtZW50c0J1dFN0YWNrZWQ6IFN0YWNrZWRSb3dFbGVtZW50W10gPSBbXTtcbiAgICBsZXQgY3VycmVudEJhc2VsaW5lOiBudW1iZXIgPSAwO1xuICAgIGxldCBjdXJyZW50VG9wbGluZTogbnVtYmVyID0gMDtcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRFbGVtZW50IG9mIHJvd1N0YWNrLmRhdGEpIHtcbiAgICAgIGN1cnJlbnRUb3BsaW5lICs9IGN1cnJlbnRFbGVtZW50LnZhbHVlID8/IDA7XG5cbiAgICAgIGVsZW1lbnRzQnV0U3RhY2tlZC5wdXNoKHtcbiAgICAgICAgLi4uY3VycmVudEVsZW1lbnQsXG4gICAgICAgIGJhc2VsaW5lOiBjdXJyZW50QmFzZWxpbmUsXG4gICAgICAgIHRvcGxpbmU6IGN1cnJlbnRUb3BsaW5lLFxuICAgICAgfSk7XG5cbiAgICAgIGN1cnJlbnRCYXNlbGluZSA9IGN1cnJlbnRUb3BsaW5lO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByb3dOYW1lOiByb3dTdGFjay5yb3dOYW1lLFxuICAgICAgZWxlbWVudHNCdXRTdGFja2VkOiBlbGVtZW50c0J1dFN0YWNrZWQsXG4gICAgICByb3dUb3RhbDogY3VycmVudFRvcGxpbmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZvciBhbGwgdGhlIHJlY3RhbmdsZXMgZm9yIGFsbCB0aGUgcm93c1xuICBjcmVhdGVSZWN0YW5nbGVzRnJvbVJvd3MoXG4gICAgZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10sXG4gICAgeFNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+LFxuICApOiBSb3dSZWN0YW5nbGVbXSB7XG4gICAgY29uc3QgcmVjdGFuZ2xlczogUm93UmVjdGFuZ2xlW10gPSBbXTtcbiAgICBkaXNwbGF5Um93cy5mb3JFYWNoKChjdXJyZW50Um93LCByb3dJbmRleCkgPT4ge1xuICAgICAgY3VycmVudFJvdy5lbGVtZW50c0J1dFN0YWNrZWQuZm9yRWFjaCgoY3VycmVudEVsZW1lbnQsIF8pID0+IHtcbiAgICAgICAgY29uc3QgdG9wT2ZSb3c6IG51bWJlciA9IHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVdpZHRoOiBudW1iZXIgPVxuICAgICAgICAgIHhTY2FsZShjdXJyZW50RWxlbWVudC50b3BsaW5lKSAtIHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZUhlaWdodDogbnVtYmVyID0gdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JFQ1RBTkdMRTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVYOiBudW1iZXIgPSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVZOiBudW1iZXIgPVxuICAgICAgICAgIHRvcE9mUm93ICsgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVztcblxuICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke2N1cnJlbnRFbGVtZW50LmNvbG9yVG9rZW59KWA7XG5cbiAgICAgICAgcmVjdGFuZ2xlcy5wdXNoKHtcbiAgICAgICAgICB4OiByZWN0YW5nbGVYLFxuICAgICAgICAgIHk6IHJlY3RhbmdsZVksXG4gICAgICAgICAgd2lkdGg6IHJlY3RhbmdsZVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZWN0YW5nbGVzO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyBuYW1lcyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dOYW1lc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IG5hbWUgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcm93LnJvd05hbWUsXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgdG90YWxzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd1RvdGFsc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSwgd2lkdGg6IG51bWJlcik6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHdpZHRoIC0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgdG90YWxzIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JFQ1RBTkdMRTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIocm93LnJvd1RvdGFsKSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPFN0YWNrZWRSb3dEcmF3RGF0YSB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCB3aWR0aCwgaGVpZ2h0XSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJhd25EYXRhKGlucHV0LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIExldHMgdXMga25vdyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHplcm8gZGF0YSBzdGF0ZVxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gV2hhdCByZWN0YW5nbGUgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRSZWN0YW5nbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcmVjdGFuZ2xlOiBSb3dSZWN0YW5nbGU7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBDcmVhdGUgdGhlIG1ldHJpYyB0byBkaXNwbGF5IGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgaG92ZXJlZCByZWN0YW5nbGVcbiAgcmVhZG9ubHkgY2FsbG91dCQgPSB0aGlzLmhvdmVyZWRSZWN0YW5nbGUkLnBpcGUoXG4gICAgbWFwKGhvdmVyZWRSZWN0YW5nbGUgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkUmVjdGFuZ2xlKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRSZWN0YW5nbGUuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGNvbnN0IHsgcm93TmFtZSwgc3RhY2tlZFJvd0VsZW1lbnQgfSA9IGhvdmVyZWRSZWN0YW5nbGUucmVjdGFuZ2xlO1xuXG4gICAgICBjb25zdCBtZXRyaWM6IENhbGxvdXRNZXRyaWMgPSB7XG4gICAgICAgIHJvd05hbWU6IHJvd05hbWUsXG4gICAgICAgIGVsZW1lbnRMYWJlbDogc3RhY2tlZFJvd0VsZW1lbnQubGFiZWwsXG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHN0YWNrZWRSb3dFbGVtZW50LnZhbHVlKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRyYXdcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZHJhdy52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dOYW1lVG9EcmF3IG9mIGRyYXcucm93TmFtZXNcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwicm93LXRpdGxlXCJcbiAgICAgICAgW2F0dHIueF09XCJyb3dOYW1lVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd05hbWVUb0RyYXcueVwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd05hbWVUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZHJhdy54VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIHdpZHRoPVwiMVwiXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICBbYXR0ci55XT1cImxvY2F0aW9uT2ZYQXhpc1RpY2soKVwiXG4gICAgICAgIGR4PVwiNFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkcmF3LnJlY3RzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInJvd1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZFJlY3RhbmdsZSQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZFJlY3RhbmdsZSQgfCBhc3luYyk/LnJlY3RhbmdsZT8ucm93TmFtZSAhPT0gcmVjdC5yb3dOYW1lXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIlxuICAgICAgICAgIGhvdmVyZWRSZWN0YW5nbGUkLm5leHQoeyByZWN0YW5nbGU6IHJlY3QsIGV2ZW50OiAkZXZlbnQgfSlcbiAgICAgICAgXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZFJlY3RhbmdsZSQubmV4dChudWxsKVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZFJlY3RhbmdsZSQubmV4dCh7IHJlY3RhbmdsZTogcmVjdCwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgICBcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkUmVjdGFuZ2xlJC5uZXh0KG51bGwpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dUb3RhbFRvRHJhdyBvZiBkcmF3LnJvd1RvdGFsc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJyb3ctdG90YWxcIlxuICAgICAgICBbYXR0ci54XT1cInJvd1RvdGFsVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd1RvdGFsVG9EcmF3LnlcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd1RvdGFsVG9EcmF3LmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgJ2NlbnRlci1yaWdodCcsXG4gICAgICAnY2VudGVyLWxlZnQnLFxuICAgICAgJ3RvcC1jZW50ZXInLFxuICAgICAgJ2JvdHRvbS1jZW50ZXInXG4gICAgXVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC10aXRsZVwiPnt7IGNhbGxvdXQubWV0cmljLnJvd05hbWUgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpY1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1sYWJlbFwiPnt7IGNhbGxvdXQubWV0cmljLmVsZW1lbnRMYWJlbCB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWMtdmFsdWVcIj57eyBjYWxsb3V0Lm1ldHJpYy52YWx1ZSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
233
+ export var StackedRowHelpers;
234
+ (function (StackedRowHelpers) {
235
+ // Get a ordered+unique list of keys from the row elements
236
+ function getKeyOrder(rowStacks) {
237
+ const allRowElements = [];
238
+ for (const rowStack of rowStacks) {
239
+ allRowElements.push(...rowStack.data);
240
+ }
241
+ const orderedKeys = union([
242
+ ...allRowElements.map(rowElement => rowElement.label),
243
+ ]);
244
+ return orderedKeys;
245
+ }
246
+ StackedRowHelpers.getKeyOrder = getKeyOrder;
247
+ // Get a list of the legend items we should show
248
+ function getLegendItems(rowsForDisplay, keysInOrder) {
249
+ const legendItemArray = [];
250
+ for (const rowForDisplay of rowsForDisplay) {
251
+ for (const key of keysInOrder) {
252
+ const elementMatchingKey = rowForDisplay.elementsButStacked.find(element => element.label == key);
253
+ if (elementMatchingKey &&
254
+ elementMatchingKey.value > 0 &&
255
+ !legendItemArray.find(item => item.label == key)) {
256
+ legendItemArray.push({
257
+ label: elementMatchingKey.label,
258
+ colorToken: elementMatchingKey.colorToken,
259
+ style: elementMatchingKey.style,
260
+ });
261
+ }
262
+ }
263
+ }
264
+ return legendItemArray;
265
+ }
266
+ StackedRowHelpers.getLegendItems = getLegendItems;
267
+ // Make sure we have input in a standard format.
268
+ function standardizeRowStacks(rowStacks, keysInOrder) {
269
+ const standardizedRows = [];
270
+ for (const rowStack of rowStacks) {
271
+ const standardizedData = [];
272
+ for (const key of keysInOrder) {
273
+ const elementMatchingKey = rowStack.data.find(element => element.label == key);
274
+ if (elementMatchingKey) {
275
+ standardizedData.push({
276
+ ...elementMatchingKey,
277
+ value: Math.abs(elementMatchingKey.value),
278
+ });
279
+ }
280
+ }
281
+ standardizedRows.push({
282
+ rowName: rowStack.rowName,
283
+ data: standardizedData,
284
+ });
285
+ }
286
+ return standardizedRows;
287
+ }
288
+ StackedRowHelpers.standardizeRowStacks = standardizeRowStacks;
289
+ // Stacks the elements and creates the baselines and toplines
290
+ function getRowDisplayInfo(rowStack) {
291
+ const elementsButStacked = [];
292
+ let currentBaseline = 0;
293
+ let currentTopline = 0;
294
+ for (const currentElement of rowStack.data) {
295
+ currentTopline += currentElement.value ?? 0;
296
+ elementsButStacked.push({
297
+ ...currentElement,
298
+ baseline: currentBaseline,
299
+ topline: currentTopline,
300
+ });
301
+ currentBaseline = currentTopline;
302
+ }
303
+ return {
304
+ rowName: rowStack.rowName,
305
+ elementsButStacked: elementsButStacked,
306
+ rowTotal: currentTopline,
307
+ };
308
+ }
309
+ StackedRowHelpers.getRowDisplayInfo = getRowDisplayInfo;
310
+ })(StackedRowHelpers || (StackedRowHelpers = {}));
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBYSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUMsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBK0RkLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFPM0IsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQWEsRUFBRSxDQUFDLENBQUM7UUFTOUQsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxHQUFHLENBQUMsQ0FBQztRQVMzRCw4RUFBOEU7UUFDN0QsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLEdBQUcsQ0FBQyxDQUFDO1FBUzVELCtFQUErRTtRQUV4RSxtQkFBYyxHQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoRCxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FDdEQscUJBQXFCLENBQ3RCLENBQUM7UUFTRjs7Ozs7VUFLRTtRQUNPLG9CQUFlLEdBQUc7WUFDekIs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TSxjQUFjLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtZQUMxQyxjQUFjLElBQUksY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7WUFFNUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUN0QixHQUFHLGNBQWM7Z0JBQ2pCLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixPQUFPLEVBQUUsY0FBYzthQUN4QixDQUFDLENBQUM7WUFFSCxlQUFlLEdBQUcsY0FBYyxDQUFDO1NBQ2xDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixrQkFBa0IsRUFBRSxrQkFBa0I7WUFDdEMsUUFBUSxFQUFFLGNBQWM7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFyQmUsbUNBQWlCLG9CQXFCaEMsQ0FBQTtBQUNILENBQUMsRUEzRmdCLGlCQUFpQixLQUFqQixpQkFBaUIsUUEyRmpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludGVyblNldCwgdW5pb24gfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbSB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5cbi8vIEEgc3BlY2lmaWNhbGx5IGNvbG9yZWQgc2VjdGlvbiBvZiBvbmUgcm93LlxuZXhwb3J0IGRlY2xhcmUgdHlwZSBSb3dFbGVtZW50ID0ge1xuICBsYWJlbDogc3RyaW5nOyAvLyBMZWdlbmQgZWxlbWVudCBuYW1lXG4gIHZhbHVlOiBudW1iZXI7XG4gIGNvbG9yVG9rZW46IHN0cmluZztcbiAgc3R5bGU/OiAnc29saWQnIHwgJ3N0cmlwZWQnO1xufTtcblxuLy8gVGhlIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBvbmUgcm93LlxuZXhwb3J0IGRlY2xhcmUgdHlwZSBSb3dTdGFjayA9IHtcbiAgcm93TmFtZTogc3RyaW5nO1xuICBkYXRhOiBSb3dFbGVtZW50W107XG59O1xuXG4vLyBBIHJvdyBlbGVtZW50IHdpdGggYSBiYXNlbGluZSwgdG9wbGluZSwgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBzdGFjayBpdCBiZWxvbmdzIHRvXG50eXBlIFN0YWNrZWRSb3dFbGVtZW50ID0gUm93RWxlbWVudCAmIHtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbiAgdG9wbGluZTogbnVtYmVyO1xufTtcblxuLy8gRXZlcnl0aGluZyB0aGF0IGRlc2NyaWJlcyBhIHJvdyB3ZSB3aWxsIGRpc3BsYXlcbmV4cG9ydCB0eXBlIFJvd0Rpc3BsYXlJbmZvID0ge1xuICByb3dOYW1lOiBzdHJpbmc7XG4gIGVsZW1lbnRzQnV0U3RhY2tlZDogU3RhY2tlZFJvd0VsZW1lbnRbXTtcbiAgcm93VG90YWw6IG51bWJlcjtcbn07XG5cbi8vIFRoZSBkYXRhIGFib3V0IGEgcmVjdGFuZ2xlIHdlIGRpc3BsYXkgb24gc2NyZWVuXG50eXBlIFJvd1JlY3RhbmdsZSA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmaWxsOiBzdHJpbmc7XG4gIHN0cmlwZWQ6IGJvb2xlYW47XG4gIHJvd05hbWU6IHN0cmluZztcbiAgc3RhY2tlZFJvd0VsZW1lbnQ6IFN0YWNrZWRSb3dFbGVtZW50O1xufTtcblxuLy8gVGhlIGRhdGEgYWJvdXQgYSByb3cgbGFiZWwgd2UgZGlzcGxheSBvbiBzY3JlZW5cbnR5cGUgUm93TGFiZWwgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufTtcblxuLy8gVGhlIGRhdGEgd2UgYXJlIGRpc3BsYXlpbmcgaW4gdGhpcyBjb21wb25lbnRcbnR5cGUgU3RhY2tlZFJvd0RyYXdEYXRhID0ge1xuICBsZWdlbmRJdGVtczogTGVnZW5kSXRlbVtdO1xuICByb3dIZWlnaHQ6IG51bWJlcjtcbiAgcmVjdHM6IFJvd1JlY3RhbmdsZVtdO1xuICByb3dOYW1lczogUm93TGFiZWxbXTtcbiAgcm93VG90YWxzOiBSb3dMYWJlbFtdO1xuICB2aWV3Qm94OiBzdHJpbmc7XG4gIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgeFRpY2tzOiBudW1iZXJbXTtcbn07XG5cbnR5cGUgQ2FsbG91dE1ldHJpYyA9IHsgcm93TmFtZTogc3RyaW5nOyBlbGVtZW50TGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93U3RhY2tbXT4oW10pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogUm93U3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBXaWR0aCBoZWxwcyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHZpZXdib3ggdGhpcyBncmFwaCBpcyBkaXNwbGF5aW5nIGluLlxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndpZHRoJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gSGVpZ2h0IGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyNTYpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlaWdodCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLypcbiAgICBUaGUgbGF5b3V0IHdlIGFyZSBzaG9vdGluZyBmb3IgaXM6XG5cbiAgICAgICAgICAgICAgfCAgIFggQXhpcyBMYWJlbHMgIHxcbiAgICBSb3cgTmFtZSAgfCAgIFJlY3RhbmdsZXMgICAgIHwgICBUb3RhbHNcbiAgKi9cbiAgcmVhZG9ubHkgU0VDVElPTl9IRUlHSFRTID0ge1xuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgeC1heGlzIGxhYmVsc1xuICAgIFhfQVhJU19MQUJFTDogMTQsXG4gICAgLy8gSGVpZ2h0IG9mIGVhY2ggcm93XG4gICAgUEVSX1JPVzogMjAsXG4gICAgLy8gSGVpZ2ggb2YgZWFjaCByZWN0YW5nbGVcbiAgICBQRVJfUkVDVEFOR0xFOiA4LFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fV0lEVEhTID0ge1xuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgbmFtZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvd1xuICAgIFJPV19OQU1FOiAxMDAsXG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB0b3RhbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93XG4gICAgUk9XX1RPVEFMX0xBQkVMOiA3MixcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1BBRERJTkcgPSB7XG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIGVhY2ggZWRnZSBvZiB0aGUgdmlld2JveCBhbmQgdGhlIGNvbnRlbnRcbiAgICBPVVRFUl9UT1BfQk9UVE9NOiA0LFxuICAgIE9VVEVSX0xFRlRfUklHSFQ6IDQsXG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIHRoZSBib3R0b20gb2Ygb25lIHJvdyBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb3dcbiAgICBCRVRXRUVOX1JPVzogNCxcbiAgICAvLyBTcGFjZSBiZXR3ZWVuIHRoZSByb3cgYW5kIHRoZSB0b3Agb2YgYSByZWN0YW5nbGUgaW4gdGhhdCByb3dcbiAgICBSRUNUQU5HTEVfVE9fUk9XOiA2LFxuICB9O1xuXG4gIC8vIFRoZSBudW1iZXIgb2YgWC1heGlzIHNlZ21lbnRzIHRvIGNyZWF0ZSwgd2l0aCBsYWJlbHMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2VnbWVudC5cbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UID0gODtcblxuICAvLyBaZXJvIG9uIHRoZSBYIGF4aXMgaXMgYWZ0ZXIgdGhlIGxlZnQgcGFkZGluZyBhbmQgdGhlIHJvdyBuYW1lLlxuICBsb2NhdGlvbk9mWEF4aXNaZXJvKCkge1xuICAgIHJldHVybiB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUICsgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfTkFNRTtcbiAgfVxuICAvLyBUaGUgZW5kIG9mIHRoZSBYIGF4aXMgaXMgcmlnaHQgYmVmb3JlIHRoZSByb3cgdG90YWwgYW5kIHRoZSByaWdodCBwYWRkaW5nLlxuICBsb2NhdGlvbk9mWEF4aXNFbmQod2lkdGg6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlT25SaWdodDogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX1RPVEFMX0xBQkVMICtcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgcmV0dXJuIHdpZHRoIC0gc3BhY2VPblJpZ2h0O1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB4LWF4aXMgdGlja3NcbiAgbG9jYXRpb25PZlhBeGlzVGljaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTFxuICAgICk7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHRvcCBvZiB0aGUgY3VycmVudCByb3dcbiAgZ2V0VG9wT2ZSb3cocm93SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlQWJvdmVSb3dzOiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgIGNvbnN0IGFib3ZlUm93czogbnVtYmVyID0gcm93SW5kZXggKiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUk9XO1xuICAgIGNvbnN0IGFib3ZlUm93UGFkZGluZ3M6IG51bWJlciA9XG4gICAgICByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XO1xuICAgIGNvbnN0IGFsbEFib3ZlUm93czogbnVtYmVyID0gYWJvdmVSb3dzICsgYWJvdmVSb3dQYWRkaW5ncztcblxuICAgIHJldHVybiBzcGFjZUFib3ZlUm93cyArIGFsbEFib3ZlUm93cztcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhbGwgdGhlIHZhbHVlcyB3ZSBuZWVkIGZvciBkaXNwbGF5aW5nIHRoZSBncmFwaCBvbiBzY3JlZW4uXG4gIGdldERyYXduRGF0YShyb3dTdGFja3M6IFJvd1N0YWNrW10sIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgaWYgKHJvd1N0YWNrcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWA7XG5cbiAgICBjb25zdCBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4gPVxuICAgICAgU3RhY2tlZFJvd0hlbHBlcnMuZ2V0S2V5T3JkZXIocm93U3RhY2tzKTtcbiAgICBjb25zdCBzdGFuZGFyZGl6ZWRSb3dzOiBSb3dTdGFja1tdID0gU3RhY2tlZFJvd0hlbHBlcnMuc3RhbmRhcmRpemVSb3dTdGFja3MoXG4gICAgICByb3dTdGFja3MsXG4gICAgICBrZXlzSW5PcmRlcixcbiAgICApO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgIHJldHVybiBTdGFja2VkUm93SGVscGVycy5nZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3ModGhpcy5YX1RJQ0tfQ09VTlQpO1xuXG4gICAgY29uc3QgcmVjdHM6IFJvd1JlY3RhbmdsZVtdID0gdGhpcy5jcmVhdGVSZWN0YW5nbGVzRnJvbVJvd3MoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHhTY2FsZSxcbiAgICApO1xuXG4gICAgY29uc3Qgcm93TmFtZXNUb0RyYXc6IFJvd0xhYmVsW10gPSB0aGlzLmdldFJvd05hbWVzVG9EcmF3KHJvd3NGb3JEaXNwbGF5KTtcbiAgICBjb25zdCByb3dUb3RhbHNUb0RyYXc6IFJvd0xhYmVsW10gPSB0aGlzLmdldFJvd1RvdGFsc1RvRHJhdyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgd2lkdGgsXG4gICAgKTtcblxuICAgIGNvbnN0IGxlZ2VuZEl0ZW1zOiBMZWdlbmRJdGVtW10gPSBTdGFja2VkUm93SGVscGVycy5nZXRMZWdlbmRJdGVtcyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAga2V5c0luT3JkZXIsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWdlbmRJdGVtczogbGVnZW5kSXRlbXMsXG4gICAgICByb3dIZWlnaHQ6IHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEUsXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVXaWR0aDogbnVtYmVyID1cbiAgICAgICAgICB4U2NhbGUoY3VycmVudEVsZW1lbnQudG9wbGluZSkgLSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVIZWlnaHQ6IG51bWJlciA9IHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEU7XG5cbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlWDogbnVtYmVyID0geFNjYWxlKGN1cnJlbnRFbGVtZW50LmJhc2VsaW5lKTtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlWTogbnVtYmVyID1cbiAgICAgICAgICB0b3BPZlJvdyArIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1c7XG5cbiAgICAgICAgY29uc3QgZmlsbCA9IGB2YXIoJHtjdXJyZW50RWxlbWVudC5jb2xvclRva2VufSlgO1xuXG4gICAgICAgIHJlY3RhbmdsZXMucHVzaCh7XG4gICAgICAgICAgeDogcmVjdGFuZ2xlWCxcbiAgICAgICAgICB5OiByZWN0YW5nbGVZLFxuICAgICAgICAgIHdpZHRoOiByZWN0YW5nbGVXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHJlY3RhbmdsZUhlaWdodCxcbiAgICAgICAgICBmaWxsOiBmaWxsLFxuICAgICAgICAgIHN0cmlwZWQ6IGN1cnJlbnRFbGVtZW50LnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgcm93TmFtZTogY3VycmVudFJvdy5yb3dOYW1lLFxuICAgICAgICAgIHN0YWNrZWRSb3dFbGVtZW50OiBjdXJyZW50RWxlbWVudCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjdGFuZ2xlcztcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgbmFtZXMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93TmFtZXNUb0RyYXcoZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10pOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgICAgLy8gVGhlIHJvdyBuYW1lIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JFQ1RBTkdMRTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHJvdy5yb3dOYW1lLFxuICAgICAgICB4OiByb3dMYWJlbFgsXG4gICAgICAgIHk6IHJvd0xhYmVsWSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBvbiB0aGUgcm93IHRvdGFscyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dUb3RhbHNUb0RyYXcoZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10sIHdpZHRoOiBudW1iZXIpOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB3aWR0aCAtIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IHRvdGFscyBsb29rcyByaWdodCBpZiBpdHMgYmFzZSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgYXNzb2NpYXRlZCByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHJvd0xhYmVsWSA9XG4gICAgICAgIHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgpICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJvdy5yb3dUb3RhbCksXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJDogT2JzZXJ2YWJsZTxTdGFja2VkUm93RHJhd0RhdGEgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuaGVpZ2h0JCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgd2lkdGgsIGhlaWdodF0pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldERyYXduRGF0YShpbnB1dCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICAvLyBMZXRzIHVzIGtub3cgd2hldGhlciB0byBkaXNwbGF5IHRoZSB6ZXJvIGRhdGEgc3RhdGVcbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4gaW5wdXQuZXZlcnkoc3RhY2sgPT4gc3RhY2suZGF0YS5sZW5ndGggPT09IDApKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIFdoYXQgcmVjdGFuZ2xlIHdlIGFyZSBjdXJyZW50bHkgaG92ZXJpbmcgb3ZlclxuICByZWFkb25seSBob3ZlcmVkUmVjdGFuZ2xlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJlY3RhbmdsZTogUm93UmVjdGFuZ2xlO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBtZXRyaWMgdG8gZGlzcGxheSBiYXNlZCBvbiB0aGUgY3VycmVudGx5IGhvdmVyZWQgcmVjdGFuZ2xlXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gdGhpcy5ob3ZlcmVkUmVjdGFuZ2xlJC5waXBlKFxuICAgIG1hcChob3ZlcmVkUmVjdGFuZ2xlID0+IHtcbiAgICAgIGlmICghaG92ZXJlZFJlY3RhbmdsZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkUmVjdGFuZ2xlLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBjb25zdCB7IHJvd05hbWUsIHN0YWNrZWRSb3dFbGVtZW50IH0gPSBob3ZlcmVkUmVjdGFuZ2xlLnJlY3RhbmdsZTtcblxuICAgICAgY29uc3QgbWV0cmljOiBDYWxsb3V0TWV0cmljID0ge1xuICAgICAgICByb3dOYW1lOiByb3dOYW1lLFxuICAgICAgICBlbGVtZW50TGFiZWw6IHN0YWNrZWRSb3dFbGVtZW50LmxhYmVsLFxuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihzdGFja2VkUm93RWxlbWVudC52YWx1ZSksXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4geyBhbmNob3IsIG1ldHJpYyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZFJvd0hlbHBlcnMge1xuICAvLyBHZXQgYSBvcmRlcmVkK3VuaXF1ZSBsaXN0IG9mIGtleXMgZnJvbSB0aGUgcm93IGVsZW1lbnRzXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRLZXlPcmRlcihyb3dTdGFja3M6IFJvd1N0YWNrW10pOiBJbnRlcm5TZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgYWxsUm93RWxlbWVudHM6IFJvd0VsZW1lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93U3RhY2sgb2Ygcm93U3RhY2tzKSB7XG4gICAgICBhbGxSb3dFbGVtZW50cy5wdXNoKC4uLnJvd1N0YWNrLmRhdGEpO1xuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkS2V5czogSW50ZXJuU2V0PHN0cmluZz4gPSB1bmlvbihbXG4gICAgICAuLi5hbGxSb3dFbGVtZW50cy5tYXAocm93RWxlbWVudCA9PiByb3dFbGVtZW50LmxhYmVsKSxcbiAgICBdKTtcbiAgICByZXR1cm4gb3JkZXJlZEtleXM7XG4gIH1cblxuICAvLyBHZXQgYSBsaXN0IG9mIHRoZSBsZWdlbmQgaXRlbXMgd2Ugc2hvdWxkIHNob3dcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldExlZ2VuZEl0ZW1zKFxuICAgIHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPixcbiAgKTogTGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCBsZWdlbmRJdGVtQXJyYXk6IExlZ2VuZEl0ZW1bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93Rm9yRGlzcGxheSBvZiByb3dzRm9yRGlzcGxheSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0luT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudE1hdGNoaW5nS2V5OiBTdGFja2VkUm93RWxlbWVudCB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgcm93Rm9yRGlzcGxheS5lbGVtZW50c0J1dFN0YWNrZWQuZmluZChcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5sYWJlbCA9PSBrZXksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnRNYXRjaGluZ0tleSAmJlxuICAgICAgICAgIGVsZW1lbnRNYXRjaGluZ0tleS52YWx1ZSA+IDAgJiZcbiAgICAgICAgICAhbGVnZW5kSXRlbUFycmF5LmZpbmQoaXRlbSA9PiBpdGVtLmxhYmVsID09IGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGVnZW5kSXRlbUFycmF5LnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnRNYXRjaGluZ0tleS5sYWJlbCxcbiAgICAgICAgICAgIGNvbG9yVG9rZW46IGVsZW1lbnRNYXRjaGluZ0tleS5jb2xvclRva2VuLFxuICAgICAgICAgICAgc3R5bGU6IGVsZW1lbnRNYXRjaGluZ0tleS5zdHlsZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kSXRlbUFycmF5O1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgaW5wdXQgaW4gYSBzdGFuZGFyZCBmb3JtYXQuXG4gIGV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZVJvd1N0YWNrcyhcbiAgICByb3dTdGFja3M6IFJvd1N0YWNrW10sXG4gICAga2V5c0luT3JkZXI6IEludGVyblNldDxzdHJpbmc+LFxuICApOiBSb3dTdGFja1tdIHtcbiAgICBjb25zdCBzdGFuZGFyZGl6ZWRSb3dzOiBSb3dTdGFja1tdID0gW107XG4gICAgZm9yIChjb25zdCByb3dTdGFjayBvZiByb3dTdGFja3MpIHtcbiAgICAgIGNvbnN0IHN0YW5kYXJkaXplZERhdGE6IFJvd0VsZW1lbnRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0luT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudE1hdGNoaW5nS2V5OiBSb3dFbGVtZW50IHwgdW5kZWZpbmVkID0gcm93U3RhY2suZGF0YS5maW5kKFxuICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5sYWJlbCA9PSBrZXksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbGVtZW50TWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgICBzdGFuZGFyZGl6ZWREYXRhLnB1c2goe1xuICAgICAgICAgICAgLi4uZWxlbWVudE1hdGNoaW5nS2V5LFxuICAgICAgICAgICAgdmFsdWU6IE1hdGguYWJzKGVsZW1lbnRNYXRjaGluZ0tleS52YWx1ZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YW5kYXJkaXplZFJvd3MucHVzaCh7XG4gICAgICAgIHJvd05hbWU6IHJvd1N0YWNrLnJvd05hbWUsXG4gICAgICAgIGRhdGE6IHN0YW5kYXJkaXplZERhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YW5kYXJkaXplZFJvd3M7XG4gIH1cblxuICAvLyBTdGFja3MgdGhlIGVsZW1lbnRzIGFuZCBjcmVhdGVzIHRoZSBiYXNlbGluZXMgYW5kIHRvcGxpbmVzXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dEaXNwbGF5SW5mbyhyb3dTdGFjazogUm93U3RhY2spOiBSb3dEaXNwbGF5SW5mbyB7XG4gICAgY29uc3QgZWxlbWVudHNCdXRTdGFja2VkOiBTdGFja2VkUm93RWxlbWVudFtdID0gW107XG4gICAgbGV0IGN1cnJlbnRCYXNlbGluZTogbnVtYmVyID0gMDtcbiAgICBsZXQgY3VycmVudFRvcGxpbmU6IG51bWJlciA9IDA7XG4gICAgZm9yIChjb25zdCBjdXJyZW50RWxlbWVudCBvZiByb3dTdGFjay5kYXRhKSB7XG4gICAgICBjdXJyZW50VG9wbGluZSArPSBjdXJyZW50RWxlbWVudC52YWx1ZSA/PyAwO1xuXG4gICAgICBlbGVtZW50c0J1dFN0YWNrZWQucHVzaCh7XG4gICAgICAgIC4uLmN1cnJlbnRFbGVtZW50LFxuICAgICAgICBiYXNlbGluZTogY3VycmVudEJhc2VsaW5lLFxuICAgICAgICB0b3BsaW5lOiBjdXJyZW50VG9wbGluZSxcbiAgICAgIH0pO1xuXG4gICAgICBjdXJyZW50QmFzZWxpbmUgPSBjdXJyZW50VG9wbGluZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93TmFtZTogcm93U3RhY2sucm93TmFtZSxcbiAgICAgIGVsZW1lbnRzQnV0U3RhY2tlZDogZWxlbWVudHNCdXRTdGFja2VkLFxuICAgICAgcm93VG90YWw6IGN1cnJlbnRUb3BsaW5lLFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRyYXdcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZHJhdy52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dOYW1lVG9EcmF3IG9mIGRyYXcucm93TmFtZXNcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwicm93LXRpdGxlXCJcbiAgICAgICAgW2F0dHIueF09XCJyb3dOYW1lVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd05hbWVUb0RyYXcueVwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd05hbWVUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZHJhdy54VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIHdpZHRoPVwiMVwiXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICBbYXR0ci55XT1cImxvY2F0aW9uT2ZYQXhpc1RpY2soKVwiXG4gICAgICAgIGR4PVwiNFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkcmF3LnJlY3RzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInJvd1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZFJlY3RhbmdsZSQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZFJlY3RhbmdsZSQgfCBhc3luYyk/LnJlY3RhbmdsZT8ucm93TmFtZSAhPT0gcmVjdC5yb3dOYW1lXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIlxuICAgICAgICAgIGhvdmVyZWRSZWN0YW5nbGUkLm5leHQoeyByZWN0YW5nbGU6IHJlY3QsIGV2ZW50OiAkZXZlbnQgfSlcbiAgICAgICAgXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZFJlY3RhbmdsZSQubmV4dChudWxsKVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZFJlY3RhbmdsZSQubmV4dCh7IHJlY3RhbmdsZTogcmVjdCwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgICBcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkUmVjdGFuZ2xlJC5uZXh0KG51bGwpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dUb3RhbFRvRHJhdyBvZiBkcmF3LnJvd1RvdGFsc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJyb3ctdG90YWxcIlxuICAgICAgICBbYXR0ci54XT1cInJvd1RvdGFsVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd1RvdGFsVG9EcmF3LnlcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd1RvdGFsVG9EcmF3LmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICA8L3N2Zz5cbiAgPGxlZ2VuZCAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZHJhd1wiPlxuICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRyYXcubGVnZW5kSXRlbXNcIlxuICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgW2NvbG9yVG9rZW5dPVwiaXRlbS5jb2xvclRva2VuXCJcbiAgICAgIFtzdHlsZV09XCJpdGVtLnN0eWxlID8gaXRlbS5zdHlsZSA6ICdzb2xpZCdcIlxuICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgPC9sZWdlbmQ+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGxvdXQkIHwgYXN5bmM7IGxldCBjYWxsb3V0XCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtY2FsbG91dFxuICAgIFthbmNob3JdPVwiY2FsbG91dC5hbmNob3JcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2NlbnRlci1yaWdodCdcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtdGl0bGVcIj57eyBjYWxsb3V0Lm1ldHJpYy5yb3dOYW1lIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbGFiZWxcIj57eyBjYWxsb3V0Lm1ldHJpYy5lbGVtZW50TGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgY2FsbG91dC5tZXRyaWMudmFsdWUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGUgW21lc3NhZ2VdPVwiemVyb1N0YXRlTWVzc2FnZVwiPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19