@provoly/dashboard 1.4.14 → 1.4.16
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/esm2022/admin/components/admin-abac-rules/admin-abac-rules-form/admin-abac-rules-form.component.mjs +7 -7
- package/esm2022/admin/components/admin-abac-rules/admin-abac-rules.component.mjs +3 -3
- package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +7 -7
- package/esm2022/admin/components/admin-abac-rules/components/composed-condition/composed-condition.component.mjs +10 -10
- package/esm2022/admin/components/admin-abac-rules/components/metadata-condition/metadata-condition.component.mjs +6 -6
- package/esm2022/admin/components/admin-abac-rules/components/select-attribute/select-attribute.component.mjs +3 -3
- package/esm2022/admin/components/admin-abac-rules/components/select-metadata/select-metadata.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes-customize/admin-classes-customize.component.mjs +10 -10
- package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +10 -15
- package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +8 -8
- package/esm2022/admin/components/admin-classes/admin-classes-edit/admin-classes-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-select/admin-classes-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-edit/admin-attributes-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-new/admin-attributes-new.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-select/admin-attributes-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-classes-view.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes.component.mjs +5 -5
- package/esm2022/admin/components/admin-dataset/admin-dataset.component.mjs +6 -6
- package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +7 -7
- package/esm2022/admin/components/admin-environment/admin-environment-form/admin-environment-form.component.mjs +3 -3
- package/esm2022/admin/components/admin-environment/admin-environment-select/admin-environment-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-environment/admin-environment-update/admin-environment-update.component.mjs +5 -5
- package/esm2022/admin/components/admin-environment/admin-environment.component.mjs +5 -5
- package/esm2022/admin/components/admin-fields/admin-fields-edit/admin-fields-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.mjs +3 -3
- package/esm2022/admin/components/admin-layout/admin-layout.component.mjs +3 -3
- package/esm2022/admin/components/admin-links/admin-links-new/admin-links-new.component.mjs +5 -5
- package/esm2022/admin/components/admin-links/admin-links.component.mjs +5 -5
- package/esm2022/admin/components/admin-menu/admin-menu.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/admin-edit-metadata/admin-edit-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/admin-select-metadata/admin-select-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/shared/form-metadata/form-metadata.component.mjs +4 -5
- package/esm2022/admin/components/admin-metadata/shared/list-metadata/pry-list-metadata.component.mjs +5 -6
- package/esm2022/admin/components/admin-metadata-rules/admin-metadata-rules.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-rules/admin-select-metadata-rules/admin-select-metadata-rules.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-rules/shared/admin-form-metadata-rules/admin-form-metadata-rules.component.mjs +4 -5
- package/esm2022/admin/components/admin-metadata-user/admin-user-edit-metadata/admin-user-edit-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-user/admin-user-select-metadata/admin-user-select-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-form/admin-predicates-form.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-select/admin-predicates-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-update/admin-predicates-update.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates.component.mjs +5 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types-modal/admin-relation-types-modal.component.mjs +4 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types-select/admin-relation-types-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types.component.mjs +6 -6
- package/esm2022/admin/components/admin-user/admin-user-select/admin-user-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-user/admin-user.component.mjs +5 -5
- package/esm2022/admin/components/association/association.component.mjs +4 -5
- package/esm2022/components/card/card.component.mjs +5 -6
- package/esm2022/components/metadata-editor/metadata-editor.component.mjs +6 -6
- package/esm2022/components/scheme-picker/scheme-picker.component.mjs +7 -7
- package/esm2022/components/stepper/stepper.component.mjs +3 -4
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +5 -5
- package/esm2022/dataset/components/dataset-version-form/dataset-version-form.component.mjs +6 -7
- package/esm2022/filters/date/date-filter.component.mjs +5 -6
- package/esm2022/filters/list/list-filter.component.mjs +6 -7
- package/esm2022/filters/number/number-filter.component.mjs +5 -6
- package/esm2022/filters/text/text-filter.component.mjs +5 -6
- package/esm2022/lib/core/components/about/about.component.mjs +3 -3
- package/esm2022/lib/core/components/accordion/accordion-item/accordion-item.component.mjs +7 -7
- package/esm2022/lib/core/components/base-menu/base-menu.component.mjs +6 -6
- package/esm2022/lib/core/components/base-toolbox/base-toolbox.component.mjs +6 -6
- package/esm2022/lib/core/components/base-toolbox-action/base-toolbox-action.component.mjs +6 -7
- package/esm2022/lib/core/components/date-picker/date-picker.component.mjs +4 -4
- package/esm2022/lib/core/components/date-picker/time-picker/loop-scroll-column/loop-scroll-column.component.mjs +3 -4
- package/esm2022/lib/core/components/date-picker/time-picker/time-picker.component.mjs +6 -6
- package/esm2022/lib/core/components/edit-input/edit-input.component.mjs +7 -8
- package/esm2022/lib/core/components/icon/icon.component.mjs +3 -3
- package/esm2022/lib/core/components/modal/modal.component.mjs +5 -6
- package/esm2022/lib/core/components/nq-color-selector/nq-color-selector.component.mjs +5 -5
- package/esm2022/lib/core/components/overlay/dialog-confirm.component.mjs +3 -3
- package/esm2022/lib/core/components/range/range.component.mjs +5 -6
- package/esm2022/lib/core/components/select/select.component.mjs +3 -3
- package/esm2022/lib/core/components/select-image/select-image.component.mjs +5 -5
- package/esm2022/lib/core/components/share/group-share/group-share.component.mjs +6 -6
- package/esm2022/lib/core/components/snackbar/snackbar/snackbar.component.mjs +3 -3
- package/esm2022/lib/core/components/status-modal/status-modal.component.mjs +5 -5
- package/esm2022/lib/core/components/tabs/tab-group.component.mjs +3 -3
- package/esm2022/lib/core/components/toggle/toggle.component.mjs +4 -4
- package/esm2022/lib/core/store/data-source/data-source.effects.mjs +9 -9
- package/esm2022/lib/core/store/search/search.effects.mjs +4 -2
- package/esm2022/lib/core/store/search/search.service.mjs +3 -7
- package/esm2022/lib/core/toolbox/toolbox-manifest.service.mjs +3 -3
- package/esm2022/lib/dashboard/action-bus/service/bus.service.mjs +2 -2
- package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +8 -8
- package/esm2022/lib/dashboard/components/dashboard.component.mjs +12 -12
- package/esm2022/lib/dashboard/components/manifests/manifests.component.mjs +5 -5
- package/esm2022/lib/dashboard/components/metadata/metadata.component.mjs +5 -6
- package/esm2022/lib/dashboard/components/vizualize-raw/vizualize-raw.component.mjs +3 -3
- package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-selector.component.mjs +6 -6
- package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +10 -10
- package/esm2022/lib/dashboard/components/widgets/widget-filler/widget-filler.component.mjs +2 -2
- package/esm2022/lib/dashboard/components/widgets/widget-placement/widget-placement.utils.mjs +2 -2
- package/esm2022/lib/dashboard/filter/components/filter-group/filter-group.component.mjs +7 -7
- package/esm2022/lib/dashboard/resultset-utils.mjs +7 -8
- package/esm2022/lib/dashboard/store/dashboard.effects.mjs +4 -4
- package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +13 -24
- package/esm2022/lib/dashboard/tooltip/components/default/default.tooltip.component.mjs +3 -3
- package/esm2022/notification/components/notification/content/notification-content.component.mjs +3 -3
- package/esm2022/notification/components/notification/notification.component.mjs +5 -5
- package/esm2022/pipeline/components/pipeline-details/pipeline-details.component.mjs +7 -7
- package/esm2022/pipeline/components/pipeline-editor/graph-serializer.utils.mjs +2 -2
- package/esm2022/pipeline/components/pipeline-editor/pipeline-editor.component.mjs +5 -5
- package/esm2022/pipeline/components/pipeline-list/pipeline-list.component.mjs +9 -9
- package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +6 -6
- package/esm2022/presentation/components/presentation.component.mjs +6 -6
- package/esm2022/presentation/components/title-presentation/title-presentation.component.mjs +5 -5
- package/esm2022/restitution/components/restitution/restitution.component.mjs +3 -3
- package/esm2022/restitution/components/restitution-catalog/restitution-catalog.component.mjs +9 -9
- package/esm2022/restitution/components/restitution-list-item/restitution-list-item.component.mjs +3 -3
- package/esm2022/search/components/choose-widget/choose-widget.component.mjs +5 -5
- package/esm2022/search/components/edit-named-query/edit-named-query.component.mjs +9 -9
- package/esm2022/search/search-fulltext/search-fulltext/search-fulltext.component.mjs +3 -3
- package/esm2022/search/search-home/search-home.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-composed/search-composed.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-mono-class/search-mono-class.component.mjs +8 -8
- package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +6 -6
- package/esm2022/search/search-mono-class/components/search-select-attribute/search-select-attribute.component.mjs +3 -3
- package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +7 -7
- package/esm2022/search/search-multi-class/components/multi-class-field-selection/multi-class-field-selection.component.mjs +6 -6
- package/esm2022/search/search-multi-class/components/search-multi-class/search-multi-class.component.mjs +7 -7
- package/esm2022/search/search-tools/search-tools.component.mjs +13 -13
- package/esm2022/toolbox/components/named-query/named-query.component.mjs +5 -5
- package/esm2022/toolbox/components/save-view/save-view.component.mjs +10 -10
- package/esm2022/toolbox/components/select-grid-layout/select-grid-layout.component.mjs +8 -8
- package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +5 -6
- package/esm2022/tooltips/attribute/attribute-tooltip.component.mjs +3 -3
- package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +4 -4
- package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +2 -2
- package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +12 -12
- package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +13 -7
- package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +7 -7
- package/esm2022/widgets/widget-iframe/component/widget-iframe.component.mjs +7 -7
- package/esm2022/widgets/widget-iframe/messaging/iframe-messaging.service.mjs +2 -2
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +10 -10
- package/esm2022/widgets/widget-map/utils/widget-map.utils.mjs +2 -2
- package/esm2022/widgets/widget-table/component/widget-table.component.mjs +2 -2
- package/esm2022/widgets/widget-table/expand-value/expand-value.component.mjs +4 -5
- package/esm2022/widgets/widget-template/component/widget-template.component.mjs +7 -7
- package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +10 -10
- package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +9 -9
- package/fesm2022/provoly-dashboard-admin.mjs +171 -175
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-card.mjs +4 -5
- package/fesm2022/provoly-dashboard-components-card.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +4 -4
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs +6 -6
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-stepper.mjs +2 -3
- package/fesm2022/provoly-dashboard-components-stepper.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +14 -14
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-date.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-date.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-list.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-list.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-number.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-number.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-text.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-text.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-notification.mjs +4 -4
- package/fesm2022/provoly-dashboard-notification.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-pipeline.mjs +21 -21
- package/fesm2022/provoly-dashboard-pipeline.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-presentation.mjs +14 -14
- package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs +6 -6
- package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-search.mjs +35 -35
- package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-toolbox.mjs +25 -25
- package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-tooltips-attribute.mjs +2 -2
- package/fesm2022/provoly-dashboard-tooltips-attribute.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +3 -3
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +10 -10
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +11 -5
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +5 -5
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs +8 -8
- package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +9 -9
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +6 -6
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-template.mjs +7 -7
- package/fesm2022/provoly-dashboard-widgets-widget-template.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +11 -11
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +7 -7
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +204 -219
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -11,10 +11,10 @@ import { vegaBaseConf, vegaCirclePackConf, vegaRadarConf } from './vega-spec.con
|
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@ngrx/store";
|
|
13
13
|
import * as i2 from "@provoly/dashboard";
|
|
14
|
-
import * as i3 from "@angular/
|
|
15
|
-
import * as i4 from "@
|
|
16
|
-
import * as i5 from "
|
|
17
|
-
import * as i6 from "
|
|
14
|
+
import * as i3 from "@angular/forms";
|
|
15
|
+
import * as i4 from "@provoly/dashboard/components/checkbox";
|
|
16
|
+
import * as i5 from "../style/css.component";
|
|
17
|
+
import * as i6 from "@angular/common";
|
|
18
18
|
vega.scheme('KO/W/OK', ['#C04D3F', '#FD9843', '#9ABE29']);
|
|
19
19
|
export class WidgetChartComponent extends DataWidgetComponent {
|
|
20
20
|
constructor(store, translateService, el, cdRef) {
|
|
@@ -162,7 +162,7 @@ export class WidgetChartComponent extends DataWidgetComponent {
|
|
|
162
162
|
this.variableAttributes$
|
|
163
163
|
]).pipe(filter(([items, _]) => this.optionsCopy.selectedVariables && this.optionsCopy.selectedVariables.length > 0), map(([items, _, variables]) => WidgetChartComponent.matchingItems(items, this.optionsCopy, variables)));
|
|
164
164
|
this.subscriptions.add(this.options$.pipe(filter((opt) => !!opt)).subscribe((options) => {
|
|
165
|
-
this.optionsCopy =
|
|
165
|
+
this.optionsCopy = structuredClone(options);
|
|
166
166
|
this.updateAdvancedEdit(JSON.stringify(this.optionsCopy.specToMerge));
|
|
167
167
|
this.optionsCopy.type = !this.markTypes.includes(this.optionsCopy.type)
|
|
168
168
|
? this.markTypes[0]
|
|
@@ -205,14 +205,14 @@ export class WidgetChartComponent extends DataWidgetComponent {
|
|
|
205
205
|
spec.scales[2].range.scheme = options.series?.scheme;
|
|
206
206
|
break;
|
|
207
207
|
case MarkType.CIRCLE_PACK:
|
|
208
|
-
spec.data[0].values =
|
|
208
|
+
spec.data[0].values = structuredClone(data);
|
|
209
209
|
spec.data[1].transform[0].key = 'attributes.' + options.packing?.id + '.value';
|
|
210
210
|
spec.data[1].transform[0].parentKey = 'attributes.' + options.packing?.parentId + '.value';
|
|
211
211
|
spec.data[1].transform[1].field = 'attributes.' + options.packing?.packField + '.value';
|
|
212
212
|
spec.marks[0].encode.enter.tooltip.signal = `datum.attributes.${options.packing?.tooltip ?? options.packing?.id}.value + ' : ' + datum.attributes.${options.packing?.packField}.value`;
|
|
213
213
|
break;
|
|
214
214
|
default:
|
|
215
|
-
spec.data = { values:
|
|
215
|
+
spec.data = { values: structuredClone(data) };
|
|
216
216
|
spec.layer = [
|
|
217
217
|
{
|
|
218
218
|
mark: {
|
|
@@ -259,7 +259,7 @@ export class WidgetChartComponent extends DataWidgetComponent {
|
|
|
259
259
|
this.subscriptions.add(combineLatest([this.vegaLiteSpec$, this.trigger$]).subscribe(([spec, _]) => {
|
|
260
260
|
if (this.vega) {
|
|
261
261
|
this.view?.finalize();
|
|
262
|
-
embed(this.vega.nativeElement,
|
|
262
|
+
embed(this.vega.nativeElement, structuredClone(spec), {
|
|
263
263
|
actions: false,
|
|
264
264
|
renderer: 'svg',
|
|
265
265
|
formatLocale: this.optionsCopy.locale === 'fr'
|
|
@@ -450,7 +450,7 @@ export class WidgetChartComponent extends DataWidgetComponent {
|
|
|
450
450
|
variable.origin0 = $event;
|
|
451
451
|
}
|
|
452
452
|
changeType(typeOptionsId) {
|
|
453
|
-
this.optionsCopy =
|
|
453
|
+
this.optionsCopy = structuredClone(this.optionsCopy);
|
|
454
454
|
const [type, subType] = typeOptionsId.split('-');
|
|
455
455
|
// @ts-ignore
|
|
456
456
|
this.optionsCopy.type = type;
|
|
@@ -639,13 +639,13 @@ export class WidgetChartComponent extends DataWidgetComponent {
|
|
|
639
639
|
});
|
|
640
640
|
}
|
|
641
641
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetChartComponent, deps: [{ token: i1.Store }, { token: i2.PryI18nService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
642
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: WidgetChartComponent, selector: "pry-widget-chart", viewQueries: [{ propertyName: "vega", first: true, predicate: ["vega"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-chart-css></pry-widget-chart-css>\n<div class=\"o-widget o-widget--chart\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [isDisable]=\"(filterDataForOptionsCopy$ | async)?.length === 0 || hasNoType(optionsCopy)\"\n [widgetIndex]=\"widgetIndex\"\n [open$]=\"open$\"\n [header]=\"header\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-edit-input\n label=\"@pry.widget.chart.title\"\n (ngModelChange)=\"changeChartTitle($event)\"\n [ngModel]=\"optionsCopy.customTitle ?? optionsCopy.title\"\n ></pry-edit-input>\n\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"(filterDataForOptionsCopy$ | async)?.length === 0; else data\">\n <p class=\"a-label a-label--help -error\">{{ '@pry.widget.chart.params.noParams' | i18n }}</p>\n </ng-container>\n <ng-template #data>\n <div *ngIf=\"optionsCopy?.type !== MarkType.RADAR\">\n {{ '@pry.widget.chart.params.multipleParams' | i18n }}{{ (filterDataForOptionsCopy$ | async)?.length }}\n </div>\n </ng-template>\n </div>\n\n <div *ngIf=\"optionsCopy\" class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_type\">{{ '@pry.widget.chart.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeType($event)\"\n [items]=\"typeOptions\"\n [ngModel]=\"optionsCopy.type + '-' + optionsCopy.subType\"\n i18nPrefix=\"@pry.widget.chart.markType.\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"chart_type\"\n ></pry-select>\n </div>\n </div>\n\n <ng-container *ngIf=\"optionsCopy?.type !== MarkType.RADAR && optionsCopy?.type !== MarkType.CIRCLE_PACK\">\n <ng-container *ngIf=\"optionsCopy?.subType === MarkSubType.DONUT\">\n <pry-range\n [ngModel]=\"optionsCopy.innerRadius\"\n (ngModelChange)=\"changeInnerRadius($event)\"\n labelTranslate=\"@pry.widget.chart.innerRadius\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </ng-container>\n\n <div\n *ngFor=\"let variableDef of optionsCopy?.selectedVariables; let i = index\"\n class=\"o-settings__popup__content__fields -condensed\"\n >\n <div class=\"m-form-label-field\" *ngIf=\"i === 1\">\n <label class=\"a-label\" for=\"aggregations\">{{ '@pry.widget.chart.encoding.group' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeAggregation($event)\"\n *ngIf=\"i === 1\"\n [items]=\"aggregations\"\n [ngModel]=\"optionsCopy.aggregation\"\n id=\"aggregations\"\n i18nPrefix=\"@pry.widget.chart.aggregation.\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"i !== 1 || optionsCopy.aggregation !== 'count'\">\n <label class=\"a-label\" for=\"aggregation_property\">\n {{ axeLabel(i, optionsCopy) | i18n }}\n </label>\n <pry-select\n (ngModelChange)=\"changeProperty($event, i)\"\n [items]=\"(i !== 1 ? variableAttributes$ : possibleSecondaryAttributes$) | async\"\n [ngModel]=\"variableDef.name\"\n bindLabel=\"name\"\n bindValue=\"technicalName\"\n id=\"aggregation_property\"\n ></pry-select>\n </div>\n\n <pry-edit-input\n label=\"@pry.widget.chart.dataLabel\"\n (ngModelChange)=\"changeLabel($event, i)\"\n [ngModel]=\"variableDef.label\"\n ></pry-edit-input>\n\n <div *ngIf=\"variableDef.type === 'temporal'\" class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_timeUnit\">{{ '@pry.widget.chart.timeUnit' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeTimeUnit($event, variableDef)\"\n [items]=\"timeUnits\"\n [ngModel]=\"variableDef.timeUnit\"\n i18nPrefix=\"@pry.widget.chart.timeUnitList.\"\n id=\"chart_timeUnit\"\n ></pry-select>\n </div>\n\n <div *ngIf=\"variableDef.type === 'quantitative' && optionsCopy?.type !== 'arc'\" class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleOriginAtZero(variableDef, $event)\" [ngModel]=\"variableDef.origin0\"\n >{{ '@pry.widget.chart.origin' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-checkbox\n (ngModelChange)=\"toggleSeries($event)\"\n [ngModel]=\"!!optionsCopy.series\"\n *ngIf=\"optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR\"\n [disabled]=\"\n this.optionsCopy.subType === MarkSubType.AREASTACKED ||\n this.optionsCopy.subType === MarkSubType.HISTOSTACKED\n \"\n >{{ '@pry.widget.chart.series' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n class=\"m-form-label-field\"\n *ngIf=\"optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR && !!optionsCopy.series\"\n >\n <label class=\"a-label\" for=\"chart_seriesAttr\">{{ '@pry.widget.chart.seriesAttr' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeries($event)\"\n [ngModel]=\"optionsCopy.series.groupBy!\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_seriesAttr\"\n ></pry-select>\n </div>\n\n <div\n class=\"m-form-label-field\"\n *ngIf=\"\n (optionsCopy?.type === MarkType.ARC || optionsCopy?.type === MarkType.RADAR || !!optionsCopy.series) &&\n schemes\n \"\n >\n <label class=\"a-label\" for=\"chart_seriesScheme\" [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\">{{\n '@pry.widget.chart.seriesScheme' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme\"\n i18nPrefix=\"@pry.widget.chart.scheme.\"\n bindValue=\"id\"\n bindLabel=\"id\"\n ></pry-select>\n </div>\n\n <div class=\"o-widget--chart-color-thumb\">\n <div\n *ngFor=\"let schemeColor of scheme()\"\n class=\"o-widget--chart-color-thumb-item\"\n [title]=\"schemeColor\"\n [style.background-color]=\"schemeColor\"\n ></div>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox\n (ngModelChange)=\"toggleSeriesLegend($event)\"\n [ngModel]=\"!!optionsCopy.legend!\"\n *ngIf=\"optionsCopy?.type !== MarkType.RADAR || !!optionsCopy.series\"\n >{{ '@pry.widget.chart.seriesLegend' | i18n }}\n </pry-checkbox>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleTooltip($event)\" [ngModel]=\"!!optionsCopy.tooltip!\"\n >{{ '@pry.widget.chart.tooltip' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy?.type === MarkType.RADAR && optionsCopy.radar !== undefined\">\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.compare\"\n [items]=\"comparisons\"\n bindLabel=\"name\"\n bindValue=\"id\"\n ></pry-select>\n </div>\n\n <ng-container *ngIf=\"optionsCopy.radar.compare === 'item'\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.props\"\n [items]=\"numericProperties$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n bindLabel=\"name\"\n bindValue=\"name\"\n ></pry-select>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy.radar.compare === 'value'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_key\">{{ '@pry.widget.chart.comparison.key' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.keyProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_key\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_values\">{{ '@pry.widget.chart.comparison.values' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.valueProp\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_values\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_category\">{{\n '@pry.widget.chart.comparison.category' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.categoryProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_category\"\n ></pry-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"schemes\">\n <label\n class=\"a-label\"\n for=\"chart_seriesScheme_radar\"\n [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\"\n >{{ '@pry.widget.chart.seriesScheme' | i18n }}</label\n >\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme_radar\"\n ></pry-select>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy?.type === MarkType.CIRCLE_PACK && optionsCopy.packing !== undefined\">\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_id\">{{ '@pry.widget.chart.circle.id' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.id\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_id\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_pid\">{{ '@pry.widget.chart.circle.pid' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.parentId\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_pid\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_field\">{{ '@pry.widget.chart.circle.field' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.packField\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_field\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_tooltip\">{{ '@pry.widget.chart.circle.tooltip' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.tooltip\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_tooltip\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-checkbox (ngModelChange)=\"toggleSpecToMerge($event)\" [ngModel]=\"!!optionsCopy.specToMerge\"\n >{{ '@pry.widget.chart.moreOptions' | i18n }}\n </pry-checkbox>\n\n <ng-container *ngIf=\"!!optionsCopy.specToMerge\">\n <textarea\n [ngModel]=\"advancedEdit\"\n (focusout)=\"updateAdvancedEdit($event)\"\n class=\"o-settings__popup__content__area\"\n [class.-invalid]=\"invalidJson\"\n ></textarea>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n <ng-container *ngIf=\"isChartValid$ | async\">\n <div\n #vega\n [style.height.px]=\"\n ((widgetSize$ | async)?.height ?? 0) - ((displayHeader$ | async) ? 1 : 0) * WIDGET_HEADER_HEIGHT\n \"\n [style.width.px]=\"(widgetSize$ | async)?.width\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"!(isChartValid$ | async)\">\n <div class=\"o-widget__choose-parameters\">\n <p class=\"a-p\">\n {{ '@pry.widget.chart.chooseParameters' | i18n }}\n </p>\n <button type=\"button\" (click)=\"openSettings()\" class=\"a-btn a-btn--primary\">\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"control\"></pry-icon>\n <span>{{ '@pry.widget.settings.title' | i18n }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryEditInputComponent, selector: "pry-edit-input", inputs: ["label", "editButtonTooltip", "confirmButtonTooltip"], outputs: ["validated"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i6.PryWidgetChartCssComponent, selector: "pry-widget-chart-css" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }] }); }
|
|
642
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetChartComponent, selector: "pry-widget-chart", viewQueries: [{ propertyName: "vega", first: true, predicate: ["vega"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-chart-css></pry-widget-chart-css>\n<div class=\"o-widget o-widget--chart\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [isDisable]=\"(filterDataForOptionsCopy$ | async)?.length === 0 || hasNoType(optionsCopy)\"\n [widgetIndex]=\"widgetIndex\"\n [open$]=\"open$\"\n [header]=\"header\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-edit-input\n label=\"@pry.widget.chart.title\"\n (ngModelChange)=\"changeChartTitle($event)\"\n [ngModel]=\"optionsCopy.customTitle ?? optionsCopy.title\"\n ></pry-edit-input>\n <div class=\"m-form-label-field\">\n @if ((filterDataForOptionsCopy$ | async)?.length === 0) {\n <p class=\"a-label a-label--help -error\">{{ '@pry.widget.chart.params.noParams' | i18n }}</p>\n } @else {\n @if (optionsCopy?.type !== MarkType.RADAR) {\n <div>\n {{ '@pry.widget.chart.params.multipleParams' | i18n }}{{ (filterDataForOptionsCopy$ | async)?.length }}\n </div>\n }\n }\n </div>\n @if (optionsCopy) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_type\">{{ '@pry.widget.chart.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeType($event)\"\n [items]=\"typeOptions\"\n [ngModel]=\"optionsCopy.type + '-' + optionsCopy.subType\"\n i18nPrefix=\"@pry.widget.chart.markType.\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"chart_type\"\n ></pry-select>\n </div>\n }\n </div>\n @if (optionsCopy?.type !== MarkType.RADAR && optionsCopy?.type !== MarkType.CIRCLE_PACK) {\n @if (optionsCopy?.subType === MarkSubType.DONUT) {\n <pry-range\n [ngModel]=\"optionsCopy.innerRadius\"\n (ngModelChange)=\"changeInnerRadius($event)\"\n labelTranslate=\"@pry.widget.chart.innerRadius\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n }\n @for (variableDef of optionsCopy?.selectedVariables; track variableDef; let i = $index) {\n <div\n class=\"o-settings__popup__content__fields -condensed\"\n >\n @if (i === 1) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"aggregations\">{{ '@pry.widget.chart.encoding.group' | i18n }}</label>\n @if (i === 1) {\n <pry-select\n (ngModelChange)=\"changeAggregation($event)\"\n [items]=\"aggregations\"\n [ngModel]=\"optionsCopy.aggregation\"\n id=\"aggregations\"\n i18nPrefix=\"@pry.widget.chart.aggregation.\"\n ></pry-select>\n }\n </div>\n }\n @if (i !== 1 || optionsCopy.aggregation !== 'count') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"aggregation_property\">\n {{ axeLabel(i, optionsCopy) | i18n }}\n </label>\n <pry-select\n (ngModelChange)=\"changeProperty($event, i)\"\n [items]=\"(i !== 1 ? variableAttributes$ : possibleSecondaryAttributes$) | async\"\n [ngModel]=\"variableDef.name\"\n bindLabel=\"name\"\n bindValue=\"technicalName\"\n id=\"aggregation_property\"\n ></pry-select>\n </div>\n }\n <pry-edit-input\n label=\"@pry.widget.chart.dataLabel\"\n (ngModelChange)=\"changeLabel($event, i)\"\n [ngModel]=\"variableDef.label\"\n ></pry-edit-input>\n @if (variableDef.type === 'temporal') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_timeUnit\">{{ '@pry.widget.chart.timeUnit' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeTimeUnit($event, variableDef)\"\n [items]=\"timeUnits\"\n [ngModel]=\"variableDef.timeUnit\"\n i18nPrefix=\"@pry.widget.chart.timeUnitList.\"\n id=\"chart_timeUnit\"\n ></pry-select>\n </div>\n }\n @if (variableDef.type === 'quantitative' && optionsCopy?.type !== 'arc') {\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleOriginAtZero(variableDef, $event)\" [ngModel]=\"variableDef.origin0\"\n >{{ '@pry.widget.chart.origin' | i18n }}\n </pry-checkbox>\n </div>\n }\n </div>\n }\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n @if (optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR) {\n <pry-checkbox\n (ngModelChange)=\"toggleSeries($event)\"\n [ngModel]=\"!!optionsCopy.series\"\n [disabled]=\"\n this.optionsCopy.subType === MarkSubType.AREASTACKED ||\n this.optionsCopy.subType === MarkSubType.HISTOSTACKED\n \"\n >{{ '@pry.widget.chart.series' | i18n }}\n </pry-checkbox>\n }\n </div>\n @if (optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR && !!optionsCopy.series) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"chart_seriesAttr\">{{ '@pry.widget.chart.seriesAttr' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeries($event)\"\n [ngModel]=\"optionsCopy.series.groupBy!\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_seriesAttr\"\n ></pry-select>\n </div>\n }\n @if (\n (optionsCopy?.type === MarkType.ARC || optionsCopy?.type === MarkType.RADAR || !!optionsCopy.series) &&\n schemes\n ) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"chart_seriesScheme\" [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\">{{\n '@pry.widget.chart.seriesScheme' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme\"\n i18nPrefix=\"@pry.widget.chart.scheme.\"\n bindValue=\"id\"\n bindLabel=\"id\"\n ></pry-select>\n </div>\n }\n <div class=\"o-widget--chart-color-thumb\">\n @for (schemeColor of scheme(); track schemeColor) {\n <div\n class=\"o-widget--chart-color-thumb-item\"\n [title]=\"schemeColor\"\n [style.background-color]=\"schemeColor\"\n ></div>\n }\n </div>\n <div class=\"m-form-label-field\">\n @if (optionsCopy?.type !== MarkType.RADAR || !!optionsCopy.series) {\n <pry-checkbox\n (ngModelChange)=\"toggleSeriesLegend($event)\"\n [ngModel]=\"!!optionsCopy.legend!\"\n >{{ '@pry.widget.chart.seriesLegend' | i18n }}\n </pry-checkbox>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleTooltip($event)\" [ngModel]=\"!!optionsCopy.tooltip!\"\n >{{ '@pry.widget.chart.tooltip' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n }\n @if (optionsCopy?.type === MarkType.RADAR && optionsCopy.radar !== undefined) {\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.compare\"\n [items]=\"comparisons\"\n bindLabel=\"name\"\n bindValue=\"id\"\n ></pry-select>\n </div>\n @if (optionsCopy.radar.compare === 'item') {\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.props\"\n [items]=\"numericProperties$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n bindLabel=\"name\"\n bindValue=\"name\"\n ></pry-select>\n </div>\n }\n @if (optionsCopy.radar.compare === 'value') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_key\">{{ '@pry.widget.chart.comparison.key' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.keyProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_key\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_values\">{{ '@pry.widget.chart.comparison.values' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.valueProp\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_values\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_category\">{{\n '@pry.widget.chart.comparison.category' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.categoryProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_category\"\n ></pry-select>\n </div>\n }\n @if (schemes) {\n <label\n class=\"a-label\"\n for=\"chart_seriesScheme_radar\"\n [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\"\n >{{ '@pry.widget.chart.seriesScheme' | i18n }}</label\n >\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme_radar\"\n ></pry-select>\n }\n </div>\n }\n @if (optionsCopy?.type === MarkType.CIRCLE_PACK && optionsCopy.packing !== undefined) {\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_id\">{{ '@pry.widget.chart.circle.id' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.id\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_id\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_pid\">{{ '@pry.widget.chart.circle.pid' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.parentId\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_pid\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_field\">{{ '@pry.widget.chart.circle.field' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.packField\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_field\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_tooltip\">{{ '@pry.widget.chart.circle.tooltip' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.tooltip\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_tooltip\"\n ></pry-select>\n </div>\n </div>\n }\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-checkbox (ngModelChange)=\"toggleSpecToMerge($event)\" [ngModel]=\"!!optionsCopy.specToMerge\"\n >{{ '@pry.widget.chart.moreOptions' | i18n }}\n </pry-checkbox>\n @if (!!optionsCopy.specToMerge) {\n <textarea\n [ngModel]=\"advancedEdit\"\n (focusout)=\"updateAdvancedEdit($event)\"\n class=\"o-settings__popup__content__area\"\n [class.-invalid]=\"invalidJson\"\n ></textarea>\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n @if (isChartValid$ | async) {\n <div\n #vega\n [style.height.px]=\"\n ((widgetSize$ | async)?.height ?? 0) - ((displayHeader$ | async) ? 1 : 0) * WIDGET_HEADER_HEIGHT\n \"\n [style.width.px]=\"(widgetSize$ | async)?.width\"\n ></div>\n }\n\n @if (!(isChartValid$ | async)) {\n <div class=\"o-widget__choose-parameters\">\n <p class=\"a-p\">\n {{ '@pry.widget.chart.chooseParameters' | i18n }}\n </p>\n <button type=\"button\" (click)=\"openSettings()\" class=\"a-btn a-btn--primary\">\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"control\"></pry-icon>\n <span>{{ '@pry.widget.settings.title' | i18n }}</span>\n </button>\n </div>\n }\n </div>\n", dependencies: [{ kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryEditInputComponent, selector: "pry-edit-input", inputs: ["label", "editButtonTooltip", "confirmButtonTooltip"], outputs: ["validated"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i5.PryWidgetChartCssComponent, selector: "pry-widget-chart-css" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }] }); }
|
|
643
643
|
}
|
|
644
644
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetChartComponent, decorators: [{
|
|
645
645
|
type: Component,
|
|
646
|
-
args: [{ selector: 'pry-widget-chart', template: "<pry-widget-chart-css></pry-widget-chart-css>\n<div class=\"o-widget o-widget--chart\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [isDisable]=\"(filterDataForOptionsCopy$ | async)?.length === 0 || hasNoType(optionsCopy)\"\n [widgetIndex]=\"widgetIndex\"\n [open$]=\"open$\"\n [header]=\"header\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-edit-input\n label=\"@pry.widget.chart.title\"\n (ngModelChange)=\"changeChartTitle($event)\"\n [ngModel]=\"optionsCopy.customTitle ?? optionsCopy.title\"\n ></pry-edit-input>\n\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"(filterDataForOptionsCopy$ | async)?.length === 0; else data\">\n <p class=\"a-label a-label--help -error\">{{ '@pry.widget.chart.params.noParams' | i18n }}</p>\n </ng-container>\n <ng-template #data>\n <div *ngIf=\"optionsCopy?.type !== MarkType.RADAR\">\n {{ '@pry.widget.chart.params.multipleParams' | i18n }}{{ (filterDataForOptionsCopy$ | async)?.length }}\n </div>\n </ng-template>\n </div>\n\n <div *ngIf=\"optionsCopy\" class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_type\">{{ '@pry.widget.chart.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeType($event)\"\n [items]=\"typeOptions\"\n [ngModel]=\"optionsCopy.type + '-' + optionsCopy.subType\"\n i18nPrefix=\"@pry.widget.chart.markType.\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"chart_type\"\n ></pry-select>\n </div>\n </div>\n\n <ng-container *ngIf=\"optionsCopy?.type !== MarkType.RADAR && optionsCopy?.type !== MarkType.CIRCLE_PACK\">\n <ng-container *ngIf=\"optionsCopy?.subType === MarkSubType.DONUT\">\n <pry-range\n [ngModel]=\"optionsCopy.innerRadius\"\n (ngModelChange)=\"changeInnerRadius($event)\"\n labelTranslate=\"@pry.widget.chart.innerRadius\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </ng-container>\n\n <div\n *ngFor=\"let variableDef of optionsCopy?.selectedVariables; let i = index\"\n class=\"o-settings__popup__content__fields -condensed\"\n >\n <div class=\"m-form-label-field\" *ngIf=\"i === 1\">\n <label class=\"a-label\" for=\"aggregations\">{{ '@pry.widget.chart.encoding.group' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeAggregation($event)\"\n *ngIf=\"i === 1\"\n [items]=\"aggregations\"\n [ngModel]=\"optionsCopy.aggregation\"\n id=\"aggregations\"\n i18nPrefix=\"@pry.widget.chart.aggregation.\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"i !== 1 || optionsCopy.aggregation !== 'count'\">\n <label class=\"a-label\" for=\"aggregation_property\">\n {{ axeLabel(i, optionsCopy) | i18n }}\n </label>\n <pry-select\n (ngModelChange)=\"changeProperty($event, i)\"\n [items]=\"(i !== 1 ? variableAttributes$ : possibleSecondaryAttributes$) | async\"\n [ngModel]=\"variableDef.name\"\n bindLabel=\"name\"\n bindValue=\"technicalName\"\n id=\"aggregation_property\"\n ></pry-select>\n </div>\n\n <pry-edit-input\n label=\"@pry.widget.chart.dataLabel\"\n (ngModelChange)=\"changeLabel($event, i)\"\n [ngModel]=\"variableDef.label\"\n ></pry-edit-input>\n\n <div *ngIf=\"variableDef.type === 'temporal'\" class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_timeUnit\">{{ '@pry.widget.chart.timeUnit' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeTimeUnit($event, variableDef)\"\n [items]=\"timeUnits\"\n [ngModel]=\"variableDef.timeUnit\"\n i18nPrefix=\"@pry.widget.chart.timeUnitList.\"\n id=\"chart_timeUnit\"\n ></pry-select>\n </div>\n\n <div *ngIf=\"variableDef.type === 'quantitative' && optionsCopy?.type !== 'arc'\" class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleOriginAtZero(variableDef, $event)\" [ngModel]=\"variableDef.origin0\"\n >{{ '@pry.widget.chart.origin' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-checkbox\n (ngModelChange)=\"toggleSeries($event)\"\n [ngModel]=\"!!optionsCopy.series\"\n *ngIf=\"optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR\"\n [disabled]=\"\n this.optionsCopy.subType === MarkSubType.AREASTACKED ||\n this.optionsCopy.subType === MarkSubType.HISTOSTACKED\n \"\n >{{ '@pry.widget.chart.series' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n class=\"m-form-label-field\"\n *ngIf=\"optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR && !!optionsCopy.series\"\n >\n <label class=\"a-label\" for=\"chart_seriesAttr\">{{ '@pry.widget.chart.seriesAttr' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeries($event)\"\n [ngModel]=\"optionsCopy.series.groupBy!\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_seriesAttr\"\n ></pry-select>\n </div>\n\n <div\n class=\"m-form-label-field\"\n *ngIf=\"\n (optionsCopy?.type === MarkType.ARC || optionsCopy?.type === MarkType.RADAR || !!optionsCopy.series) &&\n schemes\n \"\n >\n <label class=\"a-label\" for=\"chart_seriesScheme\" [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\">{{\n '@pry.widget.chart.seriesScheme' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme\"\n i18nPrefix=\"@pry.widget.chart.scheme.\"\n bindValue=\"id\"\n bindLabel=\"id\"\n ></pry-select>\n </div>\n\n <div class=\"o-widget--chart-color-thumb\">\n <div\n *ngFor=\"let schemeColor of scheme()\"\n class=\"o-widget--chart-color-thumb-item\"\n [title]=\"schemeColor\"\n [style.background-color]=\"schemeColor\"\n ></div>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox\n (ngModelChange)=\"toggleSeriesLegend($event)\"\n [ngModel]=\"!!optionsCopy.legend!\"\n *ngIf=\"optionsCopy?.type !== MarkType.RADAR || !!optionsCopy.series\"\n >{{ '@pry.widget.chart.seriesLegend' | i18n }}\n </pry-checkbox>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleTooltip($event)\" [ngModel]=\"!!optionsCopy.tooltip!\"\n >{{ '@pry.widget.chart.tooltip' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy?.type === MarkType.RADAR && optionsCopy.radar !== undefined\">\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.compare\"\n [items]=\"comparisons\"\n bindLabel=\"name\"\n bindValue=\"id\"\n ></pry-select>\n </div>\n\n <ng-container *ngIf=\"optionsCopy.radar.compare === 'item'\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.props\"\n [items]=\"numericProperties$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n bindLabel=\"name\"\n bindValue=\"name\"\n ></pry-select>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy.radar.compare === 'value'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_key\">{{ '@pry.widget.chart.comparison.key' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.keyProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_key\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_values\">{{ '@pry.widget.chart.comparison.values' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.valueProp\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_values\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_category\">{{\n '@pry.widget.chart.comparison.category' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.categoryProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_category\"\n ></pry-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"schemes\">\n <label\n class=\"a-label\"\n for=\"chart_seriesScheme_radar\"\n [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\"\n >{{ '@pry.widget.chart.seriesScheme' | i18n }}</label\n >\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme_radar\"\n ></pry-select>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"optionsCopy?.type === MarkType.CIRCLE_PACK && optionsCopy.packing !== undefined\">\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_id\">{{ '@pry.widget.chart.circle.id' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.id\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_id\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_pid\">{{ '@pry.widget.chart.circle.pid' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.parentId\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_pid\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_field\">{{ '@pry.widget.chart.circle.field' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.packField\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_field\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_tooltip\">{{ '@pry.widget.chart.circle.tooltip' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.tooltip\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_tooltip\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-checkbox (ngModelChange)=\"toggleSpecToMerge($event)\" [ngModel]=\"!!optionsCopy.specToMerge\"\n >{{ '@pry.widget.chart.moreOptions' | i18n }}\n </pry-checkbox>\n\n <ng-container *ngIf=\"!!optionsCopy.specToMerge\">\n <textarea\n [ngModel]=\"advancedEdit\"\n (focusout)=\"updateAdvancedEdit($event)\"\n class=\"o-settings__popup__content__area\"\n [class.-invalid]=\"invalidJson\"\n ></textarea>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n <ng-container *ngIf=\"isChartValid$ | async\">\n <div\n #vega\n [style.height.px]=\"\n ((widgetSize$ | async)?.height ?? 0) - ((displayHeader$ | async) ? 1 : 0) * WIDGET_HEADER_HEIGHT\n \"\n [style.width.px]=\"(widgetSize$ | async)?.width\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"!(isChartValid$ | async)\">\n <div class=\"o-widget__choose-parameters\">\n <p class=\"a-p\">\n {{ '@pry.widget.chart.chooseParameters' | i18n }}\n </p>\n <button type=\"button\" (click)=\"openSettings()\" class=\"a-btn a-btn--primary\">\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"control\"></pry-icon>\n <span>{{ '@pry.widget.settings.title' | i18n }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n" }]
|
|
646
|
+
args: [{ selector: 'pry-widget-chart', template: "<pry-widget-chart-css></pry-widget-chart-css>\n<div class=\"o-widget o-widget--chart\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [isDisable]=\"(filterDataForOptionsCopy$ | async)?.length === 0 || hasNoType(optionsCopy)\"\n [widgetIndex]=\"widgetIndex\"\n [open$]=\"open$\"\n [header]=\"header\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-edit-input\n label=\"@pry.widget.chart.title\"\n (ngModelChange)=\"changeChartTitle($event)\"\n [ngModel]=\"optionsCopy.customTitle ?? optionsCopy.title\"\n ></pry-edit-input>\n <div class=\"m-form-label-field\">\n @if ((filterDataForOptionsCopy$ | async)?.length === 0) {\n <p class=\"a-label a-label--help -error\">{{ '@pry.widget.chart.params.noParams' | i18n }}</p>\n } @else {\n @if (optionsCopy?.type !== MarkType.RADAR) {\n <div>\n {{ '@pry.widget.chart.params.multipleParams' | i18n }}{{ (filterDataForOptionsCopy$ | async)?.length }}\n </div>\n }\n }\n </div>\n @if (optionsCopy) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_type\">{{ '@pry.widget.chart.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeType($event)\"\n [items]=\"typeOptions\"\n [ngModel]=\"optionsCopy.type + '-' + optionsCopy.subType\"\n i18nPrefix=\"@pry.widget.chart.markType.\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"chart_type\"\n ></pry-select>\n </div>\n }\n </div>\n @if (optionsCopy?.type !== MarkType.RADAR && optionsCopy?.type !== MarkType.CIRCLE_PACK) {\n @if (optionsCopy?.subType === MarkSubType.DONUT) {\n <pry-range\n [ngModel]=\"optionsCopy.innerRadius\"\n (ngModelChange)=\"changeInnerRadius($event)\"\n labelTranslate=\"@pry.widget.chart.innerRadius\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n }\n @for (variableDef of optionsCopy?.selectedVariables; track variableDef; let i = $index) {\n <div\n class=\"o-settings__popup__content__fields -condensed\"\n >\n @if (i === 1) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"aggregations\">{{ '@pry.widget.chart.encoding.group' | i18n }}</label>\n @if (i === 1) {\n <pry-select\n (ngModelChange)=\"changeAggregation($event)\"\n [items]=\"aggregations\"\n [ngModel]=\"optionsCopy.aggregation\"\n id=\"aggregations\"\n i18nPrefix=\"@pry.widget.chart.aggregation.\"\n ></pry-select>\n }\n </div>\n }\n @if (i !== 1 || optionsCopy.aggregation !== 'count') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"aggregation_property\">\n {{ axeLabel(i, optionsCopy) | i18n }}\n </label>\n <pry-select\n (ngModelChange)=\"changeProperty($event, i)\"\n [items]=\"(i !== 1 ? variableAttributes$ : possibleSecondaryAttributes$) | async\"\n [ngModel]=\"variableDef.name\"\n bindLabel=\"name\"\n bindValue=\"technicalName\"\n id=\"aggregation_property\"\n ></pry-select>\n </div>\n }\n <pry-edit-input\n label=\"@pry.widget.chart.dataLabel\"\n (ngModelChange)=\"changeLabel($event, i)\"\n [ngModel]=\"variableDef.label\"\n ></pry-edit-input>\n @if (variableDef.type === 'temporal') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_timeUnit\">{{ '@pry.widget.chart.timeUnit' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeTimeUnit($event, variableDef)\"\n [items]=\"timeUnits\"\n [ngModel]=\"variableDef.timeUnit\"\n i18nPrefix=\"@pry.widget.chart.timeUnitList.\"\n id=\"chart_timeUnit\"\n ></pry-select>\n </div>\n }\n @if (variableDef.type === 'quantitative' && optionsCopy?.type !== 'arc') {\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleOriginAtZero(variableDef, $event)\" [ngModel]=\"variableDef.origin0\"\n >{{ '@pry.widget.chart.origin' | i18n }}\n </pry-checkbox>\n </div>\n }\n </div>\n }\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n @if (optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR) {\n <pry-checkbox\n (ngModelChange)=\"toggleSeries($event)\"\n [ngModel]=\"!!optionsCopy.series\"\n [disabled]=\"\n this.optionsCopy.subType === MarkSubType.AREASTACKED ||\n this.optionsCopy.subType === MarkSubType.HISTOSTACKED\n \"\n >{{ '@pry.widget.chart.series' | i18n }}\n </pry-checkbox>\n }\n </div>\n @if (optionsCopy?.type !== MarkType.ARC && optionsCopy?.type !== MarkType.RADAR && !!optionsCopy.series) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"chart_seriesAttr\">{{ '@pry.widget.chart.seriesAttr' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeries($event)\"\n [ngModel]=\"optionsCopy.series.groupBy!\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_seriesAttr\"\n ></pry-select>\n </div>\n }\n @if (\n (optionsCopy?.type === MarkType.ARC || optionsCopy?.type === MarkType.RADAR || !!optionsCopy.series) &&\n schemes\n ) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"chart_seriesScheme\" [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\">{{\n '@pry.widget.chart.seriesScheme' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme\"\n i18nPrefix=\"@pry.widget.chart.scheme.\"\n bindValue=\"id\"\n bindLabel=\"id\"\n ></pry-select>\n </div>\n }\n <div class=\"o-widget--chart-color-thumb\">\n @for (schemeColor of scheme(); track schemeColor) {\n <div\n class=\"o-widget--chart-color-thumb-item\"\n [title]=\"schemeColor\"\n [style.background-color]=\"schemeColor\"\n ></div>\n }\n </div>\n <div class=\"m-form-label-field\">\n @if (optionsCopy?.type !== MarkType.RADAR || !!optionsCopy.series) {\n <pry-checkbox\n (ngModelChange)=\"toggleSeriesLegend($event)\"\n [ngModel]=\"!!optionsCopy.legend!\"\n >{{ '@pry.widget.chart.seriesLegend' | i18n }}\n </pry-checkbox>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleTooltip($event)\" [ngModel]=\"!!optionsCopy.tooltip!\"\n >{{ '@pry.widget.chart.tooltip' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n }\n @if (optionsCopy?.type === MarkType.RADAR && optionsCopy.radar !== undefined) {\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.compare\"\n [items]=\"comparisons\"\n bindLabel=\"name\"\n bindValue=\"id\"\n ></pry-select>\n </div>\n @if (optionsCopy.radar.compare === 'item') {\n <div class=\"m-form-label-field\">\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.props\"\n [items]=\"numericProperties$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n bindLabel=\"name\"\n bindValue=\"name\"\n ></pry-select>\n </div>\n }\n @if (optionsCopy.radar.compare === 'value') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_key\">{{ '@pry.widget.chart.comparison.key' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.keyProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_key\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_values\">{{ '@pry.widget.chart.comparison.values' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.valueProp\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_values\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"comparison_category\">{{\n '@pry.widget.chart.comparison.category' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.radar.categoryProp\"\n [items]=\"textProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"comparison_category\"\n ></pry-select>\n </div>\n }\n @if (schemes) {\n <label\n class=\"a-label\"\n for=\"chart_seriesScheme_radar\"\n [title]=\"'@pry.widget.chart.seriesSchemeAlt' | i18n\"\n >{{ '@pry.widget.chart.seriesScheme' | i18n }}</label\n >\n <pry-select\n (ngModelChange)=\"changeSeriesScheme($event)\"\n [ngModel]=\"optionsCopy.series?.scheme!\"\n [items]=\"schemes\"\n id=\"chart_seriesScheme_radar\"\n ></pry-select>\n }\n </div>\n }\n @if (optionsCopy?.type === MarkType.CIRCLE_PACK && optionsCopy.packing !== undefined) {\n <div class=\"o-settings__popup__content__fields -condensed\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_id\">{{ '@pry.widget.chart.circle.id' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.id\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_id\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_pid\">{{ '@pry.widget.chart.circle.pid' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.parentId\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_pid\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_field\">{{ '@pry.widget.chart.circle.field' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.packField\"\n [items]=\"numericProperties$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_field\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"chart_circle_tooltip\">{{ '@pry.widget.chart.circle.tooltip' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"trigger(); proposeTitle()\"\n [(ngModel)]=\"optionsCopy.packing.tooltip\"\n [items]=\"variableAttributes$ | async\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"chart_circle_tooltip\"\n ></pry-select>\n </div>\n </div>\n }\n <div class=\"o-settings__popup__content__fields -condensed\">\n <pry-checkbox (ngModelChange)=\"toggleSpecToMerge($event)\" [ngModel]=\"!!optionsCopy.specToMerge\"\n >{{ '@pry.widget.chart.moreOptions' | i18n }}\n </pry-checkbox>\n @if (!!optionsCopy.specToMerge) {\n <textarea\n [ngModel]=\"advancedEdit\"\n (focusout)=\"updateAdvancedEdit($event)\"\n class=\"o-settings__popup__content__area\"\n [class.-invalid]=\"invalidJson\"\n ></textarea>\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n @if (isChartValid$ | async) {\n <div\n #vega\n [style.height.px]=\"\n ((widgetSize$ | async)?.height ?? 0) - ((displayHeader$ | async) ? 1 : 0) * WIDGET_HEADER_HEIGHT\n \"\n [style.width.px]=\"(widgetSize$ | async)?.width\"\n ></div>\n }\n\n @if (!(isChartValid$ | async)) {\n <div class=\"o-widget__choose-parameters\">\n <p class=\"a-p\">\n {{ '@pry.widget.chart.chooseParameters' | i18n }}\n </p>\n <button type=\"button\" (click)=\"openSettings()\" class=\"a-btn a-btn--primary\">\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"control\"></pry-icon>\n <span>{{ '@pry.widget.settings.title' | i18n }}</span>\n </button>\n </div>\n }\n </div>\n" }]
|
|
647
647
|
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.PryI18nService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { vega: [{
|
|
648
648
|
type: ViewChild,
|
|
649
649
|
args: ['vega']
|
|
650
650
|
}] } });
|
|
651
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWNoYXJ0L2NvbXBvbmVudC93aWRnZXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtY2hhcnQvY29tcG9uZW50L3dpZGdldC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkcsT0FBTyxFQUNMLFdBQVcsRUFPWCxjQUFjLEVBQ2QsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixtQkFBbUIsRUFFbkIsY0FBYyxFQUNkLFNBQVMsRUFFVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFFBQVEsRUFJUixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sV0FBVyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxF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QUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQTd3QlUsb0JBQW9CO2tHQUFwQixvQkFBb0IsNktDakRqQyxpb2VBOFdBOzsyRkQ3VGEsb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQjtnS0FJVCxJQUFJO3NCQUF0QixTQUFTO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRpb24sXG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlU2ltcGxlVmFsdWUsXG4gIENoYXJ0T3B0aW9uLFxuICBDaGFydFN1YlR5cGVEZWZpbml0aW9uLFxuICBDaGFydFdpZGdldE9wdGlvbnMsXG4gIENsYXNzLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgQ29uZmlnU2VsZWN0b3JzLFxuICBEYXNoYm9hcmRTZWxlY3RvcnMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEZpZWxkLFxuICBGaWVsZFNlbGVjdG9ycyxcbiAgRmllbGRUeXBlLFxuICBJdGVtLFxuICBJdGVtVXRpbHMsXG4gIE1hcmtTdWJUeXBlLFxuICBNYXJrVHlwZSxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFZhcmlhYmxlRGVmaW5pdGlvbixcbiAgVmVnYUNvbG9yVHlwZSxcbiAgVmVnYVR5cGUsXG4gIFdJREdFVF9IRUFERVJfSEVJR0hUXG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsL2VzNic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlbGF5LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUaW1lVW5pdCwgVmlldyB9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IGVtYmVkLCB7IHZlZ2EgfSBmcm9tICd2ZWdhLWVtYmVkJztcbmltcG9ydCB7IG1lcmdlRGVlcCwgVG9wTGV2ZWxTcGVjIH0gZnJvbSAndmVnYS1saXRlJztcbmltcG9ydCB7IGZvbnRDb25maWcgfSBmcm9tICd2ZWdhLWxpdGUvYnVpbGQvc3JjL2NvbmZpZyc7XG5pbXBvcnQgeyBWZWdhRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi92ZWdhLWVycm9yLmhhbmRsZXInO1xuaW1wb3J0IHsgdmVnYUJhc2VDb25mLCB2ZWdhQ2lyY2xlUGFja0NvbmYsIHZlZ2FSYWRhckNvbmYgfSBmcm9tICcuL3ZlZ2Etc3BlYy5jb25zdGFudCc7XG5cbmV4cG9ydCB0eXBlIFJhZGFyVmFsdWUgPSB7XG4gIGNhdGVnb3J5OiBudW1iZXI7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxudmVnYS5zY2hlbWUoJ0tPL1cvT0snLCBbJyNDMDREM0YnLCAnI0ZEOTg0MycsICcjOUFCRTI5J10pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1jaGFydC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0Q2hhcnRDb21wb25lbnQgZXh0ZW5kcyBEYXRhV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZlZ2EnKSB2ZWdhITogRWxlbWVudFJlZjtcbiAgdHlwZU9wdGlvbnM6IHtcbiAgICB0eXBlOiBNYXJrVHlwZTtcbiAgICBzdWJUeXBlOiBNYXJrU3ViVHlwZTtcbiAgICBsYWJlbDogTWFya1R5cGUgfCBNYXJrU3ViVHlwZTtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZWQ/OiBzdHJpbmc7XG4gIH1bXSA9IFtdO1xuICBtYXJrVHlwZXM6IE1hcmtUeXBlW10gPSBbXTtcbiAgc3ViVHlwZXM/OiBQYXJ0aWFsPENoYXJ0U3ViVHlwZURlZmluaXRpb24+O1xuICBzY2hlbWVzPzogeyBpZDogVmVnYUNvbG9yVHlwZTsgdHJhbnNsYXRlZDogc3RyaW5nIH1bXTtcbiAgTWFya1R5cGUgPSBNYXJrVHlwZTtcbiAgTWFya1N1YlR5cGUgPSBNYXJrU3ViVHlwZTtcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQgPSBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZTtcblxuICB0aW1lVW5pdHM6IFRpbWVVbml0W10gPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VycycsICdtaW51dGVzJ107XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPENoYXJ0V2lkZ2V0T3B0aW9ucz47XG4gIG9wdGlvbnNDb3B5OiBDaGFydFdpZGdldE9wdGlvbnMgPSB7fSBhcyBDaGFydFdpZGdldE9wdGlvbnM7XG4gIGNsYXNzZXMkOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuICBmaWVsZHMkOiBPYnNlcnZhYmxlPEZpZWxkW10+O1xuICB2YXJpYWJsZXMkOiBPYnNlcnZhYmxlPFZhcmlhYmxlRGVmaW5pdGlvbltdPjtcbiAgdmVnYUxpdGVTcGVjJDogT2JzZXJ2YWJsZTxUb3BMZXZlbFNwZWM+O1xuICB2YXJpYWJsZUF0dHJpYnV0ZXMkOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZVtdPjtcbiAgcG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIHRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICBpdGVtcyQ6IE9ic2VydmFibGU8SXRlbVtdPjtcbiAgZmlsdGVyRGF0YUZvck9wdGlvbnMkOiBPYnNlcnZhYmxlPEl0ZW1bXT47XG4gIGZpbHRlckRhdGFGb3JPcHRpb25zQ29weSQ6IE9ic2VydmFibGU8SXRlbVtdPjtcbiAgdmFyaWFibGVzOiBWYXJpYWJsZURlZmluaXRpb25bXSA9IFtdO1xuICBhZ2dyZWdhdGlvbnM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlQXR0cmlidXRlczogQXR0cmlidXRlW10gPSBbXTtcbiAgZmllbGRzOiBGaWVsZFtdID0gW107XG4gIGlzQ2hhcnRWYWxpZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG51bWVyaWNQcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIHRleHRQcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIGNvbXBhcmlzb25zID0gW1xuICAgIHtcbiAgICAgIGlkOiAnaXRlbScsXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQuY29tcGFyaXNvbi5pdGVtJylcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndmFsdWUnLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNvbXBhcmlzb24udmFsdWUnKVxuICAgIH1cbiAgXTtcbiAgdmlldz86IFZpZXc7XG4gIHRyaWdnZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgaW52YWxpZEpzb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFByeUkxOG5TZXJ2aWNlLFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuY2hhcnRPcHRpb24pLnN1YnNjcmliZSgoY2hhcnRPcHRpb25zOiBDaGFydE9wdGlvbikgPT4ge1xuICAgICAgdGhpcy5hZ2dyZWdhdGlvbnMgPSBjaGFydE9wdGlvbnMuYWdncmVnYXRpb247XG4gICAgICB0aGlzLnNjaGVtZXMgPSBjaGFydE9wdGlvbnMuY29sb3IubWFwKChzY2hlbWUpID0+ICh7IGlkOiBzY2hlbWUsIHRyYW5zbGF0ZWQ6ICcnIH0pKTtcbiAgICAgIHRoaXMubWFya1R5cGVzID0gY2hhcnRPcHRpb25zLnR5cGU7XG4gICAgICB0aGlzLnN1YlR5cGVzID0gY2hhcnRPcHRpb25zLnN1YlR5cGU7XG5cbiAgICAgIHRoaXMudHlwZU9wdGlvbnMgPSB0aGlzLm1hcmtUeXBlc1xuICAgICAgICAubWFwKCh0eXBlOiBNYXJrVHlwZSkgPT4ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJUeXBlcyAmJiB0aGlzLnN1YlR5cGVzW3R5cGVdID8gdGhpcy5zdWJUeXBlc1t0eXBlXS5tYXAoKHN1YlR5cGUpID0+ICh7IHR5cGUsIHN1YlR5cGUgfSkpIDogW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+IFsuLi5wLCAuLi5jXSwgW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbnM6IGFueSkgPT4gKHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGlkOiBgJHtvcHRpb25zLnR5cGV9LSR7b3B0aW9ucy5zdWJUeXBlfWAsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuREVGQVVMVCA/IG9wdGlvbnMudHlwZSA6IG9wdGlvbnMuc3ViVHlwZVxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcCgob3B0aW9uczogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgdHJhbnNsYXRlZDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0Lm1hcmtUeXBlLicgKyBvcHRpb25zLmxhYmVsKVxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnR5cGVPcHRpb25zLnNvcnQoKGEsIGIpID0+IGEudHJhbnNsYXRlZD8ubG9jYWxlQ29tcGFyZShiLnRyYW5zbGF0ZWQgPz8gJycpID8/IC0xKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsYXNzZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3Nlcyk7XG4gICAgdGhpcy5maWVsZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRzKTtcblxuICAgIHRoaXMudmFyaWFibGVBdHRyaWJ1dGVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzdWx0U2V0JCwgdGhpcy5jbGFzc2VzJCwgdGhpcy5maWVsZHMkXSkucGlwZShcbiAgICAgIG1hcCgoW3Jlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzXSkgPT4gSXRlbVV0aWxzLmdldEF0dHJpYnV0ZXNGcm9tUnMocmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpKSxcbiAgICAgIG1hcCgoZmllbGRzOiBBdHRyaWJ1dGVbXSkgPT4gZmllbGRzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpKSxcbiAgICAgIG1hcCgocHJvcHMpID0+IFdpZGdldENoYXJ0Q29tcG9uZW50LnVuaXF1ZUF0dHJpYnV0ZXNCeU5hbWVzKHByb3BzKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLnN1YnNjcmliZSgoYXR0cnMpID0+ICh0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyA9IGF0dHJzKSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5maWVsZHMkLnN1YnNjcmliZSgoYXR0cnMpID0+ICh0aGlzLmZpZWxkcyA9IGF0dHJzKSkpO1xuXG4gICAgdGhpcy52YXJpYWJsZXMkID0gdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLnBpcGUoXG4gICAgICBtYXAoKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMubWFwKFxuICAgICAgICAgIChhdHRyKSA9PlxuICAgICAgICAgICAgKCh7XG4gICAgICAgICAgICAgIG5hbWU6IGF0dHIudGVjaG5pY2FsTmFtZSxcbiAgICAgICAgICAgICAgbGFiZWw6IGF0dHIubmFtZSxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy50cmFuc2xhdGVUb1ZlZ2FUeXBlKGF0dHIuZmllbGQudHlwZSwgYXR0ci5uYW1lKVxuICAgICAgICAgICAgfSkgYXMgVmFyaWFibGVEZWZpbml0aW9uKSA/PyBbXVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5vcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YXJpYWJsZXMkLFxuICAgICAgdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiBtYW5pZmVzdC5vcHRpb25zIGFzIENoYXJ0V2lkZ2V0T3B0aW9ucykpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhcmlhYmxlcywgb3B0aW9uc10pID0+ICh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAoKHZhcmlhYmxlc1swXT8ubGFiZWwgPz8gJycpICsgJywgJyArICh2YXJpYWJsZXNbMV0/LmxhYmVsID8/ICcnKSkucmVwbGFjZSgvXiwgJC8sICcnKSxcbiAgICAgICAgc2VsZWN0ZWRWYXJpYWJsZXM6IG9wdGlvbnM/LnNlbGVjdGVkVmFyaWFibGVzID8/IFt7fSwge31dLFxuICAgICAgICAvLyBIZXJlLCB3ZSBkbyBub3QgcHJlc3VtZSBvZiB0aGUgdHlwZSBvZiBncmFwaCB0aGF0IHRoZSB1c2VyIHdhbnRzLCBhbmQgcHJlZmVyIHRvIGRpc3BsYXkgYSBidXR0b24gdG8gZ28gdG8gcGFyYW1zXG4gICAgICAgIHR5cGU6IG9wdGlvbnM/LnR5cGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhZ2dyZWdhdGlvbjogb3B0aW9ucz8uYWdncmVnYXRpb24gPz8gQWdncmVnYXRpb24uQ09VTlQsXG4gICAgICAgIHRvb2x0aXA6IG9wdGlvbnM/LnRvb2x0aXAgPz8gdHJ1ZSxcbiAgICAgICAgbGVnZW5kOiBvcHRpb25zLmxlZ2VuZCA/PyB0cnVlLFxuICAgICAgICBsb2NhbGU6ICdmcidcbiAgICAgIH0pKVxuICAgICk7XG5cbiAgICB0aGlzLml0ZW1zJCA9IHRoaXMucmVzdWx0U2V0JC5waXBlKFxuICAgICAgZmlsdGVyKChyZXN1bHRTZXQpID0+ICEhcmVzdWx0U2V0KSxcbiAgICAgIG1hcCgocmVzdWx0U2V0KSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHRTZXQ/Lml0ZW1zKVxuICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+IHJlc3VsdFNldC5pdGVtc1tjbGFzc0lkXSlcbiAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBbLi4ucHJldiwgLi4uY3Vycl0sIFtdKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLFxuICAgICAgdGhpcy5pdGVtcyQsXG4gICAgICB0aGlzLmZpZWxkcyQsXG4gICAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhcmlhYmxlRmllbGRzLCBpdGVtcywgZmllbGRzLCBfXSkgPT4ge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVGaWVsZHNcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgIC8vIEtlZXAgb25seSBudW1lcmljIHZhbHVlcyB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zQ29weS5hZ2dyZWdhdGlvbiB8fFxuICAgICAgICAgICAgICBbQWdncmVnYXRpb24uTk9ORSwgQWdncmVnYXRpb24uRElTVElOQ1QsIEFnZ3JlZ2F0aW9uLkNPVU5UXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLmlkID09PSBhdHRyaWJ1dGUuZmllbGQuaWQpO1xuICAgICAgICAgICAgICByZXR1cm4gW0ZpZWxkVHlwZS5ERUNJTUFMLCBGaWVsZFR5cGUuSU5TVEFOVCwgRmllbGRUeXBlLkxPTkcsIEZpZWxkVHlwZS5JTlRFR0VSXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICBmaWVsZD8udHlwZSA/PyBGaWVsZFR5cGUuU1RSSU5HXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubGFiZWwpICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaXRlbS5hdHRyaWJ1dGVzKS5pbmNsdWRlcyhhdHRyaWJ1dGUudGVjaG5pY2FsTmFtZSkgJiZcbiAgICAgICAgICAgICAgICAhIShpdGVtLmF0dHJpYnV0ZXNbdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1swXS5sYWJlbF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgKGl0ZW0uYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBtYXAoKHByb3BzKSA9PiBXaWRnZXRDaGFydENvbXBvbmVudC51bmlxdWVBdHRyaWJ1dGVzQnlOYW1lcyhwcm9wcykpXG4gICAgKTtcblxuICAgIHRoaXMubnVtZXJpY1Byb3BlcnRpZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyQsXG4gICAgICB0aGlzLml0ZW1zJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMudHJpZ2dlckNhbGN1bGF0ZVBvc3NpYmxlQXR0cmlidXRlcyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbdmFyaWFibGVGaWVsZHMsIGl0ZW1zLCBmaWVsZHMsIF9dKSA9PiB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZUZpZWxkc1xuICAgICAgICAgIC5maWx0ZXIoKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLmlkID09PSBhdHRyaWJ1dGUuZmllbGQuaWQpO1xuICAgICAgICAgICAgcmV0dXJuIFtGaWVsZFR5cGUuREVDSU1BTCwgRmllbGRUeXBlLklOU1RBTlQsIEZpZWxkVHlwZS5MT05HLCBGaWVsZFR5cGUuSU5URUdFUl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIGZpZWxkPy50eXBlID8/IEZpZWxkVHlwZS5TVFJJTkdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKGF0dHJpYnV0ZS50ZWNobmljYWxOYW1lKSAmJlxuICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbYXR0cmlidXRlLnRlY2huaWNhbE5hbWVdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChwcm9wcykgPT4ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0Q2hhcnRDb21wb25lbnQudW5pcXVlQXR0cmlidXRlc0J5TmFtZXMocHJvcHMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy50ZXh0UHJvcGVydGllcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMudmFyaWFibGVBdHRyaWJ1dGVzJCxcbiAgICAgIHRoaXMuaXRlbXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy50cmlnZ2VyQ2FsY3VsYXRlUG9zc2libGVBdHRyaWJ1dGVzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt2YXJpYWJsZUZpZWxkcywgaXRlbXMsIGZpZWxkcywgX10pID0+IHtcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlRmllbGRzXG4gICAgICAgICAgLmZpbHRlcigoYXR0cmlidXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQuaWQgPT09IGF0dHJpYnV0ZS5maWVsZC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gW0ZpZWxkVHlwZS5TVFJJTkcsIEZpZWxkVHlwZS5LRVlXT1JEXS5pbmNsdWRlcyhmaWVsZD8udHlwZSA/PyBGaWVsZFR5cGUuSU5URUdFUik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKGF0dHJpYnV0ZS50ZWNobmljYWxOYW1lKSAmJlxuICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbYXR0cmlidXRlLnRlY2huaWNhbE5hbWVdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChwcm9wcykgPT4ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0Q2hhcnRDb21wb25lbnQudW5pcXVlQXR0cmlidXRlc0J5TmFtZXMocHJvcHMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5maWx0ZXJEYXRhRm9yT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLml0ZW1zJCwgdGhpcy5vcHRpb25zJCwgdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW2l0ZW1zLCBvcHRpb25zXSkgPT4gb3B0aW9ucy5zZWxlY3RlZFZhcmlhYmxlcyAmJiBvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmxlbmd0aCA+IDApLFxuICAgICAgbWFwKChbaXRlbXMsIG9wdGlvbnMsIHZhcmlhYmxlc10pID0+IFdpZGdldENoYXJ0Q29tcG9uZW50Lm1hdGNoaW5nSXRlbXMoaXRlbXMsIG9wdGlvbnMsIHZhcmlhYmxlcykpXG4gICAgKTtcblxuICAgIHRoaXMuZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5pdGVtcyQsXG4gICAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkLnBpcGUoZGVsYXkoMjAwKSksXG4gICAgICB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyRcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKChbaXRlbXMsIF9dKSA9PiB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzICYmIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXMubGVuZ3RoID4gMCksXG4gICAgICBtYXAoKFtpdGVtcywgXywgdmFyaWFibGVzXSkgPT4gV2lkZ2V0Q2hhcnRDb21wb25lbnQubWF0Y2hpbmdJdGVtcyhpdGVtcywgdGhpcy5vcHRpb25zQ29weSwgdmFyaWFibGVzKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQucGlwZShmaWx0ZXIoKG9wdCkgPT4gISFvcHQpKS5zdWJzY3JpYmUoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFkdmFuY2VkRWRpdChKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlKSk7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkudHlwZSA9ICF0aGlzLm1hcmtUeXBlcy5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LnR5cGUpXG4gICAgICAgICAgPyB0aGlzLm1hcmtUeXBlc1swXVxuICAgICAgICAgIDogdGhpcy5vcHRpb25zQ29weS50eXBlO1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnN1YlR5cGUgPSB0aGlzLm9wdGlvbnNDb3B5LnN1YlR5cGUgPz8gTWFya1N1YlR5cGUuREVGQVVMVDtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5hZ2dyZWdhdGlvbiA9ICF0aGlzLmFnZ3JlZ2F0aW9ucy5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uKVxuICAgICAgICAgID8gdGhpcy5hZ2dyZWdhdGlvbnNbMF1cbiAgICAgICAgICA6IHRoaXMub3B0aW9uc0NvcHkuYWdncmVnYXRpb247XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnNlcmllcykge1xuICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzLnNjaGVtZSA9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcz8uc2NoZW1lICYmXG4gICAgICAgICAgICB0aGlzLnNjaGVtZXMgJiZcbiAgICAgICAgICAgICF0aGlzLnNjaGVtZXMuZmluZCgocykgPT4gcy5pZCA9PT0gdGhpcy5vcHRpb25zQ29weT8uc2VyaWVzPy5zY2hlbWUpXG4gICAgICAgICAgICAgID8gdGhpcy5zY2hlbWVzWzBdLmlkXG4gICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zQ29weS5zZXJpZXM/LnNjaGVtZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy52ZWdhTGl0ZVNwZWMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMud2luZG93TWFuaWZlc3QpLFxuICAgICAgdGhpcy5tYW5pZmVzdCQsXG4gICAgICB0aGlzLndpZGdldFNpemUkLFxuICAgICAgdGhpcy5maWx0ZXJEYXRhRm9yT3B0aW9ucyQsXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5kaXNwbGF5SGVhZGVyJCxcbiAgICAgIHRoaXMudmFyaWFibGVBdHRyaWJ1dGVzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt3aW5kb3dNYW5pZmVzdCwgd2lkZ2V0TWFuaWZlc3QsIHNpemUsIGRhdGEsIG9wdGlvbnMsIGRpc3BsYXlIZWFkZXIsIHZhcmlhYmxlRmllbGRdKSA9PiB7XG4gICAgICAgIGxldCBzcGVjID0gdmVnYUJhc2VDb25mO1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgIGNhc2UgTWFya1R5cGUuUkFEQVI6XG4gICAgICAgICAgICBzcGVjID0gdmVnYVJhZGFyQ29uZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFya1R5cGUuQ0lSQ0xFX1BBQ0s6XG4gICAgICAgICAgICBzcGVjID0gdmVnYUNpcmNsZVBhY2tDb25mO1xuICAgICAgICB9XG5cbiAgICAgICAgc3BlYy50aXRsZSA9IG9wdGlvbnMuY3VzdG9tVGl0bGUgPz8gb3B0aW9ucy50aXRsZTtcblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgIGNhc2UgTWFya1R5cGUuUkFEQVI6XG4gICAgICAgICAgICBzcGVjLnNpZ25hbHNbMF0udXBkYXRlID0gc2l6ZS53aWR0aCA+IHNpemUuaGVpZ2h0ID8gJ2hlaWdodCAvIDInIDogJ3dpZHRoIC8gMic7XG4gICAgICAgICAgICBzcGVjLmRhdGFbMF0udmFsdWVzID0gV2lkZ2V0Q2hhcnRDb21wb25lbnQuYnVpbGREYXRhVmVnYVJhZGFyKGRhdGEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlYy5zY2FsZXNbMl0ucmFuZ2Uuc2NoZW1lID0gb3B0aW9ucy5zZXJpZXM/LnNjaGVtZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFya1R5cGUuQ0lSQ0xFX1BBQ0s6XG4gICAgICAgICAgICBzcGVjLmRhdGFbMF0udmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgICAgICBzcGVjLmRhdGFbMV0udHJhbnNmb3JtWzBdLmtleSA9ICdhdHRyaWJ1dGVzLicgKyBvcHRpb25zLnBhY2tpbmc/LmlkICsgJy52YWx1ZSc7XG4gICAgICAgICAgICBzcGVjLmRhdGFbMV0udHJhbnNmb3JtWzBdLnBhcmVudEtleSA9ICdhdHRyaWJ1dGVzLicgKyBvcHRpb25zLnBhY2tpbmc/LnBhcmVudElkICsgJy52YWx1ZSc7XG4gICAgICAgICAgICBzcGVjLmRhdGFbMV0udHJhbnNmb3JtWzFdLmZpZWxkID0gJ2F0dHJpYnV0ZXMuJyArIG9wdGlvbnMucGFja2luZz8ucGFja0ZpZWxkICsgJy52YWx1ZSc7XG4gICAgICAgICAgICBzcGVjLm1hcmtzWzBdLmVuY29kZS5lbnRlci50b29sdGlwLnNpZ25hbCA9IGBkYXR1bS5hdHRyaWJ1dGVzLiR7XG4gICAgICAgICAgICAgIG9wdGlvbnMucGFja2luZz8udG9vbHRpcCA/PyBvcHRpb25zLnBhY2tpbmc/LmlkXG4gICAgICAgICAgICB9LnZhbHVlICsgJyA6ICcgKyBkYXR1bS5hdHRyaWJ1dGVzLiR7b3B0aW9ucy5wYWNraW5nPy5wYWNrRmllbGR9LnZhbHVlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzcGVjLmRhdGEgPSB7IHZhbHVlczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSkgfTtcbiAgICAgICAgICAgIHNwZWMubGF5ZXIgPSBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUsXG4gICAgICAgICAgICAgICAgICBwb2ludDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID09PSBNYXJrVHlwZS5QT0lOVCB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLldJVEhfTElORVNfQU5EX1BPSU5UUyB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLldJVEhfUE9JTlRTLFxuICAgICAgICAgICAgICAgICAgbGluZTogb3B0aW9ucy50eXBlID09PSBNYXJrVHlwZS5MSU5FIHx8IG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuV0lUSF9MSU5FU19BTkRfUE9JTlRTLFxuICAgICAgICAgICAgICAgICAgaW5uZXJSYWRpdXM6IG9wdGlvbnMuaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICAgICAgICB0b29sdGlwOiBvcHRpb25zLnRvb2x0aXAgPz8gdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFdpZGdldENoYXJ0Q29tcG9uZW50LmNhbGN1bGF0ZUVuY29kaW5nKG9wdGlvbnMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICAgICAgICAgIHNwZWMubGF5ZXJbMF0ubWFyay5maWxsID0gb3B0aW9ucy5maWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuQVJFQVNUQUNLRUQgfHwgb3B0aW9ucy5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5ISVNUT1NUQUNLRUQpIHtcbiAgICAgICAgICAgICAgc3BlYy5kYXRhLnRyYW5zZm9ybSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBieTogW29wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubmFtZV0sXG4gICAgICAgICAgICAgICAgICBzb3J0OiB7IGZpZWxkOiBvcHRpb25zLnNlcmllcz8uZ3JvdXBCeSB9LFxuICAgICAgICAgICAgICAgICAgZmllbGQ6IG9wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMV0ubmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZURlZXAoc3BlYywgeyBjb25maWc6IGZvbnRDb25maWcoJ1VidW50dSwgc2Fucy1zZXJpZicpIH0gYXMgYW55LCBvcHRpb25zLnNwZWNUb01lcmdlKTtcblxuICAgICAgICBpZiAoISFvcHRpb25zLnNwZWNUb01lcmdlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3BlYykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuaXNDaGFydFZhbGlkJCA9IHRoaXMub3B0aW9ucyQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgISFvcHRpb25zLnR5cGUgJiZcbiAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHZhcmlhYmxlcyB0byBkcmF3IHRoZSBncmFwaFxuICAgICAgICAgIChvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmZpbHRlcigodikgPT4gISF2LnR5cGUpLmxlbmd0aCA+IDEgfHxcbiAgICAgICAgICAgIChvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmZpbHRlcigodikgPT4gISF2LnR5cGUpLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgKG9wdGlvbnMuYWdncmVnYXRpb24gPT09IEFnZ3JlZ2F0aW9uLkNPVU5UIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hZ2dyZWdhdGlvbiA9PT0gQWdncmVnYXRpb24uRElTVElOQ1QgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFnZ3JlZ2F0aW9uID09PSBBZ2dyZWdhdGlvbi5OT05FKSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy52ZWdhTGl0ZVNwZWMkLCB0aGlzLnRyaWdnZXIkXSkuc3Vic2NyaWJlKChbc3BlYywgX10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmVnYSkge1xuICAgICAgICAgIHRoaXMudmlldz8uZmluYWxpemUoKTtcbiAgICAgICAgICBlbWJlZCh0aGlzLnZlZ2EubmF0aXZlRWxlbWVudCwgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzcGVjKSksIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgcmVuZGVyZXI6ICdzdmcnLFxuICAgICAgICAgICAgZm9ybWF0TG9jYWxlOlxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmxvY2FsZSA9PT0gJ2ZyJ1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsOiAnLCcsXG4gICAgICAgICAgICAgICAgICAgIHRob3VzYW5kczogJ1xcdTAwYTAnLFxuICAgICAgICAgICAgICAgICAgICBncm91cGluZzogWzNdLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogWycnLCAnXFx1MDBhMOKCrCddLFxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50OiAnXFx1MjAyZiUnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWw6ICcuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhvdXNhbmRzOiAnLCcsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nOiBbM10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBbJyQnLCAnJ11cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB2aWV3Q2xhc3M6IFZlZ2FFcnJvckhhbmRsZXJcbiAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+ICh0aGlzLnZpZXcgPSByZXN1bHQudmlldykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyJC5uZXh0KCksIDEwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnRyaWdnZXIkLm5leHQoKTtcbiAgfVxuXG4gIHN0YXRpYyBjYWxjdWxhdGVFbmNvZGluZyhvcHRpb25zOiBDaGFydFdpZGdldE9wdGlvbnMpIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSBvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzID8/IFt7fSwge31dO1xuICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICBjYXNlIE1hcmtUeXBlLkFSQzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aGV0YToge1xuICAgICAgICAgICAgZmllbGQ6IGBhdHRyaWJ1dGVzLiR7dmFyaWFibGVzWzFdLm5hbWV9LnZhbHVlYCxcbiAgICAgICAgICAgIHRpdGxlOiB2YXJpYWJsZXNbMV0ubGFiZWwsXG4gICAgICAgICAgICB0eXBlOiB2YXJpYWJsZXNbMV0udHlwZSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZTogb3B0aW9ucy5hZ2dyZWdhdGlvbiA/PyBBZ2dyZWdhdGlvbi5DT1VOVFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgIGZpZWxkOiBgYXR0cmlidXRlcy4ke3ZhcmlhYmxlc1swXS5uYW1lfS52YWx1ZWAsXG4gICAgICAgICAgICB0aXRsZTogdmFyaWFibGVzWzBdLmxhYmVsLFxuICAgICAgICAgICAgdHlwZTogdmFyaWFibGVzWzBdLnR5cGUsXG4gICAgICAgICAgICBsZWdlbmQ6IG9wdGlvbnMubGVnZW5kID8/IHRydWUsXG4gICAgICAgICAgICBzY2FsZTogb3B0aW9ucy5zY2FsZSA/PyB7IHNjaGVtZTogb3B0aW9ucy5zZXJpZXM/LnNjaGVtZSA/PyAnY2F0ZWdvcnkyMGMnIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICBjYXNlIE1hcmtUeXBlLlJBREFSOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBlbmNvZGluZyA9IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogYGF0dHJpYnV0ZXMuJHt2YXJpYWJsZXNbMF0ubmFtZX0udmFsdWVgLFxuICAgICAgICAgICAgdGl0bGU6IHZhcmlhYmxlc1swXS5sYWJlbCxcbiAgICAgICAgICAgIHR5cGU6IHZhcmlhYmxlc1swXS50eXBlLFxuICAgICAgICAgICAgdGltZVVuaXQ6IHZhcmlhYmxlc1swXS50eXBlID09PSBWZWdhVHlwZS5URU1QT1JBTCA/IHZhcmlhYmxlc1swXS50aW1lVW5pdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJpbjogb3B0aW9ucy5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5ISVNUT0dSQU0sXG4gICAgICAgICAgICBheGlzOiB2YXJpYWJsZXNbMF0uYXhpc09wdGlvbnMsXG4gICAgICAgICAgICBzY2FsZToge1xuICAgICAgICAgICAgICAvLyBGb3JjZSBhIGZhbHNlIHZhbHVlIGhlcmUgc28gdGhhdCB2ZWdhIHVuZGVyc3RhbmQgcHJvcGVybHlcbiAgICAgICAgICAgICAgemVybzogISF2YXJpYWJsZXNbMF0ub3JpZ2luMCxcbiAgICAgICAgICAgICAgdHlwZTogV2lkZ2V0Q2hhcnRDb21wb25lbnQuaXNUaW1lVW5pdFVUQyh2YXJpYWJsZXNbMF0pID8gJ3V0YycgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgIGZpZWxkOiBgYXR0cmlidXRlcy4ke3ZhcmlhYmxlc1sxXS5uYW1lfS52YWx1ZWAsXG4gICAgICAgICAgICB0aXRsZTogdmFyaWFibGVzWzFdLmxhYmVsLFxuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy5hZ2dyZWdhdGlvbiA9PT0gQWdncmVnYXRpb24uQ09VTlQgPyBWZWdhVHlwZS5RVUFOVElUQVRJVkUgOiB2YXJpYWJsZXNbMV0udHlwZSxcbiAgICAgICAgICAgIHRpbWVVbml0OiB2YXJpYWJsZXNbMV0udHlwZSA9PT0gVmVnYVR5cGUuVEVNUE9SQUwgPyB2YXJpYWJsZXNbMV0udGltZVVuaXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzOiB2YXJpYWJsZXNbMV0uYXhpc09wdGlvbnMsXG4gICAgICAgICAgICBhZ2dyZWdhdGU6IG9wdGlvbnMuYWdncmVnYXRpb24gIT09IEFnZ3JlZ2F0aW9uLk5PTkUgPyBvcHRpb25zLmFnZ3JlZ2F0aW9uIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgICAgemVybzogdmFyaWFibGVzWzFdLm9yaWdpbjAsXG4gICAgICAgICAgICAgIHR5cGU6IFdpZGdldENoYXJ0Q29tcG9uZW50LmlzVGltZVVuaXRVVEModmFyaWFibGVzWzFdKSA/ICd1dGMnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXMpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZW5jb2RpbmcuY29sb3IgPSB7XG4gICAgICAgICAgICB0aXRsZTogYCR7b3B0aW9ucy5zZXJpZXMuZ3JvdXBCeX1gLFxuICAgICAgICAgICAgZmllbGQ6IGBhdHRyaWJ1dGVzLiR7b3B0aW9ucy5zZXJpZXMuZ3JvdXBCeX0udmFsdWVgLFxuICAgICAgICAgICAgbGVnZW5kOiBvcHRpb25zLmxlZ2VuZFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzLnNjaGVtZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZW5jb2RpbmcuY29sb3Iuc2NhbGUgPSB7IHNjaGVtZTogb3B0aW9ucy5zZXJpZXMuc2NoZW1lIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYnVpbGREYXRhVmVnYVJhZGFyKGl0ZW1zOiBJdGVtW10sIG9wdGlvbnM6IENoYXJ0V2lkZ2V0T3B0aW9ucyk6IFJhZGFyVmFsdWVbXSB7XG4gICAgaWYgKG9wdGlvbnMucmFkYXI/LmNvbXBhcmUgPT09ICdpdGVtJykge1xuICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgICAgIC5tYXAoKGl0ZW0sIGlkeCkgPT5cbiAgICAgICAgICAob3B0aW9ucy5yYWRhcj8ucHJvcHMgPz8gW10pLm1hcCgocHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVmFsdWVNdWx0aXBsZSA9IEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShpdGVtLCBwcm9wKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IEFycmF5LmlzQXJyYXkoaXRlbVZhbHVlTXVsdGlwbGUpID8gaXRlbVZhbHVlTXVsdGlwbGVbMF0gOiBpdGVtVmFsdWVNdWx0aXBsZTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBpZHgsXG4gICAgICAgICAgICAgIGtleTogcHJvcCxcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1WYWx1ZT8udmFsdWVcbiAgICAgICAgICAgIH0gYXMgUmFkYXJWYWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGE6IFJhZGFyVmFsdWVbXSwgYjogUmFkYXJWYWx1ZVtdKSA9PiBbLi4uYSwgLi4uYl0sIFtdKVxuICAgICAgICAuZmlsdGVyKChhOiBSYWRhclZhbHVlKSA9PiBhLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgYS52YWx1ZSAhPT0gbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpdGVtc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIChpdGVtLCBpZHgpID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogKGl0ZW0uYXR0cmlidXRlc1tvcHRpb25zLnJhZGFyPy5jYXRlZ29yeVByb3AgPz8gJyddIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKT8udmFsdWUgPz8gJ29iamVjdCcsXG4gICAgICAgICAgICAgIGtleTogKGl0ZW0uYXR0cmlidXRlc1tvcHRpb25zLnJhZGFyPy5rZXlQcm9wID8/ICcnXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSk/LnZhbHVlLFxuICAgICAgICAgICAgICB2YWx1ZTogKGl0ZW0uYXR0cmlidXRlc1tvcHRpb25zLnJhZGFyPy52YWx1ZVByb3AgPz8gJyddIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKT8udmFsdWVcbiAgICAgICAgICAgIH0pIGFzIFJhZGFyVmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChhOiBSYWRhclZhbHVlKSA9PiBhLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgYS52YWx1ZSAhPT0gbnVsbCAmJiAhIWEua2V5KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgbWF0Y2hpbmdJdGVtcyhpdGVtczogSXRlbVtdLCBvcHRpb25zOiBDaGFydFdpZGdldE9wdGlvbnMsIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgY2FzZSBNYXJrVHlwZS5DSVJDTEVfUEFDSzpcbiAgICAgICAgICByZXR1cm4gISFvcHRpb25zLnBhY2tpbmc/LmlkICYmICEhb3B0aW9ucy5wYWNraW5nLnBhcmVudElkICYmICEhb3B0aW9ucy5wYWNraW5nLnBhY2tGaWVsZDtcbiAgICAgICAgY2FzZSBNYXJrVHlwZS5SQURBUjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKChvcHRpb25zLnJhZGFyPy5jb21wYXJlID09PSAnaXRlbScgJiYgKG9wdGlvbnMucmFkYXIucHJvcHM/Lmxlbmd0aCA/PyAwKSA+IDIpIHx8XG4gICAgICAgICAgICAgIChvcHRpb25zLnJhZGFyPy5jb21wYXJlICE9PSAnaXRlbScgJiZcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnMucmFkYXI/LmtleVByb3AgJiZcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnMucmFkYXIudmFsdWVQcm9wICYmXG4gICAgICAgICAgICAgICAgISFvcHRpb25zLnJhZGFyLmNhdGVnb3J5UHJvcCkpICYmXG4gICAgICAgICAgICBXaWRnZXRDaGFydENvbXBvbmVudC5idWlsZERhdGFWZWdhUmFkYXIoaXRlbXMsIG9wdGlvbnMpLmxlbmd0aCA+IDBcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKG9wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubmFtZSkgJiZcbiAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbb3B0aW9ucy5zZWxlY3RlZFZhcmlhYmxlc1swXS5uYW1lXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSkudmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKChPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKG9wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMV0ubmFtZSkgJiZcbiAgICAgICAgICAgICAgKGl0ZW0uYXR0cmlidXRlc1tvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzWzFdLm5hbWVdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICBvcHRpb25zLmFnZ3JlZ2F0aW9uID09PSBBZ2dyZWdhdGlvbi5ESVNUSU5DVCB8fFxuICAgICAgICAgICAgICBvcHRpb25zLmFnZ3JlZ2F0aW9uID09PSBBZ2dyZWdhdGlvbi5DT1VOVClcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHVuaXF1ZUF0dHJpYnV0ZXNCeU5hbWVzKGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdKTogQXR0cmlidXRlW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChhdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYXR0ci50ZWNobmljYWxOYW1lKSldLm1hcChcbiAgICAgIChhdHRyTmFtZSkgPT4gYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLnRlY2huaWNhbE5hbWUgPT09IGF0dHJOYW1lKSA/PyAoe30gYXMgQXR0cmlidXRlKVxuICAgICk7XG4gIH1cblxuICB0ZW1wbGF0ZVR5cGVUcmFuc2xhdGlvbkZuID0gKGl0ZW06IGFueSwgYXJnczogYW55W10pID0+XG4gICAgYCR7YXJnc1swXX0ke2l0ZW0gPT09IE1hcmtTdWJUeXBlLkRFRkFVTFQgPyBpdGVtIDogYXJnc1sxXSArIGFyZ3NbMl0gKyBpdGVtfWA7XG5cbiAgYWR2YW5jZWRFZGl0OiBzdHJpbmcgPSAne30nO1xuXG4gIGNoYW5nZUNoYXJ0VGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuY3VzdG9tVGl0bGUgPSB0aXRsZTtcbiAgfVxuXG4gIGNoYW5nZVRpbWVVbml0KCRldmVudDogVGltZVVuaXQsIHZhcmlhYmxlOiBWYXJpYWJsZURlZmluaXRpb24pIHtcbiAgICB2YXJpYWJsZS50aW1lVW5pdCA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUFnZ3JlZ2F0aW9uKCRldmVudDogQWdncmVnYXRpb24pIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uID0gJGV2ZW50O1xuICAgIGlmIChbQWdncmVnYXRpb24uQ09VTlQsIEFnZ3JlZ2F0aW9uLkRJU1RJTkNUXS5pbmNsdWRlcygkZXZlbnQhKSkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1sxXS5heGlzT3B0aW9ucyA9IHsgdGlja01pblN0ZXA6IDEgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMV0uYXhpc09wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckNhbGN1bGF0ZVBvc3NpYmxlQXR0cmlidXRlcyQubmV4dCgpO1xuICB9XG5cbiAgY2hhbmdlUHJvcGVydHkoYXR0ck5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLnRlY2huaWNhbE5hbWUgPT09IGF0dHJOYW1lKTtcbiAgICBpZiAoISFhdHRyKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzW2luZGV4XS5uYW1lID0gYXR0ci5uYW1lO1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1tpbmRleF0ubGFiZWwgPSBhdHRyLm5hbWU7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5pZCA9PT0gYXR0ci5maWVsZC5pZCk/LnR5cGUgPz8gRmllbGRUeXBlLlNUUklORztcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbaW5kZXhdLnR5cGUgPSB0aGlzLnRyYW5zbGF0ZVRvVmVnYVR5cGUoZmllbGQsIGF0dHIubmFtZSk7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzW2luZGV4XS5heGlzT3B0aW9ucyA9IHRoaXMubWluVGljayhmaWVsZCk7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnRpdGxlID1cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1swXS5sYWJlbCArICcsICcgKyB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzFdLmxhYmVsO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkLm5leHQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1RpbWVVbml0VVRDKHZhcmlhYmxlRGVmOiBWYXJpYWJsZURlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICBsZXQgdXRjUmVnZXggPSBuZXcgUmVnRXhwKC9fdXRjfHV0Y198X1VUQ3xVVENffF9VdGN8VXRjXy8sICdnJyk7XG4gICAgcmV0dXJuIHV0Y1JlZ2V4LnRlc3QodmFyaWFibGVEZWY/LmxhYmVsKTtcbiAgfVxuXG4gIGNoYW5nZUxhYmVsKGxhYmVsOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICBsZXQgdXBkYXRlVGl0bGUgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnRpdGxlID09PVxuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1swXS5sYWJlbCArICcsICcgKyB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzFdLmxhYmVsXG4gICAgKSB7XG4gICAgICB1cGRhdGVUaXRsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1tpbmRleF0ubGFiZWwgPSBsYWJlbDtcbiAgICBpZiAodXBkYXRlVGl0bGUpIHtcbiAgICAgIC8vdXBkYXRlIHRpdGxlIGlmIGl0IGhhcyBub3QgYmVlbiBtb2RpZmllZCBtYW51YWxseVxuICAgICAgdGhpcy5vcHRpb25zQ29weS50aXRsZSA9XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubGFiZWwgKyAnLCAnICsgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1sxXS5sYWJlbDtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVPcmlnaW5BdFplcm8odmFyaWFibGU6IFZhcmlhYmxlRGVmaW5pdGlvbiwgJGV2ZW50OiBib29sZWFuKSB7XG4gICAgdmFyaWFibGUub3JpZ2luMCA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZVR5cGUodHlwZU9wdGlvbnNJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zQ29weSkpO1xuICAgIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IHR5cGVPcHRpb25zSWQuc3BsaXQoJy0nKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5vcHRpb25zQ29weS50eXBlID0gdHlwZTtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnN1YlR5cGUgPSBzdWJUeXBlID8/IE1hcmtTdWJUeXBlLkRFRkFVTFQ7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS50eXBlID09PSBNYXJrVHlwZS5DSVJDTEVfUEFDSykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5wYWNraW5nID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnBhY2tpbmc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkudHlwZSA9PT0gTWFya1R5cGUuUkFEQVIpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkucmFkYXIgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkucmFkYXI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnNDb3B5LnR5cGUpIHtcbiAgICAgIGNhc2UgTWFya1R5cGUuQkFSOlxuICAgICAgY2FzZSBNYXJrVHlwZS5MSU5FOlxuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzBdLnR5cGUgPVxuICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0udHlwZSAhPT0gVmVnYVR5cGUuVEVNUE9SQUwgPyBWZWdhVHlwZS5OT01JTkFMIDogVmVnYVR5cGUuVEVNUE9SQUw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXJrVHlwZS5QT0lOVDpcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1sxXS50eXBlID1cbiAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzFdLnR5cGUgIT09IFZlZ2FUeXBlLlRFTVBPUkFMID8gVmVnYVR5cGUuUVVBTlRJVEFUSVZFIDogVmVnYVR5cGUuVEVNUE9SQUw7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLkFSRUFTVEFDS0VEIHx8IHRoaXMub3B0aW9uc0NvcHkuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuSElTVE9TVEFDS0VEKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcyA9IHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRDaGFydCgpO1xuXG4gICAgaWYgKHN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLkRPTlVUKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmlubmVyUmFkaXVzID0gdGhpcy5vcHRpb25zQ29weS5pbm5lclJhZGl1cyA/PyA1MDtcbiAgICB9XG4gIH1cblxuICByZXNldENoYXJ0KCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzPy5sZW5ndGggPiAyKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4udGhpcy5vcHRpb25zQ29weSB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2xhdGVUb1ZlZ2FUeXBlKHR5cGU6IEZpZWxkVHlwZSwgbmFtZTogc3RyaW5nKTogVmVnYVR5cGUge1xuICAgIGxldCBpZFJlZ2V4ID0gbmV3IFJlZ0V4cCgvX2lkfGlkX3xfSUR8SURffF9JZHxJZF8vLCAnZycpO1xuICAgIGlmIChpZFJlZ2V4LnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBWZWdhVHlwZS5PUkRJTkFMO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRmllbGRUeXBlLkRFQ0lNQUw6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5JTlRFR0VSOlxuICAgICAgY2FzZSBGaWVsZFR5cGUuTE9ORzpcbiAgICAgICAgcmV0dXJuIFZlZ2FUeXBlLlFVQU5USVRBVElWRTtcbiAgICAgIGNhc2UgRmllbGRUeXBlLklOU1RBTlQ6XG4gICAgICAgIHJldHVybiBWZWdhVHlwZS5URU1QT1JBTDtcbiAgICAgIGNhc2UgRmllbGRUeXBlLktFWVdPUkQ6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5TVFJJTkc6XG4gICAgICAgIHJldHVybiBWZWdhVHlwZS5OT01JTkFMO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFZlZ2FUeXBlLk5PTUlOQUw7XG4gICAgfVxuICB9XG5cbiAgbWluVGljayh0eXBlOiBGaWVsZFR5cGUpOiB7IHRpY2tNaW5TdGVwOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEZpZWxkVHlwZS5JTlRFR0VSOlxuICAgICAgY2FzZSBGaWVsZFR5cGUuTE9ORzpcbiAgICAgICAgcmV0dXJuIHsgdGlja01pblN0ZXA6IDEgfTtcbiAgICAgIGNhc2UgRmllbGRUeXBlLkRFQ0lNQUw6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5JTlNUQU5UOlxuICAgICAgY2FzZSBGaWVsZFR5cGUuS0VZV09SRDpcbiAgICAgIGNhc2UgRmllbGRUeXBlLlNUUklORzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlcigpIHtcbiAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkLm5leHQoKTtcbiAgfVxuXG4gIHByb3Bvc2VUaXRsZSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnR5cGUgPT09IE1hcmtUeXBlLlJBREFSKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnJhZGFyPy5jb21wYXJlID09PSAnaXRlbScpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LnJhZGFyLnRpdGxlSXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiAodGhpcy5vcHRpb25zQ29weS5yYWRhci5wcm9wcyB8fCBbXSkuam9pbignLCAnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnJhZGFyPy5jb21wYXJlID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zQ29weS50aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5jaGFydC5yYWRhci50aXRsZUxpc3QnLCB7XG4gICAgICAgICAgICBrZXk6IHRoaXMub3B0aW9uc0NvcHkucmFkYXIua2V5UHJvcCA/PyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQucmFkYXIuZGVmaW5lS2V5JyksXG4gICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5yYWRhci52YWx1ZVByb3AgPz8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LnJhZGFyLmRlZmluZVZhbHVlJyksXG4gICAgICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5yYWRhci5jYXRlZ29yeVByb3AgPz9cbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LnJhZGFyLmRlZmluZUNhdGVnb3J5JylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9uc0NvcHkudHlwZSA9PT0gTWFya1R5cGUuQ0lSQ0xFX1BBQ0spIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS50aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5jaGFydC5jaXJjbGUudGl0bGUnLCB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMub3B0aW9uc0NvcHkucGFja2luZz8ucGFja0ZpZWxkID8/ICcnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBjaGFuZ2VJbm5lclJhZGl1cygkZXZlbnQ6IHN0cmluZykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmlubmVyUmFkaXVzID0gcGFyc2VJbnQoJGV2ZW50LCAxMCk7XG4gIH1cblxuICBvcGVuU2V0dGluZ3MoKSB7XG4gICAgKHRoaXMub3BlbiQgYXMgU3ViamVjdDx2b2lkPikubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgdG9nZ2xlU2VyaWVzKCRldmVudDogYW55KSB7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZXJpZXMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVNlcmllcygkZXZlbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5zZXJpZXMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzID0ge307XG4gICAgfVxuICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzLmdyb3VwQnkgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VTZXJpZXNTY2hlbWUoJGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkuc2VyaWVzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcy5zY2hlbWUgPSAkZXZlbnQ7XG4gIH1cblxuICB0b2dnbGVTZXJpZXNMZWdlbmQoJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxlZ2VuZCA9ICRldmVudDtcbiAgfVxuXG4gIHRvZ2dsZVRvb2x0aXAoJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnRvb2x0aXAgPSAkZXZlbnQ7XG4gIH1cblxuICBheGVMYWJlbChpOiBudW1iZXIsIG9wdGlvbnNDb3B5OiBDaGFydFdpZGdldE9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9uc0NvcHk/LnR5cGUgPT09IE1hcmtUeXBlLkFSQykge1xuICAgICAgcmV0dXJuIGkgPT09IDAgPyAnQHByeS53aWRnZXQuY2hhcnQuZW5jb2RpbmcuZ3JvdXAnIDogJ0Bwcnkud2lkZ2V0LmNoYXJ0LmVuY29kaW5nLnZhbHVlcyc7XG4gICAgfVxuICAgIHJldHVybiBpID09PSAwID8gJ0Bwcnkud2lkZ2V0LmNoYXJ0LmVuY29kaW5nLmhvcml6b250YWwnIDogJ0Bwcnkud2lkZ2V0LmNoYXJ0LmVuY29kaW5nLnZlcnRpY2FsJztcbiAgfVxuXG4gIGhhc05vVHlwZShvcHRpb25zOiBDaGFydFdpZGdldE9wdGlvbnMpIHtcbiAgICByZXR1cm4gIW9wdGlvbnMgfHwgIW9wdGlvbnMudHlwZSB8fCBvcHRpb25zLnR5cGUuaW5jbHVkZXMoJ3VuZGVmaW5lZCcpIHx8IG9wdGlvbnMudHlwZS5pbmNsdWRlcygnbnVsbCcpO1xuICB9XG5cbiAgc2NoZW1lKCkge1xuICAgIHJldHVybiB2ZWdhLnNjaGVtZSh0aGlzLm9wdGlvbnNDb3B5LnNlcmllcz8uc2NoZW1lID8/ICcnKTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWNUb01lcmdlKCRldmVudDogYW55KSB7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zcGVjVG9NZXJnZSA9IHt9O1xuICAgICAgdGhpcy5hZHZhbmNlZEVkaXQgPSAne30nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5zcGVjVG9NZXJnZTtcbiAgICAgIHRoaXMuYWR2YW5jZWRFZGl0ID0gJ3t9JztcbiAgICB9XG4gIH1cblxuICB1cGRhdGVBZHZhbmNlZEVkaXQoJGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICRldmVudD8udGFyZ2V0Py52YWx1ZSA/PyAkZXZlbnQ7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZWRFZGl0ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zQ29weS5zcGVjVG9NZXJnZSwgdW5kZWZpbmVkLCA0KTtcbiAgICAgICAgdGhpcy5pbnZhbGlkSnNvbiA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGpzb24gcHJvdmlkZWQnKTtcbiAgICAgICAgdGhpcy5pbnZhbGlkSnNvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5zcGVjVG9NZXJnZTtcbiAgICAgIHRoaXMuYWR2YW5jZWRFZGl0ID0gJ3t9JztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSB0b0ltYWdlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUodGhpcy52ZWdhLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnY2FudmFzJylbMF0udG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxwcnktd2lkZ2V0LWNoYXJ0LWNzcz48L3ByeS13aWRnZXQtY2hhcnQtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1jaGFydFwiPlxuICA8cHJ5LXdpZGdldC1oZWFkZXJcbiAgICBbZGF0YXNvdXJjZUlkc109XCIoZGF0YXNvdXJjZUlkcyQgfCBhc3luYykgPz8gW11cIlxuICAgICpuZ0lmPVwiZGlzcGxheUhlYWRlciQgfCBhc3luY1wiXG4gICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgIChtYW5pZmVzdE1vZGlmaWVkKT1cIm1hbmlmZXN0TW9kaWZpZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAjaGVhZGVyXG4gICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgPlxuICAgIDxwcnktc2V0dGluZ3NcbiAgICAgIChzYXZlVHJpZ2dlcmVkKT1cImVtaXRNYW5pZmVzdCgpXCJcbiAgICAgIChjaGFuZ2VUaXRsZSk9XCJjaGFuZ2VXaWRnZXRUaXRsZSgkZXZlbnQpXCJcbiAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgW2lzRGlzYWJsZV09XCIoZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwIHx8IGhhc05vVHlwZShvcHRpb25zQ29weSlcIlxuICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBjbGFzcz1cIm8tc2V0dGluZ3NcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLXNldHRpbmdzX19wb3B1cF9fY29udGVudF9fZmllbGRzIC1jb25kZW5zZWRcIj5cbiAgICAgICAgPHByeS1lZGl0LWlucHV0XG4gICAgICAgICAgbGFiZWw9XCJAcHJ5LndpZGdldC5jaGFydC50aXRsZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2hhcnRUaXRsZSgkZXZlbnQpXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5jdXN0b21UaXRsZSA/PyBvcHRpb25zQ29weS50aXRsZVwiXG4gICAgICAgID48L3ByeS1lZGl0LWlucHV0PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGZpbHRlckRhdGFGb3JPcHRpb25zQ29weSQgfCBhc3luYyk/Lmxlbmd0aCA9PT0gMDsgZWxzZSBkYXRhXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImEtbGFiZWwgYS1sYWJlbC0taGVscCAtZXJyb3JcIj57eyAnQHByeS53aWRnZXQuY2hhcnQucGFyYW1zLm5vUGFyYW1zJyB8IGkxOG4gfX08L3A+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRhPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5SQURBUlwiPlxuICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQuY2hhcnQucGFyYW1zLm11bHRpcGxlUGFyYW1zJyB8IGkxOG4gfX17eyAoZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCB8IGFzeW5jKT8ubGVuZ3RoIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9uc0NvcHlcIiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGFydF90eXBlXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnR5cGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaXRlbXNdPVwidHlwZU9wdGlvbnNcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkudHlwZSArICctJyArIG9wdGlvbnNDb3B5LnN1YlR5cGVcIlxuICAgICAgICAgICAgaTE4blByZWZpeD1cIkBwcnkud2lkZ2V0LmNoYXJ0Lm1hcmtUeXBlLlwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICBpZD1cImNoYXJ0X3R5cGVcIlxuICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuUkFEQVIgJiYgb3B0aW9uc0NvcHk/LnR5cGUgIT09IE1hcmtUeXBlLkNJUkNMRV9QQUNLXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25zQ29weT8uc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuRE9OVVRcIj5cbiAgICAgICAgICA8cHJ5LXJhbmdlXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5pbm5lclJhZGl1c1wiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VJbm5lclJhZGl1cygkZXZlbnQpXCJcbiAgICAgICAgICAgIGxhYmVsVHJhbnNsYXRlPVwiQHByeS53aWRnZXQuY2hhcnQuaW5uZXJSYWRpdXNcIlxuICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICBtYXg9XCI1MDBcIlxuICAgICAgICAgID48L3ByeS1yYW5nZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0Zvcj1cImxldCB2YXJpYWJsZURlZiBvZiBvcHRpb25zQ29weT8uc2VsZWN0ZWRWYXJpYWJsZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cImkgPT09IDFcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJhZ2dyZWdhdGlvbnNcIj57eyAnQHByeS53aWRnZXQuY2hhcnQuZW5jb2RpbmcuZ3JvdXAnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBZ2dyZWdhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpID09PSAxXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImFnZ3JlZ2F0aW9uc1wiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uXCJcbiAgICAgICAgICAgICAgaWQ9XCJhZ2dyZWdhdGlvbnNcIlxuICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQHByeS53aWRnZXQuY2hhcnQuYWdncmVnYXRpb24uXCJcbiAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJpICE9PSAxIHx8IG9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uICE9PSAnY291bnQnXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYWdncmVnYXRpb25fcHJvcGVydHlcIj5cbiAgICAgICAgICAgICAge3sgYXhlTGFiZWwoaSwgb3B0aW9uc0NvcHkpIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVByb3BlcnR5KCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICBbaXRlbXNdPVwiKGkgIT09IDEgPyB2YXJpYWJsZUF0dHJpYnV0ZXMkIDogcG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInZhcmlhYmxlRGVmLm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgYmluZFZhbHVlPVwidGVjaG5pY2FsTmFtZVwiXG4gICAgICAgICAgICAgIGlkPVwiYWdncmVnYXRpb25fcHJvcGVydHlcIlxuICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxwcnktZWRpdC1pbnB1dFxuICAgICAgICAgICAgbGFiZWw9XCJAcHJ5LndpZGdldC5jaGFydC5kYXRhTGFiZWxcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGFiZWwoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJ2YXJpYWJsZURlZi5sYWJlbFwiXG4gICAgICAgICAgPjwvcHJ5LWVkaXQtaW5wdXQ+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFyaWFibGVEZWYudHlwZSA9PT0gJ3RlbXBvcmFsJ1wiIGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY2hhcnRfdGltZVVuaXRcIj57eyAnQHByeS53aWRnZXQuY2hhcnQudGltZVVuaXQnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VUaW1lVW5pdCgkZXZlbnQsIHZhcmlhYmxlRGVmKVwiXG4gICAgICAgICAgICAgIFtpdGVtc109XCJ0aW1lVW5pdHNcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ2YXJpYWJsZURlZi50aW1lVW5pdFwiXG4gICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAcHJ5LndpZGdldC5jaGFydC50aW1lVW5pdExpc3QuXCJcbiAgICAgICAgICAgICAgaWQ9XCJjaGFydF90aW1lVW5pdFwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInZhcmlhYmxlRGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnICYmIG9wdGlvbnNDb3B5Py50eXBlICE9PSAnYXJjJ1wiIGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZU9yaWdpbkF0WmVybyh2YXJpYWJsZURlZiwgJGV2ZW50KVwiIFtuZ01vZGVsXT1cInZhcmlhYmxlRGVmLm9yaWdpbjBcIlxuICAgICAgICAgICAgICA+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0Lm9yaWdpbicgfCBpMThuIH19XG4gICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19maWVsZHMgLWNvbmRlbnNlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgIDxwcnktY2hlY2tib3hcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlU2VyaWVzKCRldmVudClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCIhIW9wdGlvbnNDb3B5LnNlcmllc1wiXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uc0NvcHk/LnR5cGUgIT09IE1hcmtUeXBlLkFSQyAmJiBvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuUkFEQVJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5BUkVBU1RBQ0tFRCB8fFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuSElTVE9TVEFDS0VEXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIlxuICAgICAgICAgICAgKm5nSWY9XCJvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuQVJDICYmIG9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5SQURBUiAmJiAhIW9wdGlvbnNDb3B5LnNlcmllc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X3Nlcmllc0F0dHJcIj57eyAnQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzQXR0cicgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNlcmllcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2VyaWVzLmdyb3VwQnkhXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInZhcmlhYmxlQXR0cmlidXRlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgaWQ9XCJjaGFydF9zZXJpZXNBdHRyXCJcbiAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAob3B0aW9uc0NvcHk/LnR5cGUgPT09IE1hcmtUeXBlLkFSQyB8fCBvcHRpb25zQ29weT8udHlwZSA9PT0gTWFya1R5cGUuUkFEQVIgfHwgISFvcHRpb25zQ29weS5zZXJpZXMpICYmXG4gICAgICAgICAgICAgIHNjaGVtZXNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X3Nlcmllc1NjaGVtZVwiIFt0aXRsZV09XCInQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzU2NoZW1lQWx0JyB8IGkxOG5cIj57e1xuICAgICAgICAgICAgICAnQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzU2NoZW1lJyB8IGkxOG5cbiAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNlcmllc1NjaGVtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2VyaWVzPy5zY2hlbWUhXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInNjaGVtZXNcIlxuICAgICAgICAgICAgICBpZD1cImNoYXJ0X3Nlcmllc1NjaGVtZVwiXG4gICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAcHJ5LndpZGdldC5jaGFydC5zY2hlbWUuXCJcbiAgICAgICAgICAgICAgYmluZFZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJpZFwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0LS1jaGFydC1jb2xvci10aHVtYlwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2NoZW1lQ29sb3Igb2Ygc2NoZW1lKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm8td2lkZ2V0LS1jaGFydC1jb2xvci10aHVtYi1pdGVtXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cInNjaGVtZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2NoZW1lQ29sb3JcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPHByeS1jaGVja2JveFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVTZXJpZXNMZWdlbmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cIiEhb3B0aW9uc0NvcHkubGVnZW5kIVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uc0NvcHk/LnR5cGUgIT09IE1hcmtUeXBlLlJBREFSIHx8ICEhb3B0aW9uc0NvcHkuc2VyaWVzXCJcbiAgICAgICAgICAgICAgPnt7ICdAcHJ5LndpZGdldC5jaGFydC5zZXJpZXNMZWdlbmQnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVRvb2x0aXAoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIiEhb3B0aW9uc0NvcHkudG9vbHRpcCFcIlxuICAgICAgICAgICAgICA+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnRvb2x0aXAnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25zQ29weT8udHlwZSA9PT0gTWFya1R5cGUuUkFEQVIgJiYgb3B0aW9uc0NvcHkucmFkYXIgIT09IHVuZGVmaW5lZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucmFkYXIuY29tcGFyZVwiXG4gICAgICAgICAgICAgIFtpdGVtc109XCJjb21wYXJpc29uc1wiXG4gICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbnNDb3B5LnJhZGFyLmNvbXBhcmUgPT09ICdpdGVtJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRyaWdnZXIoKTsgcHJvcG9zZVRpdGxlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucmFkYXIucHJvcHNcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJudW1lcmljUHJvcGVydGllcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbnNDb3B5LnJhZGFyLmNvbXBhcmUgPT09ICd2YWx1ZSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNvbXBhcmlzb25fa2V5XCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNvbXBhcmlzb24ua2V5JyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRyaWdnZXIoKTsgcHJvcG9zZVRpdGxlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucmFkYXIua2V5UHJvcFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cInRleHRQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbXBhcmlzb25fa2V5XCJcbiAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjb21wYXJpc29uX3ZhbHVlc1wiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jb21wYXJpc29uLnZhbHVlcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnJhZGFyLnZhbHVlUHJvcFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cIm51bWVyaWNQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbXBhcmlzb25fdmFsdWVzXCJcbiAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjb21wYXJpc29uX2NhdGVnb3J5XCI+e3tcbiAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQuY2hhcnQuY29tcGFyaXNvbi5jYXRlZ29yeScgfCBpMThuXG4gICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnJhZGFyLmNhdGVnb3J5UHJvcFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cInRleHRQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbXBhcmlzb25fY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjaGVtZXNcIj5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImEtbGFiZWxcIlxuICAgICAgICAgICAgICBmb3I9XCJjaGFydF9zZXJpZXNTY2hlbWVfcmFkYXJcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0Bwcnkud2lkZ2V0LmNoYXJ0LnNlcmllc1NjaGVtZUFsdCcgfCBpMThuXCJcbiAgICAgICAgICAgICAgPnt7ICdAcHJ5LndpZGdldC5jaGFydC5zZXJpZXNTY2hlbWUnIHwgaTE4biB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNlcmllc1NjaGVtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2VyaWVzPy5zY2hlbWUhXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInNjaGVtZXNcIlxuICAgICAgICAgICAgICBpZD1cImNoYXJ0X3Nlcmllc1NjaGVtZV9yYWRhclwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uc0NvcHk/LnR5cGUgPT09IE1hcmtUeXBlLkNJUkNMRV9QQUNLICYmIG9wdGlvbnNDb3B5LnBhY2tpbmcgIT09IHVuZGVmaW5lZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X2NpcmNsZV9pZFwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jaXJjbGUuaWQnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zQ29weS5wYWNraW5nLmlkXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInZhcmlhYmxlQXR0cmlidXRlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgaWQ9XCJjaGFydF9jaXJjbGVfaWRcIlxuICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGFydF9jaXJjbGVfcGlkXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNpcmNsZS5waWQnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zQ29weS5wYWNraW5nLnBhcmVudElkXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInZhcmlhYmxlQXR0cmlidXRlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgaWQ9XCJjaGFydF9jaXJjbGVfcGlkXCJcbiAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY2hhcnRfY2lyY2xlX2ZpZWxkXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNpcmNsZS5maWVsZCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRyaWdnZXIoKTsgcHJvcG9zZVRpdGxlKClcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnBhY2tpbmcucGFja0ZpZWxkXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cIm51bWVyaWNQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICBpZD1cImNoYXJ0X2NpcmNsZV9maWVsZFwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X2NpcmNsZV90b29sdGlwXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNpcmNsZS50b29sdGlwJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucGFja2luZy50b29sdGlwXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cInZhcmlhYmxlQXR0cmlidXRlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgaWQ9XCJjaGFydF9jaXJjbGVfdG9vbHRpcFwiXG4gICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlU3BlY1RvTWVyZ2UoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIiEhb3B0aW9uc0NvcHkuc3BlY1RvTWVyZ2VcIlxuICAgICAgICAgID57eyAnQHByeS53aWRnZXQuY2hhcnQubW9yZU9wdGlvbnMnIHwgaTE4biB9fVxuICAgICAgICA8L3ByeS1jaGVja2JveD5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFvcHRpb25zQ29weS5zcGVjVG9NZXJnZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgW25nTW9kZWxdPVwiYWR2YW5jZWRFZGl0XCJcbiAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVBZHZhbmNlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19hcmVhXCJcbiAgICAgICAgICAgIFtjbGFzcy4taW52YWxpZF09XCJpbnZhbGlkSnNvblwiXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NoYXJ0VmFsaWQkIHwgYXN5bmNcIj5cbiAgICA8ZGl2XG4gICAgICAjdmVnYVxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJcbiAgICAgICAgKCh3aWRnZXRTaXplJCB8IGFzeW5jKT8uaGVpZ2h0ID8/IDApIC0gKChkaXNwbGF5SGVhZGVyJCB8IGFzeW5jKSA/IDEgOiAwKSAqIFdJREdFVF9IRUFERVJfSEVJR0hUXG4gICAgICBcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIih3aWRnZXRTaXplJCB8IGFzeW5jKT8ud2lkdGhcIlxuICAgID48L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoaXNDaGFydFZhbGlkJCB8IGFzeW5jKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLXdpZGdldF9fY2hvb3NlLXBhcmFtZXRlcnNcIj5cbiAgICAgIDxwIGNsYXNzPVwiYS1wXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5jaGFydC5jaG9vc2VQYXJhbWV0ZXJzJyB8IGkxOG4gfX1cbiAgICAgIDwvcD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuU2V0dGluZ3MoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIj5cbiAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMjBcIiBbd2lkdGhdPVwiMjBcIiBpY29uU3ZnPVwiY29udHJvbFwiPjwvcHJ5LWljb24+XG4gICAgICAgIDxzcGFuPnt7ICdAcHJ5LndpZGdldC5zZXR0aW5ncy50aXRsZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
|
|
651
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWNoYXJ0L2NvbXBvbmVudC93aWRnZXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtY2hhcnQvY29tcG9uZW50L3dpZGdldC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkcsT0FBTyxFQUNMLFdBQVcsRUFPWCxjQUFjLEVBQ2QsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixtQkFBbUIsRUFFbkIsY0FBYyxFQUNkLFNBQVMsRUFFVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFFBQVEsRUFJUixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sV0FBVyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxF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QUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVRLE9BQU87UUFDZCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBN3dCVSxvQkFBb0I7a0dBQXBCLG9CQUFvQiw2S0NqRGpDLDRrZ0JBd1dBOzsyRkR2VGEsb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQjtnS0FJVCxJQUFJO3NCQUF0QixTQUFTO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRpb24sXG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlU2ltcGxlVmFsdWUsXG4gIENoYXJ0T3B0aW9uLFxuICBDaGFydFN1YlR5cGVEZWZpbml0aW9uLFxuICBDaGFydFdpZGdldE9wdGlvbnMsXG4gIENsYXNzLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgQ29uZmlnU2VsZWN0b3JzLFxuICBEYXNoYm9hcmRTZWxlY3RvcnMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEZpZWxkLFxuICBGaWVsZFNlbGVjdG9ycyxcbiAgRmllbGRUeXBlLFxuICBJdGVtLFxuICBJdGVtVXRpbHMsXG4gIE1hcmtTdWJUeXBlLFxuICBNYXJrVHlwZSxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFZhcmlhYmxlRGVmaW5pdGlvbixcbiAgVmVnYUNvbG9yVHlwZSxcbiAgVmVnYVR5cGUsXG4gIFdJREdFVF9IRUFERVJfSEVJR0hUXG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsL2VzNic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlbGF5LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUaW1lVW5pdCwgVmlldyB9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IGVtYmVkLCB7IHZlZ2EgfSBmcm9tICd2ZWdhLWVtYmVkJztcbmltcG9ydCB7IG1lcmdlRGVlcCwgVG9wTGV2ZWxTcGVjIH0gZnJvbSAndmVnYS1saXRlJztcbmltcG9ydCB7IGZvbnRDb25maWcgfSBmcm9tICd2ZWdhLWxpdGUvYnVpbGQvc3JjL2NvbmZpZyc7XG5pbXBvcnQgeyBWZWdhRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi92ZWdhLWVycm9yLmhhbmRsZXInO1xuaW1wb3J0IHsgdmVnYUJhc2VDb25mLCB2ZWdhQ2lyY2xlUGFja0NvbmYsIHZlZ2FSYWRhckNvbmYgfSBmcm9tICcuL3ZlZ2Etc3BlYy5jb25zdGFudCc7XG5cbmV4cG9ydCB0eXBlIFJhZGFyVmFsdWUgPSB7XG4gIGNhdGVnb3J5OiBudW1iZXI7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxudmVnYS5zY2hlbWUoJ0tPL1cvT0snLCBbJyNDMDREM0YnLCAnI0ZEOTg0MycsICcjOUFCRTI5J10pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1jaGFydC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0Q2hhcnRDb21wb25lbnQgZXh0ZW5kcyBEYXRhV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZlZ2EnKSB2ZWdhITogRWxlbWVudFJlZjtcbiAgdHlwZU9wdGlvbnM6IHtcbiAgICB0eXBlOiBNYXJrVHlwZTtcbiAgICBzdWJUeXBlOiBNYXJrU3ViVHlwZTtcbiAgICBsYWJlbDogTWFya1R5cGUgfCBNYXJrU3ViVHlwZTtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZWQ/OiBzdHJpbmc7XG4gIH1bXSA9IFtdO1xuICBtYXJrVHlwZXM6IE1hcmtUeXBlW10gPSBbXTtcbiAgc3ViVHlwZXM/OiBQYXJ0aWFsPENoYXJ0U3ViVHlwZURlZmluaXRpb24+O1xuICBzY2hlbWVzPzogeyBpZDogVmVnYUNvbG9yVHlwZTsgdHJhbnNsYXRlZDogc3RyaW5nIH1bXTtcbiAgTWFya1R5cGUgPSBNYXJrVHlwZTtcbiAgTWFya1N1YlR5cGUgPSBNYXJrU3ViVHlwZTtcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQgPSBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZTtcblxuICB0aW1lVW5pdHM6IFRpbWVVbml0W10gPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VycycsICdtaW51dGVzJ107XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPENoYXJ0V2lkZ2V0T3B0aW9ucz47XG4gIG9wdGlvbnNDb3B5OiBDaGFydFdpZGdldE9wdGlvbnMgPSB7fSBhcyBDaGFydFdpZGdldE9wdGlvbnM7XG4gIGNsYXNzZXMkOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuICBmaWVsZHMkOiBPYnNlcnZhYmxlPEZpZWxkW10+O1xuICB2YXJpYWJsZXMkOiBPYnNlcnZhYmxlPFZhcmlhYmxlRGVmaW5pdGlvbltdPjtcbiAgdmVnYUxpdGVTcGVjJDogT2JzZXJ2YWJsZTxUb3BMZXZlbFNwZWM+O1xuICB2YXJpYWJsZUF0dHJpYnV0ZXMkOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZVtdPjtcbiAgcG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIHRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICBpdGVtcyQ6IE9ic2VydmFibGU8SXRlbVtdPjtcbiAgZmlsdGVyRGF0YUZvck9wdGlvbnMkOiBPYnNlcnZhYmxlPEl0ZW1bXT47XG4gIGZpbHRlckRhdGFGb3JPcHRpb25zQ29weSQ6IE9ic2VydmFibGU8SXRlbVtdPjtcbiAgdmFyaWFibGVzOiBWYXJpYWJsZURlZmluaXRpb25bXSA9IFtdO1xuICBhZ2dyZWdhdGlvbnM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlQXR0cmlidXRlczogQXR0cmlidXRlW10gPSBbXTtcbiAgZmllbGRzOiBGaWVsZFtdID0gW107XG4gIGlzQ2hhcnRWYWxpZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG51bWVyaWNQcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIHRleHRQcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVbXT47XG4gIGNvbXBhcmlzb25zID0gW1xuICAgIHtcbiAgICAgIGlkOiAnaXRlbScsXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQuY29tcGFyaXNvbi5pdGVtJylcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndmFsdWUnLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNvbXBhcmlzb24udmFsdWUnKVxuICAgIH1cbiAgXTtcbiAgdmlldz86IFZpZXc7XG4gIHRyaWdnZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgaW52YWxpZEpzb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFByeUkxOG5TZXJ2aWNlLFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuY2hhcnRPcHRpb24pLnN1YnNjcmliZSgoY2hhcnRPcHRpb25zOiBDaGFydE9wdGlvbikgPT4ge1xuICAgICAgdGhpcy5hZ2dyZWdhdGlvbnMgPSBjaGFydE9wdGlvbnMuYWdncmVnYXRpb247XG4gICAgICB0aGlzLnNjaGVtZXMgPSBjaGFydE9wdGlvbnMuY29sb3IubWFwKChzY2hlbWUpID0+ICh7IGlkOiBzY2hlbWUsIHRyYW5zbGF0ZWQ6ICcnIH0pKTtcbiAgICAgIHRoaXMubWFya1R5cGVzID0gY2hhcnRPcHRpb25zLnR5cGU7XG4gICAgICB0aGlzLnN1YlR5cGVzID0gY2hhcnRPcHRpb25zLnN1YlR5cGU7XG5cbiAgICAgIHRoaXMudHlwZU9wdGlvbnMgPSB0aGlzLm1hcmtUeXBlc1xuICAgICAgICAubWFwKCh0eXBlOiBNYXJrVHlwZSkgPT4ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJUeXBlcyAmJiB0aGlzLnN1YlR5cGVzW3R5cGVdID8gdGhpcy5zdWJUeXBlc1t0eXBlXS5tYXAoKHN1YlR5cGUpID0+ICh7IHR5cGUsIHN1YlR5cGUgfSkpIDogW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+IFsuLi5wLCAuLi5jXSwgW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbnM6IGFueSkgPT4gKHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGlkOiBgJHtvcHRpb25zLnR5cGV9LSR7b3B0aW9ucy5zdWJUeXBlfWAsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuREVGQVVMVCA/IG9wdGlvbnMudHlwZSA6IG9wdGlvbnMuc3ViVHlwZVxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcCgob3B0aW9uczogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgdHJhbnNsYXRlZDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0Lm1hcmtUeXBlLicgKyBvcHRpb25zLmxhYmVsKVxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnR5cGVPcHRpb25zLnNvcnQoKGEsIGIpID0+IGEudHJhbnNsYXRlZD8ubG9jYWxlQ29tcGFyZShiLnRyYW5zbGF0ZWQgPz8gJycpID8/IC0xKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsYXNzZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3Nlcyk7XG4gICAgdGhpcy5maWVsZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRzKTtcblxuICAgIHRoaXMudmFyaWFibGVBdHRyaWJ1dGVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzdWx0U2V0JCwgdGhpcy5jbGFzc2VzJCwgdGhpcy5maWVsZHMkXSkucGlwZShcbiAgICAgIG1hcCgoW3Jlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzXSkgPT4gSXRlbVV0aWxzLmdldEF0dHJpYnV0ZXNGcm9tUnMocmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpKSxcbiAgICAgIG1hcCgoZmllbGRzOiBBdHRyaWJ1dGVbXSkgPT4gZmllbGRzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpKSxcbiAgICAgIG1hcCgocHJvcHMpID0+IFdpZGdldENoYXJ0Q29tcG9uZW50LnVuaXF1ZUF0dHJpYnV0ZXNCeU5hbWVzKHByb3BzKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLnN1YnNjcmliZSgoYXR0cnMpID0+ICh0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyA9IGF0dHJzKSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5maWVsZHMkLnN1YnNjcmliZSgoYXR0cnMpID0+ICh0aGlzLmZpZWxkcyA9IGF0dHJzKSkpO1xuXG4gICAgdGhpcy52YXJpYWJsZXMkID0gdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLnBpcGUoXG4gICAgICBtYXAoKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMubWFwKFxuICAgICAgICAgIChhdHRyKSA9PlxuICAgICAgICAgICAgKCh7XG4gICAgICAgICAgICAgIG5hbWU6IGF0dHIudGVjaG5pY2FsTmFtZSxcbiAgICAgICAgICAgICAgbGFiZWw6IGF0dHIubmFtZSxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy50cmFuc2xhdGVUb1ZlZ2FUeXBlKGF0dHIuZmllbGQudHlwZSwgYXR0ci5uYW1lKVxuICAgICAgICAgICAgfSkgYXMgVmFyaWFibGVEZWZpbml0aW9uKSA/PyBbXVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5vcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YXJpYWJsZXMkLFxuICAgICAgdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiBtYW5pZmVzdC5vcHRpb25zIGFzIENoYXJ0V2lkZ2V0T3B0aW9ucykpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhcmlhYmxlcywgb3B0aW9uc10pID0+ICh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAoKHZhcmlhYmxlc1swXT8ubGFiZWwgPz8gJycpICsgJywgJyArICh2YXJpYWJsZXNbMV0/LmxhYmVsID8/ICcnKSkucmVwbGFjZSgvXiwgJC8sICcnKSxcbiAgICAgICAgc2VsZWN0ZWRWYXJpYWJsZXM6IG9wdGlvbnM/LnNlbGVjdGVkVmFyaWFibGVzID8/IFt7fSwge31dLFxuICAgICAgICAvLyBIZXJlLCB3ZSBkbyBub3QgcHJlc3VtZSBvZiB0aGUgdHlwZSBvZiBncmFwaCB0aGF0IHRoZSB1c2VyIHdhbnRzLCBhbmQgcHJlZmVyIHRvIGRpc3BsYXkgYSBidXR0b24gdG8gZ28gdG8gcGFyYW1zXG4gICAgICAgIHR5cGU6IG9wdGlvbnM/LnR5cGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhZ2dyZWdhdGlvbjogb3B0aW9ucz8uYWdncmVnYXRpb24gPz8gQWdncmVnYXRpb24uQ09VTlQsXG4gICAgICAgIHRvb2x0aXA6IG9wdGlvbnM/LnRvb2x0aXAgPz8gdHJ1ZSxcbiAgICAgICAgbGVnZW5kOiBvcHRpb25zLmxlZ2VuZCA/PyB0cnVlLFxuICAgICAgICBsb2NhbGU6ICdmcidcbiAgICAgIH0pKVxuICAgICk7XG5cbiAgICB0aGlzLml0ZW1zJCA9IHRoaXMucmVzdWx0U2V0JC5waXBlKFxuICAgICAgZmlsdGVyKChyZXN1bHRTZXQpID0+ICEhcmVzdWx0U2V0KSxcbiAgICAgIG1hcCgocmVzdWx0U2V0KSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHRTZXQ/Lml0ZW1zKVxuICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+IHJlc3VsdFNldC5pdGVtc1tjbGFzc0lkXSlcbiAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBbLi4ucHJldiwgLi4uY3Vycl0sIFtdKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkLFxuICAgICAgdGhpcy5pdGVtcyQsXG4gICAgICB0aGlzLmZpZWxkcyQsXG4gICAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhcmlhYmxlRmllbGRzLCBpdGVtcywgZmllbGRzLCBfXSkgPT4ge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVGaWVsZHNcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgIC8vIEtlZXAgb25seSBudW1lcmljIHZhbHVlcyB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zQ29weS5hZ2dyZWdhdGlvbiB8fFxuICAgICAgICAgICAgICBbQWdncmVnYXRpb24uTk9ORSwgQWdncmVnYXRpb24uRElTVElOQ1QsIEFnZ3JlZ2F0aW9uLkNPVU5UXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLmlkID09PSBhdHRyaWJ1dGUuZmllbGQuaWQpO1xuICAgICAgICAgICAgICByZXR1cm4gW0ZpZWxkVHlwZS5ERUNJTUFMLCBGaWVsZFR5cGUuSU5TVEFOVCwgRmllbGRUeXBlLkxPTkcsIEZpZWxkVHlwZS5JTlRFR0VSXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICBmaWVsZD8udHlwZSA/PyBGaWVsZFR5cGUuU1RSSU5HXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubGFiZWwpICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaXRlbS5hdHRyaWJ1dGVzKS5pbmNsdWRlcyhhdHRyaWJ1dGUudGVjaG5pY2FsTmFtZSkgJiZcbiAgICAgICAgICAgICAgICAhIShpdGVtLmF0dHJpYnV0ZXNbdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1swXS5sYWJlbF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgKGl0ZW0uYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBtYXAoKHByb3BzKSA9PiBXaWRnZXRDaGFydENvbXBvbmVudC51bmlxdWVBdHRyaWJ1dGVzQnlOYW1lcyhwcm9wcykpXG4gICAgKTtcblxuICAgIHRoaXMubnVtZXJpY1Byb3BlcnRpZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyQsXG4gICAgICB0aGlzLml0ZW1zJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMudHJpZ2dlckNhbGN1bGF0ZVBvc3NpYmxlQXR0cmlidXRlcyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbdmFyaWFibGVGaWVsZHMsIGl0ZW1zLCBmaWVsZHMsIF9dKSA9PiB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZUZpZWxkc1xuICAgICAgICAgIC5maWx0ZXIoKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLmlkID09PSBhdHRyaWJ1dGUuZmllbGQuaWQpO1xuICAgICAgICAgICAgcmV0dXJuIFtGaWVsZFR5cGUuREVDSU1BTCwgRmllbGRUeXBlLklOU1RBTlQsIEZpZWxkVHlwZS5MT05HLCBGaWVsZFR5cGUuSU5URUdFUl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIGZpZWxkPy50eXBlID8/IEZpZWxkVHlwZS5TVFJJTkdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKGF0dHJpYnV0ZS50ZWNobmljYWxOYW1lKSAmJlxuICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbYXR0cmlidXRlLnRlY2huaWNhbE5hbWVdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChwcm9wcykgPT4ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0Q2hhcnRDb21wb25lbnQudW5pcXVlQXR0cmlidXRlc0J5TmFtZXMocHJvcHMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy50ZXh0UHJvcGVydGllcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMudmFyaWFibGVBdHRyaWJ1dGVzJCxcbiAgICAgIHRoaXMuaXRlbXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy50cmlnZ2VyQ2FsY3VsYXRlUG9zc2libGVBdHRyaWJ1dGVzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt2YXJpYWJsZUZpZWxkcywgaXRlbXMsIGZpZWxkcywgX10pID0+IHtcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlRmllbGRzXG4gICAgICAgICAgLmZpbHRlcigoYXR0cmlidXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQuaWQgPT09IGF0dHJpYnV0ZS5maWVsZC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gW0ZpZWxkVHlwZS5TVFJJTkcsIEZpZWxkVHlwZS5LRVlXT1JEXS5pbmNsdWRlcyhmaWVsZD8udHlwZSA/PyBGaWVsZFR5cGUuSU5URUdFUik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICBpdGVtcy5maW5kKFxuICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpdGVtLmF0dHJpYnV0ZXMpLmluY2x1ZGVzKGF0dHJpYnV0ZS50ZWNobmljYWxOYW1lKSAmJlxuICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbYXR0cmlidXRlLnRlY2huaWNhbE5hbWVdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChwcm9wcykgPT4ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0Q2hhcnRDb21wb25lbnQudW5pcXVlQXR0cmlidXRlc0J5TmFtZXMocHJvcHMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5maWx0ZXJEYXRhRm9yT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLml0ZW1zJCwgdGhpcy5vcHRpb25zJCwgdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW2l0ZW1zLCBvcHRpb25zXSkgPT4gb3B0aW9ucy5zZWxlY3RlZFZhcmlhYmxlcyAmJiBvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmxlbmd0aCA+IDApLFxuICAgICAgbWFwKChbaXRlbXMsIG9wdGlvbnMsIHZhcmlhYmxlc10pID0+IFdpZGdldENoYXJ0Q29tcG9uZW50Lm1hdGNoaW5nSXRlbXMoaXRlbXMsIG9wdGlvbnMsIHZhcmlhYmxlcykpXG4gICAgKTtcblxuICAgIHRoaXMuZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5pdGVtcyQsXG4gICAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkLnBpcGUoZGVsYXkoMjAwKSksXG4gICAgICB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyRcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKChbaXRlbXMsIF9dKSA9PiB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzICYmIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXMubGVuZ3RoID4gMCksXG4gICAgICBtYXAoKFtpdGVtcywgXywgdmFyaWFibGVzXSkgPT4gV2lkZ2V0Q2hhcnRDb21wb25lbnQubWF0Y2hpbmdJdGVtcyhpdGVtcywgdGhpcy5vcHRpb25zQ29weSwgdmFyaWFibGVzKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQucGlwZShmaWx0ZXIoKG9wdCkgPT4gISFvcHQpKS5zdWJzY3JpYmUoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weSA9IHN0cnVjdHVyZWRDbG9uZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy51cGRhdGVBZHZhbmNlZEVkaXQoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zQ29weS5zcGVjVG9NZXJnZSkpO1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnR5cGUgPSAhdGhpcy5tYXJrVHlwZXMuaW5jbHVkZXModGhpcy5vcHRpb25zQ29weS50eXBlKVxuICAgICAgICAgID8gdGhpcy5tYXJrVHlwZXNbMF1cbiAgICAgICAgICA6IHRoaXMub3B0aW9uc0NvcHkudHlwZTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zdWJUeXBlID0gdGhpcy5vcHRpb25zQ29weS5zdWJUeXBlID8/IE1hcmtTdWJUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuYWdncmVnYXRpb24gPSAhdGhpcy5hZ2dyZWdhdGlvbnMuaW5jbHVkZXModGhpcy5vcHRpb25zQ29weS5hZ2dyZWdhdGlvbilcbiAgICAgICAgICA/IHRoaXMuYWdncmVnYXRpb25zWzBdXG4gICAgICAgICAgOiB0aGlzLm9wdGlvbnNDb3B5LmFnZ3JlZ2F0aW9uO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zQ29weS5zZXJpZXMpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcy5zY2hlbWUgPVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zZXJpZXM/LnNjaGVtZSAmJlxuICAgICAgICAgICAgdGhpcy5zY2hlbWVzICYmXG4gICAgICAgICAgICAhdGhpcy5zY2hlbWVzLmZpbmQoKHMpID0+IHMuaWQgPT09IHRoaXMub3B0aW9uc0NvcHk/LnNlcmllcz8uc2NoZW1lKVxuICAgICAgICAgICAgICA/IHRoaXMuc2NoZW1lc1swXS5pZFxuICAgICAgICAgICAgICA6IHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzPy5zY2hlbWU7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMudmVnYUxpdGVTcGVjJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLndpbmRvd01hbmlmZXN0KSxcbiAgICAgIHRoaXMubWFuaWZlc3QkLFxuICAgICAgdGhpcy53aWRnZXRTaXplJCxcbiAgICAgIHRoaXMuZmlsdGVyRGF0YUZvck9wdGlvbnMkLFxuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMuZGlzcGxheUhlYWRlciQsXG4gICAgICB0aGlzLnZhcmlhYmxlQXR0cmlidXRlcyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbd2luZG93TWFuaWZlc3QsIHdpZGdldE1hbmlmZXN0LCBzaXplLCBkYXRhLCBvcHRpb25zLCBkaXNwbGF5SGVhZGVyLCB2YXJpYWJsZUZpZWxkXSkgPT4ge1xuICAgICAgICBsZXQgc3BlYyA9IHZlZ2FCYXNlQ29uZjtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1hcmtUeXBlLlJBREFSOlxuICAgICAgICAgICAgc3BlYyA9IHZlZ2FSYWRhckNvbmY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hcmtUeXBlLkNJUkNMRV9QQUNLOlxuICAgICAgICAgICAgc3BlYyA9IHZlZ2FDaXJjbGVQYWNrQ29uZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNwZWMudGl0bGUgPSBvcHRpb25zLmN1c3RvbVRpdGxlID8/IG9wdGlvbnMudGl0bGU7XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1hcmtUeXBlLlJBREFSOlxuICAgICAgICAgICAgc3BlYy5zaWduYWxzWzBdLnVwZGF0ZSA9IHNpemUud2lkdGggPiBzaXplLmhlaWdodCA/ICdoZWlnaHQgLyAyJyA6ICd3aWR0aCAvIDInO1xuICAgICAgICAgICAgc3BlYy5kYXRhWzBdLnZhbHVlcyA9IFdpZGdldENoYXJ0Q29tcG9uZW50LmJ1aWxkRGF0YVZlZ2FSYWRhcihkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHNwZWMuc2NhbGVzWzJdLnJhbmdlLnNjaGVtZSA9IG9wdGlvbnMuc2VyaWVzPy5zY2hlbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hcmtUeXBlLkNJUkNMRV9QQUNLOlxuICAgICAgICAgICAgc3BlYy5kYXRhWzBdLnZhbHVlcyA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcbiAgICAgICAgICAgIHNwZWMuZGF0YVsxXS50cmFuc2Zvcm1bMF0ua2V5ID0gJ2F0dHJpYnV0ZXMuJyArIG9wdGlvbnMucGFja2luZz8uaWQgKyAnLnZhbHVlJztcbiAgICAgICAgICAgIHNwZWMuZGF0YVsxXS50cmFuc2Zvcm1bMF0ucGFyZW50S2V5ID0gJ2F0dHJpYnV0ZXMuJyArIG9wdGlvbnMucGFja2luZz8ucGFyZW50SWQgKyAnLnZhbHVlJztcbiAgICAgICAgICAgIHNwZWMuZGF0YVsxXS50cmFuc2Zvcm1bMV0uZmllbGQgPSAnYXR0cmlidXRlcy4nICsgb3B0aW9ucy5wYWNraW5nPy5wYWNrRmllbGQgKyAnLnZhbHVlJztcbiAgICAgICAgICAgIHNwZWMubWFya3NbMF0uZW5jb2RlLmVudGVyLnRvb2x0aXAuc2lnbmFsID0gYGRhdHVtLmF0dHJpYnV0ZXMuJHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5wYWNraW5nPy50b29sdGlwID8/IG9wdGlvbnMucGFja2luZz8uaWRcbiAgICAgICAgICAgIH0udmFsdWUgKyAnIDogJyArIGRhdHVtLmF0dHJpYnV0ZXMuJHtvcHRpb25zLnBhY2tpbmc/LnBhY2tGaWVsZH0udmFsdWVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNwZWMuZGF0YSA9IHsgdmFsdWVzOiBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSkgfTtcbiAgICAgICAgICAgIHNwZWMubGF5ZXIgPSBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUsXG4gICAgICAgICAgICAgICAgICBwb2ludDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID09PSBNYXJrVHlwZS5QT0lOVCB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLldJVEhfTElORVNfQU5EX1BPSU5UUyB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN1YlR5cGUgPT09IE1hcmtTdWJUeXBlLldJVEhfUE9JTlRTLFxuICAgICAgICAgICAgICAgICAgbGluZTogb3B0aW9ucy50eXBlID09PSBNYXJrVHlwZS5MSU5FIHx8IG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuV0lUSF9MSU5FU19BTkRfUE9JTlRTLFxuICAgICAgICAgICAgICAgICAgaW5uZXJSYWRpdXM6IG9wdGlvbnMuaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICAgICAgICB0b29sdGlwOiBvcHRpb25zLnRvb2x0aXAgPz8gdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFdpZGdldENoYXJ0Q29tcG9uZW50LmNhbGN1bGF0ZUVuY29kaW5nKG9wdGlvbnMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICAgICAgICAgIHNwZWMubGF5ZXJbMF0ubWFyay5maWxsID0gb3B0aW9ucy5maWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuQVJFQVNUQUNLRUQgfHwgb3B0aW9ucy5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5ISVNUT1NUQUNLRUQpIHtcbiAgICAgICAgICAgICAgc3BlYy5kYXRhLnRyYW5zZm9ybSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBieTogW29wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubmFtZV0sXG4gICAgICAgICAgICAgICAgICBzb3J0OiB7IGZpZWxkOiBvcHRpb25zLnNlcmllcz8uZ3JvdXBCeSB9LFxuICAgICAgICAgICAgICAgICAgZmllbGQ6IG9wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMV0ubmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZURlZXAoc3BlYywgeyBjb25maWc6IGZvbnRDb25maWcoJ1VidW50dSwgc2Fucy1zZXJpZicpIH0gYXMgYW55LCBvcHRpb25zLnNwZWNUb01lcmdlKTtcblxuICAgICAgICBpZiAoISFvcHRpb25zLnNwZWNUb01lcmdlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3BlYykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuaXNDaGFydFZhbGlkJCA9IHRoaXMub3B0aW9ucyQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgISFvcHRpb25zLnR5cGUgJiZcbiAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHZhcmlhYmxlcyB0byBkcmF3IHRoZSBncmFwaFxuICAgICAgICAgIChvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmZpbHRlcigodikgPT4gISF2LnR5cGUpLmxlbmd0aCA+IDEgfHxcbiAgICAgICAgICAgIChvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzLmZpbHRlcigodikgPT4gISF2LnR5cGUpLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgKG9wdGlvbnMuYWdncmVnYXRpb24gPT09IEFnZ3JlZ2F0aW9uLkNPVU5UIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hZ2dyZWdhdGlvbiA9PT0gQWdncmVnYXRpb24uRElTVElOQ1QgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFnZ3JlZ2F0aW9uID09PSBBZ2dyZWdhdGlvbi5OT05FKSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy52ZWdhTGl0ZVNwZWMkLCB0aGlzLnRyaWdnZXIkXSkuc3Vic2NyaWJlKChbc3BlYywgX10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmVnYSkge1xuICAgICAgICAgIHRoaXMudmlldz8uZmluYWxpemUoKTtcbiAgICAgICAgICBlbWJlZCh0aGlzLnZlZ2EubmF0aXZlRWxlbWVudCwgc3RydWN0dXJlZENsb25lKHNwZWMpLCB7XG4gICAgICAgICAgICBhY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbmRlcmVyOiAnc3ZnJyxcbiAgICAgICAgICAgIGZvcm1hdExvY2FsZTpcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sb2NhbGUgPT09ICdmcidcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbDogJywnLFxuICAgICAgICAgICAgICAgICAgICB0aG91c2FuZHM6ICdcXHUwMGEwJyxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmc6IFszXSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IFsnJywgJ1xcdTAwYTDigqwnXSxcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudDogJ1xcdTIwMmYlJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsOiAnLicsXG4gICAgICAgICAgICAgICAgICAgIHRob3VzYW5kczogJywnLFxuICAgICAgICAgICAgICAgICAgICBncm91cGluZzogWzNdLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogWyckJywgJyddXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdmlld0NsYXNzOiBWZWdhRXJyb3JIYW5kbGVyXG4gICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiAodGhpcy52aWV3ID0gcmVzdWx0LnZpZXcpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJpZ2dlciQubmV4dCgpLCAxMDApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy50cmlnZ2VyJC5uZXh0KCk7XG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRlRW5jb2Rpbmcob3B0aW9uczogQ2hhcnRXaWRnZXRPcHRpb25zKSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gb3B0aW9ucy5zZWxlY3RlZFZhcmlhYmxlcyA/PyBbe30sIHt9XTtcbiAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgY2FzZSBNYXJrVHlwZS5BUkM6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGhldGE6IHtcbiAgICAgICAgICAgIGZpZWxkOiBgYXR0cmlidXRlcy4ke3ZhcmlhYmxlc1sxXS5uYW1lfS52YWx1ZWAsXG4gICAgICAgICAgICB0aXRsZTogdmFyaWFibGVzWzFdLmxhYmVsLFxuICAgICAgICAgICAgdHlwZTogdmFyaWFibGVzWzFdLnR5cGUsXG4gICAgICAgICAgICBhZ2dyZWdhdGU6IG9wdGlvbnMuYWdncmVnYXRpb24gPz8gQWdncmVnYXRpb24uQ09VTlRcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICBmaWVsZDogYGF0dHJpYnV0ZXMuJHt2YXJpYWJsZXNbMF0ubmFtZX0udmFsdWVgLFxuICAgICAgICAgICAgdGl0bGU6IHZhcmlhYmxlc1swXS5sYWJlbCxcbiAgICAgICAgICAgIHR5cGU6IHZhcmlhYmxlc1swXS50eXBlLFxuICAgICAgICAgICAgbGVnZW5kOiBvcHRpb25zLmxlZ2VuZCA/PyB0cnVlLFxuICAgICAgICAgICAgc2NhbGU6IG9wdGlvbnMuc2NhbGUgPz8geyBzY2hlbWU6IG9wdGlvbnMuc2VyaWVzPy5zY2hlbWUgPz8gJ2NhdGVnb3J5MjBjJyB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgY2FzZSBNYXJrVHlwZS5SQURBUjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgZW5jb2RpbmcgPSB7XG4gICAgICAgICAgeDoge1xuICAgICAgICAgICAgZmllbGQ6IGBhdHRyaWJ1dGVzLiR7dmFyaWFibGVzWzBdLm5hbWV9LnZhbHVlYCxcbiAgICAgICAgICAgIHRpdGxlOiB2YXJpYWJsZXNbMF0ubGFiZWwsXG4gICAgICAgICAgICB0eXBlOiB2YXJpYWJsZXNbMF0udHlwZSxcbiAgICAgICAgICAgIHRpbWVVbml0OiB2YXJpYWJsZXNbMF0udHlwZSA9PT0gVmVnYVR5cGUuVEVNUE9SQUwgPyB2YXJpYWJsZXNbMF0udGltZVVuaXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBiaW46IG9wdGlvbnMuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuSElTVE9HUkFNLFxuICAgICAgICAgICAgYXhpczogdmFyaWFibGVzWzBdLmF4aXNPcHRpb25zLFxuICAgICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgICAgLy8gRm9yY2UgYSBmYWxzZSB2YWx1ZSBoZXJlIHNvIHRoYXQgdmVnYSB1bmRlcnN0YW5kIHByb3Blcmx5XG4gICAgICAgICAgICAgIHplcm86ICEhdmFyaWFibGVzWzBdLm9yaWdpbjAsXG4gICAgICAgICAgICAgIHR5cGU6IFdpZGdldENoYXJ0Q29tcG9uZW50LmlzVGltZVVuaXRVVEModmFyaWFibGVzWzBdKSA/ICd1dGMnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB5OiB7XG4gICAgICAgICAgICBmaWVsZDogYGF0dHJpYnV0ZXMuJHt2YXJpYWJsZXNbMV0ubmFtZX0udmFsdWVgLFxuICAgICAgICAgICAgdGl0bGU6IHZhcmlhYmxlc1sxXS5sYWJlbCxcbiAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMuYWdncmVnYXRpb24gPT09IEFnZ3JlZ2F0aW9uLkNPVU5UID8gVmVnYVR5cGUuUVVBTlRJVEFUSVZFIDogdmFyaWFibGVzWzFdLnR5cGUsXG4gICAgICAgICAgICB0aW1lVW5pdDogdmFyaWFibGVzWzFdLnR5cGUgPT09IFZlZ2FUeXBlLlRFTVBPUkFMID8gdmFyaWFibGVzWzFdLnRpbWVVbml0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpczogdmFyaWFibGVzWzFdLmF4aXNPcHRpb25zLFxuICAgICAgICAgICAgYWdncmVnYXRlOiBvcHRpb25zLmFnZ3JlZ2F0aW9uICE9PSBBZ2dyZWdhdGlvbi5OT05FID8gb3B0aW9ucy5hZ2dyZWdhdGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICAgIHplcm86IHZhcmlhYmxlc1sxXS5vcmlnaW4wLFxuICAgICAgICAgICAgICB0eXBlOiBXaWRnZXRDaGFydENvbXBvbmVudC5pc1RpbWVVbml0VVRDKHZhcmlhYmxlc1sxXSkgPyAndXRjJyA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGVuY29kaW5nLmNvbG9yID0ge1xuICAgICAgICAgICAgdGl0bGU6IGAke29wdGlvbnMuc2VyaWVzLmdyb3VwQnl9YCxcbiAgICAgICAgICAgIGZpZWxkOiBgYXR0cmlidXRlcy4ke29wdGlvbnMuc2VyaWVzLmdyb3VwQnl9LnZhbHVlYCxcbiAgICAgICAgICAgIGxlZ2VuZDogb3B0aW9ucy5sZWdlbmRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvcHRpb25zLnNlcmllcy5zY2hlbWUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVuY29kaW5nLmNvbG9yLnNjYWxlID0geyBzY2hlbWU6IG9wdGlvbnMuc2VyaWVzLnNjaGVtZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGJ1aWxkRGF0YVZlZ2FSYWRhcihpdGVtczogSXRlbVtdLCBvcHRpb25zOiBDaGFydFdpZGdldE9wdGlvbnMpOiBSYWRhclZhbHVlW10ge1xuICAgIGlmIChvcHRpb25zLnJhZGFyPy5jb21wYXJlID09PSAnaXRlbScpIHtcbiAgICAgIHJldHVybiBpdGVtc1xuICAgICAgICAubWFwKChpdGVtLCBpZHgpID0+XG4gICAgICAgICAgKG9wdGlvbnMucmFkYXI/LnByb3BzID8/IFtdKS5tYXAoKHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbVZhbHVlTXVsdGlwbGUgPSBJdGVtVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoaXRlbSwgcHJvcCk7XG4gICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSBBcnJheS5pc0FycmF5KGl0ZW1WYWx1ZU11bHRpcGxlKSA/IGl0ZW1WYWx1ZU11bHRpcGxlWzBdIDogaXRlbVZhbHVlTXVsdGlwbGU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjYXRlZ29yeTogaWR4LFxuICAgICAgICAgICAgICBrZXk6IHByb3AsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtVmFsdWU/LnZhbHVlXG4gICAgICAgICAgICB9IGFzIFJhZGFyVmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKChhOiBSYWRhclZhbHVlW10sIGI6IFJhZGFyVmFsdWVbXSkgPT4gWy4uLmEsIC4uLmJdLCBbXSlcbiAgICAgICAgLmZpbHRlcigoYTogUmFkYXJWYWx1ZSkgPT4gYS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGEudmFsdWUgIT09IG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXRlbXNcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAoaXRlbSwgaWR4KSA9PlxuICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IChpdGVtLmF0dHJpYnV0ZXNbb3B0aW9ucy5yYWRhcj8uY2F0ZWdvcnlQcm9wID8/ICcnXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSk/LnZhbHVlID8/ICdvYmplY3QnLFxuICAgICAgICAgICAgICBrZXk6IChpdGVtLmF0dHJpYnV0ZXNbb3B0aW9ucy5yYWRhcj8ua2V5UHJvcCA/PyAnJ10gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpPy52YWx1ZSxcbiAgICAgICAgICAgICAgdmFsdWU6IChpdGVtLmF0dHJpYnV0ZXNbb3B0aW9ucy5yYWRhcj8udmFsdWVQcm9wID8/ICcnXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSk/LnZhbHVlXG4gICAgICAgICAgICB9KSBhcyBSYWRhclZhbHVlXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYTogUmFkYXJWYWx1ZSkgPT4gYS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGEudmFsdWUgIT09IG51bGwgJiYgISFhLmtleSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG1hdGNoaW5nSXRlbXMoaXRlbXM6IEl0ZW1bXSwgb3B0aW9uczogQ2hhcnRXaWRnZXRPcHRpb25zLCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXSkge1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgIGNhc2UgTWFya1R5cGUuQ0lSQ0xFX1BBQ0s6XG4gICAgICAgICAgcmV0dXJuICEhb3B0aW9ucy5wYWNraW5nPy5pZCAmJiAhIW9wdGlvbnMucGFja2luZy5wYXJlbnRJZCAmJiAhIW9wdGlvbnMucGFja2luZy5wYWNrRmllbGQ7XG4gICAgICAgIGNhc2UgTWFya1R5cGUuUkFEQVI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICgob3B0aW9ucy5yYWRhcj8uY29tcGFyZSA9PT0gJ2l0ZW0nICYmIChvcHRpb25zLnJhZGFyLnByb3BzPy5sZW5ndGggPz8gMCkgPiAyKSB8fFxuICAgICAgICAgICAgICAob3B0aW9ucy5yYWRhcj8uY29tcGFyZSAhPT0gJ2l0ZW0nICYmXG4gICAgICAgICAgICAgICAgISFvcHRpb25zLnJhZGFyPy5rZXlQcm9wICYmXG4gICAgICAgICAgICAgICAgISFvcHRpb25zLnJhZGFyLnZhbHVlUHJvcCAmJlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucy5yYWRhci5jYXRlZ29yeVByb3ApKSAmJlxuICAgICAgICAgICAgV2lkZ2V0Q2hhcnRDb21wb25lbnQuYnVpbGREYXRhVmVnYVJhZGFyKGl0ZW1zLCBvcHRpb25zKS5sZW5ndGggPiAwXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoaXRlbS5hdHRyaWJ1dGVzKS5pbmNsdWRlcyhvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzWzBdLm5hbWUpICYmXG4gICAgICAgICAgICAoaXRlbS5hdHRyaWJ1dGVzW29wdGlvbnMuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubmFtZV0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICgoT2JqZWN0LmtleXMoaXRlbS5hdHRyaWJ1dGVzKS5pbmNsdWRlcyhvcHRpb25zLnNlbGVjdGVkVmFyaWFibGVzWzFdLm5hbWUpICYmXG4gICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbb3B0aW9ucy5zZWxlY3RlZFZhcmlhYmxlc1sxXS5uYW1lXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSkudmFsdWUgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgICAgICAgb3B0aW9ucy5hZ2dyZWdhdGlvbiA9PT0gQWdncmVnYXRpb24uRElTVElOQ1QgfHxcbiAgICAgICAgICAgICAgb3B0aW9ucy5hZ2dyZWdhdGlvbiA9PT0gQWdncmVnYXRpb24uQ09VTlQpXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyB1bmlxdWVBdHRyaWJ1dGVzQnlOYW1lcyhhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXSk6IEF0dHJpYnV0ZVtdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoYXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIudGVjaG5pY2FsTmFtZSkpXS5tYXAoXG4gICAgICAoYXR0ck5hbWUpID0+IGF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci50ZWNobmljYWxOYW1lID09PSBhdHRyTmFtZSkgPz8gKHt9IGFzIEF0dHJpYnV0ZSlcbiAgICApO1xuICB9XG5cbiAgdGVtcGxhdGVUeXBlVHJhbnNsYXRpb25GbiA9IChpdGVtOiBhbnksIGFyZ3M6IGFueVtdKSA9PlxuICAgIGAke2FyZ3NbMF19JHtpdGVtID09PSBNYXJrU3ViVHlwZS5ERUZBVUxUID8gaXRlbSA6IGFyZ3NbMV0gKyBhcmdzWzJdICsgaXRlbX1gO1xuXG4gIGFkdmFuY2VkRWRpdDogc3RyaW5nID0gJ3t9JztcblxuICBjaGFuZ2VDaGFydFRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmN1c3RvbVRpdGxlID0gdGl0bGU7XG4gIH1cblxuICBjaGFuZ2VUaW1lVW5pdCgkZXZlbnQ6IFRpbWVVbml0LCB2YXJpYWJsZTogVmFyaWFibGVEZWZpbml0aW9uKSB7XG4gICAgdmFyaWFibGUudGltZVVuaXQgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VBZ2dyZWdhdGlvbigkZXZlbnQ6IEFnZ3JlZ2F0aW9uKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5hZ2dyZWdhdGlvbiA9ICRldmVudDtcbiAgICBpZiAoW0FnZ3JlZ2F0aW9uLkNPVU5ULCBBZ2dyZWdhdGlvbi5ESVNUSU5DVF0uaW5jbHVkZXMoJGV2ZW50ISkpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMV0uYXhpc09wdGlvbnMgPSB7IHRpY2tNaW5TdGVwOiAxIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzFdLmF4aXNPcHRpb25zO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJDYWxjdWxhdGVQb3NzaWJsZUF0dHJpYnV0ZXMkLm5leHQoKTtcbiAgfVxuXG4gIGNoYW5nZVByb3BlcnR5KGF0dHJOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy52YXJpYWJsZUF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci50ZWNobmljYWxOYW1lID09PSBhdHRyTmFtZSk7XG4gICAgaWYgKCEhYXR0cikge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1tpbmRleF0ubmFtZSA9IGF0dHIubmFtZTtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbaW5kZXhdLmxhYmVsID0gYXR0ci5uYW1lO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQuaWQgPT09IGF0dHIuZmllbGQuaWQpPy50eXBlID8/IEZpZWxkVHlwZS5TVFJJTkc7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzW2luZGV4XS50eXBlID0gdGhpcy50cmFuc2xhdGVUb1ZlZ2FUeXBlKGZpZWxkLCBhdHRyLm5hbWUpO1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1tpbmRleF0uYXhpc09wdGlvbnMgPSB0aGlzLm1pblRpY2soZmllbGQpO1xuICAgICAgdGhpcy5vcHRpb25zQ29weS50aXRsZSA9XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubGFiZWwgKyAnLCAnICsgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1sxXS5sYWJlbDtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyQ2FsY3VsYXRlUG9zc2libGVBdHRyaWJ1dGVzJC5uZXh0KCk7XG4gIH1cblxuICBzdGF0aWMgaXNUaW1lVW5pdFVUQyh2YXJpYWJsZURlZjogVmFyaWFibGVEZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgbGV0IHV0Y1JlZ2V4ID0gbmV3IFJlZ0V4cCgvX3V0Y3x1dGNffF9VVEN8VVRDX3xfVXRjfFV0Y18vLCAnZycpO1xuICAgIHJldHVybiB1dGNSZWdleC50ZXN0KHZhcmlhYmxlRGVmPy5sYWJlbCk7XG4gIH1cblxuICBjaGFuZ2VMYWJlbChsYWJlbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgbGV0IHVwZGF0ZVRpdGxlID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zQ29weS50aXRsZSA9PT1cbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0ubGFiZWwgKyAnLCAnICsgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1sxXS5sYWJlbFxuICAgICkge1xuICAgICAgdXBkYXRlVGl0bGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbaW5kZXhdLmxhYmVsID0gbGFiZWw7XG4gICAgaWYgKHVwZGF0ZVRpdGxlKSB7XG4gICAgICAvL3VwZGF0ZSB0aXRsZSBpZiBpdCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgbWFudWFsbHlcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkudGl0bGUgPVxuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzBdLmxhYmVsICsgJywgJyArIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMV0ubGFiZWw7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlT3JpZ2luQXRaZXJvKHZhcmlhYmxlOiBWYXJpYWJsZURlZmluaXRpb24sICRldmVudDogYm9vbGVhbikge1xuICAgIHZhcmlhYmxlLm9yaWdpbjAgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VUeXBlKHR5cGVPcHRpb25zSWQ6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9uc0NvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5vcHRpb25zQ29weSk7XG4gICAgY29uc3QgW3R5cGUsIHN1YlR5cGVdID0gdHlwZU9wdGlvbnNJZC5zcGxpdCgnLScpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnR5cGUgPSB0eXBlO1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc3ViVHlwZSA9IHN1YlR5cGUgPz8gTWFya1N1YlR5cGUuREVGQVVMVDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnR5cGUgPT09IE1hcmtUeXBlLkNJUkNMRV9QQUNLKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnBhY2tpbmcgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkucGFja2luZztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS50eXBlID09PSBNYXJrVHlwZS5SQURBUikge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5yYWRhciA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5yYWRhcjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9uc0NvcHkudHlwZSkge1xuICAgICAgY2FzZSBNYXJrVHlwZS5CQVI6XG4gICAgICBjYXNlIE1hcmtUeXBlLkxJTkU6XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMF0udHlwZSA9XG4gICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zZWxlY3RlZFZhcmlhYmxlc1swXS50eXBlICE9PSBWZWdhVHlwZS5URU1QT1JBTCA/IFZlZ2FUeXBlLk5PTUlOQUwgOiBWZWdhVHlwZS5URU1QT1JBTDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hcmtUeXBlLlBPSU5UOlxuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlbGVjdGVkVmFyaWFibGVzWzFdLnR5cGUgPVxuICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXNbMV0udHlwZSAhPT0gVmVnYVR5cGUuVEVNUE9SQUwgPyBWZWdhVHlwZS5RVUFOVElUQVRJVkUgOiBWZWdhVHlwZS5URU1QT1JBTDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuQVJFQVNUQUNLRUQgfHwgdGhpcy5vcHRpb25zQ29weS5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5ISVNUT1NUQUNLRUQpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzID0gdGhpcy5vcHRpb25zQ29weS5zZXJpZXMgPz8ge307XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldENoYXJ0KCk7XG5cbiAgICBpZiAoc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuRE9OVVQpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuaW5uZXJSYWRpdXMgPSB0aGlzLm9wdGlvbnNDb3B5LmlubmVyUmFkaXVzID8/IDUwO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0Q2hhcnQoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXM/Lmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VsZWN0ZWRWYXJpYWJsZXMucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLndpZGdldEluZGV4LFxuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgb3B0aW9uczogeyAuLi50aGlzLm9wdGlvbnNDb3B5IH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zbGF0ZVRvVmVnYVR5cGUodHlwZTogRmllbGRUeXBlLCBuYW1lOiBzdHJpbmcpOiBWZWdhVHlwZSB7XG4gICAgbGV0IGlkUmVnZXggPSBuZXcgUmVnRXhwKC9faWR8aWRffF9JRHxJRF98X0lkfElkXy8sICdnJyk7XG4gICAgaWYgKGlkUmVnZXgudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIFZlZ2FUeXBlLk9SRElOQUw7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBGaWVsZFR5cGUuREVDSU1BTDpcbiAgICAgIGNhc2UgRmllbGRUeXBlLklOVEVHRVI6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5MT05HOlxuICAgICAgICByZXR1cm4gVmVnYVR5cGUuUVVBTlRJVEFUSVZFO1xuICAgICAgY2FzZSBGaWVsZFR5cGUuSU5TVEFOVDpcbiAgICAgICAgcmV0dXJuIFZlZ2FUeXBlLlRFTVBPUkFMO1xuICAgICAgY2FzZSBGaWVsZFR5cGUuS0VZV09SRDpcbiAgICAgIGNhc2UgRmllbGRUeXBlLlNUUklORzpcbiAgICAgICAgcmV0dXJuIFZlZ2FUeXBlLk5PTUlOQUw7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gVmVnYVR5cGUuTk9NSU5BTDtcbiAgICB9XG4gIH1cblxuICBtaW5UaWNrKHR5cGU6IEZpZWxkVHlwZSk6IHsgdGlja01pblN0ZXA6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRmllbGRUeXBlLklOVEVHRVI6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5MT05HOlxuICAgICAgICByZXR1cm4geyB0aWNrTWluU3RlcDogMSB9O1xuICAgICAgY2FzZSBGaWVsZFR5cGUuREVDSU1BTDpcbiAgICAgIGNhc2UgRmllbGRUeXBlLklOU1RBTlQ6XG4gICAgICBjYXNlIEZpZWxkVHlwZS5LRVlXT1JEOlxuICAgICAgY2FzZSBGaWVsZFR5cGUuU1RSSU5HOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyKCkge1xuICAgIHRoaXMudHJpZ2dlckNhbGN1bGF0ZVBvc3NpYmxlQXR0cmlidXRlcyQubmV4dCgpO1xuICB9XG5cbiAgcHJvcG9zZVRpdGxlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9uc0NvcHkudHlwZSA9PT0gTWFya1R5cGUuUkFEQVIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc0NvcHkucmFkYXI/LmNvbXBhcmUgPT09ICdpdGVtJykge1xuICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkudGl0bGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQucmFkYXIudGl0bGVJdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6ICh0aGlzLm9wdGlvbnNDb3B5LnJhZGFyLnByb3BzIHx8IFtdKS5qb2luKCcsICcpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc0NvcHkucmFkYXI/LmNvbXBhcmUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LnJhZGFyLnRpdGxlTGlzdCcsIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5vcHRpb25zQ29weS5yYWRhci5rZXlQcm9wID8/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5jaGFydC5yYWRhci5kZWZpbmVLZXknKSxcbiAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnJhZGFyLnZhbHVlUHJvcCA/PyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQucmFkYXIuZGVmaW5lVmFsdWUnKSxcbiAgICAgICAgICAgIGNhdGVnb3J5OlxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnJhZGFyLmNhdGVnb3J5UHJvcCA/P1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuY2hhcnQucmFkYXIuZGVmaW5lQ2F0ZWdvcnknKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zQ29weS50eXBlID09PSBNYXJrVHlwZS5DSVJDTEVfUEFDSykge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNpcmNsZS50aXRsZScsIHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5vcHRpb25zQ29weS5wYWNraW5nPy5wYWNrRmllbGQgPz8gJydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGNoYW5nZUlubmVyUmFkaXVzKCRldmVudDogc3RyaW5nKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMub3B0aW9uc0NvcHkuaW5uZXJSYWRpdXMgPSBwYXJzZUludCgkZXZlbnQsIDEwKTtcbiAgfVxuXG4gIG9wZW5TZXR0aW5ncygpIHtcbiAgICAodGhpcy5vcGVuJCBhcyBTdWJqZWN0PHZvaWQ+KS5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cblxuICB0b2dnbGVTZXJpZXMoJGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNlcmllcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5zZXJpZXM7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU2VyaWVzKCRldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LnNlcmllcykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5zZXJpZXMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zQ29weS5zZXJpZXMuZ3JvdXBCeSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZVNlcmllc1NjaGVtZSgkZXZlbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5zZXJpZXMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzID0ge307XG4gICAgfVxuICAgIHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzLnNjaGVtZSA9ICRldmVudDtcbiAgfVxuXG4gIHRvZ2dsZVNlcmllc0xlZ2VuZCgkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGVnZW5kID0gJGV2ZW50O1xuICB9XG5cbiAgdG9nZ2xlVG9vbHRpcCgkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkudG9vbHRpcCA9ICRldmVudDtcbiAgfVxuXG4gIGF4ZUxhYmVsKGk6IG51bWJlciwgb3B0aW9uc0NvcHk6IENoYXJ0V2lkZ2V0T3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zQ29weT8udHlwZSA9PT0gTWFya1R5cGUuQVJDKSB7XG4gICAgICByZXR1cm4gaSA9PT0gMCA/ICdAcHJ5LndpZGdldC5jaGFydC5lbmNvZGluZy5ncm91cCcgOiAnQHByeS53aWRnZXQuY2hhcnQuZW5jb2RpbmcudmFsdWVzJztcbiAgICB9XG4gICAgcmV0dXJuIGkgPT09IDAgPyAnQHByeS53aWRnZXQuY2hhcnQuZW5jb2RpbmcuaG9yaXpvbnRhbCcgOiAnQHByeS53aWRnZXQuY2hhcnQuZW5jb2RpbmcudmVydGljYWwnO1xuICB9XG5cbiAgaGFzTm9UeXBlKG9wdGlvbnM6IENoYXJ0V2lkZ2V0T3B0aW9ucykge1xuICAgIHJldHVybiAhb3B0aW9ucyB8fCAhb3B0aW9ucy50eXBlIHx8IG9wdGlvbnMudHlwZS5pbmNsdWRlcygndW5kZWZpbmVkJykgfHwgb3B0aW9ucy50eXBlLmluY2x1ZGVzKCdudWxsJyk7XG4gIH1cblxuICBzY2hlbWUoKSB7XG4gICAgcmV0dXJuIHZlZ2Euc2NoZW1lKHRoaXMub3B0aW9uc0NvcHkuc2VyaWVzPy5zY2hlbWUgPz8gJycpO1xuICB9XG5cbiAgdG9nZ2xlU3BlY1RvTWVyZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlID0ge307XG4gICAgICB0aGlzLmFkdmFuY2VkRWRpdCA9ICd7fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlO1xuICAgICAgdGhpcy5hZHZhbmNlZEVkaXQgPSAne30nO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUFkdmFuY2VkRWRpdCgkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gJGV2ZW50Py50YXJnZXQ/LnZhbHVlID8/ICRldmVudDtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc3BlY1RvTWVyZ2UgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5hZHZhbmNlZEVkaXQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlLCB1bmRlZmluZWQsIDQpO1xuICAgICAgICB0aGlzLmludmFsaWRKc29uID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQganNvbiBwcm92aWRlZCcpO1xuICAgICAgICB0aGlzLmludmFsaWRKc29uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnNwZWNUb01lcmdlO1xuICAgICAgdGhpcy5hZHZhbmNlZEVkaXQgPSAne30nO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHRvSW1hZ2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZSh0aGlzLnZlZ2EubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKVswXS50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHByeS13aWRnZXQtY2hhcnQtY3NzPjwvcHJ5LXdpZGdldC1jaGFydC1jc3M+XG48ZGl2IGNsYXNzPVwiby13aWRnZXQgby13aWRnZXQtLWNoYXJ0XCI+XG4gIEBpZiAoZGlzcGxheUhlYWRlciQgfCBhc3luYykge1xuICAgIDxwcnktd2lkZ2V0LWhlYWRlclxuICAgICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgICAgKG1hbmlmZXN0TW9kaWZpZWQpPVwibWFuaWZlc3RNb2RpZmllZC5lbWl0KCRldmVudClcIlxuICAgICAgI2hlYWRlclxuICAgICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAgID5cbiAgICAgIDxwcnktc2V0dGluZ3NcbiAgICAgICAgKHNhdmVUcmlnZ2VyZWQpPVwiZW1pdE1hbmlmZXN0KClcIlxuICAgICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgICBbaXNEaXNhYmxlXT1cIihmaWx0ZXJEYXRhRm9yT3B0aW9uc0NvcHkkIHwgYXN5bmMpPy5sZW5ndGggPT09IDAgfHwgaGFzTm9UeXBlKG9wdGlvbnNDb3B5KVwiXG4gICAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICAgIFtoZWFkZXJdPVwiaGVhZGVyXCJcbiAgICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgICAgPHByeS1lZGl0LWlucHV0XG4gICAgICAgICAgICBsYWJlbD1cIkBwcnkud2lkZ2V0LmNoYXJ0LnRpdGxlXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUNoYXJ0VGl0bGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5jdXN0b21UaXRsZSA/PyBvcHRpb25zQ29weS50aXRsZVwiXG4gICAgICAgICAgPjwvcHJ5LWVkaXQtaW5wdXQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgQGlmICgoZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYS1sYWJlbCBhLWxhYmVsLS1oZWxwIC1lcnJvclwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5wYXJhbXMubm9QYXJhbXMnIHwgaTE4biB9fTwvcD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5SQURBUikge1xuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQuY2hhcnQucGFyYW1zLm11bHRpcGxlUGFyYW1zJyB8IGkxOG4gfX17eyAoZmlsdGVyRGF0YUZvck9wdGlvbnNDb3B5JCB8IGFzeW5jKT8ubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGFydF90eXBlXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnR5cGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwidHlwZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LnR5cGUgKyAnLScgKyBvcHRpb25zQ29weS5zdWJUeXBlXCJcbiAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQHByeS53aWRnZXQuY2hhcnQubWFya1R5cGUuXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgYmluZFZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICAgIGlkPVwiY2hhcnRfdHlwZVwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKG9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5SQURBUiAmJiBvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuQ0lSQ0xFX1BBQ0spIHtcbiAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5Py5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5ET05VVCkge1xuICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5pbm5lclJhZGl1c1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUlubmVyUmFkaXVzKCRldmVudClcIlxuICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0LmNoYXJ0LmlubmVyUmFkaXVzXCJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgIG1heD1cIjUwMFwiXG4gICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKHZhcmlhYmxlRGVmIG9mIG9wdGlvbnNDb3B5Py5zZWxlY3RlZFZhcmlhYmxlczsgdHJhY2sgdmFyaWFibGVEZWY7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYWdncmVnYXRpb25zXCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmVuY29kaW5nLmdyb3VwJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgQGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQWdncmVnYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImFnZ3JlZ2F0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYWdncmVnYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWdncmVnYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQHByeS53aWRnZXQuY2hhcnQuYWdncmVnYXRpb24uXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGkgIT09IDEgfHwgb3B0aW9uc0NvcHkuYWdncmVnYXRpb24gIT09ICdjb3VudCcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYWdncmVnYXRpb25fcHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYXhlTGFiZWwoaSwgb3B0aW9uc0NvcHkpIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVByb3BlcnR5KCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiKGkgIT09IDEgPyB2YXJpYWJsZUF0dHJpYnV0ZXMkIDogcG9zc2libGVTZWNvbmRhcnlBdHRyaWJ1dGVzJCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInZhcmlhYmxlRGVmLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwidGVjaG5pY2FsTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYWdncmVnYXRpb25fcHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8cHJ5LWVkaXQtaW5wdXRcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkBwcnkud2lkZ2V0LmNoYXJ0LmRhdGFMYWJlbFwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGFiZWwoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmFyaWFibGVEZWYubGFiZWxcIlxuICAgICAgICAgICAgICA+PC9wcnktZWRpdC1pbnB1dD5cbiAgICAgICAgICAgICAgQGlmICh2YXJpYWJsZURlZi50eXBlID09PSAndGVtcG9yYWwnKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X3RpbWVVbml0XCI+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnRpbWVVbml0JyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlVGltZVVuaXQoJGV2ZW50LCB2YXJpYWJsZURlZilcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidGltZVVuaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmFyaWFibGVEZWYudGltZVVuaXRcIlxuICAgICAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQHByeS53aWRnZXQuY2hhcnQudGltZVVuaXRMaXN0LlwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiY2hhcnRfdGltZVVuaXRcIlxuICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHZhcmlhYmxlRGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnICYmIG9wdGlvbnNDb3B5Py50eXBlICE9PSAnYXJjJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlT3JpZ2luQXRaZXJvKHZhcmlhYmxlRGVmLCAkZXZlbnQpXCIgW25nTW9kZWxdPVwidmFyaWFibGVEZWYub3JpZ2luMFwiXG4gICAgICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQuY2hhcnQub3JpZ2luJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX3BvcHVwX19jb250ZW50X19maWVsZHMgLWNvbmRlbnNlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5BUkMgJiYgb3B0aW9uc0NvcHk/LnR5cGUgIT09IE1hcmtUeXBlLlJBREFSKSB7XG4gICAgICAgICAgICAgICAgPHByeS1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlU2VyaWVzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiISFvcHRpb25zQ29weS5zZXJpZXNcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5zdWJUeXBlID09PSBNYXJrU3ViVHlwZS5BUkVBU1RBQ0tFRCB8fFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NvcHkuc3ViVHlwZSA9PT0gTWFya1N1YlR5cGUuSElTVE9TVEFDS0VEXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnNlcmllcycgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuQVJDICYmIG9wdGlvbnNDb3B5Py50eXBlICE9PSBNYXJrVHlwZS5SQURBUiAmJiAhIW9wdGlvbnNDb3B5LnNlcmllcykge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY2hhcnRfc2VyaWVzQXR0clwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5zZXJpZXNBdHRyJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTZXJpZXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5zZXJpZXMuZ3JvdXBCeSFcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInZhcmlhYmxlQXR0cmlidXRlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjaGFydF9zZXJpZXNBdHRyXCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgIChvcHRpb25zQ29weT8udHlwZSA9PT0gTWFya1R5cGUuQVJDIHx8IG9wdGlvbnNDb3B5Py50eXBlID09PSBNYXJrVHlwZS5SQURBUiB8fCAhIW9wdGlvbnNDb3B5LnNlcmllcykgJiZcbiAgICAgICAgICAgICAgc2NoZW1lc1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X3Nlcmllc1NjaGVtZVwiIFt0aXRsZV09XCInQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzU2NoZW1lQWx0JyB8IGkxOG5cIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnNlcmllc1NjaGVtZScgfCBpMThuXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTZXJpZXNTY2hlbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5zZXJpZXM/LnNjaGVtZSFcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInNjaGVtZXNcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjaGFydF9zZXJpZXNTY2hlbWVcIlxuICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBwcnkud2lkZ2V0LmNoYXJ0LnNjaGVtZS5cIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwiaWRcIlxuICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0LS1jaGFydC1jb2xvci10aHVtYlwiPlxuICAgICAgICAgICAgICBAZm9yIChzY2hlbWVDb2xvciBvZiBzY2hlbWUoKTsgdHJhY2sgc2NoZW1lQ29sb3IpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm8td2lkZ2V0LS1jaGFydC1jb2xvci10aHVtYi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJzY2hlbWVDb2xvclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJzY2hlbWVDb2xvclwiXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgQGlmIChvcHRpb25zQ29weT8udHlwZSAhPT0gTWFya1R5cGUuUkFEQVIgfHwgISFvcHRpb25zQ29weS5zZXJpZXMpIHtcbiAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVTZXJpZXNMZWdlbmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIhIW9wdGlvbnNDb3B5LmxlZ2VuZCFcIlxuICAgICAgICAgICAgICAgICAgPnt7ICdAcHJ5LndpZGdldC5jaGFydC5zZXJpZXNMZWdlbmQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVUb29sdGlwKCRldmVudClcIiBbbmdNb2RlbF09XCIhIW9wdGlvbnNDb3B5LnRvb2x0aXAhXCJcbiAgICAgICAgICAgICAgICA+e3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LnRvb2x0aXAnIHwgaTE4biB9fVxuICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9uc0NvcHk/LnR5cGUgPT09IE1hcmtUeXBlLlJBREFSICYmIG9wdGlvbnNDb3B5LnJhZGFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zQ29weS5yYWRhci5jb21wYXJlXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwiY29tcGFyaXNvbnNcIlxuICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cImlkXCJcbiAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChvcHRpb25zQ29weS5yYWRhci5jb21wYXJlID09PSAnaXRlbScpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucmFkYXIucHJvcHNcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIm51bWVyaWNQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5LnJhZGFyLmNvbXBhcmUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjb21wYXJpc29uX2tleVwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jb21wYXJpc29uLmtleScgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnJhZGFyLmtleVByb3BcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInRleHRQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNvbXBhcmlzb25fa2V5XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjb21wYXJpc29uX3ZhbHVlc1wiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jb21wYXJpc29uLnZhbHVlcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnJhZGFyLnZhbHVlUHJvcFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibnVtZXJpY1Byb3BlcnRpZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY29tcGFyaXNvbl92YWx1ZXNcIlxuICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNvbXBhcmlzb25fY2F0ZWdvcnlcIj57e1xuICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNvbXBhcmlzb24uY2F0ZWdvcnknIHwgaTE4blxuICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnJhZGFyLmNhdGVnb3J5UHJvcFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidGV4dFByb3BlcnRpZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY29tcGFyaXNvbl9jYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHNjaGVtZXMpIHtcbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLWxhYmVsXCJcbiAgICAgICAgICAgICAgICBmb3I9XCJjaGFydF9zZXJpZXNTY2hlbWVfcmFkYXJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzU2NoZW1lQWx0JyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQuY2hhcnQuc2VyaWVzU2NoZW1lJyB8IGkxOG4gfX08L2xhYmVsXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTZXJpZXNTY2hlbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5zZXJpZXM/LnNjaGVtZSFcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInNjaGVtZXNcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjaGFydF9zZXJpZXNTY2hlbWVfcmFkYXJcIlxuICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5Py50eXBlID09PSBNYXJrVHlwZS5DSVJDTEVfUEFDSyAmJiBvcHRpb25zQ29weS5wYWNraW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXNldHRpbmdzX19wb3B1cF9fY29udGVudF9fZmllbGRzIC1jb25kZW5zZWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGFydF9jaXJjbGVfaWRcIj57eyAnQHByeS53aWRnZXQuY2hhcnQuY2lyY2xlLmlkJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucGFja2luZy5pZFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidmFyaWFibGVBdHRyaWJ1dGVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNoYXJ0X2NpcmNsZV9pZFwiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY2hhcnRfY2lyY2xlX3BpZFwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jaXJjbGUucGlkJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0cmlnZ2VyKCk7IHByb3Bvc2VUaXRsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uc0NvcHkucGFja2luZy5wYXJlbnRJZFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidmFyaWFibGVBdHRyaWJ1dGVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNoYXJ0X2NpcmNsZV9waWRcIlxuICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoYXJ0X2NpcmNsZV9maWVsZFwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jaXJjbGUuZmllbGQnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRyaWdnZXIoKTsgcHJvcG9zZVRpdGxlKClcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zQ29weS5wYWNraW5nLnBhY2tGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibnVtZXJpY1Byb3BlcnRpZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY2hhcnRfY2lyY2xlX2ZpZWxkXCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGFydF9jaXJjbGVfdG9vbHRpcFwiPnt7ICdAcHJ5LndpZGdldC5jaGFydC5jaXJjbGUudG9vbHRpcCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidHJpZ2dlcigpOyBwcm9wb3NlVGl0bGUoKVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnNDb3B5LnBhY2tpbmcudG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidmFyaWFibGVBdHRyaWJ1dGVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNoYXJ0X2NpcmNsZV90b29sdGlwXCJcbiAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkcyAtY29uZGVuc2VkXCI+XG4gICAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVNwZWNUb01lcmdlKCRldmVudClcIiBbbmdNb2RlbF09XCIhIW9wdGlvbnNDb3B5LnNwZWNUb01lcmdlXCJcbiAgICAgICAgICAgICAgPnt7ICdAcHJ5LndpZGdldC5jaGFydC5tb3JlT3B0aW9ucycgfCBpMThuIH19XG4gICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgIEBpZiAoISFvcHRpb25zQ29weS5zcGVjVG9NZXJnZSkge1xuICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhZHZhbmNlZEVkaXRcIlxuICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVBZHZhbmNlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJvLXNldHRpbmdzX19wb3B1cF9fY29udGVudF9fYXJlYVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLi1pbnZhbGlkXT1cImludmFsaWRKc29uXCJcbiAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcHJ5LXNldHRpbmdzPlxuICAgICAgPC9wcnktd2lkZ2V0LWhlYWRlcj5cbiAgICB9XG4gICAgQGlmIChpc0NoYXJ0VmFsaWQkIHwgYXN5bmMpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgI3ZlZ2FcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICgod2lkZ2V0U2l6ZSQgfCBhc3luYyk/LmhlaWdodCA/PyAwKSAtICgoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPyAxIDogMCkgKiBXSURHRVRfSEVBREVSX0hFSUdIVFxuICAgICAgXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIih3aWRnZXRTaXplJCB8IGFzeW5jKT8ud2lkdGhcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoIShpc0NoYXJ0VmFsaWQkIHwgYXN5bmMpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXRfX2Nob29zZS1wYXJhbWV0ZXJzXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiYS1wXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0LmNoYXJ0LmNob29zZVBhcmFtZXRlcnMnIHwgaTE4biB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuU2V0dGluZ3MoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIj5cbiAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIyMFwiIFt3aWR0aF09XCIyMFwiIGljb25Tdmc9XCJjb250cm9sXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnQHByeS53aWRnZXQuc2V0dGluZ3MudGl0bGUnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuIl19
|