@c8y/ngx-components 1021.77.2 → 1021.78.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/bookmarks/bookmarks.component.d.ts +4 -6
  2. package/bookmarks/bookmarks.component.d.ts.map +1 -1
  3. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
  4. package/echart/charts.component.d.ts.map +1 -1
  5. package/echart/models/datapoints-graph-widget.model.d.ts +2 -0
  6. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -1
  7. package/echart/services/echarts-options.service.d.ts.map +1 -1
  8. package/esm2022/bookmarks/bookmarks.component.mjs +15 -18
  9. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +6 -5
  10. package/esm2022/echart/charts.component.mjs +5 -3
  11. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +1 -1
  12. package/esm2022/echart/services/echarts-options.service.mjs +5 -5
  13. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +5 -4
  14. package/fesm2022/c8y-ngx-components-bookmarks.mjs +13 -14
  15. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +5 -4
  17. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-echart.mjs +8 -6
  20. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +4 -3
  22. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  23. package/package.json +1 -1
  24. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -1
@@ -198,7 +198,8 @@ export class DatapointsGraphWidgetConfigComponent {
198
198
  realtime: [false, [Validators.required]],
199
199
  showSlider: [true, [Validators.required]],
200
200
  yAxisSplitLines: [false, [Validators.required]],
201
- xAxisSplitLines: [false, [Validators.required]]
201
+ xAxisSplitLines: [false, [Validators.required]],
202
+ numberOfDecimalPlaces: [2, [Validators.required, Validators.min(0), Validators.max(10)]]
202
203
  });
203
204
  return form;
204
205
  }
@@ -215,7 +216,7 @@ export class DatapointsGraphWidgetConfigComponent {
215
216
  (this.config?.datapoints?.filter(dp => dp.__active)?.length || 0) > 0;
216
217
  }
217
218
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, deps: [{ token: i1.WidgetConfigComponent, optional: true }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
218
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
219
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
219
220
  }
220
221
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, decorators: [{
221
222
  type: Component,
@@ -229,7 +230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
229
230
  DatapointSelectorModule,
230
231
  AlarmEventSelectorModule,
231
232
  TimeContextComponent
232
- ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
233
+ ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
233
234
  }], ctorParameters: () => [{ type: i1.WidgetConfigComponent, decorators: [{
234
235
  type: Optional
235
236
  }] }, { type: i1.ContextDashboardComponent, decorators: [{
@@ -237,4 +238,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
237
238
  }] }], propDecorators: { config: [{
238
239
  type: Input
239
240
  }] } });
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLFdBQVcsRUFDWCxPQUFPLEVBRVAsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBRUwsd0JBQXdCLEVBRXpC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RnBDLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsMEJDL0RyRCx1bFpBZ1ZBLDJDRDNSSSxZQUFZLHVnQkFDWixVQUFVLG92REFDVixXQUFXLDhCQUNYLGFBQWEsaWtCQUNiLGFBQWEsK1ZBQ2IsZUFBZSwyTkFDZix1QkFBdUIscVRBQ3ZCLHdCQUF3QixzVUFDeEIsb0JBQW9COzs0RkFJWCxvQ0FBb0M7a0JBbEJoRCxTQUFTOytCQUNFLG9DQUFvQyxRQUN4QyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsY0FFakIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixlQUFlO3dCQUNmLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixvQkFBb0I7cUJBQ3JCLGFBQ1UsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQzs7MEJBMENoRCxRQUFROzswQkFDUixRQUFRO3lDQXhDRixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL09ic2VydmFibGUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3JlTW9kdWxlLFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yLFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dCxcbiAgT25CZWZvcmVTYXZlLFxuICBXaWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnMsXG4gIERhdGFwb2ludFNlbGVjdG9yTW9kdWxlLFxuICBLUElEZXRhaWxzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCxcbiAgV2lkZ2V0Q29uZmlnQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHtcbiAgQWxhcm1EZXRhaWxzLFxuICBBbGFybUV2ZW50U2VsZWN0b3JNb2R1bGUsXG4gIEV2ZW50RGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2FsYXJtLWV2ZW50LXNlbGVjdG9yJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuaW1wb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5pbXBvcnQge1xuICBDaGFydEFsYXJtc1NlcnZpY2UsXG4gIENoYXJ0RXZlbnRzU2VydmljZSxcbiAgQ2hhcnRzQ29tcG9uZW50LFxuICBEYXRhcG9pbnRzR3JhcGhLUElEZXRhaWxzLFxuICBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcsXG4gIERhdGFwb2ludHNHcmFwaFdpZGdldFRpbWVQcm9wcyxcbiAgREFURV9TRUxFQ1RJT05fRVhURU5ERUQsXG4gIFRpbWVDb250ZXh0UHJvcHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9lY2hhcnQnO1xuaW1wb3J0IHsgVGltZUNvbnRleHRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3RpbWUtY29udGV4dCc7XG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaW50ZXJ2YWwtcGlja2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGFwb2ludHMtZ3JhcGgtd2lkZ2V0LWNvbmZpZycsXG4gIGhvc3Q6IHsgY2xhc3M6ICdkLWNvbnRlbnRzJyB9LFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb3JlTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgUG9wb3Zlck1vZHVsZSxcbiAgICBDaGFydHNDb21wb25lbnQsXG4gICAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gICAgQWxhcm1FdmVudFNlbGVjdG9yTW9kdWxlLFxuICAgIFRpbWVDb250ZXh0Q29tcG9uZW50XG4gIF0sXG4gIHByb3ZpZGVyczogW0NoYXJ0RXZlbnRzU2VydmljZSwgQ2hhcnRBbGFybXNTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQmVmb3JlU2F2ZSwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY29uZmlnOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtQnVpbGRlciA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybSA9IGluamVjdChOZ0Zvcm0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UgPSBpbmplY3QoV2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlKTtcblxuICBhbGVydHM6IER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IgfCB1bmRlZmluZWQ7XG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdDb21wb25lbnRbJ2luaXRGb3JtJ10+O1xuICBEQVRFX1NFTEVDVElPTiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEO1xuICBkYXRlU2VsZWN0aW9uOiBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCB8IHVuZGVmaW5lZDtcbiAgZGF0ZVNlbGVjdGlvbkhlbHAgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgIGdldHRleHQoYENob29zZSBob3cgdG8gc2VsZWN0IGEgZGF0ZSByYW5nZSwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgPHVsIGNsYXNzPVwibS1sLTAgcC1sLTggbS10LTggbS1iLTBcIj5cbiAgICA8bGk+XG4gICAgICA8Yj5XaWRnZXQgY29uZmlndXJhdGlvbjo8L2I+XG4gICAgICByZXN0cmljdHMgdGhlIGRhdGUgc2VsZWN0aW9uIG9ubHkgdG8gdGhlIHdpZGdldCBjb25maWd1cmF0aW9uXG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8Yj5XaWRnZXQgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldCB2aWV3IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8Yj5EYXNoYm9hcmQgdGltZSByYW5nZTo8L2I+XG4gICAgICByZXN0cmljdHMgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIGdsb2JhbCBkYXNoYm9hcmQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgPC9saT5cbiAgPC91bD5gKVxuICApO1xuICBkYXRhcG9pbnRTZWxlY3REZWZhdWx0Rm9ybU9wdGlvbnM6IFBhcnRpYWw8RGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWc+ID0ge1xuICAgIHNob3dSYW5nZTogdHJ1ZSxcbiAgICBzaG93Q2hhcnQ6IHRydWVcbiAgfTtcbiAgZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnOiBQYXJ0aWFsPERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zPiA9IHt9O1xuICBhY3RpdmVEYXRhcG9pbnRzRXhpc3RzID0gZmFsc2U7XG4gIGFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSBmYWxzZTtcbiAgdGltZVByb3BzOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRUaW1lUHJvcHMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgd2lkZ2V0Q29uZmlnOiBXaWRnZXRDb25maWdDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50OiBDb250ZXh0RGFzaGJvYXJkQ29tcG9uZW50XG4gICkge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5pbml0Rm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb25maWc/LmRhdGFwb2ludHM/LmZvckVhY2goZHAgPT4gdGhpcy5hc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZHApKTtcbiAgICB0aGlzLmZvcm0uZm9ybS5hZGRDb250cm9sKCdjb25maWcnLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmNvbmZpZyB8fCB7fSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWxhcm1zLnNldFZhbHVlKFxuICAgICAgdGhpcy5jb25maWc/LmFsYXJtc0V2ZW50c0NvbmZpZ3M/LmZpbHRlcihhZSA9PiBhZS50aW1lbGluZVR5cGUgPT09ICdBTEFSTScpIGFzIEFsYXJtRGV0YWlsc1tdXG4gICAgKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5ldmVudHMuc2V0VmFsdWUoXG4gICAgICB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZmlsdGVyKGFlID0+IGFlLnRpbWVsaW5lVHlwZSA9PT0gJ0VWRU5UJykgYXMgRXZlbnREZXRhaWxzW11cbiAgICApO1xuXG4gICAgdGhpcy5pbml0RGF0ZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpO1xuICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFtcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuYWxhcm1zIHx8IFtdKSxcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuZXZlbnRzIHx8IFtdKVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRBY3RpdmVEYXRhcG9pbnRzRXhpc3RzKCk7XG4gICAgICB0aGlzLmNoZWNrRm9yTWF0Y2hpbmdEYXRhcG9pbnRzKCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWc/LndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMudXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQodGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UuaW5pdGlhbFRpbWVSYW5nZSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuZGF0ZUZyb20gJiYgdGhpcy5jb25maWcuZGF0ZVRvKSB7XG4gICAgICB0aGlzLnRpbWVQcm9wcyA9IHtcbiAgICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKHRoaXMuY29uZmlnPy5kYXRlRnJvbSksXG4gICAgICAgIGRhdGVUbzogbmV3IERhdGUodGhpcy5jb25maWc/LmRhdGVUbyksXG4gICAgICAgIGludGVydmFsOiB0aGlzLmNvbmZpZz8uaW50ZXJ2YWwsXG4gICAgICAgIHJlYWx0aW1lOiB0aGlzLmNvbmZpZz8ucmVhbHRpbWUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB0aGlzLmNvbmZpZz8ucmVhbHRpbWUgPyBudWxsIDogdGhpcy5jb25maWc/LmFnZ3JlZ2F0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZShcbiAgICBjb25maWc/OiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdcbiAgKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsaWQgJiYgY29uZmlnKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgb21pdCh0aGlzLmZvcm1Hcm91cC52YWx1ZSwgWydhbGFybXMnLCAnZXZlbnRzJ10pLCB7XG4gICAgICAgIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFtcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuYWxhcm1zIHx8IFtdKSxcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuZXZlbnRzIHx8IFtdKVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRpbWVQcm9wc0NoYW5nZWQodGltZVByb3BzOiBUaW1lQ29udGV4dFByb3BzKTogdm9pZCB7XG4gICAgaWYgKHRpbWVQcm9wcy5yZWFsdGltZSAhPT0gdGhpcy5jb25maWcucmVhbHRpbWUpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyByZWFsdGltZTogdGltZVByb3BzLnJlYWx0aW1lIH0pO1xuICAgIH1cbiAgICBpZiAodGltZVByb3BzLnJlYWx0aW1lKSB7XG4gICAgICBpZiAodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsICE9PSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5pbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgaW50ZXJ2YWw6IHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGF0Y2hWYWx1ZXMgPSB7XG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSksXG4gICAgICBpbnRlcnZhbDogdGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgLi4uKHRpbWVQcm9wcy5hZ2dyZWdhdGlvbiAmJiB7IGFnZ3JlZ2F0aW9uOiB0aW1lUHJvcHMuYWdncmVnYXRpb24gfSksXG4gICAgICAuLi4odGltZVByb3BzLnJlYWx0aW1lICYmIHsgcmVhbHRpbWU6IHRpbWVQcm9wcy5yZWFsdGltZSB9KVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHBhdGNoVmFsdWVzKTtcbiAgfVxuXG4gIHVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KHRpbWVQcm9wczogRGF0YXBvaW50c0dyYXBoV2lkZ2V0VGltZVByb3BzKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbFRpbWVSYW5nZSA9IHtcbiAgICAgIGRhdGVGcm9tOiB0aW1lUHJvcHMuZGF0ZUZyb20sXG4gICAgICBkYXRlVG86IHRpbWVQcm9wcy5kYXRlVG8sXG4gICAgICBpbnRlcnZhbDogdGltZVByb3BzLmludGVydmFsIHx8ICdjdXN0b20nXG4gICAgfTtcbiAgICBpZiAoIXRoaXMud2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlLmluaXRpYWxUaW1lUmFuZ2UoKSkge1xuICAgICAgdGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UudXBkYXRlSW5pdGlhbFRpbWVSYW5nZShpbml0aWFsVGltZVJhbmdlKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IC4uLnRpbWVQcm9wcywgLi4uaW5pdGlhbFRpbWVSYW5nZSB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoXG4gICAgdGltZVJhbmdlOiBQaWNrPERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZywgJ2RhdGVGcm9tJyB8ICdkYXRlVG8nPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRpbWVSYW5nZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgZGF0ZVNlbGVjdGlvbkNoYW5nZShkYXRlU2VsZWN0aW9uOiBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IGRhdGVTZWxlY3Rpb247XG5cbiAgICBpZiAoZGF0ZVNlbGVjdGlvbiA9PT0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQuQ09ORklHKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5lbmFibGUoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkaXNwbGF5RGF0ZVNlbGVjdGlvbiBzaG91bGQgYmUgZmFsc2UgYW5kIGRpc2FibGVkIHdoZW4gZGF0ZVNlbGVjdGlvbiBpcyBub3QgQ09ORklHXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGlzcGxheURhdGVTZWxlY3Rpb24uZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDogdHJ1ZSxcbiAgICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICAgIGRpc3BsYXlEYXRlU2VsZWN0aW9uOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZGF0YXBvaW50OiBLUElEZXRhaWxzKSB7XG4gICAgaWYgKCF0aGlzLmRhc2hib2FyZENvbnRleHRDb21wb25lbnQ/LmlzRGV2aWNlVHlwZURhc2hib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53aWRnZXRDb25maWc/LmNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQ/LmlkKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGlkIH0gPSBjb250ZXh0O1xuICAgICAgZGF0YXBvaW50Ll9fdGFyZ2V0ID0geyBuYW1lLCBpZCB9O1xuICAgICAgdGhpcy5kYXRhcG9pbnRTZWxlY3Rpb25Db25maWcuY29udGV4dEFzc2V0ID0geyBpZCB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsTWF0Y2ggPSB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZXZlcnkoYWUgPT5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGFwb2ludHM/LnNvbWUoZHAgPT4gZHAuX190YXJnZXQ/LmlkID09PSBhZS5fX3RhcmdldD8uaWQpXG4gICAgKTtcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChhbGxNYXRjaCkge1xuICAgICAgICB0aGlzLmFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCkge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGRhdGFwb2ludHM6IFtcbiAgICAgICAgW10gYXMgRGF0YXBvaW50c0dyYXBoS1BJRGV0YWlsc1tdLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSldXG4gICAgICBdLFxuICAgICAgYWxhcm1zOiBbW10gYXMgQWxhcm1EZXRhaWxzW11dLFxuICAgICAgZXZlbnRzOiBbW10gYXMgRXZlbnREZXRhaWxzW11dLFxuICAgICAgZGlzcGxheU1hcmtlZExpbmU6IFt0cnVlLCBbXV0sXG4gICAgICBkaXNwbGF5TWFya2VkUG9pbnQ6IFt0cnVlLCBbXV0sXG4gICAgICBtZXJnZU1hdGNoaW5nRGF0YXBvaW50czogW3RydWUsIFtdXSxcbiAgICAgIGZvcmNlTWVyZ2VEYXRhcG9pbnRzOiBbZmFsc2UsIFtdXSxcbiAgICAgIHNob3dMYWJlbEFuZFVuaXQ6IFt0cnVlLCBbXV0sXG4gICAgICBkaXNwbGF5RGF0ZVNlbGVjdGlvbjogW2ZhbHNlLCBbXV0sXG4gICAgICBkaXNwbGF5QWdncmVnYXRpb25TZWxlY3Rpb246IFtmYWxzZSwgW11dLFxuICAgICAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDogW2ZhbHNlLCBbXV0sXG4gICAgICBjYW5EZWNvdXBsZUdsb2JhbFRpbWVDb250ZXh0OiBbZmFsc2UsIFtdXSxcbiAgICAgIGRhdGVGcm9tOiBbbnVsbCBhcyB1bmtub3duIGFzIERhdGUsIFtdXSxcbiAgICAgIGRhdGVUbzogW251bGwgYXMgdW5rbm93biBhcyBEYXRlLCBbXV0sXG4gICAgICBpbnRlcnZhbDogWydkYXlzJyBhcyBJbnRlcnZhbFsnaWQnXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiBbbnVsbCBhcyBhZ2dyZWdhdGlvblR5cGUgfCBudWxsLCBbXV0sXG4gICAgICByZWFsdGltZTogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgc2hvd1NsaWRlcjogW3RydWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICB5QXhpc1NwbGl0TGluZXM6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHhBeGlzU3BsaXRMaW5lczogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm07XG4gIH1cblxuICBwcml2YXRlIGluaXREYXRlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkNPTkZJRztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVTZWxlY3Rpb24gPSBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRC5EQVNIQk9BUkRfQ09OVEVYVDtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5kaXNhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZURhdGFwb2ludHNFeGlzdHMoKSB7XG4gICAgdGhpcy5hY3RpdmVEYXRhcG9pbnRzRXhpc3RzID1cbiAgICAgICh0aGlzLmNvbmZpZz8uZGF0YXBvaW50cz8uZmlsdGVyKGRwID0+IGRwLl9fYWN0aXZlKT8ubGVuZ3RoIHx8IDApID4gMDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5vLWNhcmQtY29udGV4dCBkLWZsZXgtbWQgZml0LWgtLW1kXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBiZy1sZXZlbC0xIGNvbmYtY29sIGlubmVyLXNjcm9sbCBwLWwtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLWwtMjRcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgY2xhc3M9XCJiZy1sZXZlbC0xIHNlcGFyYXRvci1ib3R0b20gZC1ibG9ja1wiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFttaW5BY3RpdmVDb3VudF09XCIxXCJcbiAgICAgICAgICBbZGVmYXVsdEZvcm1PcHRpb25zXT1cImRhdGFwb2ludFNlbGVjdERlZmF1bHRGb3JtT3B0aW9uc1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhcG9pbnRTZWxlY3Rpb25Db25maWdcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuXG4gICAgICAgIDxjOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiYWxhcm1zXCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhbGFybXNcIlxuICAgICAgICAgIFt0aW1lbGluZVR5cGVdPVwiJ0FMQVJNJ1wiXG4gICAgICAgICAgW2RhdGFwb2ludHNdPVwiY29uZmlnPy5kYXRhcG9pbnRzXCJcbiAgICAgICAgPjwvYzh5LWFsYXJtLWV2ZW50LXNlbGVjdGlvbi1saXN0PlxuXG4gICAgICAgIDxjOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWluaGVyaXRcIlxuICAgICAgICAgIG5hbWU9XCJldmVudHNcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV2ZW50c1wiXG4gICAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInRVZFTlQnXCJcbiAgICAgICAgICBbZGF0YXBvaW50c109XCJjb25maWc/LmRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBzdGlja3ktdG9wIHAtdC04IGlubmVyLXNjcm9sbCB3aWRnZXQtcHJldmlld1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwLXItMjQgZC1jb2wgZml0LWhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHAtdC04IGZvcm0tZ3JvdXAtc20gZC1mbGV4IGEtaS1jZW50ZXIgbS1iLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIG0tci00XCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi0wXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIERhdGUgc2VsZWN0aW9uXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJkYXRlU2VsZWN0aW9uSGVscFRlbXBsYXRlXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRlU2VsZWN0aW9uXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImRhdGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGFzaGJvYXJkIHRpbWUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIkRBVEVfU0VMRUNUSU9OLkRBU0hCT0FSRF9DT05URVhUXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0Rhc2hib2FyZCB0aW1lIHJhbmdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1dpZGdldCBjb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJEQVRFX1NFTEVDVElPTi5DT05GSUdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LTEyXCI+e3sgJ09wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxjOHktdGltZS1jb250ZXh0XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlbGVjdGlvbiA9PT0gREFURV9TRUxFQ1RJT04uQ09ORklHICYmXG4gICAgICAgICAgZm9ybUdyb3VwLmdldCgnZGlzcGxheURhdGVTZWxlY3Rpb24nKS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICBcIlxuICAgICAgICBbY2hhbmdlZERhdGVDb250ZXh0XT1cInRpbWVQcm9wc1wiXG4gICAgICAgIFtjb250cm9sc0F2YWlsYWJsZV09XCJ7XG4gICAgICAgICAgcmVhbHRpbWU6IHRydWUsXG4gICAgICAgICAgdGltZVJhbmdlOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGludGVydmFsOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBjb25maWc/LmRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblxuICAgICAgICB9XCJcbiAgICAgICAgKGNvbnRleHRDaGFuZ2UpPVwidGltZVByb3BzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgID48L2M4eS10aW1lLWNvbnRleHQ+XG4gICAgICA8Yzh5LWNoYXJ0c1xuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC1yZWxhdGl2ZVwiXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlRGF0YXBvaW50c0V4aXN0c1wiXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgW2FsZXJ0c109XCJhbGVydHNcIlxuICAgICAgICAodGltZVJhbmdlQ2hhbmdlT25SZWFsdGltZSk9XCJ1cGRhdGVUaW1lUmFuZ2VPblJlYWx0aW1lKCRldmVudClcIlxuICAgICAgICAoY29uZmlnQ2hhbmdlT25ab29tT3V0KT1cInVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWNoYXJ0cz5cblxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgbS10LTI0XCJcbiAgICAgICAgW2ljb25dPVwiJ3NlYXJjaCdcIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIGRhdGEgcG9pbnRzIHNlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGRhdGEgcG9pbnQgdG8gcmVuZGVyIGNoYXJ0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICpuZ0lmPVwiIWFjdGl2ZURhdGFwb2ludHNFeGlzdHNcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuXG4gICAgICA8Zm9ybVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC10LThcIlxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbD57eyAnRGlzcGxheSBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdBeGlzJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtYi0xNiBtLWItMCBwLXQtOCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1ktYXhpcyBoZWxwZXIgbGluZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cInlBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ5QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ZLWF4aXMgaGVscGVyIGxpbmVzPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInWC1heGlzIGhlbHBlciBsaW5lcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwieEF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInhBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlgtYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidNZXJnZSBtYXRjaGluZyBkYXRhIHBvaW50cyBpbnRvIHNpbmdsZSBheGlzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk1lcmdlIG1hdGNoaW5nIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXM8L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3QgbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0YSBwb2ludHMgd2l0aCB0aGUgc2FtZSBtaW4gYW5kIG1heCB2YWx1ZXMgd2lsbCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBheGlzLiBUaGUgdmFsdWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGF0YSBwb2ludCBjb25maWd1cmF0aW9uLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ0RhdGEgcG9pbnRzIHdpdGggdGhlIHNhbWUgbWluIGFuZCBtYXggdmFsdWVzIHdpbGwgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgYXhpcy4gVGhlIHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGRhdGEgcG9pbnQgY29uZmlndXJhdGlvbi4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWluZm9cIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImluZm9cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInRm9yY2UgbWVyZ2UgYWxsIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+Rm9yY2UgbWVyZ2UgYWxsIGRhdGFwb2ludHMgaW50byBhIHNpbmdsZSBheGlzPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZG90IG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ0FsbCBheGVzIHdpbGwgYmUgZm9yY2UgbWVyZ2VkIHRvIGEgc2luZ2xlIGF4aXMgd2l0aCB0aGUgc2NhbGUgYmVpbmcgc2V0IHRvIHRoZSBtYXggYW5kIG1pbiB2YWx1ZSBvZiBhbGwgYXhlcy4gSXRcXCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG9wdGlvbiBmb3IgZGF0YSBwb2ludHMgd2l0aCBzaW1pbGFyIHZhbHVlcy4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICAgICAgICAgICdBbGwgYXhlcyB3aWxsIGJlIGZvcmNlIG1lcmdlZCB0byBhIHNpbmdsZSBheGlzIHdpdGggdGhlIHNjYWxlIGJlaW5nIHNldCB0byB0aGUgbWF4IGFuZCBtaW4gdmFsdWUgb2YgYWxsIGF4ZXMuIEl0XFwncyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBvcHRpb24gZm9yIGRhdGEgcG9pbnRzIHdpdGggc2ltaWxhciB2YWx1ZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0FsYXJtcyAmIGV2ZW50cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgaWNvbiB3aGVuIHRyaWdnZXJlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZFBvaW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlNYXJrZWRQb2ludFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgaWNvbiB3aGVuIHRyaWdnZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdDaGFydCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidFbmFibGUgZGF0ZSBzZWxlY3Rpb24gaW4gdGhlIHdpZGdldCB2aWV3LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EYXRlIHNlbGVjdGlvbiBpbiB0aGUgd2lkZ2V0IHZpZXcuPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5EQVNIQk9BUkRfQ09OVEVYVFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFnZ3JlZ2F0aW9uIHNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93TGFiZWxBbmRVbml0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RGlzcGxheSBsYWJlbHMgYW5kIHVuaXRzIG9uIFktYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dTbGlkZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHNsaWRlcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbkhlbHBUZW1wbGF0ZT5cbiAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGVTZWxlY3Rpb25IZWxwXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLFdBQVcsRUFDWCxPQUFPLEVBRVAsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBRUwsd0JBQXdCLEVBRXpC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LE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLENBQUM7K0dBMU9VLG9DQUFvQzttR0FBcEMsb0NBQW9DLHVKQUZwQyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLDBCQy9EckQsMHRhQW9XQSwyQ0QvU0ksWUFBWSx1Z0JBQ1osVUFBVSxneUVBQ1YsV0FBVyw4QkFDWCxhQUFhLGlrQkFDYixhQUFhLCtWQUNiLGVBQWUsMk5BQ2YsdUJBQXVCLHFUQUN2Qix3QkFBd0Isc1VBQ3hCLG9CQUFvQjs7NEZBSVgsb0NBQW9DO2tCQWxCaEQsU0FBUzsrQkFDRSxvQ0FBb0MsUUFDeEMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGNBRWpCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFVBQVU7d0JBQ1YsV0FBVzt3QkFDWCxhQUFhO3dCQUNiLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3FCQUNyQixhQUNVLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7OzBCQTBDaEQsUUFBUTs7MEJBQ1IsUUFBUTt5Q0F4Q0YsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBOZ0Zvcm0sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9PYnNlcnZhYmxlJztcbmltcG9ydCB7XG4gIENvbW1vbk1vZHVsZSxcbiAgQ29yZU1vZHVsZSxcbiAgRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcixcbiAgRm9ybXNNb2R1bGUsXG4gIGdldHRleHQsXG4gIE9uQmVmb3JlU2F2ZSxcbiAgV2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWcsXG4gIERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgS1BJRGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGFnZ3JlZ2F0aW9uVHlwZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gIFdpZGdldENvbmZpZ0NvbXBvbmVudFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7XG4gIEFsYXJtRGV0YWlscyxcbiAgQWxhcm1FdmVudFNlbGVjdG9yTW9kdWxlLFxuICBFdmVudERldGFpbHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9hbGFybS1ldmVudC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcbmltcG9ydCB7IFBvcG92ZXJNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3BvcG92ZXInO1xuaW1wb3J0IHtcbiAgQ2hhcnRBbGFybXNTZXJ2aWNlLFxuICBDaGFydEV2ZW50c1NlcnZpY2UsXG4gIENoYXJ0c0NvbXBvbmVudCxcbiAgRGF0YXBvaW50c0dyYXBoS1BJRGV0YWlscyxcbiAgRGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnLFxuICBEYXRhcG9pbnRzR3JhcGhXaWRnZXRUaW1lUHJvcHMsXG4gIERBVEVfU0VMRUNUSU9OX0VYVEVOREVELFxuICBUaW1lQ29udGV4dFByb3BzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNoYXJ0JztcbmltcG9ydCB7IFRpbWVDb250ZXh0Q29tcG9uZW50IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy90aW1lLWNvbnRleHQnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLWdyYXBoLXdpZGdldC1jb25maWcnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb250ZW50cycgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtZ3JhcGgtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQ29yZU1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIFBvcG92ZXJNb2R1bGUsXG4gICAgQ2hhcnRzQ29tcG9uZW50LFxuICAgIERhdGFwb2ludFNlbGVjdG9yTW9kdWxlLFxuICAgIEFsYXJtRXZlbnRTZWxlY3Rvck1vZHVsZSxcbiAgICBUaW1lQ29udGV4dENvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtDaGFydEV2ZW50c1NlcnZpY2UsIENoYXJ0QWxhcm1zU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkJlZm9yZVNhdmUsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogRGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm0gPSBpbmplY3QoTmdGb3JtKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlID0gaW5qZWN0KFdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZSk7XG5cbiAgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yIHwgdW5kZWZpbmVkO1xuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8RGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnQ29tcG9uZW50Wydpbml0Rm9ybSddPjtcbiAgREFURV9TRUxFQ1RJT04gPSBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRDtcbiAgZGF0ZVNlbGVjdGlvbjogREFURV9TRUxFQ1RJT05fRVhURU5ERUQgfCB1bmRlZmluZWQ7XG4gIGRhdGVTZWxlY3Rpb25IZWxwID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcbiAgICBnZXR0ZXh0KGBDaG9vc2UgaG93IHRvIHNlbGVjdCBhIGRhdGUgcmFuZ2UsIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBhcmU6XG4gIDx1bCBjbGFzcz1cIm0tbC0wIHAtbC04IG0tdC04IG0tYi0wXCI+XG4gICAgPGxpPlxuICAgICAgPGI+V2lkZ2V0IGNvbmZpZ3VyYXRpb246PC9iPlxuICAgICAgcmVzdHJpY3RzIHRoZSBkYXRlIHNlbGVjdGlvbiBvbmx5IHRvIHRoZSB3aWRnZXQgY29uZmlndXJhdGlvblxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGI+V2lkZ2V0IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbjo8L2I+XG4gICAgICByZXN0cmljdHMgdGhlIGRhdGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQgdmlldyBhbmQgd2lkZ2V0IGNvbmZpZ3VyYXRpb24gb25seVxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGI+RGFzaGJvYXJkIHRpbWUgcmFuZ2U6PC9iPlxuICAgICAgcmVzdHJpY3RzIGRhdGUgc2VsZWN0aW9uIHRvIHRoZSBnbG9iYWwgZGFzaGJvYXJkIGNvbmZpZ3VyYXRpb24gb25seVxuICAgIDwvbGk+XG4gIDwvdWw+YClcbiAgKTtcbiAgZGF0YXBvaW50U2VsZWN0RGVmYXVsdEZvcm1PcHRpb25zOiBQYXJ0aWFsPERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtQ29uZmlnPiA9IHtcbiAgICBzaG93UmFuZ2U6IHRydWUsXG4gICAgc2hvd0NoYXJ0OiB0cnVlXG4gIH07XG4gIGRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZzogUGFydGlhbDxEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucz4gPSB7fTtcbiAgYWN0aXZlRGF0YXBvaW50c0V4aXN0cyA9IGZhbHNlO1xuICBhbGFybXNPckV2ZW50c0hhdmVOb01hdGNoaW5nRHBzID0gZmFsc2U7XG4gIHRpbWVQcm9wczogRGF0YXBvaW50c0dyYXBoV2lkZ2V0VGltZVByb3BzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHdpZGdldENvbmZpZzogV2lkZ2V0Q29uZmlnQ29tcG9uZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGFzaGJvYXJkQ29udGV4dENvbXBvbmVudDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuaW5pdEZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzPy5mb3JFYWNoKGRwID0+IHRoaXMuYXNzaWduQ29udGV4dEZyb21Db250ZXh0RGFzaGJvYXJkKGRwKSk7XG4gICAgdGhpcy5mb3JtLmZvcm0uYWRkQ29udHJvbCgnY29uZmlnJywgdGhpcy5mb3JtR3JvdXApO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGhpcy5jb25maWcgfHwge30pO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFsYXJtcy5zZXRWYWx1ZShcbiAgICAgIHRoaXMuY29uZmlnPy5hbGFybXNFdmVudHNDb25maWdzPy5maWx0ZXIoYWUgPT4gYWUudGltZWxpbmVUeXBlID09PSAnQUxBUk0nKSBhcyBBbGFybURldGFpbHNbXVxuICAgICk7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZXZlbnRzLnNldFZhbHVlKFxuICAgICAgdGhpcy5jb25maWc/LmFsYXJtc0V2ZW50c0NvbmZpZ3M/LmZpbHRlcihhZSA9PiBhZS50aW1lbGluZVR5cGUgPT09ICdFVkVOVCcpIGFzIEV2ZW50RGV0YWlsc1tdXG4gICAgKTtcblxuICAgIHRoaXMuaW5pdERhdGVTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnNldEFjdGl2ZURhdGFwb2ludHNFeGlzdHMoKTtcbiAgICB0aGlzLmNoZWNrRm9yTWF0Y2hpbmdEYXRhcG9pbnRzKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgICBhbGFybXNFdmVudHNDb25maWdzOiBbXG4gICAgICAgICAgLi4uKHRoaXMuZm9ybUdyb3VwLnZhbHVlLmFsYXJtcyB8fCBbXSksXG4gICAgICAgICAgLi4uKHRoaXMuZm9ybUdyb3VwLnZhbHVlLmV2ZW50cyB8fCBbXSlcbiAgICAgICAgXVxuICAgICAgfTtcbiAgICAgIHRoaXMuc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpO1xuICAgICAgdGhpcy5jaGVja0Zvck1hdGNoaW5nRGF0YXBvaW50cygpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnPy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KHRoaXMud2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlLmluaXRpYWxUaW1lUmFuZ2UoKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGVGcm9tICYmIHRoaXMuY29uZmlnLmRhdGVUbykge1xuICAgICAgdGhpcy50aW1lUHJvcHMgPSB7XG4gICAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSh0aGlzLmNvbmZpZz8uZGF0ZUZyb20pLFxuICAgICAgICBkYXRlVG86IG5ldyBEYXRlKHRoaXMuY29uZmlnPy5kYXRlVG8pLFxuICAgICAgICBpbnRlcnZhbDogdGhpcy5jb25maWc/LmludGVydmFsLFxuICAgICAgICByZWFsdGltZTogdGhpcy5jb25maWc/LnJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogdGhpcy5jb25maWc/LnJlYWx0aW1lID8gbnVsbCA6IHRoaXMuY29uZmlnPy5hZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvbkJlZm9yZVNhdmUoXG4gICAgY29uZmlnPzogRGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnXG4gICk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnZhbGlkICYmIGNvbmZpZykge1xuICAgICAgT2JqZWN0LmFzc2lnbihjb25maWcsIG9taXQodGhpcy5mb3JtR3JvdXAudmFsdWUsIFsnYWxhcm1zJywgJ2V2ZW50cyddKSwge1xuICAgICAgICBhbGFybXNFdmVudHNDb25maWdzOiBbXG4gICAgICAgICAgLi4uKHRoaXMuZm9ybUdyb3VwLnZhbHVlLmFsYXJtcyB8fCBbXSksXG4gICAgICAgICAgLi4uKHRoaXMuZm9ybUdyb3VwLnZhbHVlLmV2ZW50cyB8fCBbXSlcbiAgICAgICAgXVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0aW1lUHJvcHNDaGFuZ2VkKHRpbWVQcm9wczogVGltZUNvbnRleHRQcm9wcyk6IHZvaWQge1xuICAgIGlmICh0aW1lUHJvcHMucmVhbHRpbWUgIT09IHRoaXMuY29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgcmVhbHRpbWU6IHRpbWVQcm9wcy5yZWFsdGltZSB9KTtcbiAgICB9XG4gICAgaWYgKHRpbWVQcm9wcy5yZWFsdGltZSkge1xuICAgICAgaWYgKHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCAhPT0gdGhpcy5mb3JtR3JvdXAudmFsdWUuaW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IGludGVydmFsOiB0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhdGNoVmFsdWVzID0ge1xuICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSksXG4gICAgICBkYXRlVG86IG5ldyBEYXRlKHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGUpLFxuICAgICAgaW50ZXJ2YWw6IHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgIC4uLih0aW1lUHJvcHMuYWdncmVnYXRpb24gJiYgeyBhZ2dyZWdhdGlvbjogdGltZVByb3BzLmFnZ3JlZ2F0aW9uIH0pLFxuICAgICAgLi4uKHRpbWVQcm9wcy5yZWFsdGltZSAmJiB7IHJlYWx0aW1lOiB0aW1lUHJvcHMucmVhbHRpbWUgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShwYXRjaFZhbHVlcyk7XG4gIH1cblxuICB1cGRhdGVEYXNoYm9hcmRUaW1lQ29udGV4dCh0aW1lUHJvcHM6IERhdGFwb2ludHNHcmFwaFdpZGdldFRpbWVQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWxUaW1lUmFuZ2UgPSB7XG4gICAgICBkYXRlRnJvbTogdGltZVByb3BzLmRhdGVGcm9tLFxuICAgICAgZGF0ZVRvOiB0aW1lUHJvcHMuZGF0ZVRvLFxuICAgICAgaW50ZXJ2YWw6IHRpbWVQcm9wcy5pbnRlcnZhbCB8fCAnY3VzdG9tJ1xuICAgIH07XG4gICAgaWYgKCF0aGlzLndpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZS5pbml0aWFsVGltZVJhbmdlKCkpIHtcbiAgICAgIHRoaXMud2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlLnVwZGF0ZUluaXRpYWxUaW1lUmFuZ2UoaW5pdGlhbFRpbWVSYW5nZSk7XG4gICAgfVxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyAuLi50aW1lUHJvcHMsIC4uLmluaXRpYWxUaW1lUmFuZ2UgfSk7XG4gIH1cblxuICB1cGRhdGVUaW1lUmFuZ2VPblJlYWx0aW1lKFxuICAgIHRpbWVSYW5nZTogUGljazxEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcsICdkYXRlRnJvbScgfCAnZGF0ZVRvJz5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aW1lUmFuZ2UsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGRhdGVTZWxlY3Rpb25DaGFuZ2UoZGF0ZVNlbGVjdGlvbjogREFURV9TRUxFQ1RJT05fRVhURU5ERUQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVTZWxlY3Rpb24gPSBkYXRlU2VsZWN0aW9uO1xuXG4gICAgaWYgKGRhdGVTZWxlY3Rpb24gPT09IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkNPTkZJRykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGlzcGxheURhdGVTZWxlY3Rpb24uZW5hYmxlKCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGlzcGxheURhdGVTZWxlY3Rpb24gc2hvdWxkIGJlIGZhbHNlIGFuZCBkaXNhYmxlZCB3aGVuIGRhdGVTZWxlY3Rpb24gaXMgbm90IENPTkZJR1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgIHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ6IHRydWUsXG4gICAgICByZWFsdGltZTogZmFsc2UsXG4gICAgICBkaXNwbGF5RGF0ZVNlbGVjdGlvbjogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduQ29udGV4dEZyb21Db250ZXh0RGFzaGJvYXJkKGRhdGFwb2ludDogS1BJRGV0YWlscykge1xuICAgIGlmICghdGhpcy5kYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50Py5pc0RldmljZVR5cGVEYXNoYm9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud2lkZ2V0Q29uZmlnPy5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0Py5pZCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBpZCB9ID0gY29udGV4dDtcbiAgICAgIGRhdGFwb2ludC5fX3RhcmdldCA9IHsgbmFtZSwgaWQgfTtcbiAgICAgIHRoaXMuZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnLmNvbnRleHRBc3NldCA9IHsgaWQgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yTWF0Y2hpbmdEYXRhcG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGFsbE1hdGNoID0gdGhpcy5jb25maWc/LmFsYXJtc0V2ZW50c0NvbmZpZ3M/LmV2ZXJ5KGFlID0+XG4gICAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZS5kYXRhcG9pbnRzPy5zb21lKGRwID0+IGRwLl9fdGFyZ2V0Py5pZCA9PT0gYWUuX190YXJnZXQ/LmlkKVxuICAgICk7XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgdGhpcy5hbGFybXNPckV2ZW50c0hhdmVOb01hdGNoaW5nRHBzID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBkYXRhcG9pbnRzOiBbXG4gICAgICAgIFtdIGFzIERhdGFwb2ludHNHcmFwaEtQSURldGFpbHNbXSxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEpXVxuICAgICAgXSxcbiAgICAgIGFsYXJtczogW1tdIGFzIEFsYXJtRGV0YWlsc1tdXSxcbiAgICAgIGV2ZW50czogW1tdIGFzIEV2ZW50RGV0YWlsc1tdXSxcbiAgICAgIGRpc3BsYXlNYXJrZWRMaW5lOiBbdHJ1ZSwgW11dLFxuICAgICAgZGlzcGxheU1hcmtlZFBvaW50OiBbdHJ1ZSwgW11dLFxuICAgICAgbWVyZ2VNYXRjaGluZ0RhdGFwb2ludHM6IFt0cnVlLCBbXV0sXG4gICAgICBmb3JjZU1lcmdlRGF0YXBvaW50czogW2ZhbHNlLCBbXV0sXG4gICAgICBzaG93TGFiZWxBbmRVbml0OiBbdHJ1ZSwgW11dLFxuICAgICAgZGlzcGxheURhdGVTZWxlY3Rpb246IFtmYWxzZSwgW11dLFxuICAgICAgZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uOiBbZmFsc2UsIFtdXSxcbiAgICAgIHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ6IFtmYWxzZSwgW11dLFxuICAgICAgY2FuRGVjb3VwbGVHbG9iYWxUaW1lQ29udGV4dDogW2ZhbHNlLCBbXV0sXG4gICAgICBkYXRlRnJvbTogW251bGwgYXMgdW5rbm93biBhcyBEYXRlLCBbXV0sXG4gICAgICBkYXRlVG86IFtudWxsIGFzIHVua25vd24gYXMgRGF0ZSwgW11dLFxuICAgICAgaW50ZXJ2YWw6IFsnZGF5cycgYXMgSW50ZXJ2YWxbJ2lkJ10sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBhZ2dyZWdhdGlvbjogW251bGwgYXMgYWdncmVnYXRpb25UeXBlIHwgbnVsbCwgW11dLFxuICAgICAgcmVhbHRpbWU6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHNob3dTbGlkZXI6IFt0cnVlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgeUF4aXNTcGxpdExpbmVzOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICB4QXhpc1NwbGl0TGluZXM6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIG51bWJlck9mRGVjaW1hbFBsYWNlczogWzIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTApXV1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy5kYXRlU2VsZWN0aW9uID0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQuQ09ORklHO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkRBU0hCT0FSRF9DT05URVhUO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpIHtcbiAgICB0aGlzLmFjdGl2ZURhdGFwb2ludHNFeGlzdHMgPVxuICAgICAgKHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzPy5maWx0ZXIoZHAgPT4gZHAuX19hY3RpdmUpPy5sZW5ndGggfHwgMCkgPiAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm8tY2FyZC1jb250ZXh0IGQtZmxleC1tZCBmaXQtaC0tbWRcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC01IGJnLWxldmVsLTEgY29uZi1jb2wgaW5uZXItc2Nyb2xsIHAtbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInAtbC0yNFwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGF0YXBvaW50U2VsZWN0RGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctbGV2ZWwtMSBzZXBhcmF0b3ItYm90dG9tIGQtYmxvY2tcIlxuICAgICAgICAgIG5hbWU9XCJhbGFybXNcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFsYXJtc1wiXG4gICAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInQUxBUk0nXCJcbiAgICAgICAgICBbZGF0YXBvaW50c109XCJjb25maWc/LmRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdFwiXG4gICAgICAgICAgbmFtZT1cImV2ZW50c1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXZlbnRzXCJcbiAgICAgICAgICBbdGltZWxpbmVUeXBlXT1cIidFVkVOVCdcIlxuICAgICAgICAgIFtkYXRhcG9pbnRzXT1cImNvbmZpZz8uZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdD5cblxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBbdGl0bGVdPVwiJ051bWJlciBvZiBkZWNpbWFsIHBsYWNlcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICBuYW1lPVwibnVtYmVyT2ZEZWNpbWFsUGxhY2VzXCJcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJudW1iZXJPZkRlY2ltYWxQbGFjZXNcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInZS5nLiB7eyBleGFtcGxlIH19JyB8IHRyYW5zbGF0ZTogeyBleGFtcGxlOiAxIH1cIlxuICAgICAgICAvPlxuICAgICAgICA8Yzh5LW1lc3NhZ2VzXG4gICAgICAgICAgW3Nob3ddPVwiXG4gICAgICAgICAgICBmb3JtR3JvdXAuY29udHJvbHM/Lm51bWJlck9mRGVjaW1hbFBsYWNlcz8udG91Y2hlZCAmJlxuICAgICAgICAgICAgZm9ybUdyb3VwPy5jb250cm9scz8ubnVtYmVyT2ZEZWNpbWFsUGxhY2VzPy5lcnJvcnNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jOHktbWVzc2FnZXM+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBzdGlja3ktdG9wIHAtdC04IGlubmVyLXNjcm9sbCB3aWRnZXQtcHJldmlld1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwLXItMjQgZC1jb2wgZml0LWhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHAtdC04IGZvcm0tZ3JvdXAtc20gZC1mbGV4IGEtaS1jZW50ZXIgbS1iLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIG0tci00XCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi0wXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIERhdGUgc2VsZWN0aW9uXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJkYXRlU2VsZWN0aW9uSGVscFRlbXBsYXRlXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRlU2VsZWN0aW9uXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImRhdGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGFzaGJvYXJkIHRpbWUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIkRBVEVfU0VMRUNUSU9OLkRBU0hCT0FSRF9DT05URVhUXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0Rhc2hib2FyZCB0aW1lIHJhbmdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1dpZGdldCBjb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJEQVRFX1NFTEVDVElPTi5DT05GSUdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LTEyXCI+e3sgJ09wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxjOHktdGltZS1jb250ZXh0XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlbGVjdGlvbiA9PT0gREFURV9TRUxFQ1RJT04uQ09ORklHICYmXG4gICAgICAgICAgZm9ybUdyb3VwLmdldCgnZGlzcGxheURhdGVTZWxlY3Rpb24nKS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICBcIlxuICAgICAgICBbY2hhbmdlZERhdGVDb250ZXh0XT1cInRpbWVQcm9wc1wiXG4gICAgICAgIFtjb250cm9sc0F2YWlsYWJsZV09XCJ7XG4gICAgICAgICAgcmVhbHRpbWU6IHRydWUsXG4gICAgICAgICAgdGltZVJhbmdlOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGludGVydmFsOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBjb25maWc/LmRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblxuICAgICAgICB9XCJcbiAgICAgICAgKGNvbnRleHRDaGFuZ2UpPVwidGltZVByb3BzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgID48L2M4eS10aW1lLWNvbnRleHQ+XG4gICAgICA8Yzh5LWNoYXJ0c1xuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC1yZWxhdGl2ZVwiXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlRGF0YXBvaW50c0V4aXN0c1wiXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgW2FsZXJ0c109XCJhbGVydHNcIlxuICAgICAgICAodGltZVJhbmdlQ2hhbmdlT25SZWFsdGltZSk9XCJ1cGRhdGVUaW1lUmFuZ2VPblJlYWx0aW1lKCRldmVudClcIlxuICAgICAgICAoY29uZmlnQ2hhbmdlT25ab29tT3V0KT1cInVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWNoYXJ0cz5cblxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgbS10LTI0XCJcbiAgICAgICAgW2ljb25dPVwiJ3NlYXJjaCdcIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIGRhdGEgcG9pbnRzIHNlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGRhdGEgcG9pbnQgdG8gcmVuZGVyIGNoYXJ0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICpuZ0lmPVwiIWFjdGl2ZURhdGFwb2ludHNFeGlzdHNcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuXG4gICAgICA8Zm9ybVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC10LThcIlxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbD57eyAnRGlzcGxheSBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdBeGlzJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtYi0xNiBtLWItMCBwLXQtOCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1ktYXhpcyBoZWxwZXIgbGluZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cInlBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ5QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ZLWF4aXMgaGVscGVyIGxpbmVzPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInWC1heGlzIGhlbHBlciBsaW5lcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwieEF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInhBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlgtYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidNZXJnZSBtYXRjaGluZyBkYXRhIHBvaW50cyBpbnRvIHNpbmdsZSBheGlzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk1lcmdlIG1hdGNoaW5nIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXM8L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3QgbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0YSBwb2ludHMgd2l0aCB0aGUgc2FtZSBtaW4gYW5kIG1heCB2YWx1ZXMgd2lsbCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBheGlzLiBUaGUgdmFsdWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGF0YSBwb2ludCBjb25maWd1cmF0aW9uLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ0RhdGEgcG9pbnRzIHdpdGggdGhlIHNhbWUgbWluIGFuZCBtYXggdmFsdWVzIHdpbGwgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgYXhpcy4gVGhlIHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGRhdGEgcG9pbnQgY29uZmlndXJhdGlvbi4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWluZm9cIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImluZm9cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInRm9yY2UgbWVyZ2UgYWxsIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+Rm9yY2UgbWVyZ2UgYWxsIGRhdGFwb2ludHMgaW50byBhIHNpbmdsZSBheGlzPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZG90IG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ0FsbCBheGVzIHdpbGwgYmUgZm9yY2UgbWVyZ2VkIHRvIGEgc2luZ2xlIGF4aXMgd2l0aCB0aGUgc2NhbGUgYmVpbmcgc2V0IHRvIHRoZSBtYXggYW5kIG1pbiB2YWx1ZSBvZiBhbGwgYXhlcy4gSXRcXCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG9wdGlvbiBmb3IgZGF0YSBwb2ludHMgd2l0aCBzaW1pbGFyIHZhbHVlcy4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICAgICAgICAgICdBbGwgYXhlcyB3aWxsIGJlIGZvcmNlIG1lcmdlZCB0byBhIHNpbmdsZSBheGlzIHdpdGggdGhlIHNjYWxlIGJlaW5nIHNldCB0byB0aGUgbWF4IGFuZCBtaW4gdmFsdWUgb2YgYWxsIGF4ZXMuIEl0XFwncyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBvcHRpb24gZm9yIGRhdGEgcG9pbnRzIHdpdGggc2ltaWxhciB2YWx1ZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0FsYXJtcyAmIGV2ZW50cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgaWNvbiB3aGVuIHRyaWdnZXJlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZFBvaW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlNYXJrZWRQb2ludFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgaWNvbiB3aGVuIHRyaWdnZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdDaGFydCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidFbmFibGUgZGF0ZSBzZWxlY3Rpb24gaW4gdGhlIHdpZGdldCB2aWV3LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EYXRlIHNlbGVjdGlvbiBpbiB0aGUgd2lkZ2V0IHZpZXcuPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5EQVNIQk9BUkRfQ09OVEVYVFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFnZ3JlZ2F0aW9uIHNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93TGFiZWxBbmRVbml0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RGlzcGxheSBsYWJlbHMgYW5kIHVuaXRzIG9uIFktYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dTbGlkZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHNsaWRlcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbkhlbHBUZW1wbGF0ZT5cbiAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGVTZWxlY3Rpb25IZWxwXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -2,18 +2,18 @@ import * as i7 from '@angular/cdk/drag-drop';
2
2
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injectable, Component, Input, HostListener, Inject, NgModule } from '@angular/core';
5
- import * as i6$1 from '@angular/forms';
5
+ import * as i6 from '@angular/forms';
6
6
  import { FormsModule } from '@angular/forms';
7
7
  import * as i8 from 'ngx-bootstrap/tooltip';
8
8
  import { TooltipModule } from 'ngx-bootstrap/tooltip';
9
9
  import * as i2 from '@c8y/ngx-components';
10
10
  import { gettext, CoreModule, CommonModule, ListGroupModule, FormsModule as FormsModule$1, ModalModule, hookDrawer } from '@c8y/ngx-components';
11
- import * as i6 from '@angular/common';
11
+ import * as i5 from '@angular/common';
12
12
  import { DOCUMENT } from '@angular/common';
13
- import * as i5 from '@angular/router';
14
- import * as i1 from '@ngx-translate/core';
13
+ import * as i4$1 from '@angular/router';
15
14
  import { uniqBy, cloneDeep } from 'lodash-es';
16
15
  import * as i1$1 from 'ngx-bootstrap/modal';
16
+ import * as i1 from '@ngx-translate/core';
17
17
  import { firstValueFrom, map } from 'rxjs';
18
18
  import * as i4 from '@c8y/ngx-components/icon-selector';
19
19
 
@@ -194,7 +194,7 @@ class EditBookmarksComponent {
194
194
  }
195
195
  }
196
196
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditBookmarksComponent, deps: [{ token: i1$1.BsModalRef }, { token: i2.AlertService }, { token: BookmarkService }, { token: i4.IconSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
197
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EditBookmarksComponent, selector: "c8y-edit-bookmarks", inputs: { bookmarks: "bookmarks" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n class=\"icon-24 p-relative changeIcon a-s-stretch\"\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <i [c8yIcon]=\"bookmark.icon\"></i>\n <button\n class=\"btn btn-default btn-xs\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"changeBookmarkIcon(bookmark)\"\n >\n <i c8yIcon=\"replace\"></i>\n </button>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n", dependencies: [{ kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i6$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6$1.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: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
197
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EditBookmarksComponent, selector: "c8y-edit-bookmarks", inputs: { bookmarks: "bookmarks" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n class=\"icon-24 p-relative changeIcon a-s-stretch\"\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <i [c8yIcon]=\"bookmark.icon\"></i>\n <button\n class=\"btn btn-default btn-xs\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"changeBookmarkIcon(bookmark)\"\n >\n <i c8yIcon=\"replace\"></i>\n </button>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n", dependencies: [{ kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
198
198
  }
199
199
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditBookmarksComponent, decorators: [{
200
200
  type: Component,
@@ -207,18 +207,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
207
207
  }] } });
208
208
 
209
209
  class BookmarksComponent {
210
- constructor(document, translateService, bookmarksService, alertService, bookmarkService, bsModalService, router, headerService) {
210
+ constructor(document, bookmarksService, alertService, bookmarkService, bsModalService, router, headerService) {
211
211
  this.document = document;
212
- this.translateService = translateService;
213
212
  this.bookmarksService = bookmarksService;
214
213
  this.alertService = alertService;
215
214
  this.bookmarkService = bookmarkService;
216
215
  this.bsModalService = bsModalService;
217
216
  this.router = router;
218
217
  this.headerService = headerService;
219
- this.emptyMessageHeader = this.translateService.instant(gettext('No bookmarks yet'));
220
- this.emptyMessageBody = this.translateService.instant(gettext('Navigate to the desired page and click the "Add current page" button. Editing, deleting and reordering are possible by clicking on the cog wheel.'));
221
- this.addButtonText = this.translateService.instant(gettext('Add current page'));
218
+ this.emptyMessageHeader = gettext('No bookmarks yet');
219
+ this.emptyMessageBody = gettext('Navigate to the desired page and click the "Add current page" button. Editing, deleting and reordering are possible by clicking on the cog wheel.');
220
+ this.addButtonText = gettext('Add current page');
222
221
  this.drawerOpen$ = this.headerService.rightDrawerOpen$;
223
222
  }
224
223
  async ngOnInit() {
@@ -266,16 +265,16 @@ class BookmarksComponent {
266
265
  }
267
266
  window.open(url, '_self');
268
267
  }
269
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: i1.TranslateService }, { token: BookmarkService }, { token: i2.AlertService }, { token: BookmarkService }, { token: i1$1.BsModalService }, { token: i5.Router }, { token: i2.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
270
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BookmarksComponent, selector: "c8y-bookmarks", ngImport: i0, template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n container=\"body\"\n placement=\"left\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"cog\" class=\"text-14 m-0\"></i>\n </button>\n</div>\n<div class=\"c8y-right-drawer__item p-t-0 p-b-8\" *ngIf=\"bookmarks?.length\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"addBookmark()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"plus-circle-o\" class=\"m-t-0 m-b-0 text-14\"></i>\n <span>{{ addButtonText }}</span>\n </button>\n</div>\n<ng-container *ngFor=\"let bookmark of bookmarks\">\n <button\n title=\"{{ bookmark.label }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\n (click)=\"openUrl(bookmark.url)\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i [c8yIcon]=\"bookmark.icon\" *ngIf=\"bookmark.icon\"></i>\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n</ng-container>\n<div class=\"p-t-8 p-b-8\">\n <ng-container *ngIf=\"!bookmarks?.length\">\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"addBookmark()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"plus-circle-o\" class=\"m-t-0 m-b-0 text-14\"></i>\n <span>{{ addButtonText }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
268
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: BookmarkService }, { token: i2.AlertService }, { token: BookmarkService }, { token: i1$1.BsModalService }, { token: i4$1.Router }, { token: i2.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
269
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BookmarksComponent, selector: "c8y-bookmarks", ngImport: i0, template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n >\n <i\n class=\"text-14 m-0\"\n c8yIcon=\"cog\"\n ></i>\n </button>\n</div>\n<div\n class=\"c8y-right-drawer__item p-t-0 p-b-8\"\n *ngIf=\"bookmarks?.length\"\n>\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n</div>\n<ng-container *ngFor=\"let bookmark of bookmarks\">\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ bookmark.label }}\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"openUrl(bookmark.url)\"\n >\n <i\n [c8yIcon]=\"bookmark.icon\"\n *ngIf=\"bookmark.icon\"\n ></i>\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n</ng-container>\n<div class=\"p-t-8 p-b-8\">\n <ng-container *ngIf=\"!bookmarks?.length\">\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader | translate }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody | translate }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
271
270
  }
272
271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookmarksComponent, decorators: [{
273
272
  type: Component,
274
- args: [{ selector: 'c8y-bookmarks', template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n container=\"body\"\n placement=\"left\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"cog\" class=\"text-14 m-0\"></i>\n </button>\n</div>\n<div class=\"c8y-right-drawer__item p-t-0 p-b-8\" *ngIf=\"bookmarks?.length\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"addBookmark()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"plus-circle-o\" class=\"m-t-0 m-b-0 text-14\"></i>\n <span>{{ addButtonText }}</span>\n </button>\n</div>\n<ng-container *ngFor=\"let bookmark of bookmarks\">\n <button\n title=\"{{ bookmark.label }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\n (click)=\"openUrl(bookmark.url)\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i [c8yIcon]=\"bookmark.icon\" *ngIf=\"bookmark.icon\"></i>\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n</ng-container>\n<div class=\"p-t-8 p-b-8\">\n <ng-container *ngIf=\"!bookmarks?.length\">\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"addBookmark()\"\n type=\"button\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n >\n <i c8yIcon=\"plus-circle-o\" class=\"m-t-0 m-b-0 text-14\"></i>\n <span>{{ addButtonText }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n" }]
273
+ args: [{ selector: 'c8y-bookmarks', template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n >\n <i\n class=\"text-14 m-0\"\n c8yIcon=\"cog\"\n ></i>\n </button>\n</div>\n<div\n class=\"c8y-right-drawer__item p-t-0 p-b-8\"\n *ngIf=\"bookmarks?.length\"\n>\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n</div>\n<ng-container *ngFor=\"let bookmark of bookmarks\">\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ bookmark.label }}\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"openUrl(bookmark.url)\"\n >\n <i\n [c8yIcon]=\"bookmark.icon\"\n *ngIf=\"bookmark.icon\"\n ></i>\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n</ng-container>\n<div class=\"p-t-8 p-b-8\">\n <ng-container *ngIf=\"!bookmarks?.length\">\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader | translate }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody | translate }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n </ng-container>\n</div>\n" }]
275
274
  }], ctorParameters: () => [{ type: DOCUMENT, decorators: [{
276
275
  type: Inject,
277
276
  args: [DOCUMENT]
278
- }] }, { type: i1.TranslateService }, { type: BookmarkService }, { type: i2.AlertService }, { type: BookmarkService }, { type: i1$1.BsModalService }, { type: i5.Router }, { type: i2.HeaderService }] });
277
+ }] }, { type: BookmarkService }, { type: i2.AlertService }, { type: BookmarkService }, { type: i1$1.BsModalService }, { type: i4$1.Router }, { type: i2.HeaderService }] });
279
278
 
280
279
  class BookmarksModule {
281
280
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookmarksModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }