@rivet-health/design-system 2.14.0 → 2.15.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.
- package/esm2020/lib/input/single-select/single-select.component.mjs +2 -2
- package/esm2020/lib/visualization/intervals.mjs +63 -0
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +129 -25
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +66 -79
- package/fesm2015/rivet-health-design-system.mjs +251 -99
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +249 -99
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/visualization/intervals.d.ts +8 -0
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +24 -6
- package/lib/visualization/time-series/time-series.component.d.ts +13 -8
- package/package.json +1 -1
|
@@ -37,10 +37,10 @@ export class SingleSelectComponent {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
SingleSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SingleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
40
|
-
SingleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SingleSelectComponent, selector: "riv-single-select", inputs: { options: "options", selectedOption: "selectedOption", filterabilityOptions: "filterabilityOptions", loading: "loading", noOptionsMessage: "noOptionsMessage", nodeTemplate: "nodeTemplate", placeholder: "placeholder" }, outputs: { filterQueryChange: "filterQueryChange", selectedOptionChange: "selectedOptionChange" }, ngImport: i0, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:
|
|
40
|
+
SingleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SingleSelectComponent, selector: "riv-single-select", inputs: { options: "options", selectedOption: "selectedOption", filterabilityOptions: "filterabilityOptions", loading: "loading", noOptionsMessage: "noOptionsMessage", nodeTemplate: "nodeTemplate", placeholder: "placeholder" }, outputs: { filterQueryChange: "filterQueryChange", selectedOptionChange: "selectedOptionChange" }, ngImport: i0, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:auto}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i4.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i5.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "errorMessage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
41
41
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SingleSelectComponent, decorators: [{
|
|
42
42
|
type: Component,
|
|
43
|
-
args: [{ selector: 'riv-single-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:
|
|
43
|
+
args: [{ selector: 'riv-single-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:auto}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\n"] }]
|
|
44
44
|
}], propDecorators: { options: [{
|
|
45
45
|
type: Input
|
|
46
46
|
}], selectedOption: [{
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { timeDay, timeMonth, timeWeek, timeYear } from 'd3-time';
|
|
2
|
+
export const intervals = ['year', 'quarter', 'month', 'week', 'day'];
|
|
3
|
+
export function getTimeInterval(interval) {
|
|
4
|
+
switch (interval) {
|
|
5
|
+
case 'day':
|
|
6
|
+
return timeDay;
|
|
7
|
+
case 'week':
|
|
8
|
+
return timeWeek;
|
|
9
|
+
case 'month':
|
|
10
|
+
return timeMonth;
|
|
11
|
+
case 'quarter':
|
|
12
|
+
return timeMonth.every(3);
|
|
13
|
+
case 'year':
|
|
14
|
+
return timeYear;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function getMinorIntervalFormat(interval) {
|
|
18
|
+
switch (interval) {
|
|
19
|
+
case 'day':
|
|
20
|
+
case 'week':
|
|
21
|
+
return '%-d';
|
|
22
|
+
case 'month':
|
|
23
|
+
return '%b';
|
|
24
|
+
case 'quarter':
|
|
25
|
+
return 'Q%q';
|
|
26
|
+
case 'year':
|
|
27
|
+
return '%Y';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function getMajorInterval(interval) {
|
|
31
|
+
switch (interval) {
|
|
32
|
+
case 'day':
|
|
33
|
+
case 'week':
|
|
34
|
+
return 'month';
|
|
35
|
+
case 'month':
|
|
36
|
+
case 'quarter':
|
|
37
|
+
case 'year':
|
|
38
|
+
return 'year';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function getMajorIntervalFormat(interval, hasMultipleYears) {
|
|
42
|
+
switch (interval) {
|
|
43
|
+
case 'year':
|
|
44
|
+
return hasMultipleYears ? '%Y' : '';
|
|
45
|
+
case 'month':
|
|
46
|
+
return hasMultipleYears ? '%b %Y' : '%b';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function getIntervalTitle(interval) {
|
|
50
|
+
switch (interval) {
|
|
51
|
+
case 'year':
|
|
52
|
+
return 'Years';
|
|
53
|
+
case 'quarter':
|
|
54
|
+
return 'Quarters';
|
|
55
|
+
case 'month':
|
|
56
|
+
return 'Months';
|
|
57
|
+
case 'week':
|
|
58
|
+
return 'Weeks';
|
|
59
|
+
case 'day':
|
|
60
|
+
return 'Days';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9pbnRlcnZhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBVSxDQUFDO0FBRzlFLE1BQU0sVUFBVSxlQUFlLENBQUMsUUFBa0I7SUFDaEQsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxPQUFPLENBQUM7UUFDakIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQzdCLEtBQUssTUFBTTtZQUNULE9BQU8sUUFBUSxDQUFDO0tBQ25CO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxRQUFrQjtJQUN2RCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTTtZQUNULE9BQU8sS0FBSyxDQUFDO1FBQ2YsS0FBSyxPQUFPO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLFNBQVM7WUFDWixPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCO0lBQ2pELFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNO1lBQ1QsT0FBTyxPQUFPLENBQUM7UUFDakIsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsUUFBNkMsRUFDN0MsZ0JBQXlCO0lBRXpCLFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssTUFBTTtZQUNULE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssT0FBTztZQUNWLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQzVDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUFrQjtJQUNqRCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFNBQVM7WUFDWixPQUFPLFVBQVUsQ0FBQztRQUNwQixLQUFLLE9BQU87WUFDVixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLE1BQU0sQ0FBQztLQUNqQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lSW50ZXJ2YWwsIHRpbWVEYXksIHRpbWVNb250aCwgdGltZVdlZWssIHRpbWVZZWFyIH0gZnJvbSAnZDMtdGltZSc7XG5cbmV4cG9ydCBjb25zdCBpbnRlcnZhbHMgPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSW50ZXJ2YWwgPSAodHlwZW9mIGludGVydmFscylbbnVtYmVyXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbDogSW50ZXJ2YWwpOiBUaW1lSW50ZXJ2YWwge1xuICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgY2FzZSAnZGF5JzpcbiAgICAgIHJldHVybiB0aW1lRGF5O1xuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgcmV0dXJuIHRpbWVXZWVrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiB0aW1lTW9udGg7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gdGltZU1vbnRoLmV2ZXJ5KDMpITtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHJldHVybiB0aW1lWWVhcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJyUtZCc7XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuICclYic7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gJ1ElcSc7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gJyVZJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFqb3JJbnRlcnZhbChpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJ21vbnRoJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gJ3llYXInO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICBpbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0TWFqb3JJbnRlcnZhbD4sXG4gIGhhc011bHRpcGxlWWVhcnM6IGJvb2xlYW4sXG4pIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuIGhhc011bHRpcGxlWWVhcnMgPyAnJVknIDogJyc7XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIGhhc011bHRpcGxlWWVhcnMgPyAnJWIgJVknIDogJyViJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuICdZZWFycyc7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gJ1F1YXJ0ZXJzJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgICByZXR1cm4gJ01vbnRocyc7XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJ1dlZWtzJztcbiAgICBjYXNlICdkYXknOlxuICAgICAgcmV0dXJuICdEYXlzJztcbiAgfVxufVxuIl19
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, ViewChild, } from '@angular/core';
|
|
2
2
|
import { index } from 'd3-array';
|
|
3
3
|
import { scaleBand, scaleLinear } from 'd3-scale';
|
|
4
4
|
import { stack } from 'd3-shape';
|
|
5
|
-
import { timeMonth } from 'd3-time';
|
|
6
5
|
import { timeFormat } from 'd3-time-format';
|
|
7
|
-
import { BehaviorSubject, combineLatest, map, shareReplay } from 'rxjs';
|
|
6
|
+
import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
|
|
7
|
+
import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@angular/common";
|
|
10
10
|
import * as i2 from "../../modal/callout/callout.component";
|
|
11
11
|
import * as i3 from "../../modal/callout/callout.directive";
|
|
12
|
-
import * as i4 from "
|
|
12
|
+
import * as i4 from "../../input/single-select/single-select.component";
|
|
13
|
+
import * as i5 from "../zero-state/zero-state.component";
|
|
13
14
|
function getDateRange(stacks) {
|
|
14
15
|
let min = Infinity;
|
|
15
16
|
let max = -Infinity;
|
|
@@ -24,6 +25,20 @@ function getDateRange(stacks) {
|
|
|
24
25
|
}
|
|
25
26
|
return [new Date(min), new Date(max)];
|
|
26
27
|
}
|
|
28
|
+
function pointReducer(points) {
|
|
29
|
+
return points.reduce((total, { value }) => total + value, 0);
|
|
30
|
+
}
|
|
31
|
+
const MAX_COLUMNS = 72;
|
|
32
|
+
const DEFAULT_INTERVAL = 'month';
|
|
33
|
+
function getColumnWidth(numColumns) {
|
|
34
|
+
if (numColumns <= 6)
|
|
35
|
+
return 72;
|
|
36
|
+
if (numColumns <= 18)
|
|
37
|
+
return 40;
|
|
38
|
+
if (numColumns <= 40)
|
|
39
|
+
return 16;
|
|
40
|
+
return 8;
|
|
41
|
+
}
|
|
27
42
|
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
28
43
|
// signals instead of RxJS.
|
|
29
44
|
export class StackedColumnComponent {
|
|
@@ -32,27 +47,91 @@ export class StackedColumnComponent {
|
|
|
32
47
|
this.width$ = new BehaviorSubject(960);
|
|
33
48
|
this.height$ = new BehaviorSubject(256);
|
|
34
49
|
this.valueFormatter = v => v.toString();
|
|
35
|
-
this.
|
|
50
|
+
this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
|
|
51
|
+
this.allowedIntervals$ = this.input$.pipe(map(input => {
|
|
52
|
+
const numVisibleColumns = input.filter(stack => stack.filter(s => s.style === 'tooltipOnly').length === 0).length;
|
|
53
|
+
const [minDate, maxDate] = getDateRange(input);
|
|
54
|
+
return intervals.filter(interval => {
|
|
55
|
+
const timeInterval = getTimeInterval(interval);
|
|
56
|
+
const xStepsCount = timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
|
|
57
|
+
return numVisibleColumns * xStepsCount <= MAX_COLUMNS;
|
|
58
|
+
});
|
|
59
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
60
|
+
this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
|
|
61
|
+
id: interval,
|
|
62
|
+
title: getIntervalTitle(interval),
|
|
63
|
+
}))), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
64
|
+
this.selectedIntervalOption$ = combineLatest([
|
|
65
|
+
this.interval$,
|
|
66
|
+
this.intervalOptions$,
|
|
67
|
+
]).pipe(map(([interval, options]) => {
|
|
68
|
+
const allowedIntervals = options.map(({ id }) => id);
|
|
69
|
+
if (!allowedIntervals.includes(interval)) {
|
|
70
|
+
const firstAllowed = allowedIntervals.at(0);
|
|
71
|
+
const lastAllowed = allowedIntervals.at(-1);
|
|
72
|
+
if (!firstAllowed || !lastAllowed)
|
|
73
|
+
return null;
|
|
74
|
+
if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
|
|
75
|
+
interval = firstAllowed;
|
|
76
|
+
if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
|
|
77
|
+
interval = lastAllowed;
|
|
78
|
+
}
|
|
79
|
+
return options.find(o => o.id === interval) ?? null;
|
|
80
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
81
|
+
this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
|
|
82
|
+
this.binnedData$ = combineLatest([
|
|
36
83
|
this.input$,
|
|
84
|
+
this.selectedInterval$,
|
|
85
|
+
]).pipe(map(([input, interval]) => input.map((stack) => {
|
|
86
|
+
const timeInterval = getTimeInterval(interval);
|
|
87
|
+
return stack.map(series => {
|
|
88
|
+
const binned = new Map();
|
|
89
|
+
for (const point of series.data) {
|
|
90
|
+
const bin = timeInterval.floor(point.date).valueOf();
|
|
91
|
+
if (!binned.has(bin)) {
|
|
92
|
+
binned.set(bin, []);
|
|
93
|
+
}
|
|
94
|
+
binned.get(bin).push(point);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
...series,
|
|
98
|
+
data: [...binned.entries()].map(([dateValue, points]) => ({
|
|
99
|
+
date: new Date(dateValue),
|
|
100
|
+
value: pointReducer(points),
|
|
101
|
+
})),
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
})), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
105
|
+
this.drawData$ = combineLatest([
|
|
106
|
+
this.binnedData$,
|
|
37
107
|
this.width$,
|
|
38
108
|
this.height$,
|
|
39
|
-
|
|
109
|
+
this.selectedInterval$,
|
|
110
|
+
]).pipe(map(([binnedData, width, height, interval]) => {
|
|
40
111
|
const viewBox = `0 0 ${width} ${height}`;
|
|
41
|
-
const padding =
|
|
42
|
-
const invisColumns =
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
112
|
+
const padding = 16;
|
|
113
|
+
const invisColumns = binnedData.filter(stack => stack.filter(s => s.style == 'tooltipOnly').length > 0).length;
|
|
114
|
+
const visibleColumns = binnedData.length - invisColumns;
|
|
115
|
+
const [minDate, maxDate] = getDateRange(binnedData);
|
|
116
|
+
const hasMultipleYears = minDate.getFullYear() < maxDate.getFullYear();
|
|
117
|
+
const xMinorIntervalFormat = getMinorIntervalFormat(interval);
|
|
118
|
+
const minorFormatter = timeFormat(xMinorIntervalFormat);
|
|
119
|
+
const minorTimeInterval = getTimeInterval(interval);
|
|
120
|
+
const xSteps = minorTimeInterval.range(minorTimeInterval.floor(minDate), minorTimeInterval.floor(minorTimeInterval.offset(maxDate, 1)));
|
|
121
|
+
const xMajorInterval = getMajorInterval(interval);
|
|
122
|
+
const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
|
|
123
|
+
const majorFormatter = timeFormat(xMajorIntervalFormat);
|
|
124
|
+
const fullFormatter = timeFormat(`${xMinorIntervalFormat} ${xMajorIntervalFormat}`);
|
|
46
125
|
const xOuterScale = scaleBand()
|
|
47
|
-
.domain(xSteps.map(date =>
|
|
126
|
+
.domain(xSteps.map(date => fullFormatter(date)))
|
|
48
127
|
.range([0, width]);
|
|
49
|
-
const columnWidth =
|
|
128
|
+
const columnWidth = getColumnWidth(xSteps.length * visibleColumns);
|
|
50
129
|
const columnPadding = 4;
|
|
51
130
|
const outerPadding = (xOuterScale.bandwidth() -
|
|
52
|
-
(columnPadding * (
|
|
53
|
-
columnWidth * (
|
|
131
|
+
(columnPadding * (binnedData.length - 1 - invisColumns) +
|
|
132
|
+
columnWidth * (binnedData.length - invisColumns))) /
|
|
54
133
|
2;
|
|
55
|
-
const renderInformation =
|
|
134
|
+
const renderInformation = binnedData.map(stackData => {
|
|
56
135
|
const stackedTable = stackData.reduce((table, s) => [
|
|
57
136
|
...table,
|
|
58
137
|
...s.data.map(point => ({
|
|
@@ -94,7 +173,7 @@ export class StackedColumnComponent {
|
|
|
94
173
|
}
|
|
95
174
|
const width = seriesPoint.series.style == 'tooltipOnly' ? 0 : columnWidth;
|
|
96
175
|
const height = yScale(baseline) - yScale(topline);
|
|
97
|
-
const x = (xOuterScale(
|
|
176
|
+
const x = (xOuterScale(fullFormatter(date)) ?? 0) +
|
|
98
177
|
outerPadding +
|
|
99
178
|
columnWidth * (index - invisColumnsSoFar) +
|
|
100
179
|
columnPadding * (index - invisColumnsSoFar);
|
|
@@ -119,17 +198,27 @@ export class StackedColumnComponent {
|
|
|
119
198
|
invisColumnsSoFar++;
|
|
120
199
|
}
|
|
121
200
|
});
|
|
122
|
-
const
|
|
201
|
+
const xMinorTicks = xSteps.map(date => ({
|
|
123
202
|
dateValue: date.valueOf(),
|
|
124
|
-
label:
|
|
125
|
-
x: (xOuterScale(
|
|
203
|
+
label: minorFormatter(date),
|
|
204
|
+
x: (xOuterScale(fullFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
|
|
126
205
|
}));
|
|
206
|
+
const xMajorTicks = interval !== 'year'
|
|
207
|
+
? xSteps
|
|
208
|
+
.map(date => ({
|
|
209
|
+
dateValue: date.valueOf(),
|
|
210
|
+
label: majorFormatter(date),
|
|
211
|
+
x: (xOuterScale(fullFormatter(date)) ?? 0) +
|
|
212
|
+
xOuterScale.bandwidth() / 2,
|
|
213
|
+
}))
|
|
214
|
+
.filter((tick, i, ticks) => i === 0 || tick.label !== ticks[i - 1].label)
|
|
215
|
+
: [];
|
|
127
216
|
const yTicks = yScale.ticks(5);
|
|
128
217
|
const hoverBandWidth = (renderInformation.length - invisColumns) * columnWidth +
|
|
129
218
|
(renderInformation.length + 1 - invisColumns) * columnPadding;
|
|
130
219
|
const hoverBands = xSteps.map(date => ({
|
|
131
220
|
dateValue: date.valueOf(),
|
|
132
|
-
x: (xOuterScale(
|
|
221
|
+
x: (xOuterScale(fullFormatter(date)) ?? 0) +
|
|
133
222
|
(xOuterScale.bandwidth() - hoverBandWidth) / 2,
|
|
134
223
|
y: yScale(domainMax),
|
|
135
224
|
width: hoverBandWidth,
|
|
@@ -140,7 +229,8 @@ export class StackedColumnComponent {
|
|
|
140
229
|
hoverBands,
|
|
141
230
|
rects,
|
|
142
231
|
viewBox,
|
|
143
|
-
|
|
232
|
+
xMinorTicks,
|
|
233
|
+
xMajorTicks,
|
|
144
234
|
yScale,
|
|
145
235
|
yTicks,
|
|
146
236
|
};
|
|
@@ -181,12 +271,21 @@ export class StackedColumnComponent {
|
|
|
181
271
|
get height() {
|
|
182
272
|
return this.height$.getValue();
|
|
183
273
|
}
|
|
274
|
+
set interval(v) {
|
|
275
|
+
this.interval$.next(v);
|
|
276
|
+
}
|
|
277
|
+
get interval() {
|
|
278
|
+
return this.interval$.getValue();
|
|
279
|
+
}
|
|
280
|
+
setIntervalOption(option) {
|
|
281
|
+
this.interval = option.id;
|
|
282
|
+
}
|
|
184
283
|
}
|
|
185
284
|
StackedColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
186
|
-
StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", 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 d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.
|
|
285
|
+
StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", interval: "interval" }, viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], 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 d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\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 (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\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 ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\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-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ 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\n<ng-template #controls>\n <riv-single-select\n [options]=\"(intervalOptions$ | async) || []\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\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)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\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.SingleSelectComponent, selector: "riv-single-select", inputs: ["options", "selectedOption", "filterabilityOptions", "loading", "noOptionsMessage", "nodeTemplate", "placeholder"], outputs: ["filterQueryChange", "selectedOptionChange"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
187
286
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, decorators: [{
|
|
188
287
|
type: Component,
|
|
189
|
-
args: [{ selector: 'riv-stacked-column', 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 d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.
|
|
288
|
+
args: [{ selector: 'riv-stacked-column', 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 d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\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 (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\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 ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\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-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ 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\n<ng-template #controls>\n <riv-single-select\n [options]=\"(intervalOptions$ | async) || []\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\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)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
|
|
190
289
|
}], propDecorators: { input: [{
|
|
191
290
|
type: Input
|
|
192
291
|
}], width: [{
|
|
@@ -195,5 +294,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
195
294
|
type: Input
|
|
196
295
|
}], valueFormatter: [{
|
|
197
296
|
type: Input
|
|
297
|
+
}], interval: [{
|
|
298
|
+
type: Input
|
|
299
|
+
}], controls: [{
|
|
300
|
+
type: ViewChild,
|
|
301
|
+
args: ['controls']
|
|
198
302
|
}] } });
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFFeEUsU0FBUyxZQUFZLENBQUMsTUFBZTtJQUNuQyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFB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SztzQkFEZixLQUFLO2dCQVVLLE1BQU07c0JBRGhCLEtBQUs7Z0JBU0MsY0FBYztzQkFEcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHRpbWVNb250aCB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHsgdGltZUZvcm1hdCB9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuXG5mdW5jdGlvbiBnZXREYXRlUmFuZ2Uoc3RhY2tzOiBTdGFja1tdKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZGF0ZSB9IG9mIHNlcmllcy5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtuZXcgRGF0ZShtaW4pLCBuZXcgRGF0ZShtYXgpXTtcbn1cblxuZXhwb3J0IHR5cGUgVmFsdWUgPSB7IGRhdGU6IERhdGU7IHZhbHVlOiBudW1iZXIgfTtcblxuZXhwb3J0IHR5cGUgU2VyaWVzID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBkYXRhOiBWYWx1ZVtdO1xufSAmIChcbiAgfCB7XG4gICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG4gICAgfVxuICB8IHtcbiAgICAgIHN0eWxlOiAndG9vbHRpcE9ubHknO1xuICAgIH1cbik7XG5cbmV4cG9ydCB0eXBlIFN0YWNrID0gU2VyaWVzW107XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tbXT4oW10pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndpZHRoJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDI1Nik7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGVpZ2h0KHY6IG51bWJlcikge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmhlaWdodCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2hlaWdodH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDg7XG5cbiAgICAgIGNvbnN0IGludmlzQ29sdW1ucyA9IGlucHV0LmZpbHRlcihcbiAgICAgICAgc3RhY2sgPT4gc3RhY2suZmlsdGVyKHMgPT4gcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKS5sZW5ndGggPiAwLFxuICAgICAgKS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IFttaW5EYXRlLCBtYXhEYXRlXSA9IGdldERhdGVSYW5nZShpbnB1dCk7XG4gICAgICBjb25zdCB4U3RlcHMgPSB0aW1lTW9udGgucmFuZ2UoXG4gICAgICAgIHRpbWVNb250aC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgdGltZU1vbnRoLmZsb29yKHRpbWVNb250aC5vZmZzZXQobWF4RGF0ZSwgMSkpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHhGb3JtYXR0ZXIgPSB0aW1lRm9ybWF0KCclYicpO1xuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiB4Rm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFswLCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEwO1xuICAgICAgY29uc3QgY29sdW1uUGFkZGluZyA9IDQ7XG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgIChjb2x1bW5QYWRkaW5nICogKGlucHV0Lmxlbmd0aCAtIDEgLSBpbnZpc0NvbHVtbnMpICtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGlucHV0Lmxlbmd0aCAtIGludmlzQ29sdW1ucykpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBWYWx1ZSAmIHsgc2VyaWVzOiBTZXJpZXMgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBpbnB1dC5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tlZFRhYmxlID0gc3RhY2tEYXRhLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IGludmlzQ29sdW1uc1NvRmFyID0gMDtcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBpbnZpc0NvbHVtbkZvdW5kID0gZmFsc2U7XG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUuZW50cmllcygpXS5mb3JFYWNoKChbZGF0ZSwgcG9pbnRNYXBdLCBpKSA9PiB7XG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Jhc2VsaW5lLCB0b3BsaW5lXSA9IHN0YWNrZWRbal1baV07XG5cbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBpbnZpc0NvbHVtbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgICAgICAgc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScgPyAwIDogY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB5U2NhbGUoYmFzZWxpbmUpIC0geVNjYWxlKHRvcGxpbmUpO1xuICAgICAgICAgICAgY29uc3QgeCA9XG4gICAgICAgICAgICAgICh4T3V0ZXJTY2FsZSh4Rm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgIG91dGVyUGFkZGluZyArXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGluZGV4IC0gaW52aXNDb2x1bW5zU29GYXIpICtcbiAgICAgICAgICAgICAgY29sdW1uUGFkZGluZyAqIChpbmRleCAtIGludmlzQ29sdW1uc1NvRmFyKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGZpbGwgPSAnJztcbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgIT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW52aXNDb2x1bW5Gb3VuZCkge1xuICAgICAgICAgIGludmlzQ29sdW1uc1NvRmFyKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4VGlja3MgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgbGFiZWw6IHhGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6ICh4T3V0ZXJTY2FsZSh4Rm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHlUaWNrcyA9IHlTY2FsZS50aWNrcyg1KTtcblxuICAgICAgY29uc3QgaG92ZXJCYW5kV2lkdGggPVxuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoIC0gaW52aXNDb2x1bW5zKSAqIGNvbHVtbldpZHRoICtcbiAgICAgICAgKHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCArIDEgLSBpbnZpc0NvbHVtbnMpICogY29sdW1uUGFkZGluZztcbiAgICAgIGNvbnN0IGhvdmVyQmFuZHMgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoeEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICh4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAtIGhvdmVyQmFuZFdpZHRoKSAvIDIsXG4gICAgICAgIHk6IHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgICB3aWR0aDogaG92ZXJCYW5kV2lkdGgsXG4gICAgICAgIGhlaWdodDogeVNjYWxlKDApIC0geVNjYWxlKGRvbWFpbk1heCksXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbldpZHRoLFxuICAgICAgICBob3ZlckJhbmRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgeFRpY2tzLFxuICAgICAgICB5U2NhbGUsXG4gICAgICAgIHlUaWNrcyxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PlxuICAgICAgaW5wdXQuZXZlcnkoc3RhY2sgPT4gc3RhY2suZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuZHJhd0RhdGEkXSkucGlwZShcbiAgICBtYXAoKFtob3ZlcmVkQmFuZCwgZHJhd0RhdGFdKSA9PiB7XG4gICAgICBpZiAoIWhvdmVyZWRCYW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRCYW5kLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9O1xuICAgICAgY29uc3QgbWV0cmljczogTWV0cmljW10gPSBkcmF3RGF0YS5yZWN0c1xuICAgICAgICAuZmlsdGVyKHJlY3QgPT4gcmVjdC5kYXRlVmFsdWUgPT09IGhvdmVyZWRCYW5kLmRhdGVWYWx1ZSlcbiAgICAgICAgLm1hcChyZWN0ID0+ICh7XG4gICAgICAgICAgbGFiZWw6IHJlY3Quc2VyaWVzUG9pbnQuc2VyaWVzLmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJlY3Quc2VyaWVzUG9pbnQudmFsdWUpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIShlbXB0eSQgfCBhc3luYyk7IGVsc2UgemVyb1N0YXRlXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICB5Mj1cIjBcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWJhY2tncm91bmRcIlxuICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCIoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5kYXRlVmFsdWUgPT09IHRpY2suZGF0ZVZhbHVlXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnggLSAyMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAzXCJcbiAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgIGhlaWdodD1cIjEyXCJcbiAgICAgICAgcng9XCIyXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAxMlwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnlUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCJcbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PVwiMVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHQgY2xhc3M9XCJ0aWNrLWxhYmVsXCIgeD1cIjBcIiBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCIgZHk9XCItNFwiPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkLnJlY3RzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cImNvbHVtblwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlICE9PSByZWN0LmRhdGVWYWx1ZVxuICAgICAgICBcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0lmPVwicmVjdC5zdHJpcGVkXCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvZz5cbiAgICA8cmVjdFxuICAgICAgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5ob3ZlckJhbmRzXCJcbiAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAobW91c2VlbnRlcik9XCJcbiAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICBcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID48L3JlY3Q+XG4gIDwvc3ZnPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjYWxsb3V0JCB8IGFzeW5jOyBsZXQgY2FsbG91dFwiPlxuICA8cml2LWNhbGxvdXRcbiAgICAqcml2LWNhbGxvdXRcbiAgICBbYW5jaG9yXT1cImNhbGxvdXQuYW5jaG9yXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpY1wiICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgY2FsbG91dC5tZXRyaWNzXCI+XG4gICAgICAgIDxkaXY+e3sgbWV0cmljLmxhYmVsIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpYy12YWx1ZVwiPnt7IG1ldHJpYy52YWx1ZSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0sY0FBYyxDQUFDOzs7Ozs7O0FBRXRCLFNBQVMsWUFBWSxDQUFDLE1BQWU7SUFDbkMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1FBQzFCLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxFQUFFO1lBQzFCLEtB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LENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUE4REQsaUJBQWlCLENBQUMsTUFBb0M7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBYyxDQUFDO0lBQ3hDLENBQUM7O21IQXRHVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixzUkNuRm5DLG9zSEF3SUE7MkZEckRhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTTs4QkFLcEMsS0FBSztzQkFEZixLQUFLO2dCQVVLLEtBQUs7c0JBRGYsS0FBSztnQkFVSyxNQUFNO3NCQURoQixLQUFLO2dCQVNDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBS0ssUUFBUTtzQkFEbEIsS0FBSztnQkFTVSxRQUFRO3NCQUR2QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHRpbWVGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW5wdXQvc2luZ2xlLXNlbGVjdC9zaW5nbGUtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5cbmZ1bmN0aW9uIGdldERhdGVSYW5nZShzdGFja3M6IFN0YWNrW10pOiBbRGF0ZSwgRGF0ZV0ge1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGxldCBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2Ygc3RhY2spIHtcbiAgICAgIGZvciAoY29uc3QgeyBkYXRlIH0gb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2YWx1ZSk7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW25ldyBEYXRlKG1pbiksIG5ldyBEYXRlKG1heCldO1xufVxuXG5leHBvcnQgdHlwZSBWYWx1ZSA9IHsgZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRhdGE6IFZhbHVlW107XG59ICYgKFxuICB8IHtcbiAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgIHN0eWxlPzogJ3NvbGlkJyB8ICdzdHJpcGVkJztcbiAgICB9XG4gIHwge1xuICAgICAgc3R5bGU6ICd0b29sdGlwT25seSc7XG4gICAgfVxuKTtcblxuZXhwb3J0IHR5cGUgU3RhY2sgPSBTZXJpZXNbXTtcblxuZnVuY3Rpb24gcG9pbnRSZWR1Y2VyKHBvaW50czogVmFsdWVbXSkge1xuICByZXR1cm4gcG9pbnRzLnJlZHVjZSgodG90YWwsIHsgdmFsdWUgfSkgPT4gdG90YWwgKyB2YWx1ZSwgMCk7XG59XG5cbmNvbnN0IE1BWF9DT0xVTU5TID0gNzI7XG5jb25zdCBERUZBVUxUX0lOVEVSVkFMOiBJbnRlcnZhbCA9ICdtb250aCc7XG5cbmZ1bmN0aW9uIGdldENvbHVtbldpZHRoKG51bUNvbHVtbnM6IG51bWJlcikge1xuICBpZiAobnVtQ29sdW1ucyA8PSA2KSByZXR1cm4gNzI7XG4gIGlmIChudW1Db2x1bW5zIDw9IDE4KSByZXR1cm4gNDA7XG4gIGlmIChudW1Db2x1bW5zIDw9IDQwKSByZXR1cm4gMTY7XG4gIHJldHVybiA4O1xufVxuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrW10+KFtdKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oOTYwKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyNTYpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlaWdodCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVydmFsPihERUZBVUxUX0lOVEVSVkFMKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnRlcnZhbCh2OiBJbnRlcnZhbCkge1xuICAgIHRoaXMuaW50ZXJ2YWwkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJylcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3QgbnVtVmlzaWJsZUNvbHVtbnMgPSBpbnB1dC5maWx0ZXIoXG4gICAgICAgIHN0YWNrID0+IHN0YWNrLmZpbHRlcihzID0+IHMuc3R5bGUgPT09ICd0b29sdGlwT25seScpLmxlbmd0aCA9PT0gMCxcbiAgICAgICkubGVuZ3RoO1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJ2YWxzLmZpbHRlcihpbnRlcnZhbCA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIGNvbnN0IHhTdGVwc0NvdW50ID0gdGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IodGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgICAgICkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbnVtVmlzaWJsZUNvbHVtbnMgKiB4U3RlcHNDb3VudCA8PSBNQVhfQ09MVU1OUztcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBTaW5nbGVTZWxlY3RDb21wb25lbnQuT3B0aW9uID0+ICh7XG4gICAgICAgICAgaWQ6IGludGVydmFsLFxuICAgICAgICAgIHRpdGxlOiBnZXRJbnRlcnZhbFRpdGxlKGludGVydmFsKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsT3B0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW50ZXJ2YWwkLFxuICAgIHRoaXMuaW50ZXJ2YWxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnRlcnZhbCwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGFsbG93ZWRJbnRlcnZhbHMgPSBvcHRpb25zLm1hcCgoeyBpZCB9KSA9PiBpZCBhcyBJbnRlcnZhbCk7XG4gICAgICBpZiAoIWFsbG93ZWRJbnRlcnZhbHMuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgtMSk7XG4gICAgICAgIGlmICghZmlyc3RBbGxvd2VkIHx8ICFsYXN0QWxsb3dlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA8IGludGVydmFscy5pbmRleE9mKGZpcnN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBmaXJzdEFsbG93ZWQ7XG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPiBpbnRlcnZhbHMuaW5kZXhPZihsYXN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBsYXN0QWxsb3dlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLmlkID09PSBpbnRlcnZhbCkgPz8gbnVsbDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWwkID0gdGhpcy5zZWxlY3RlZEludGVydmFsT3B0aW9uJC5waXBlKFxuICAgIG1hcChvcHRpb24gPT4gKG9wdGlvbiA/IChvcHRpb24uaWQgYXMgSW50ZXJ2YWwpIDogREVGQVVMVF9JTlRFUlZBTCkpLFxuICApO1xuXG4gIHNldEludGVydmFsT3B0aW9uKG9wdGlvbjogU2luZ2xlU2VsZWN0Q29tcG9uZW50Lk9wdGlvbikge1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQgYXMgSW50ZXJ2YWw7XG4gIH1cblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIGludGVydmFsXSkgPT5cbiAgICAgIGlucHV0Lm1hcCgoc3RhY2spOiBTdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgcmV0dXJuIHN0YWNrLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBWYWx1ZVtdPigpO1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHRpbWVJbnRlcnZhbC5mbG9vcihwb2ludC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluKSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmlubmVkLmdldChiaW4pIS5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuaGVpZ2h0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Jpbm5lZERhdGEsIHdpZHRoLCBoZWlnaHQsIGludGVydmFsXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YDtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcblxuICAgICAgY29uc3QgaW52aXNDb2x1bW5zID0gYmlubmVkRGF0YS5maWx0ZXIoXG4gICAgICAgIHN0YWNrID0+IHN0YWNrLmZpbHRlcihzID0+IHMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5JykubGVuZ3RoID4gMCxcbiAgICAgICkubGVuZ3RoO1xuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBiaW5uZWREYXRhLmxlbmd0aCAtIGludmlzQ29sdW1ucztcblxuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGJpbm5lZERhdGEpO1xuICAgICAgY29uc3QgaGFzTXVsdGlwbGVZZWFycyA9IG1pbkRhdGUuZ2V0RnVsbFllYXIoKSA8IG1heERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHRpbWVGb3JtYXQoeE1pbm9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgbWlub3JUaW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeFN0ZXBzID0gbWlub3JUaW1lSW50ZXJ2YWwucmFuZ2UoXG4gICAgICAgIG1pbm9yVGltZUludGVydmFsLmZsb29yKG1pbkRhdGUpLFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5vclRpbWVJbnRlcnZhbC5vZmZzZXQobWF4RGF0ZSwgMSkpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsID0gZ2V0TWFqb3JJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbEZvcm1hdCA9IGdldE1ham9ySW50ZXJ2YWxGb3JtYXQoXG4gICAgICAgIHhNYWpvckludGVydmFsLFxuICAgICAgICBoYXNNdWx0aXBsZVllYXJzLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1ham9yRm9ybWF0dGVyID0gdGltZUZvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdGltZUZvcm1hdChcbiAgICAgICAgYCR7eE1pbm9ySW50ZXJ2YWxGb3JtYXR9ICR7eE1ham9ySW50ZXJ2YWxGb3JtYXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHhPdXRlclNjYWxlID0gc2NhbGVCYW5kKClcbiAgICAgICAgLmRvbWFpbih4U3RlcHMubWFwKGRhdGUgPT4gZnVsbEZvcm1hdHRlcihkYXRlKSkpXG4gICAgICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcblxuICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBnZXRDb2x1bW5XaWR0aCh4U3RlcHMubGVuZ3RoICogdmlzaWJsZUNvbHVtbnMpO1xuICAgICAgY29uc3QgY29sdW1uUGFkZGluZyA9IDQ7XG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgIChjb2x1bW5QYWRkaW5nICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSAtIGludmlzQ29sdW1ucykgK1xuICAgICAgICAgICAgY29sdW1uV2lkdGggKiAoYmlubmVkRGF0YS5sZW5ndGggLSBpbnZpc0NvbHVtbnMpKSkgL1xuICAgICAgICAyO1xuXG4gICAgICB0eXBlIFNlcmllc1BvaW50ID0gVmFsdWUgJiB7IHNlcmllczogU2VyaWVzIH07XG5cbiAgICAgIGNvbnN0IHJlbmRlckluZm9ybWF0aW9uID0gYmlubmVkRGF0YS5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tlZFRhYmxlID0gc3RhY2tEYXRhLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IGludmlzQ29sdW1uc1NvRmFyID0gMDtcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBpbnZpc0NvbHVtbkZvdW5kID0gZmFsc2U7XG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUuZW50cmllcygpXS5mb3JFYWNoKChbZGF0ZSwgcG9pbnRNYXBdLCBpKSA9PiB7XG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Jhc2VsaW5lLCB0b3BsaW5lXSA9IHN0YWNrZWRbal1baV07XG5cbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBpbnZpc0NvbHVtbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgICAgICAgc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScgPyAwIDogY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB5U2NhbGUoYmFzZWxpbmUpIC0geVNjYWxlKHRvcGxpbmUpO1xuICAgICAgICAgICAgY29uc3QgeCA9XG4gICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgIG91dGVyUGFkZGluZyArXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGluZGV4IC0gaW52aXNDb2x1bW5zU29GYXIpICtcbiAgICAgICAgICAgICAgY29sdW1uUGFkZGluZyAqIChpbmRleCAtIGludmlzQ29sdW1uc1NvRmFyKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGZpbGwgPSAnJztcbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgIT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW52aXNDb2x1bW5Gb3VuZCkge1xuICAgICAgICAgIGludmlzQ29sdW1uc1NvRmFyKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICBsYWJlbDogbWlub3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICsgeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLyAyLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPVxuICAgICAgICBpbnRlcnZhbCAhPT0gJ3llYXInXG4gICAgICAgICAgPyB4U3RlcHNcbiAgICAgICAgICAgICAgLm1hcChkYXRlID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbWFqb3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgICAgICAgICAgeDpcbiAgICAgICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgICAgICB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh0aWNrLCBpLCB0aWNrcykgPT5cbiAgICAgICAgICAgICAgICAgIGkgPT09IDAgfHwgdGljay5sYWJlbCAhPT0gdGlja3NbaSAtIDFdLmxhYmVsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpO1xuXG4gICAgICBjb25zdCBob3ZlckJhbmRXaWR0aCA9XG4gICAgICAgIChyZW5kZXJJbmZvcm1hdGlvbi5sZW5ndGggLSBpbnZpc0NvbHVtbnMpICogY29sdW1uV2lkdGggK1xuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICsgMSAtIGludmlzQ29sdW1ucykgKiBjb2x1bW5QYWRkaW5nO1xuICAgICAgY29uc3QgaG92ZXJCYW5kcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC0gaG92ZXJCYW5kV2lkdGgpIC8gMixcbiAgICAgICAgeTogeVNjYWxlKGRvbWFpbk1heCksXG4gICAgICAgIHdpZHRoOiBob3ZlckJhbmRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5U2NhbGUoMCkgLSB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgIGhvdmVyQmFuZHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICB2aWV3Qm94LFxuICAgICAgICB4TWlub3JUaWNrcyxcbiAgICAgICAgeE1ham9yVGlja3MsXG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVRpY2tzLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+XG4gICAgICBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5ldmVyeShzZXJpZXMgPT4gc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgY2FsbG91dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmhvdmVyZWRCYW5kJCwgdGhpcy5kcmF3RGF0YSRdKS5waXBlKFxuICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBkcmF3RGF0YV0pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZEJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LmRhdGVWYWx1ZSA9PT0gaG92ZXJlZEJhbmQuZGF0ZVZhbHVlKVxuICAgICAgICAubWFwKHJlY3QgPT4gKHtcbiAgICAgICAgICBsYWJlbDogcmVjdC5zZXJpZXNQb2ludC5zZXJpZXMubGFiZWwsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocmVjdC5zZXJpZXNQb2ludC52YWx1ZSksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPHJlY3RcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KHsgZGF0ZVZhbHVlOiByZWN0LmRhdGVWYWx1ZSwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICA+PC9yZWN0PlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgJ2NlbnRlci1yaWdodCcsXG4gICAgICAnY2VudGVyLWxlZnQnLFxuICAgICAgJ3RvcC1jZW50ZXInLFxuICAgICAgJ2JvdHRvbS1jZW50ZXInXG4gICAgXVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWNcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQubWV0cmljc1wiPlxuICAgICAgICA8ZGl2Pnt7IG1ldHJpYy5sYWJlbCB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWMtdmFsdWVcIj57eyBtZXRyaWMudmFsdWUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGU+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbHM+XG4gIDxyaXYtc2luZ2xlLXNlbGVjdFxuICAgIFtvcHRpb25zXT1cIihpbnRlcnZhbE9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICBbc2VsZWN0ZWRPcHRpb25dPVwic2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgfCBhc3luY1wiXG4gICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cInNldEludGVydmFsT3B0aW9uKCRldmVudClcIlxuICA+PC9yaXYtc2luZ2xlLXNlbGVjdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|