@c8y/ngx-components 1021.11.1 → 1021.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alarms/alarms-date-filter.component.d.ts +34 -0
- package/alarms/alarms-date-filter.component.d.ts.map +1 -0
- package/alarms/alarms-filter.component.d.ts +2 -1
- package/alarms/alarms-filter.component.d.ts.map +1 -1
- package/alarms/alarms-list.component.d.ts +2 -17
- package/alarms/alarms-list.component.d.ts.map +1 -1
- package/alarms/alarms-view.service.d.ts +5 -2
- package/alarms/alarms-view.service.d.ts.map +1 -1
- package/alarms/alarms.component.d.ts +3 -1
- package/alarms/alarms.component.d.ts.map +1 -1
- package/alarms/alarms.model.d.ts +47 -1
- package/alarms/alarms.model.d.ts.map +1 -1
- package/alarms/alarms.module.d.ts +15 -13
- package/alarms/alarms.module.d.ts.map +1 -1
- package/branding/shared/data/store-branding.service.d.ts +5 -0
- package/branding/shared/data/store-branding.service.d.ts.map +1 -1
- package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.model.d.ts +1 -0
- package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts +7 -5
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.component.d.ts +4 -7
- package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts +4 -4
- package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
- package/core/action-bar/action-bar-item.component.d.ts +1 -1
- package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
- package/core/action-bar/action-bar.module.d.ts +6 -6
- package/core/action-bar/action-bar.module.d.ts.map +1 -1
- package/core/bootstrap/bootstrap.component.d.ts +3 -1
- package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
- package/core/common/aggregation/aggregation.model.d.ts +39 -0
- package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
- package/core/common/aggregation/aggregation.service.d.ts +17 -0
- package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
- package/core/common/index.d.ts +4 -0
- package/core/common/index.d.ts.map +1 -1
- package/core/common/inter-app.service.d.ts +48 -0
- package/core/common/inter-app.service.d.ts.map +1 -0
- package/core/common/interval-based-reload.abstract.d.ts +120 -0
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
- package/core/dashboard/dashboard.module.d.ts +26 -20
- package/core/dashboard/dashboard.module.d.ts.map +1 -1
- package/core/dashboard/index.d.ts +3 -0
- package/core/dashboard/index.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
- package/core/dashboard/widget-change-event.model.d.ts +1 -1
- package/core/dashboard/widget-change-event.model.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts +2 -1
- package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +12 -8
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +7 -26
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
- package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
- package/core/header/header.module.d.ts +18 -18
- package/core/header/header.module.d.ts.map +1 -1
- package/core/header/title/title.component.d.ts +1 -1
- package/core/header/title/title.component.d.ts.map +1 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
- package/core/i18n/i18n.module.d.ts +0 -4
- package/core/i18n/i18n.module.d.ts.map +1 -1
- package/core/i18n/index.d.ts +2 -1
- package/core/i18n/index.d.ts.map +1 -1
- package/core/i18n/translation-loader.service.d.ts +50 -0
- package/core/i18n/translation-loader.service.d.ts.map +1 -0
- package/core/i18n/translation-utils.d.ts +14 -0
- package/core/i18n/translation-utils.d.ts.map +1 -0
- package/core/plugins/plugins-resolve.service.d.ts +7 -10
- package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
- package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
- package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
- package/datapoints-export-selector/index.d.ts +15 -0
- package/datapoints-export-selector/index.d.ts.map +1 -0
- package/device-list/device-list.module.d.ts +4 -2
- package/device-list/device-list.module.d.ts.map +1 -1
- package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +4 -4
- package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +3 -3
- package/esm2022/alarms/alarms-date-filter.component.mjs +139 -0
- package/esm2022/alarms/alarms-filter.component.mjs +11 -5
- package/esm2022/alarms/alarms-list.component.mjs +5 -16
- package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
- package/esm2022/alarms/alarms-view.service.mjs +16 -2
- package/esm2022/alarms/alarms.component.mjs +12 -6
- package/esm2022/alarms/alarms.model.mjs +17 -1
- package/esm2022/alarms/alarms.module.mjs +11 -4
- package/esm2022/branding/shared/data/store-branding.service.mjs +24 -1
- package/esm2022/branding/shared/lazy/branding/branding.component.mjs +3 -1
- package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
- package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
- package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
- package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
- package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
- package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
- package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
- package/esm2022/core/action-bar/action-bar.component.mjs +3 -3
- package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
- package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
- package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
- package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
- package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
- package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
- package/esm2022/core/common/index.mjs +5 -1
- package/esm2022/core/common/inter-app.service.mjs +76 -0
- package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
- package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
- package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
- package/esm2022/core/dashboard/dashboard.module.mjs +22 -4
- package/esm2022/core/dashboard/index.mjs +4 -1
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
- package/esm2022/core/dashboard/widget-change-event.model.mjs +1 -1
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
- package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
- package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-helper.service.mjs +3 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -36
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -72
- package/esm2022/core/date-time-picker/date-time-picker.component.mjs +9 -3
- package/esm2022/core/header/header.module.mjs +7 -5
- package/esm2022/core/header/title/title.component.mjs +3 -3
- package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
- package/esm2022/core/i18n/i18n.module.mjs +7 -14
- package/esm2022/core/i18n/index.mjs +3 -2
- package/esm2022/core/i18n/translate.parser.mjs +2 -2
- package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
- package/esm2022/core/i18n/translation-utils.mjs +24 -0
- package/esm2022/core/list-display-switch/list-display-switch.component.mjs +3 -3
- package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
- package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
- package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
- package/esm2022/datapoints-export-selector/index.mjs +15 -0
- package/esm2022/device-list/add-smart-group.component.mjs +4 -3
- package/esm2022/device-list/device-list.module.mjs +22 -4
- package/esm2022/interval-picker/c8y-ngx-components-interval-picker.mjs +5 -0
- package/esm2022/interval-picker/index.mjs +3 -0
- package/esm2022/interval-picker/interval-picker.component.mjs +68 -0
- package/esm2022/interval-picker/interval-picker.model.mjs +47 -0
- package/esm2022/map/cluster-map.component.mjs +41 -13
- package/esm2022/map/map-status.component.mjs +6 -5
- package/esm2022/map/map.component.mjs +9 -5
- package/esm2022/map/map.model.mjs +1 -1
- package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
- package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
- package/esm2022/translation-editor/data/index.mjs +2 -0
- package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
- package/esm2022/translation-editor/index.mjs +10 -0
- package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
- package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
- package/esm2022/translation-editor/lazy/index.mjs +2 -0
- package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
- package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
- package/esm2022/widgets/cockpit/index.mjs +4 -2
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
- package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
- package/esm2022/widgets/definitions/index.mjs +2 -1
- package/esm2022/widgets/definitions/map/index.mjs +4 -2
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
- package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
- package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
- package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
- package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
- package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
- package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
- package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +5 -5
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +189 -31
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +23 -0
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -0
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +120 -0
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-map.mjs +52 -19
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +5093 -4369
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/interval-picker/c8y-ngx-components-interval-picker.d.ts.map +1 -0
- package/interval-picker/index.d.ts +3 -0
- package/interval-picker/index.d.ts.map +1 -0
- package/{core/dashboard/wiget-time-context/interval-picker → interval-picker}/interval-picker.component.d.ts +10 -2
- package/interval-picker/interval-picker.component.d.ts.map +1 -0
- package/interval-picker/interval-picker.model.d.ts +15 -0
- package/interval-picker/interval-picker.model.d.ts.map +1 -0
- package/locales/de.po +289 -18
- package/locales/en.po +12 -0
- package/locales/en_US.po +3 -0
- package/locales/es.po +253 -18
- package/locales/fr.po +253 -18
- package/locales/ja_JP.po +282 -18
- package/locales/locales.pot +266 -21
- package/locales/nl.po +253 -18
- package/locales/pl.po +253 -18
- package/locales/pt_BR.po +253 -18
- package/map/cluster-map.component.d.ts +8 -3
- package/map/cluster-map.component.d.ts.map +1 -1
- package/map/map-status.component.d.ts +0 -3
- package/map/map-status.component.d.ts.map +1 -1
- package/map/map.component.d.ts +4 -2
- package/map/map.component.d.ts.map +1 -1
- package/map/map.model.d.ts +2 -1
- package/map/map.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
- package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
- package/translation-editor/data/index.d.ts +2 -0
- package/translation-editor/data/index.d.ts.map +1 -0
- package/translation-editor/data/translation-store.service.d.ts +61 -0
- package/translation-editor/data/translation-store.service.d.ts.map +1 -0
- package/translation-editor/index.d.ts +2 -0
- package/translation-editor/index.d.ts.map +1 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
- package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
- package/translation-editor/lazy/index.d.ts +2 -0
- package/translation-editor/lazy/index.d.ts.map +1 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
- package/widgets/cockpit/index.d.ts +13 -0
- package/widgets/cockpit/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
- package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
- package/widgets/definitions/datapoints-table/index.d.ts +14 -0
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/map/index.d.ts +2 -1
- package/widgets/definitions/map/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/index.d.ts +10 -0
- package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
- package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
- package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.component.d.ts +8 -3
- package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.model.d.ts +4 -3
- package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.d.ts.map +0 -1
- package/core/i18n/translate.loader.d.ts +0 -31
- package/core/i18n/translate.loader.d.ts.map +0 -1
- package/esm2022/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.mjs +0 -55
- package/esm2022/core/i18n/translate.loader.mjs +0 -71
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYzh5LW5neC1jb21wb25lbnRzLXdpZGdldHMtZGVmaW5pdGlvbnMtZGF0YXBvaW50cy10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvZGVmaW5pdGlvbnMvZGF0YXBvaW50cy10YWJsZS9jOHktbmd4LWNvbXBvbmVudHMtd2lkZ2V0cy1kZWZpbml0aW9ucy1kYXRhcG9pbnRzLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DynamicComponentErrorStrategy, gettext, hookComponent } from '@c8y/ngx-components';
|
|
2
|
+
import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';
|
|
3
|
+
export const dataPointsTableWidgetDefinition = {
|
|
4
|
+
id: defaultWidgetIds.DATA_POINTS_TABLE,
|
|
5
|
+
label: gettext('Data points table'),
|
|
6
|
+
description: gettext(`A table display of a collection of data points`),
|
|
7
|
+
loadComponent: () => import('@c8y/ngx-components/widgets/implementations/datapoints-table').then(m => m.DatapointsTableViewWidgetComponent),
|
|
8
|
+
loadConfigComponent: () => import('@c8y/ngx-components/widgets/implementations/datapoints-table').then(m => m.DatapointsTableWidgetConfigComponent),
|
|
9
|
+
previewImage: 'c8y-style-assets/data-points-table-widget.png',
|
|
10
|
+
errorStrategy: DynamicComponentErrorStrategy.OVERLAY_ERROR,
|
|
11
|
+
data: {
|
|
12
|
+
settings: {
|
|
13
|
+
noNewWidgets: false,
|
|
14
|
+
widgetDefaults: {
|
|
15
|
+
_width: 8,
|
|
16
|
+
_height: 4
|
|
17
|
+
},
|
|
18
|
+
ng1: {
|
|
19
|
+
options: {
|
|
20
|
+
noDeviceTarget: true,
|
|
21
|
+
minCol: 6,
|
|
22
|
+
datapointAttributes: ['datapoints']
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
displaySettings: {
|
|
27
|
+
globalTimeContext: true,
|
|
28
|
+
globalRealtimeContext: true,
|
|
29
|
+
globalAggregationContext: true
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export const dataPointsTableWidgetProviders = [hookComponent(dataPointsTableWidgetDefinition)];
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL2RhdGFwb2ludHMtdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRztJQUM3QyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsaUJBQWlCO0lBQ3RDLEtBQUssRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDbkMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxnREFBZ0QsQ0FBQztJQUN0RSxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQ2xCLE1BQU0sQ0FBQyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FDekUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0NBQWtDLENBQzFDO0lBQ0gsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQ3hCLE1BQU0sQ0FBQyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FDekUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQzVDO0lBQ0gsWUFBWSxFQUFFLCtDQUErQztJQUM3RCxhQUFhLEVBQUUsNkJBQTZCLENBQUMsYUFBYTtJQUMxRCxJQUFJLEVBQUU7UUFDSixRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsS0FBSztZQUNuQixjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLElBQUk7b0JBQ3BCLE1BQU0sRUFBRSxDQUFDO29CQUNULG1CQUFtQixFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUNwQzthQUNGO1NBQ0Y7UUFDRCxlQUFlLEVBQUU7WUFDZixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLHFCQUFxQixFQUFFLElBQUk7WUFDM0Isd0JBQXdCLEVBQUUsSUFBSTtTQUMvQjtLQUNxQjtDQUNZLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudEVycm9yU3RyYXRlZ3ksIGdldHRleHQsIGhvb2tDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dFdpZGdldENvbmZpZyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgZGVmYXVsdFdpZGdldElkcyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9kZWZpbml0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBkYXRhUG9pbnRzVGFibGVXaWRnZXREZWZpbml0aW9uID0ge1xuICBpZDogZGVmYXVsdFdpZGdldElkcy5EQVRBX1BPSU5UU19UQUJMRSxcbiAgbGFiZWw6IGdldHRleHQoJ0RhdGEgcG9pbnRzIHRhYmxlJyksXG4gIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KGBBIHRhYmxlIGRpc3BsYXkgb2YgYSBjb2xsZWN0aW9uIG9mIGRhdGEgcG9pbnRzYCksXG4gIGxvYWRDb21wb25lbnQ6ICgpID0+XG4gICAgaW1wb3J0KCdAYzh5L25neC1jb21wb25lbnRzL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtdGFibGUnKS50aGVuKFxuICAgICAgbSA9PiBtLkRhdGFwb2ludHNUYWJsZVZpZXdXaWRnZXRDb21wb25lbnRcbiAgICApLFxuICBsb2FkQ29uZmlnQ29tcG9uZW50OiAoKSA9PlxuICAgIGltcG9ydCgnQGM4eS9uZ3gtY29tcG9uZW50cy93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlJykudGhlbihcbiAgICAgIG0gPT4gbS5EYXRhcG9pbnRzVGFibGVXaWRnZXRDb25maWdDb21wb25lbnRcbiAgICApLFxuICBwcmV2aWV3SW1hZ2U6ICdjOHktc3R5bGUtYXNzZXRzL2RhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC5wbmcnLFxuICBlcnJvclN0cmF0ZWd5OiBEeW5hbWljQ29tcG9uZW50RXJyb3JTdHJhdGVneS5PVkVSTEFZX0VSUk9SLFxuICBkYXRhOiB7XG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIG5vTmV3V2lkZ2V0czogZmFsc2UsXG4gICAgICB3aWRnZXREZWZhdWx0czoge1xuICAgICAgICBfd2lkdGg6IDgsXG4gICAgICAgIF9oZWlnaHQ6IDRcbiAgICAgIH0sXG4gICAgICBuZzE6IHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vRGV2aWNlVGFyZ2V0OiB0cnVlLFxuICAgICAgICAgIG1pbkNvbDogNixcbiAgICAgICAgICBkYXRhcG9pbnRBdHRyaWJ1dGVzOiBbJ2RhdGFwb2ludHMnXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkaXNwbGF5U2V0dGluZ3M6IHtcbiAgICAgIGdsb2JhbFRpbWVDb250ZXh0OiB0cnVlLFxuICAgICAgZ2xvYmFsUmVhbHRpbWVDb250ZXh0OiB0cnVlLFxuICAgICAgZ2xvYmFsQWdncmVnYXRpb25Db250ZXh0OiB0cnVlXG4gICAgfVxuICB9IGFzIENvbnRleHRXaWRnZXRDb25maWdcbn0gc2F0aXNmaWVzIER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uO1xuXG5leHBvcnQgY29uc3QgZGF0YVBvaW50c1RhYmxlV2lkZ2V0UHJvdmlkZXJzID0gW2hvb2tDb21wb25lbnQoZGF0YVBvaW50c1RhYmxlV2lkZ2V0RGVmaW5pdGlvbildO1xuIl19
|
|
@@ -2,6 +2,7 @@ export const defaultWidgetIds = {
|
|
|
2
2
|
APPLICATIONS: 'Applications',
|
|
3
3
|
LEGACY_COCKPIT_WELCOME: 'Cockpit Welcome',
|
|
4
4
|
COCKPIT_WELCOME: 'cockpit.welcome.widget',
|
|
5
|
+
DATA_POINTS_TABLE: 'Data points table',
|
|
5
6
|
DEVICE_MANAGEMENT_WELCOME: 'devicemanagement.welcome.widget',
|
|
6
7
|
IMAGE: 'Image',
|
|
7
8
|
KPI: 'kpi.widget',
|
|
@@ -17,4 +18,4 @@ export const defaultWidgetIds = {
|
|
|
17
18
|
LINEAR_GAUGE: 'KPI Linear Gauge',
|
|
18
19
|
SILO: 'KPI Silo'
|
|
19
20
|
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFlBQVksRUFBRSxjQUFjO0lBQzVCLHNCQUFzQixFQUFFLGlCQUFpQjtJQUN6QyxlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0Qyx5QkFBeUIsRUFBRSxpQ0FBaUM7SUFDNUQsS0FBSyxFQUFFLE9BQU87SUFDZCxHQUFHLEVBQUUsWUFBWTtJQUNqQixRQUFRLEVBQUUsVUFBVTtJQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixHQUFHLEVBQUUsS0FBSztJQUNWLDZCQUE2QixFQUFFLDRCQUE0QjtJQUMzRCxVQUFVLEVBQUUsV0FBVztJQUN2QixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxjQUFjO0lBQ25DLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsSUFBSSxFQUFFLFVBQVU7Q0FDUixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGRlZmF1bHRXaWRnZXRJZHMgPSB7XG4gIEFQUExJQ0FUSU9OUzogJ0FwcGxpY2F0aW9ucycsXG4gIExFR0FDWV9DT0NLUElUX1dFTENPTUU6ICdDb2NrcGl0IFdlbGNvbWUnLFxuICBDT0NLUElUX1dFTENPTUU6ICdjb2NrcGl0LndlbGNvbWUud2lkZ2V0JyxcbiAgREFUQV9QT0lOVFNfVEFCTEU6ICdEYXRhIHBvaW50cyB0YWJsZScsXG4gIERFVklDRV9NQU5BR0VNRU5UX1dFTENPTUU6ICdkZXZpY2VtYW5hZ2VtZW50LndlbGNvbWUud2lkZ2V0JyxcbiAgSU1BR0U6ICdJbWFnZScsXG4gIEtQSTogJ2twaS53aWRnZXQnLFxuICBNQVJLRE9XTjogJ21hcmtkb3duJyxcbiAgSEVMUF9BTkRfU0VSVklDRTogJ0hlbHBBbmRTZXJ2aWNlJyxcbiAgVEhSRUVfRF9ST1RBVElPTjogJ3JvdGF0aW9uM2QnLFxuICBNQVA6ICdNYXAnLFxuICBERVZJQ0VfQ09OVFJPTF9NRVNTQUdFX1dJREdFVDogJ2RldmljZUNvbnRyb2xNZXNzYWdlV2lkZ2V0JyxcbiAgSU5GT19HQVVHRTogJ2luZm9HYXVnZScsXG4gIEFMQVJNX0xJU1Q6ICdBbGFybSBsaXN0JyxcbiAgQUxMX0NSSVRJQ0FMX0FMQVJNUzogJ0Fzc2V0IEFsYXJtcycsXG4gIFJFQ0VOVF9BTEFSTVM6ICdSZWNlbnQgQWxhcm1zJyxcbiAgTElORUFSX0dBVUdFOiAnS1BJIExpbmVhciBHYXVnZScsXG4gIFNJTE86ICdLUEkgU2lsbydcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRXaWRnZXRJZEtleXMgPSBrZXlvZiB0eXBlb2YgZGVmYXVsdFdpZGdldElkcztcbmV4cG9ydCB0eXBlIERlZmF1bHRXaWRnZXRJZFZhbHVlcyA9ICh0eXBlb2YgZGVmYXVsdFdpZGdldElkcylbRGVmYXVsdFdpZGdldElkS2V5c107XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DynamicManagedObjectResolver, gettext, hookWidget } from '@c8y/ngx-components';
|
|
1
|
+
import { DynamicManagedObjectResolver, DynamicComponentErrorStrategy, gettext, hookWidget } from '@c8y/ngx-components';
|
|
2
2
|
import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';
|
|
3
3
|
export const mapWidgetDefinition = {
|
|
4
4
|
id: defaultWidgetIds.MAP,
|
|
@@ -13,6 +13,7 @@ export const mapWidgetDefinition = {
|
|
|
13
13
|
device: DynamicManagedObjectResolver
|
|
14
14
|
},
|
|
15
15
|
previewImage: 'c8y-style-assets/map-widget-pr.png',
|
|
16
|
+
errorStrategy: DynamicComponentErrorStrategy.OVERLAY_ERROR,
|
|
16
17
|
data: {
|
|
17
18
|
settings: {
|
|
18
19
|
noNewWidgets: false,
|
|
@@ -30,9 +31,10 @@ export const mapWidgetDefinition = {
|
|
|
30
31
|
},
|
|
31
32
|
displaySettings: {
|
|
32
33
|
globalTimeContext: false,
|
|
34
|
+
globalAutoRefreshContext: true,
|
|
33
35
|
globalRealtimeContext: true
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
};
|
|
37
39
|
export const mapWidgetProviders = [hookWidget(mapWidgetDefinition)];
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL21hcC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDZCQUE2QixFQUM3QixPQUFPLEVBQ1AsVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLEdBQUc7SUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDckIsV0FBVyxFQUFFLE9BQU8sQ0FBQywyREFBMkQsQ0FBQztJQUNqRixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQ2xCLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztJQUMzRixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLGlEQUFpRCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO0lBQ2pHOztRQUVJO0lBQ0osT0FBTyxFQUFFO1FBQ1AsTUFBTSxFQUFFLDRCQUE0QjtLQUNyQztJQUNELFlBQVksRUFBRSxvQ0FBb0M7SUFDbEQsYUFBYSxFQUFFLDZCQUE2QixDQUFDLGFBQWE7SUFDMUQsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLEtBQUs7WUFDbkIsY0FBYyxFQUFFO2dCQUNkLE1BQU0sRUFBRSxDQUFDO2dCQUNULE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxFQUFFO29CQUNQLGNBQWMsRUFBRSxLQUFLO29CQUNyQixnQkFBZ0IsRUFBRSxJQUFJO29CQUN0Qix1QkFBdUIsRUFBRSxJQUFJO2lCQUM5QjthQUNGO1NBQ0Y7UUFDRCxlQUFlLEVBQUU7WUFDZixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLHdCQUF3QixFQUFFLElBQUk7WUFDOUIscUJBQXFCLEVBQUUsSUFBSTtTQUM1QjtLQUNxQjtDQUNTLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb250ZXh0V2lkZ2V0Q29uZmlnIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9jb250ZXh0LWRhc2hib2FyZCc7XG5pbXBvcnQge1xuICBEeW5hbWljTWFuYWdlZE9iamVjdFJlc29sdmVyLFxuICBEeW5hbWljQ29tcG9uZW50RXJyb3JTdHJhdGVneSxcbiAgZ2V0dGV4dCxcbiAgaG9va1dpZGdldFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgRHluYW1pY1dpZGdldERlZmluaXRpb24gfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IGRlZmF1bHRXaWRnZXRJZHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3dpZGdldHMvZGVmaW5pdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgbWFwV2lkZ2V0RGVmaW5pdGlvbiA9IHtcbiAgaWQ6IGRlZmF1bHRXaWRnZXRJZHMuTUFQLFxuICBsYWJlbDogZ2V0dGV4dCgnTWFwJyksXG4gIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdTaG93cyB0aGUgcG9zaXRpb24gb2YgYSBkZXZpY2Ugb3IgYWxsIGRldmljZXMgaW4gYSBncm91cC4nKSxcbiAgbG9hZENvbXBvbmVudDogKCkgPT5cbiAgICBpbXBvcnQoJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwJykudGhlbihtID0+IG0uTWFwV2lkZ2V0Q29tcG9uZW50KSxcbiAgbG9hZENvbmZpZ0NvbXBvbmVudDogKCkgPT5cbiAgICBpbXBvcnQoJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwJykudGhlbihtID0+IG0uTWFwV2lkZ2V0Q29uZmlnQ29tcG9uZW50KSxcbiAgLypwcm92aWRlcnM6IFtcblxuICBdLCovXG4gIHJlc29sdmU6IHtcbiAgICBkZXZpY2U6IER5bmFtaWNNYW5hZ2VkT2JqZWN0UmVzb2x2ZXJcbiAgfSxcbiAgcHJldmlld0ltYWdlOiAnYzh5LXN0eWxlLWFzc2V0cy9tYXAtd2lkZ2V0LXByLnBuZycsXG4gIGVycm9yU3RyYXRlZ3k6IER5bmFtaWNDb21wb25lbnRFcnJvclN0cmF0ZWd5Lk9WRVJMQVlfRVJST1IsXG4gIGRhdGE6IHtcbiAgICBzZXR0aW5nczoge1xuICAgICAgbm9OZXdXaWRnZXRzOiBmYWxzZSxcbiAgICAgIHdpZGdldERlZmF1bHRzOiB7XG4gICAgICAgIF93aWR0aDogOCxcbiAgICAgICAgX2hlaWdodDogNFxuICAgICAgfSxcbiAgICAgIG5nMToge1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9EZXZpY2VUYXJnZXQ6IGZhbHNlLFxuICAgICAgICAgIGdyb3Vwc1NlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgZGV2aWNlVGFyZ2V0Tm90UmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheVNldHRpbmdzOiB7XG4gICAgICBnbG9iYWxUaW1lQ29udGV4dDogZmFsc2UsXG4gICAgICBnbG9iYWxBdXRvUmVmcmVzaENvbnRleHQ6IHRydWUsXG4gICAgICBnbG9iYWxSZWFsdGltZUNvbnRleHQ6IHRydWVcbiAgICB9XG4gIH0gYXMgQ29udGV4dFdpZGdldENvbmZpZ1xufSBzYXRpc2ZpZXMgRHluYW1pY1dpZGdldERlZmluaXRpb247XG5cbmV4cG9ydCBjb25zdCBtYXBXaWRnZXRQcm92aWRlcnMgPSBbaG9va1dpZGdldChtYXBXaWRnZXREZWZpbml0aW9uKV07XG4iXX0=
|
|
@@ -7,7 +7,7 @@ import { TranslateService } from '@ngx-translate/core';
|
|
|
7
7
|
import { isEqual, omit } from 'lodash-es';
|
|
8
8
|
import { BehaviorSubject } from 'rxjs';
|
|
9
9
|
import { debounceTime, pairwise, startWith } from 'rxjs/operators';
|
|
10
|
-
import { ALARM_ORDER_LABELS, ALARM_ORDER_VALUES } from '../alarm-list-widget.model';
|
|
10
|
+
import { ALARM_ORDER_LABELS, ALARM_ORDER_VALUES, GLOBAL_INTERVAL_OPTION } from '../alarm-list-widget.model';
|
|
11
11
|
import { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
import * as i1 from "../alarm-widget.service";
|
|
@@ -38,8 +38,8 @@ export class AlarmListWidgetConfigComponent {
|
|
|
38
38
|
this.BELL_ICON = ALARM_STATUS_ICON.BELL;
|
|
39
39
|
this.C8Y_ALERT_IDLE_ICON = ALARM_STATUS_ICON.ALERT_IDLE;
|
|
40
40
|
this.ALARM_ORDER_LABELS = ALARM_ORDER_LABELS;
|
|
41
|
+
this.GLOBAL_INTERVAL_OPTION = GLOBAL_INTERVAL_OPTION;
|
|
41
42
|
this.alarms$ = new BehaviorSubject(null);
|
|
42
|
-
this.refreshOptionsDetails = [];
|
|
43
43
|
this.orderList = Object.values(ALARM_ORDER_VALUES);
|
|
44
44
|
this.severityList = Object.keys(SEVERITY_LABELS);
|
|
45
45
|
/**
|
|
@@ -52,9 +52,12 @@ export class AlarmListWidgetConfigComponent {
|
|
|
52
52
|
? this.translateService.instant(gettext('Realtime'))
|
|
53
53
|
: this.translateService.instant(gettext('Auto refresh'));
|
|
54
54
|
this.refreshTypePopoverMessage = this.config.isRealtime
|
|
55
|
-
? this.translateService.instant(gettext('Change the state of realtime refresh.'))
|
|
55
|
+
? this.translateService.instant(gettext('Change the default state of realtime refresh.'))
|
|
56
56
|
: this.translateService.instant(gettext('Change the state of interval automatic refresh and set the refresh frequency.'));
|
|
57
57
|
this.initializeForm();
|
|
58
|
+
if (!this.config.isRealtime) {
|
|
59
|
+
this.updateConfigBasedOnRefreshOption();
|
|
60
|
+
}
|
|
58
61
|
this.config.isRealtime = !this.alarmsViewService.isIntervalRefresh();
|
|
59
62
|
const isWidgetWithExistingConfig = this.config.order && this.config.severities && this.config.status;
|
|
60
63
|
if (isWidgetWithExistingConfig) {
|
|
@@ -105,17 +108,17 @@ export class AlarmListWidgetConfigComponent {
|
|
|
105
108
|
addType() {
|
|
106
109
|
this.types.push(this.formBuilder.control(''));
|
|
107
110
|
}
|
|
111
|
+
updateRefreshOption() {
|
|
112
|
+
this.config.refreshOption = this.refreshOption;
|
|
113
|
+
this.formGroup.controls.refreshOption.setValue(this.refreshOption);
|
|
114
|
+
const isGlobalInterval = this.refreshOption === GLOBAL_INTERVAL_OPTION;
|
|
115
|
+
this.config.widgetInstanceGlobalAutoRefreshContext = isGlobalInterval;
|
|
116
|
+
this.formGroup.controls.widgetInstanceGlobalAutoRefreshContext.setValue(isGlobalInterval);
|
|
117
|
+
this.updateConfigBasedOnRefreshOption();
|
|
118
|
+
}
|
|
108
119
|
get types() {
|
|
109
120
|
return this.formGroup.get('types');
|
|
110
121
|
}
|
|
111
|
-
updateRefreshIntervals() {
|
|
112
|
-
if (this.config.isRealtime) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
this.formGroup.get('isAutoRefreshEnabled').value
|
|
116
|
-
? this.formGroup.get('refreshInterval').disable()
|
|
117
|
-
: this.formGroup.get('refreshInterval').enable();
|
|
118
|
-
}
|
|
119
122
|
filterEmptyTypes(types) {
|
|
120
123
|
return types.filter((element) => element !== '' && element !== null);
|
|
121
124
|
}
|
|
@@ -140,6 +143,7 @@ export class AlarmListWidgetConfigComponent {
|
|
|
140
143
|
this.form.form.addControl('config', this.formGroup);
|
|
141
144
|
this.formGroup.patchValue(this.config);
|
|
142
145
|
this.initializeTypes(this.config.types);
|
|
146
|
+
this.refreshOption = this.config.refreshOption ?? 'interval';
|
|
143
147
|
}
|
|
144
148
|
createForm() {
|
|
145
149
|
return this.formBuilder.group({
|
|
@@ -159,7 +163,9 @@ export class AlarmListWidgetConfigComponent {
|
|
|
159
163
|
disabled: this.isAutorefershDisabled()
|
|
160
164
|
})
|
|
161
165
|
: new FormControl(undefined),
|
|
162
|
-
device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined)
|
|
166
|
+
device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined),
|
|
167
|
+
refreshOption: this.config.isRealtime ? null : 'interval',
|
|
168
|
+
widgetInstanceGlobalAutoRefreshContext: this.config.refreshOption === GLOBAL_INTERVAL_OPTION
|
|
163
169
|
});
|
|
164
170
|
}
|
|
165
171
|
isAutorefershDisabled() {
|
|
@@ -227,13 +233,21 @@ export class AlarmListWidgetConfigComponent {
|
|
|
227
233
|
const currentConfigCopy = omit(currentConfig, 'isAutoRefreshEnabled', 'refreshInterval');
|
|
228
234
|
return isEqual(prevConfigCopy, currentConfigCopy);
|
|
229
235
|
}
|
|
236
|
+
updateConfigBasedOnRefreshOption() {
|
|
237
|
+
const isInterval = this.refreshOption === 'interval';
|
|
238
|
+
this.config.isAutoRefreshEnabled = isInterval;
|
|
239
|
+
this.formGroup.controls.isAutoRefreshEnabled.setValue(isInterval);
|
|
240
|
+
isInterval
|
|
241
|
+
? this.formGroup.get('refreshInterval').enable()
|
|
242
|
+
: this.formGroup.get('refreshInterval').disable();
|
|
243
|
+
}
|
|
230
244
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmListWidgetConfigComponent, deps: [{ token: i1.AlarmWidgetService }, { token: i2.AlarmService }, { token: i3.AlarmsViewService }, { token: i4.AlertService }, { token: i5.NgForm }, { token: i5.FormBuilder }, { token: i6.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
231
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmListWidgetConfigComponent, selector: "c8y-alarm-list-widget-config", inputs: { config: "config" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n<form\n class=\"row\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-0\">\n <div\n class=\"d-flex m-b-8 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let severityOption of severityList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"status\"\n >\n <legend>{{ 'Status' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let statusOption of statusList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n <div\n class=\"input-group\"\n *ngFor=\"let type of types.controls; let i = index\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\n <button\n class=\"btn btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-8 form-group-sm\">\n <div class=\"d-flex gap-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"updateRefreshIntervals()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <ng-container *ngIf=\"!config.isRealtime\">\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<div class=\"legend form-block m-b-0\">{{ 'Preview`of an alarm list`' | translate }}</div>\n<c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false\n }\"\n></c8y-alarms-list>\n", dependencies: [{ kind: "component", type: i3.AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "splitView"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.SeverityIconPipe, name: "severityIcon" }, { kind: "pipe", type: i10.SortingDescriptionPopoverMessagePipe, name: "sortingDescriptionPopoverMessage" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
245
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmListWidgetConfigComponent, selector: "c8y-alarm-list-widget-config", inputs: { config: "config" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n<form\n class=\"row\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-0\">\n <div\n class=\"d-flex m-b-8 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let severityOption of severityList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"status\"\n >\n <legend>{{ 'Status' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let statusOption of statusList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n <div\n class=\"input-group\"\n *ngFor=\"let type of types.controls; let i = index\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\n <button\n class=\"btn btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-8 form-group-sm\">\n <div class=\"d-flex gap-8 a-i-center\">\n <ng-template #realtime>\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Realtime refresh' | translate }}</span>\n </label>\n </ng-template>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!config.isRealtime; else realtime\"\n >\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"refreshOption\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"updateRefreshOption()\"\n >\n <option value=\"none\">\n {{ 'No automatic refresh' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval' | translate\"\n value=\"interval\"\n >\n {{ 'Use refresh interval' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval, synchronized globally' | translate\"\n value=\"global-interval\"\n >\n {{ 'Use global refresh interval' | translate }}\n </option>\n </select>\n </div>\n <ng-container\n *ngIf=\"!config.isRealtime && config.refreshOption !== GLOBAL_INTERVAL_OPTION\"\n >\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<div class=\"legend form-block m-b-0\">{{ 'Preview`of an alarm list`' | translate }}</div>\n<c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n></c8y-alarms-list>\n", dependencies: [{ kind: "component", type: i3.AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "splitView"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.SeverityIconPipe, name: "severityIcon" }, { kind: "pipe", type: i10.SortingDescriptionPopoverMessagePipe, name: "sortingDescriptionPopoverMessage" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
232
246
|
}
|
|
233
247
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmListWidgetConfigComponent, decorators: [{
|
|
234
248
|
type: Component,
|
|
235
|
-
args: [{ selector: 'c8y-alarm-list-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n<form\n class=\"row\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-0\">\n <div\n class=\"d-flex m-b-8 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let severityOption of severityList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"status\"\n >\n <legend>{{ 'Status' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let statusOption of statusList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n <div\n class=\"input-group\"\n *ngFor=\"let type of types.controls; let i = index\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\n <button\n class=\"btn btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-8 form-group-sm\">\n <div class=\"d-flex gap-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"updateRefreshIntervals()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <ng-container *ngIf=\"!config.isRealtime\">\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<div class=\"legend form-block m-b-0\">{{ 'Preview`of an alarm list`' | translate }}</div>\n<c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false\n }\"\n></c8y-alarms-list>\n" }]
|
|
249
|
+
args: [{ selector: 'c8y-alarm-list-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n<form\n class=\"row\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-0\">\n <div\n class=\"d-flex m-b-8 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let severityOption of severityList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"status\"\n >\n <legend>{{ 'Status' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n >\n <ng-container *ngFor=\"let statusOption of statusList\">\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n <div\n class=\"input-group\"\n *ngFor=\"let type of types.controls; let i = index\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\n <button\n class=\"btn btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-8 form-group-sm\">\n <div class=\"d-flex gap-8 a-i-center\">\n <ng-template #realtime>\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Realtime refresh' | translate }}</span>\n </label>\n </ng-template>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!config.isRealtime; else realtime\"\n >\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"refreshOption\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"updateRefreshOption()\"\n >\n <option value=\"none\">\n {{ 'No automatic refresh' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval' | translate\"\n value=\"interval\"\n >\n {{ 'Use refresh interval' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval, synchronized globally' | translate\"\n value=\"global-interval\"\n >\n {{ 'Use global refresh interval' | translate }}\n </option>\n </select>\n </div>\n <ng-container\n *ngIf=\"!config.isRealtime && config.refreshOption !== GLOBAL_INTERVAL_OPTION\"\n >\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<div class=\"legend form-block m-b-0\">{{ 'Preview`of an alarm list`' | translate }}</div>\n<c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n></c8y-alarms-list>\n" }]
|
|
236
250
|
}], ctorParameters: () => [{ type: i1.AlarmWidgetService }, { type: i2.AlarmService }, { type: i3.AlarmsViewService }, { type: i4.AlertService }, { type: i5.NgForm }, { type: i5.FormBuilder }, { type: i6.TranslateService }], propDecorators: { config: [{
|
|
237
251
|
type: Input
|
|
238
252
|
}] } });
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2FsYXJtcy9hbGFybS1saXN0LXdpZGdldC1jb25maWcvYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2FsYXJtcy9hbGFybS1saXN0LXdpZGdldC1jb25maWcvYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLFdBQVcsRUFDWCxXQUFXLEVBRVgsTUFBTSxFQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsWUFBWSxFQUdaLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFlBQVksRUFBZ0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBR25CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQWFoRixNQUFNLE9BQU8sOEJBQThCO0lBZ0N6QyxZQUNVLHNCQUEwQyxFQUMxQyxZQUEwQixFQUMxQixpQkFBb0MsRUFDcEMsWUFBMEIsRUFDMUIsSUFBWSxFQUNaLFdBQXdCLEVBQ3hCLGdCQUFrQztRQU5sQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQW9CO1FBQzFDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFwQ25DLHFDQUFnQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQztRQUNsRixvQkFBZSxHQUFHLGVBQWUsQ0FBQztRQUNsQyxrQkFBYSxHQUFHLG1CQUFtQixDQUFDO1FBRXBDLDZCQUF3QixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDcEQseUJBQW9CLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUUzQyxvQkFBZSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMvQyxjQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztRQUVuRCx1QkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUVqRCxZQUFPLEdBQWdELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpGLDBCQUFxQixHQUEyQixFQUFFLENBQUM7UUFHbkQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUc5QyxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUM7O1dBRUc7UUFDSCxlQUFVLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBWTlFLENBQUM7SUFFSixLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDakYsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQzNCLE9BQU8sQ0FBQywrRUFBK0UsQ0FBQyxDQUN6RixDQUFDO1FBRU4sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFckUsTUFBTSwwQkFBMEIsR0FDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFcEUsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixzQ0FBc0M7WUFDdEMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBOEIsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBOEI7UUFDekMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFdBQVcsR0FBRyxLQUFpQixDQUFDO1lBRXRDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsS0FBSztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXdCO1FBQy9DLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQXNCLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxLQUF3QjtRQUN6RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFzQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUE2QjtRQUNuRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixNQUFNLE1BQU0sR0FBd0IsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDOUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUM5RSxDQUFDO1lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO2dCQUNwRCxVQUFVLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQzthQUMxQyxDQUFDO1lBQ0YscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtnQkFDMUQsVUFBVSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7YUFDMUMsQ0FBQztZQUNGLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxTQUEyQjtZQUNyRCxvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQztZQUM1QixlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztvQkFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQjtvQkFDcEQsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtpQkFDdkMsQ0FBQztnQkFDSixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDO1NBQzlGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztJQUMzQyxDQUFDO0lBRU8scUJBQXFCLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQWdCLENBQUMsU0FBb0IsRUFBRSxFQUFFO1lBQ3RELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FDNUQsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDdkQsQ0FBQyxDQUNGLENBQUM7WUFFRixPQUFPLGFBQWEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUQsQ0FBQyxDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFlO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBYyxDQUFDO1FBQzlELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO2FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEUsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFxQixFQUFFLEVBQUU7WUFDakUsTUFBTSxtQkFBbUIsR0FBMEIsY0FBdUMsQ0FBQztZQUMzRixNQUFNLGtCQUFrQixHQUEwQixhQUFzQyxDQUFDO1lBRXpGLElBQUksSUFBSSxDQUFDLGtDQUFrQyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztnQkFDckYsT0FBTztZQUNULENBQUM7WUFFRCxJQUNFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO2dCQUN6RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUNyRSxDQUFDO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLGtDQUFrQyxDQUN4QyxjQUFxQyxFQUNyQyxhQUFvQztRQUVwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFekYsT0FBTyxPQUFPLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsQ0FBQzs4R0FwUVUsOEJBQThCO2tHQUE5Qiw4QkFBOEIsdUhDaEQzQywwalJBOFBBLDJrSERoTmlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzsyRkFFeEQsOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLDhCQUE4QixpQkFFekIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7MlBBRzFELE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdG9yRm5cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUxBUk1fU1RBVFVTX0xBQkVMUyxcbiAgQWxhcm1TdGF0dXMsXG4gIEFsYXJtU2VydmljZSxcbiAgSUFsYXJtLFxuICBJUmVzdWx0TGlzdCxcbiAgU0VWRVJJVFlfTEFCRUxTXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgT25CZWZvcmVTYXZlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBBTEFSTV9TVEFUVVNfSUNPTixcbiAgQWxhcm1zVmlld1NlcnZpY2UsXG4gIERFRkFVTFRfU0VWRVJJVFlfVkFMVUVTLFxuICBERUZBVUxUX1NUQVRVU19WQUxVRVNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9hbGFybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgaXNFcXVhbCwgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBwYWlyd2lzZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQUxBUk1fT1JERVJfTEFCRUxTLFxuICBBTEFSTV9PUkRFUl9WQUxVRVMsXG4gIEFsYXJtTGlzdFdpZGdldENvbmZpZyxcbiAgQWxhcm1PcmRlclR5cGVcbn0gZnJvbSAnLi4vYWxhcm0tbGlzdC13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgQWxhcm1XaWRnZXRTZXJ2aWNlLCBERUZBVUxUX1BBR0VfU0laRSB9IGZyb20gJy4uL2FsYXJtLXdpZGdldC5zZXJ2aWNlJztcblxudHlwZSBSZWZyZXNoT3B0aW9uRGV0YWlscyA9IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgZGlzcGxheTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFsYXJtLWxpc3Qtd2lkZ2V0LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGFybS1saXN0LXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEFsYXJtTGlzdFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkJlZm9yZVNhdmUsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnO1xuXG4gIHJlYWRvbmx5IFJFRlJFU0hfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gdGhpcy5hbGFybXNWaWV3U2VydmljZS5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFUztcbiAgcmVhZG9ubHkgU0VWRVJJVFlfTEFCRUxTID0gU0VWRVJJVFlfTEFCRUxTO1xuICByZWFkb25seSBTVEFUVVNfTEFCRUxTID0gQUxBUk1fU1RBVFVTX0xBQkVMUztcblxuICByZWFkb25seSBBQ0tOT1dMRURHRV9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRUQ7XG4gIHJlYWRvbmx5IENMRUFSRURfU1RBVFVTX1ZBTFVFID0gQWxhcm1TdGF0dXMuQ0xFQVJFRDtcblxuICByZWFkb25seSBCRUxMX1NMQVNIX0lDT04gPSBBTEFSTV9TVEFUVVNfSUNPTi5CRUxMX1NMQVNIO1xuICByZWFkb25seSBCRUxMX0lDT04gPSBBTEFSTV9TVEFUVVNfSUNPTi5CRUxMO1xuICByZWFkb25seSBDOFlfQUxFUlRfSURMRV9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQUxFUlRfSURMRTtcblxuICByZWFkb25seSBBTEFSTV9PUkRFUl9MQUJFTFMgPSBBTEFSTV9PUkRFUl9MQUJFTFM7XG5cbiAgYWxhcm1zJDogQmVoYXZpb3JTdWJqZWN0PElSZXN1bHRMaXN0PElBbGFybT4gfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxBbGFybUxpc3RXaWRnZXRDb25maWdDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG4gIHJlZnJlc2hPcHRpb25zRGV0YWlsczogUmVmcmVzaE9wdGlvbkRldGFpbHNbXSA9IFtdO1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgb3JkZXJMaXN0ID0gT2JqZWN0LnZhbHVlcyhBTEFSTV9PUkRFUl9WQUxVRVMpO1xuICByZWZyZXNoVHlwZVBvcG92ZXJNZXNzYWdlOiBzdHJpbmc7XG4gIHJlZnJlc2hUeXBlVGl0bGU6IHN0cmluZztcbiAgc2V2ZXJpdHlMaXN0ID0gT2JqZWN0LmtleXMoU0VWRVJJVFlfTEFCRUxTKTtcbiAgLyoqXG4gICAqIE9yZGVyIGRvZXMgbWF0dGVyLlxuICAgKi9cbiAgc3RhdHVzTGlzdCA9IFtBbGFybVN0YXR1cy5BQ1RJVkUsIEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRCwgQWxhcm1TdGF0dXMuQ0xFQVJFRF07XG5cbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWxhcm1MaXN0V2lkZ2V0U2VydmljZTogQWxhcm1XaWRnZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxhcm1TZXJ2aWNlOiBBbGFybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybXNWaWV3U2VydmljZTogQWxhcm1zVmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVmcmVzaFR5cGVUaXRsZSA9IHRoaXMuY29uZmlnLmlzUmVhbHRpbWVcbiAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnUmVhbHRpbWUnKSlcbiAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQXV0byByZWZyZXNoJykpO1xuXG4gICAgdGhpcy5yZWZyZXNoVHlwZVBvcG92ZXJNZXNzYWdlID0gdGhpcy5jb25maWcuaXNSZWFsdGltZVxuICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdDaGFuZ2UgdGhlIHN0YXRlIG9mIHJlYWx0aW1lIHJlZnJlc2guJykpXG4gICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgIGdldHRleHQoJ0NoYW5nZSB0aGUgc3RhdGUgb2YgaW50ZXJ2YWwgYXV0b21hdGljIHJlZnJlc2ggYW5kIHNldCB0aGUgcmVmcmVzaCBmcmVxdWVuY3kuJylcbiAgICAgICAgKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcbiAgICB0aGlzLmNvbmZpZy5pc1JlYWx0aW1lID0gIXRoaXMuYWxhcm1zVmlld1NlcnZpY2UuaXNJbnRlcnZhbFJlZnJlc2goKTtcblxuICAgIGNvbnN0IGlzV2lkZ2V0V2l0aEV4aXN0aW5nQ29uZmlnID1cbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyICYmIHRoaXMuY29uZmlnLnNldmVyaXRpZXMgJiYgdGhpcy5jb25maWcuc3RhdHVzO1xuXG4gICAgaWYgKGlzV2lkZ2V0V2l0aEV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldEFsYXJtcyh0aGlzLmNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qKiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcgd2lkZ2V0ICovXG4gICAgICBhd2FpdCB0aGlzLmdldEFsYXJtcyh0aGlzLmZvcm1Hcm91cC52YWx1ZSBhcyBBbGFybUxpc3RXaWRnZXRDb25maWcpO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZVByZXZpZXdTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAgJiYgY2hhbmdlcy5jb25maWcpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnZGV2aWNlJykucGF0Y2hWYWx1ZSh0aGlzLmNvbmZpZy5kZXZpY2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUNoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkJlZm9yZVNhdmUoY29uZmlnPzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR5cGVzIH0gPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgc3RyaW5nVHlwZXMgPSB0eXBlcyBhcyBzdHJpbmdbXTtcblxuICAgICAgaWYgKHRoaXMuaXNDb250YWluaW5nT25seUVtcHR5VHlwZXMoc3RyaW5nVHlwZXMpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLnR5cGVzID0gWycnXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLnR5cGVzID0gdGhpcy5maWx0ZXJFbXB0eVR5cGVzKHN0cmluZ1R5cGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIG9ubHkgdG8gY29udmVydGVkIGxlZ2FjeSBBbGFybSBsaXN0IHdpZGdldFxuICAgICAqL1xuICAgIGlmIChjb25maWdbJ29wdGlvbnMnXSkge1xuICAgICAgZGVsZXRlIGNvbmZpZ1snb3B0aW9ucyddO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCB0aGlzLmZvcm1Hcm91cC52YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW1vdmVUeXBlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlcy5jb250cm9scy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgndHlwZXMnKS5yZXNldCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnR5cGVzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKCk6IHZvaWQge1xuICAgIHRoaXMudHlwZXMucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycpKTtcbiAgfVxuXG4gIGdldCB0eXBlcygpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ3R5cGVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgdXBkYXRlUmVmcmVzaEludGVydmFscygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcuaXNSZWFsdGltZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ2lzQXV0b1JlZnJlc2hFbmFibGVkJykudmFsdWVcbiAgICAgID8gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyZWZyZXNoSW50ZXJ2YWwnKS5kaXNhYmxlKClcbiAgICAgIDogdGhpcy5mb3JtR3JvdXAuZ2V0KCdyZWZyZXNoSW50ZXJ2YWwnKS5lbmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyRW1wdHlUeXBlcyh0eXBlczogKHN0cmluZyB8IG51bGwpW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHR5cGVzLmZpbHRlcigoZWxlbWVudDogc3RyaW5nIHwgbnVsbCkgPT4gZWxlbWVudCAhPT0gJycgJiYgZWxlbWVudCAhPT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ29udGFpbmluZ09ubHlFbXB0eVR5cGVzKHR5cGVzOiAoc3RyaW5nIHwgbnVsbClbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlcy5ldmVyeSgoZWxlbWVudDogc3RyaW5nIHwgbnVsbCkgPT4gZWxlbWVudCA9PT0gJycgfHwgZWxlbWVudCA9PT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFsYXJtcyhjb25maWc6IEFsYXJtTGlzdFdpZGdldENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICBjb25zdCByZXN1bHQ6IElSZXN1bHRMaXN0PElBbGFybT4gPSBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS5saXN0KFxuICAgICAgICB0aGlzLmFsYXJtTGlzdFdpZGdldFNlcnZpY2UubWFwQ29uZmlnVG9RdWVyeUZpbHRlcihjb25maWcsIERFRkFVTFRfUEFHRV9TSVpFKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5hbGFybXMkLm5leHQocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlRm9ybSgpO1xuICAgIHRoaXMuZm9ybS5mb3JtLmFkZENvbnRyb2woJ2NvbmZpZycsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemVUeXBlcyh0aGlzLmNvbmZpZy50eXBlcyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgc3RhdHVzOiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKERFRkFVTFRfU1RBVFVTX1ZBTFVFUywge1xuICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLm1pblNlbGVjdGVkQ2hlY2tib3hlcygxKVxuICAgICAgfSksXG4gICAgICBzaG93QWxhcm1zRm9yQ2hpbGRyZW46IHRydWUsXG4gICAgICB0eXBlczogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSksXG4gICAgICBzZXZlcml0aWVzOiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKERFRkFVTFRfU0VWRVJJVFlfVkFMVUVTLCB7XG4gICAgICAgIHZhbGlkYXRvcnM6IHRoaXMubWluU2VsZWN0ZWRDaGVja2JveGVzKDEpXG4gICAgICB9KSxcbiAgICAgIG9yZGVyOiBBTEFSTV9PUkRFUl9WQUxVRVMuQllfQUNUSVZFIGFzIEFsYXJtT3JkZXJUeXBlLFxuICAgICAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IFt0cnVlXSxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbDogIXRoaXMuY29uZmlnLmlzUmVhbHRpbWVcbiAgICAgICAgPyBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuYWxhcm1zVmlld1NlcnZpY2UuREVGQVVMVF9JTlRFUlZBTF9WQUxVRSxcbiAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzQXV0b3JlZmVyc2hEaXNhYmxlZCgpXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBuZXcgRm9ybUNvbnRyb2wodW5kZWZpbmVkKSxcbiAgICAgIGRldmljZTogdGhpcy5jb25maWcuZGV2aWNlID8gbmV3IEZvcm1Db250cm9sKHRoaXMuY29uZmlnLmRldmljZSkgOiBuZXcgRm9ybUNvbnRyb2wodW5kZWZpbmVkKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0F1dG9yZWZlcnNoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgLyoqVGhpcyBjaGVjayBpcyByZXF1aXJlZCBvbiB3aWRnZXQgY3JlYXRpb24gKi9cbiAgICBpZiAodGhpcy5jb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5jb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIG1pblNlbGVjdGVkQ2hlY2tib3hlcyhtaW4gPSAxKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoZm9ybUdyb3VwOiBGb3JtR3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHRvdGFsU2VsZWN0ZWQgPSBPYmplY3QudmFsdWVzKGZvcm1Hcm91cC5jb250cm9scykucmVkdWNlKFxuICAgICAgICAocHJldiwgbmV4dCkgPT4gKG5leHQudmFsdWUgPyBwcmV2ICsgbmV4dC52YWx1ZSA6IHByZXYpLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdG90YWxTZWxlY3RlZCA+PSBtaW4gPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVHlwZXModHlwZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgdHlwZXNDb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KCd0eXBlcycpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XG4gICAgICAgIHR5cGVzQ29udHJvbC5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh0eXBlKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZXNDb250cm9sLnB1c2godGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFuZCBoYW5kbGVzIHRoZSBmb3JtIGNoYW5nZSBzdWJzY3JpcHRpb24gZm9yIHRoZSBBbGFybSBsaXN0IHByZXZpZXcgYXQgV2lkZ2V0J3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc3Vic2NyaWJlcyB0byBmb3JtIHZhbHVlIGNoYW5nZXMgd2l0aCBhIGRlYm91bmNlIHRpbWUgb2YgNTAwbXMuXG4gICAqIEl0IGNvbXBhcmVzIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBmb3JtIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhlIGNoYW5nZXMgYXJlIHJlbGV2YW50LlxuICAgKiBJZiB0aGUgb25seSBjaGFuZ2UgaXMgaW4gdGhlIGBpc0F1dG9SZWZyZXNoRW5hYmxlZGAgcHJvcGVydHksIHRoZSBjaGFuZ2UgaXMgaWdub3JlZC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUHJldmlld1N1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1DaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5mb3JtR3JvdXAudmFsdWUpLCBwYWlyd2lzZSgpLCBkZWJvdW5jZVRpbWUoNTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtwcmV2aW91c0NvbmZpZywgY3VycmVudENvbmZpZ106IFt1bmtub3duLCB1bmtub3duXSkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlZFByZXZpb3VzQ29uZmlnOiBBbGFybUxpc3RXaWRnZXRDb25maWcgPSBwcmV2aW91c0NvbmZpZyBhcyBBbGFybUxpc3RXaWRnZXRDb25maWc7XG4gICAgICAgIGNvbnN0IHR5cGVkQ3VycmVudENvbmZpZzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnID0gY3VycmVudENvbmZpZyBhcyBBbGFybUxpc3RXaWRnZXRDb25maWc7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPbmx5QXV0b1JlZnJlc2hPckludGVydmFsQ2hhbmdlZCh0eXBlZFByZXZpb3VzQ29uZmlnLCB0eXBlZEN1cnJlbnRDb25maWcpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWxhcm1MaXN0V2lkZ2V0U2VydmljZS5hbGxWYWx1ZXNGYWxzZSh0eXBlZEN1cnJlbnRDb25maWcuc2V2ZXJpdGllcykgfHxcbiAgICAgICAgICB0aGlzLmFsYXJtTGlzdFdpZGdldFNlcnZpY2UuYWxsVmFsdWVzRmFsc2UodHlwZWRDdXJyZW50Q29uZmlnLnN0YXR1cylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hbGFybXMkLm5leHQoeyBkYXRhOiBbXSwgcmVzOiBudWxsIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2V0QWxhcm1zKHR5cGVkQ3VycmVudENvbmZpZyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBvbmx5IGNoYW5nZXMgYmV0d2VlbiB0d28gYEFsYXJtTGlzdFdpZGdldENvbmZpZ2Agb2JqZWN0cyBhcmUgaW4gdGhlIGBpc0F1dG9SZWZyZXNoRW5hYmxlZGAgYW5kIGByZWZyZXNoSW50ZXJ2YWxgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNvbXBhcmVzIHR3byBjb25maWd1cmF0aW9ucyBieSBvbWl0dGluZyBgaXNBdXRvUmVmcmVzaEVuYWJsZWRgIGFuZCBgcmVmcmVzaEludGVydmFsYC5cbiAgICogSXQgcmV0dXJucyB0cnVlIGlmIHRoZXNlIGFyZSB0aGUgb25seSBwcm9wZXJ0aWVzIHRoYXQgZGlmZmVyIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IGNvbmZpZ3VyYXRpb25zLlxuICAgKiBOb3RlIHRoYXQgYHJlZnJlc2hJbnRlcnZhbGAgaXMgcmVsZXZhbnQgb25seSB3aGVuIHRoZSByZWZyZXNoIHR5cGUgaXMgc2V0IHRvIGFuIGludGVydmFsLlxuICAgKlxuICAgKiBAcGFyYW0gcHJldmlvdXNDb25maWcgLSBUaGUgcHJldmlvdXMgY29uZmlndXJhdGlvbiBvZiBgQWxhcm1MaXN0V2lkZ2V0Q29uZmlnYC5cbiAgICogQHBhcmFtIGN1cnJlbnRDb25maWcgLSBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGBBbGFybUxpc3RXaWRnZXRDb25maWdgLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRpZmZlcmVuY2VzIGFyZSBjb25maW5lZCB0byBgaXNBdXRvUmVmcmVzaEVuYWJsZWRgIGFuZCBgcmVmcmVzaEludGVydmFsYCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIGlzT25seUF1dG9SZWZyZXNoT3JJbnRlcnZhbENoYW5nZWQoXG4gICAgcHJldmlvdXNDb25maWc6IEFsYXJtTGlzdFdpZGdldENvbmZpZyxcbiAgICBjdXJyZW50Q29uZmlnOiBBbGFybUxpc3RXaWRnZXRDb25maWdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldkNvbmZpZ0NvcHkgPSBvbWl0KHByZXZpb3VzQ29uZmlnLCAnaXNBdXRvUmVmcmVzaEVuYWJsZWQnLCAncmVmcmVzaEludGVydmFsJyk7XG4gICAgY29uc3QgY3VycmVudENvbmZpZ0NvcHkgPSBvbWl0KGN1cnJlbnRDb25maWcsICdpc0F1dG9SZWZyZXNoRW5hYmxlZCcsICdyZWZyZXNoSW50ZXJ2YWwnKTtcblxuICAgIHJldHVybiBpc0VxdWFsKHByZXZDb25maWdDb3B5LCBjdXJyZW50Q29uZmlnQ29weSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJwLWwtMjQgcC1yLTI0XCJcbiAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidhdXRvJ1wiXG4gIFtzdHlsZS5vcGFjaXR5XT1cIjFcIlxuPjwvZGl2PlxuXG48Zm9ybVxuICBjbGFzcz1cInJvd1wiXG4gIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICA8bGVnZW5kPnt7ICdPcmRlcmBvZiBpdGVtcyBvbiBhIGxpc3QsIG5vdW5gJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTBcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IG0tYi04IGEtaS1jZW50ZXJcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBvcmRlciBvZiBvcmRlckxpc3Q7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1yYWRpbyBnYXAtNFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7IEFMQVJNX09SREVSX0xBQkVMU1tvcmRlcl0gfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwib3JkZXJcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmRlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhLXMtY2VudGVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3sgQUxBUk1fT1JERVJfTEFCRUxTW29yZGVyXSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtwb3BvdmVyXT1cIm9yZGVyIHwgc29ydGluZ0Rlc2NyaXB0aW9uUG9wb3Zlck1lc3NhZ2UgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cbiAgICA8ZmllbGRzZXRcbiAgICAgIGNsYXNzPVwiYzh5LWZpZWxkc2V0XCJcbiAgICAgIGZvcm1BcnJheU5hbWU9XCJzZXZlcml0aWVzXCJcbiAgICA+XG4gICAgICA8bGVnZW5kPnt7ICdTZXZlcml0aWVzJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgPGM4eS1mb3JtLWdyb3VwXG4gICAgICAgIFtoYXNFcnJvcl09XCJmb3JtR3JvdXAuY29udHJvbHMuc2V2ZXJpdGllcy5oYXNFcnJvcigncmVxdWlyZWQnKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnbS1iLTgnOiAhZm9ybUdyb3VwLmNvbnRyb2xzLnNldmVyaXRpZXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcbiAgICAgICAgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNldmVyaXR5T3B0aW9uIG9mIHNldmVyaXR5TGlzdFwiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3ggbS10LTAgZ2FwLTRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIlNFVkVSSVRZX0xBQkVMU1tzZXZlcml0eU9wdGlvbl0gfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInNldmVyaXR5T3B0aW9uXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwic2V2ZXJpdHlPcHRpb25cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYS1zLWNlbnRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ7IHJlc3VsdDogc2V2ZXJpdHlPcHRpb24gfCBzZXZlcml0eUljb24gfSBhcyBzZXZlcml0eUljb25cIj5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImEtcy1jZW50ZXIgbS1yLTQgaWNvbi0yMCB7eyBzZXZlcml0eUljb24ucmVzdWx0Lmljb25DbGFzcyB9fVwiXG4gICAgICAgICAgICAgICAgW2M4eUljb25dPVwic2V2ZXJpdHlJY29uLnJlc3VsdC5jOHlJY29uXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgU0VWRVJJVFlfTEFCRUxTW3NldmVyaXR5T3B0aW9uXSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICA8Yzh5LW1lc3NhZ2UgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMuc2V2ZXJpdGllcy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAge3sgJ1NlbGVjdCBhdCBsZWFzdCBvbmUgc2V2ZXJpdHkuJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYzh5LW1lc3NhZ2U+XG4gICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8L2ZpZWxkc2V0PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICA8ZmllbGRzZXRcbiAgICAgIGNsYXNzPVwiYzh5LWZpZWxkc2V0XCJcbiAgICAgIGZvcm1BcnJheU5hbWU9XCJzdGF0dXNcIlxuICAgID5cbiAgICAgIDxsZWdlbmQ+e3sgJ1N0YXR1cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cFxuICAgICAgICBbaGFzRXJyb3JdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLnN0YXR1cy5oYXNFcnJvcigncmVxdWlyZWQnKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnbS1iLTgnOiAhZm9ybUdyb3VwLmNvbnRyb2xzLnN0YXR1cy5oYXNFcnJvcigncmVxdWlyZWQnKVxuICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdHVzT3B0aW9uIG9mIHN0YXR1c0xpc3RcIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IG0tdC0wIGdhcC00XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJTVEFUVVNfTEFCRUxTW3N0YXR1c09wdGlvbl0gfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInN0YXR1c09wdGlvblwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cInN0YXR1c09wdGlvblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhLXMtY2VudGVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLXMtY2VudGVyIG0tbC00IG0tci00IHRleHQtZ3JheS1kYXJrIGM4eS1pY29uIGljb24tMjBcIlxuICAgICAgICAgICAgICBbYzh5SWNvbl09XCJcbiAgICAgICAgICAgICAgICBzdGF0dXNPcHRpb24gPT09IENMRUFSRURfU1RBVFVTX1ZBTFVFXG4gICAgICAgICAgICAgICAgICA/IEM4WV9BTEVSVF9JRExFX0lDT05cbiAgICAgICAgICAgICAgICAgIDogc3RhdHVzT3B0aW9uID09PSBBQ0tOT1dMRURHRV9TVEFUVVNfVkFMVUVcbiAgICAgICAgICAgICAgICAgICAgPyBCRUxMX1NMQVNIX0lDT05cbiAgICAgICAgICAgICAgICAgICAgOiBCRUxMX0lDT05cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyBTVEFUVVNfTEFCRUxTW3N0YXR1c09wdGlvbl0gfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxjOHktbWVzc2FnZXM+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLnN0YXR1cy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAge3sgJ1NlbGVjdCBhdCBsZWFzdCBvbmUgc3RhdHVzLicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2M4eS1tZXNzYWdlPlxuICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cblxuICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldFwiPlxuICAgICAgPGxlZ2VuZD57eyAnQ2hpbGQgZGV2aWNlcycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi04XCI+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIGNsYXNzPVwiYzh5LXN3aXRjaFwiXG4gICAgICAgICAgW3RpdGxlXT1cIidTaG93IGFsYXJtcyBmcm9tIGNoaWxkIGRldmljZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dBbGFybXNGb3JDaGlsZHJlblwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgJ1Nob3cgYWxhcm1zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57eyAnU2hvdyBhbGFybXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8L2ZpZWxkc2V0PlxuXG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICA8bGVnZW5kPnt7ICdUeXBlcycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cFxuICAgICAgICBjbGFzcz1cIm0tYi04XCJcbiAgICAgICAgZm9ybUFycmF5TmFtZT1cInR5cGVzXCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXBcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICdjOHlfQWxhcm0nIH1cIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgbS1sLWF1dG9cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1JlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVR5cGUoaSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHlwZXMuY29udHJvbHM/Lmxlbmd0aCA9PT0gMSAmJiAhdHlwZS52YWx1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJtaW51cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiXG4gICAgICAgICAgICAqbmdJZj1cImkgPT09IHR5cGVzLmNvbnRyb2xzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1wcmltYXJ5IG0tbC1hdXRvXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidBZGQgYWxhcm0gdHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFR5cGUoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cbiAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgIDxsZWdlbmQgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAge3sgcmVmcmVzaFR5cGVUaXRsZSB9fVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbcG9wb3Zlcl09XCJyZWZyZXNoVHlwZVBvcG92ZXJNZXNzYWdlXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICA8L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi04IGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtOCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicmVmcmVzaFRvZ2dsZVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVJlZnJlc2hJbnRlcnZhbHMoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbmZpZy5pc1JlYWx0aW1lXCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLWItMFwiXG4gICAgICAgICAgICAgIGZvcj1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdJbnRlcnZhbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1JlZnJlc2ggaW50ZXJ2YWwgaW4gc2Vjb25kcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIGlkPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJlZnJlc2hJbnRlcnZhbCBvZiBSRUZSRVNIX0lOVEVSVkFMX0lOX01JTExJU0VDT05EU1wiXG4gICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7ICd7eyBzZWNvbmRzIH19IHMnIHwgdHJhbnNsYXRlOiB7IHNlY29uZHM6IHJlZnJlc2hJbnRlcnZhbCAvIDEwMDAgfSB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cbiAgPC9kaXY+XG48L2Zvcm0+XG5cbjxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9jayBtLWItMFwiPnt7ICdQcmV2aWV3YG9mIGFuIGFsYXJtIGxpc3RgJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuPGM4eS1hbGFybXMtbGlzdFxuICBbYWxhcm1zXT1cImFsYXJtcyQgfCBhc3luY1wiXG4gIFtpc0luaXRpYWxMb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtuYXZpZ2F0aW9uT3B0aW9uc109XCJ7XG4gICAgYWxsb3dOYXZpZ2F0aW9uVG9BbGFybXNWaWV3OiBmYWxzZSxcbiAgICBhbHdheXNOYXZpZ2F0ZVRvQWxsQWxhcm1zOiBmYWxzZSxcbiAgICBpbmNsdWRlQ2xlYXJlZFF1ZXJ5UGFyYW1zOiBmYWxzZVxuICB9XCJcbj48L2M4eS1hbGFybXMtbGlzdD5cbiJdfQ==
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2FsYXJtcy9hbGFybS1saXN0LXdpZGdldC1jb25maWcvYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2FsYXJtcy9hbGFybS1saXN0LXdpZGdldC1jb25maWcvYWxhcm0tbGlzdC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLFdBQVcsRUFDWCxXQUFXLEVBRVgsTUFBTSxFQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsWUFBWSxFQUdaLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFlBQVksRUFBZ0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBSWxCLHNCQUFzQixFQUN2QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7Ozs7QUFPaEYsTUFBTSxPQUFPLDhCQUE4QjtJQWlDekMsWUFDVSxzQkFBMEMsRUFDMUMsWUFBMEIsRUFDMUIsaUJBQW9DLEVBQ3BDLFlBQTBCLEVBQzFCLElBQVksRUFDWixXQUF3QixFQUN4QixnQkFBa0M7UUFObEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFvQjtRQUMxQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBckNuQyxxQ0FBZ0MsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUM7UUFDbEYsb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxtQkFBbUIsQ0FBQztRQUVwQyw2QkFBd0IsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO1FBQ3BELHlCQUFvQixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFFM0Msb0JBQWUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7UUFDL0MsY0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztRQUNuQyx3QkFBbUIsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7UUFFbkQsdUJBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDeEMsMkJBQXNCLEdBQUcsc0JBQXNCLENBQUM7UUFFekQsWUFBTyxHQUFnRCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUlqRixjQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRzlDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1Qzs7V0FFRztRQUNILGVBQVUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFZOUUsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUN6RixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLCtFQUErRSxDQUFDLENBQ3pGLENBQUM7UUFFTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFckUsTUFBTSwwQkFBMEIsR0FDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFcEUsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixzQ0FBc0M7WUFDdEMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBOEIsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBOEI7UUFDekMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFdBQVcsR0FBRyxLQUFpQixDQUFDO1lBRXRDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLHNCQUFzQixDQUFDO1FBRXZFLElBQUksQ0FBQyxNQUFNLENBQUMsc0NBQXNDLEdBQUcsZ0JBQWdCLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUYsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFjLENBQUM7SUFDbEQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXdCO1FBQy9DLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQXNCLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxLQUF3QjtRQUN6RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFzQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUE2QjtRQUNuRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixNQUFNLE1BQU0sR0FBd0IsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDOUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUM5RSxDQUFDO1lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDO0lBQy9ELENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO2dCQUNwRCxVQUFVLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQzthQUMxQyxDQUFDO1lBQ0YscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtnQkFDMUQsVUFBVSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7YUFDMUMsQ0FBQztZQUNGLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxTQUEyQjtZQUNyRCxvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQztZQUM1QixlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztvQkFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQjtvQkFDcEQsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtpQkFDdkMsQ0FBQztnQkFDSixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQzdGLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVO1lBQ3pELHNDQUFzQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLHNCQUFzQjtTQUM3RixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLCtDQUErQztRQUMvQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7SUFDM0MsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFnQixDQUFDLFNBQW9CLEVBQUUsRUFBRTtZQUN0RCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQzVELENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3ZELENBQUMsQ0FDRixDQUFDO1lBRUYsT0FBTyxhQUFhLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFELENBQUMsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBZTtRQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWMsQ0FBQztRQUM5RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTthQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BFLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBcUIsRUFBRSxFQUFFO1lBQ2pFLE1BQU0sbUJBQW1CLEdBQTBCLGNBQXVDLENBQUM7WUFDM0YsTUFBTSxrQkFBa0IsR0FBMEIsYUFBc0MsQ0FBQztZQUV6RixJQUFJLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFDRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztnQkFDekUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFDckUsQ0FBQztnQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxrQ0FBa0MsQ0FDeEMsY0FBcUMsRUFDckMsYUFBb0M7UUFFcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXpGLE9BQU8sT0FBTyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxnQ0FBZ0M7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUM7UUFFckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxFLFVBQVU7WUFDUixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEQsQ0FBQzs4R0F6UlUsOEJBQThCO2tHQUE5Qiw4QkFBOEIsdUhDNUMzQyw0eVRBOFJBLG15SERwUGlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzsyRkFFeEQsOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLDhCQUE4QixpQkFFekIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7MlBBRzFELE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdG9yRm5cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUxBUk1fU1RBVFVTX0xBQkVMUyxcbiAgQWxhcm1TdGF0dXMsXG4gIEFsYXJtU2VydmljZSxcbiAgSUFsYXJtLFxuICBJUmVzdWx0TGlzdCxcbiAgU0VWRVJJVFlfTEFCRUxTXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgT25CZWZvcmVTYXZlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBBTEFSTV9TVEFUVVNfSUNPTixcbiAgQWxhcm1zVmlld1NlcnZpY2UsXG4gIERFRkFVTFRfU0VWRVJJVFlfVkFMVUVTLFxuICBERUZBVUxUX1NUQVRVU19WQUxVRVNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9hbGFybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgaXNFcXVhbCwgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBwYWlyd2lzZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQUxBUk1fT1JERVJfTEFCRUxTLFxuICBBTEFSTV9PUkRFUl9WQUxVRVMsXG4gIEFsYXJtTGlzdFdpZGdldENvbmZpZyxcbiAgQWxhcm1PcmRlclR5cGUsXG4gIEFsYXJtTGlzdFJlZnJlc2hPcHRpb24sXG4gIEdMT0JBTF9JTlRFUlZBTF9PUFRJT05cbn0gZnJvbSAnLi4vYWxhcm0tbGlzdC13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgQWxhcm1XaWRnZXRTZXJ2aWNlLCBERUZBVUxUX1BBR0VfU0laRSB9IGZyb20gJy4uL2FsYXJtLXdpZGdldC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFsYXJtLWxpc3Qtd2lkZ2V0LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGFybS1saXN0LXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEFsYXJtTGlzdFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkJlZm9yZVNhdmUsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnO1xuXG4gIHJlYWRvbmx5IFJFRlJFU0hfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gdGhpcy5hbGFybXNWaWV3U2VydmljZS5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFUztcbiAgcmVhZG9ubHkgU0VWRVJJVFlfTEFCRUxTID0gU0VWRVJJVFlfTEFCRUxTO1xuICByZWFkb25seSBTVEFUVVNfTEFCRUxTID0gQUxBUk1fU1RBVFVTX0xBQkVMUztcblxuICByZWFkb25seSBBQ0tOT1dMRURHRV9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRUQ7XG4gIHJlYWRvbmx5IENMRUFSRURfU1RBVFVTX1ZBTFVFID0gQWxhcm1TdGF0dXMuQ0xFQVJFRDtcblxuICByZWFkb25seSBCRUxMX1NMQVNIX0lDT04gPSBBTEFSTV9TVEFUVVNfSUNPTi5CRUxMX1NMQVNIO1xuICByZWFkb25seSBCRUxMX0lDT04gPSBBTEFSTV9TVEFUVVNfSUNPTi5CRUxMO1xuICByZWFkb25seSBDOFlfQUxFUlRfSURMRV9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQUxFUlRfSURMRTtcblxuICByZWFkb25seSBBTEFSTV9PUkRFUl9MQUJFTFMgPSBBTEFSTV9PUkRFUl9MQUJFTFM7XG4gIHJlYWRvbmx5IEdMT0JBTF9JTlRFUlZBTF9PUFRJT04gPSBHTE9CQUxfSU5URVJWQUxfT1BUSU9OO1xuXG4gIGFsYXJtcyQ6IEJlaGF2aW9yU3ViamVjdDxJUmVzdWx0TGlzdDxJQWxhcm0+IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8QWxhcm1MaXN0V2lkZ2V0Q29uZmlnQ29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgb3JkZXJMaXN0ID0gT2JqZWN0LnZhbHVlcyhBTEFSTV9PUkRFUl9WQUxVRVMpO1xuICByZWZyZXNoVHlwZVBvcG92ZXJNZXNzYWdlOiBzdHJpbmc7XG4gIHJlZnJlc2hUeXBlVGl0bGU6IHN0cmluZztcbiAgc2V2ZXJpdHlMaXN0ID0gT2JqZWN0LmtleXMoU0VWRVJJVFlfTEFCRUxTKTtcbiAgcmVmcmVzaE9wdGlvbjogQWxhcm1MaXN0UmVmcmVzaE9wdGlvbjtcbiAgLyoqXG4gICAqIE9yZGVyIGRvZXMgbWF0dGVyLlxuICAgKi9cbiAgc3RhdHVzTGlzdCA9IFtBbGFybVN0YXR1cy5BQ1RJVkUsIEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRCwgQWxhcm1TdGF0dXMuQ0xFQVJFRF07XG5cbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWxhcm1MaXN0V2lkZ2V0U2VydmljZTogQWxhcm1XaWRnZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxhcm1TZXJ2aWNlOiBBbGFybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybXNWaWV3U2VydmljZTogQWxhcm1zVmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVmcmVzaFR5cGVUaXRsZSA9IHRoaXMuY29uZmlnLmlzUmVhbHRpbWVcbiAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnUmVhbHRpbWUnKSlcbiAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQXV0byByZWZyZXNoJykpO1xuXG4gICAgdGhpcy5yZWZyZXNoVHlwZVBvcG92ZXJNZXNzYWdlID0gdGhpcy5jb25maWcuaXNSZWFsdGltZVxuICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdDaGFuZ2UgdGhlIGRlZmF1bHQgc3RhdGUgb2YgcmVhbHRpbWUgcmVmcmVzaC4nKSlcbiAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dCgnQ2hhbmdlIHRoZSBzdGF0ZSBvZiBpbnRlcnZhbCBhdXRvbWF0aWMgcmVmcmVzaCBhbmQgc2V0IHRoZSByZWZyZXNoIGZyZXF1ZW5jeS4nKVxuICAgICAgICApO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc1JlYWx0aW1lKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ0Jhc2VkT25SZWZyZXNoT3B0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmlzUmVhbHRpbWUgPSAhdGhpcy5hbGFybXNWaWV3U2VydmljZS5pc0ludGVydmFsUmVmcmVzaCgpO1xuXG4gICAgY29uc3QgaXNXaWRnZXRXaXRoRXhpc3RpbmdDb25maWcgPVxuICAgICAgdGhpcy5jb25maWcub3JkZXIgJiYgdGhpcy5jb25maWcuc2V2ZXJpdGllcyAmJiB0aGlzLmNvbmZpZy5zdGF0dXM7XG5cbiAgICBpZiAoaXNXaWRnZXRXaXRoRXhpc3RpbmdDb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QWxhcm1zKHRoaXMuY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoqIFVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB3aWRnZXQgKi9cbiAgICAgIGF3YWl0IHRoaXMuZ2V0QWxhcm1zKHRoaXMuZm9ybUdyb3VwLnZhbHVlIGFzIEFsYXJtTGlzdFdpZGdldENvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlUHJldmlld1N1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cCAmJiBjaGFuZ2VzLmNvbmZpZykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdkZXZpY2UnKS5wYXRjaFZhbHVlKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZShjb25maWc/OiBBbGFybUxpc3RXaWRnZXRDb25maWcpOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHlwZXMgfSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlO1xuICAgIGlmICh0eXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBzdHJpbmdUeXBlcyA9IHR5cGVzIGFzIHN0cmluZ1tdO1xuXG4gICAgICBpZiAodGhpcy5pc0NvbnRhaW5pbmdPbmx5RW1wdHlUeXBlcyhzdHJpbmdUeXBlcykpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUudHlwZXMgPSBbJyddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUudHlwZXMgPSB0aGlzLmZpbHRlckVtcHR5VHlwZXMoc3RyaW5nVHlwZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgb25seSB0byBjb252ZXJ0ZWQgbGVnYWN5IEFsYXJtIGxpc3Qgd2lkZ2V0XG4gICAgICovXG4gICAgaWYgKGNvbmZpZ1snb3B0aW9ucyddKSB7XG4gICAgICBkZWxldGUgY29uZmlnWydvcHRpb25zJ107XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlbW92ZVR5cGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGVzLmNvbnRyb2xzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCd0eXBlcycpLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHlwZXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUoKTogdm9pZCB7XG4gICAgdGhpcy50eXBlcy5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJykpO1xuICB9XG5cbiAgdXBkYXRlUmVmcmVzaE9wdGlvbigpIHtcbiAgICB0aGlzLmNvbmZpZy5yZWZyZXNoT3B0aW9uID0gdGhpcy5yZWZyZXNoT3B0aW9uO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnJlZnJlc2hPcHRpb24uc2V0VmFsdWUodGhpcy5yZWZyZXNoT3B0aW9uKTtcbiAgICBjb25zdCBpc0dsb2JhbEludGVydmFsID0gdGhpcy5yZWZyZXNoT3B0aW9uID09PSBHTE9CQUxfSU5URVJWQUxfT1BUSU9OO1xuXG4gICAgdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQgPSBpc0dsb2JhbEludGVydmFsO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0LnNldFZhbHVlKGlzR2xvYmFsSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy51cGRhdGVDb25maWdCYXNlZE9uUmVmcmVzaE9wdGlvbigpO1xuICB9XG5cbiAgZ2V0IHR5cGVzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgndHlwZXMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckVtcHR5VHlwZXModHlwZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0eXBlcy5maWx0ZXIoKGVsZW1lbnQ6IHN0cmluZyB8IG51bGwpID0+IGVsZW1lbnQgIT09ICcnICYmIGVsZW1lbnQgIT09IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbnRhaW5pbmdPbmx5RW1wdHlUeXBlcyh0eXBlczogKHN0cmluZyB8IG51bGwpW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZXMuZXZlcnkoKGVsZW1lbnQ6IHN0cmluZyB8IG51bGwpID0+IGVsZW1lbnQgPT09ICcnIHx8IGVsZW1lbnQgPT09IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBbGFybXMoY29uZmlnOiBBbGFybUxpc3RXaWRnZXRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0OiBJUmVzdWx0TGlzdDxJQWxhcm0+ID0gYXdhaXQgdGhpcy5hbGFybVNlcnZpY2UubGlzdChcbiAgICAgICAgdGhpcy5hbGFybUxpc3RXaWRnZXRTZXJ2aWNlLm1hcENvbmZpZ1RvUXVlcnlGaWx0ZXIoY29uZmlnLCBERUZBVUxUX1BBR0VfU0laRSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWxhcm1zJC5uZXh0KHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB0aGlzLmZvcm0uZm9ybS5hZGRDb250cm9sKCdjb25maWcnLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5pbml0aWFsaXplVHlwZXModGhpcy5jb25maWcudHlwZXMpO1xuICAgIHRoaXMucmVmcmVzaE9wdGlvbiA9IHRoaXMuY29uZmlnLnJlZnJlc2hPcHRpb24gPz8gJ2ludGVydmFsJztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBzdGF0dXM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoREVGQVVMVF9TVEFUVVNfVkFMVUVTLCB7XG4gICAgICAgIHZhbGlkYXRvcnM6IHRoaXMubWluU2VsZWN0ZWRDaGVja2JveGVzKDEpXG4gICAgICB9KSxcbiAgICAgIHNob3dBbGFybXNGb3JDaGlsZHJlbjogdHJ1ZSxcbiAgICAgIHR5cGVzOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcbiAgICAgIHNldmVyaXRpZXM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoREVGQVVMVF9TRVZFUklUWV9WQUxVRVMsIHtcbiAgICAgICAgdmFsaWRhdG9yczogdGhpcy5taW5TZWxlY3RlZENoZWNrYm94ZXMoMSlcbiAgICAgIH0pLFxuICAgICAgb3JkZXI6IEFMQVJNX09SREVSX1ZBTFVFUy5CWV9BQ1RJVkUgYXMgQWxhcm1PcmRlclR5cGUsXG4gICAgICBpc0F1dG9SZWZyZXNoRW5hYmxlZDogW3RydWVdLFxuICAgICAgcmVmcmVzaEludGVydmFsOiAhdGhpcy5jb25maWcuaXNSZWFsdGltZVxuICAgICAgICA/IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5hbGFybXNWaWV3U2VydmljZS5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNBdXRvcmVmZXJzaERpc2FibGVkKClcbiAgICAgICAgICB9KVxuICAgICAgICA6IG5ldyBGb3JtQ29udHJvbCh1bmRlZmluZWQpLFxuICAgICAgZGV2aWNlOiB0aGlzLmNvbmZpZy5kZXZpY2UgPyBuZXcgRm9ybUNvbnRyb2wodGhpcy5jb25maWcuZGV2aWNlKSA6IG5ldyBGb3JtQ29udHJvbCh1bmRlZmluZWQpLFxuICAgICAgcmVmcmVzaE9wdGlvbjogdGhpcy5jb25maWcuaXNSZWFsdGltZSA/IG51bGwgOiAnaW50ZXJ2YWwnLFxuICAgICAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQ6IHRoaXMuY29uZmlnLnJlZnJlc2hPcHRpb24gPT09IEdMT0JBTF9JTlRFUlZBTF9PUFRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBdXRvcmVmZXJzaERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIC8qKlRoaXMgY2hlY2sgaXMgcmVxdWlyZWQgb24gd2lkZ2V0IGNyZWF0aW9uICovXG4gICAgaWYgKHRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtaW5TZWxlY3RlZENoZWNrYm94ZXMobWluID0gMSk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGZvcm1Hcm91cDogRm9ybUdyb3VwKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFNlbGVjdGVkID0gT2JqZWN0LnZhbHVlcyhmb3JtR3JvdXAuY29udHJvbHMpLnJlZHVjZShcbiAgICAgICAgKHByZXYsIG5leHQpID0+IChuZXh0LnZhbHVlID8gcHJldiArIG5leHQudmFsdWUgOiBwcmV2KSxcbiAgICAgICAgMFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRvdGFsU2VsZWN0ZWQgPj0gbWluID8gbnVsbCA6IHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVR5cGVzKHR5cGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHR5cGVzQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldCgndHlwZXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICB0eXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICAgICB0eXBlc0NvbnRyb2wucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodHlwZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVzQ29udHJvbC5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbmQgaGFuZGxlcyB0aGUgZm9ybSBjaGFuZ2Ugc3Vic2NyaXB0aW9uIGZvciB0aGUgQWxhcm0gbGlzdCBwcmV2aWV3IGF0IFdpZGdldCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHN1YnNjcmliZXMgdG8gZm9ybSB2YWx1ZSBjaGFuZ2VzIHdpdGggYSBkZWJvdW5jZSB0aW1lIG9mIDUwMG1zLlxuICAgKiBJdCBjb21wYXJlcyB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZm9ybSB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFuZ2VzIGFyZSByZWxldmFudC5cbiAgICogSWYgdGhlIG9ubHkgY2hhbmdlIGlzIGluIHRoZSBgaXNBdXRvUmVmcmVzaEVuYWJsZWRgIHByb3BlcnR5LCB0aGUgY2hhbmdlIGlzIGlnbm9yZWQuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVByZXZpZXdTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuZm9ybUdyb3VwLnZhbHVlKSwgcGFpcndpc2UoKSwgZGVib3VuY2VUaW1lKDUwMCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldmlvdXNDb25maWcsIGN1cnJlbnRDb25maWddOiBbdW5rbm93biwgdW5rbm93bl0pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZWRQcmV2aW91c0NvbmZpZzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnID0gcHJldmlvdXNDb25maWcgYXMgQWxhcm1MaXN0V2lkZ2V0Q29uZmlnO1xuICAgICAgICBjb25zdCB0eXBlZEN1cnJlbnRDb25maWc6IEFsYXJtTGlzdFdpZGdldENvbmZpZyA9IGN1cnJlbnRDb25maWcgYXMgQWxhcm1MaXN0V2lkZ2V0Q29uZmlnO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT25seUF1dG9SZWZyZXNoT3JJbnRlcnZhbENoYW5nZWQodHlwZWRQcmV2aW91c0NvbmZpZywgdHlwZWRDdXJyZW50Q29uZmlnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFsYXJtTGlzdFdpZGdldFNlcnZpY2UuYWxsVmFsdWVzRmFsc2UodHlwZWRDdXJyZW50Q29uZmlnLnNldmVyaXRpZXMpIHx8XG4gICAgICAgICAgdGhpcy5hbGFybUxpc3RXaWRnZXRTZXJ2aWNlLmFsbFZhbHVlc0ZhbHNlKHR5cGVkQ3VycmVudENvbmZpZy5zdGF0dXMpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWxhcm1zJC5uZXh0KHsgZGF0YTogW10sIHJlczogbnVsbCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldEFsYXJtcyh0eXBlZEN1cnJlbnRDb25maWcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgb25seSBjaGFuZ2VzIGJldHdlZW4gdHdvIGBBbGFybUxpc3RXaWRnZXRDb25maWdgIG9iamVjdHMgYXJlIGluIHRoZSBgaXNBdXRvUmVmcmVzaEVuYWJsZWRgIGFuZCBgcmVmcmVzaEludGVydmFsYCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjb21wYXJlcyB0d28gY29uZmlndXJhdGlvbnMgYnkgb21pdHRpbmcgYGlzQXV0b1JlZnJlc2hFbmFibGVkYCBhbmQgYHJlZnJlc2hJbnRlcnZhbGAuXG4gICAqIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGVzZSBhcmUgdGhlIG9ubHkgcHJvcGVydGllcyB0aGF0IGRpZmZlciBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBjb25maWd1cmF0aW9ucy5cbiAgICogTm90ZSB0aGF0IGByZWZyZXNoSW50ZXJ2YWxgIGlzIHJlbGV2YW50IG9ubHkgd2hlbiB0aGUgcmVmcmVzaCB0eXBlIGlzIHNldCB0byBhbiBpbnRlcnZhbC5cbiAgICpcbiAgICogQHBhcmFtIHByZXZpb3VzQ29uZmlnIC0gVGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gb2YgYEFsYXJtTGlzdFdpZGdldENvbmZpZ2AuXG4gICAqIEBwYXJhbSBjdXJyZW50Q29uZmlnIC0gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBgQWxhcm1MaXN0V2lkZ2V0Q29uZmlnYC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkaWZmZXJlbmNlcyBhcmUgY29uZmluZWQgdG8gYGlzQXV0b1JlZnJlc2hFbmFibGVkYCBhbmQgYHJlZnJlc2hJbnRlcnZhbGAsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc09ubHlBdXRvUmVmcmVzaE9ySW50ZXJ2YWxDaGFuZ2VkKFxuICAgIHByZXZpb3VzQ29uZmlnOiBBbGFybUxpc3RXaWRnZXRDb25maWcsXG4gICAgY3VycmVudENvbmZpZzogQWxhcm1MaXN0V2lkZ2V0Q29uZmlnXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZDb25maWdDb3B5ID0gb21pdChwcmV2aW91c0NvbmZpZywgJ2lzQXV0b1JlZnJlc2hFbmFibGVkJywgJ3JlZnJlc2hJbnRlcnZhbCcpO1xuICAgIGNvbnN0IGN1cnJlbnRDb25maWdDb3B5ID0gb21pdChjdXJyZW50Q29uZmlnLCAnaXNBdXRvUmVmcmVzaEVuYWJsZWQnLCAncmVmcmVzaEludGVydmFsJyk7XG5cbiAgICByZXR1cm4gaXNFcXVhbChwcmV2Q29uZmlnQ29weSwgY3VycmVudENvbmZpZ0NvcHkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWdCYXNlZE9uUmVmcmVzaE9wdGlvbigpIHtcbiAgICBjb25zdCBpc0ludGVydmFsID0gdGhpcy5yZWZyZXNoT3B0aW9uID09PSAnaW50ZXJ2YWwnO1xuXG4gICAgdGhpcy5jb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWQgPSBpc0ludGVydmFsO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmlzQXV0b1JlZnJlc2hFbmFibGVkLnNldFZhbHVlKGlzSW50ZXJ2YWwpO1xuXG4gICAgaXNJbnRlcnZhbFxuICAgICAgPyB0aGlzLmZvcm1Hcm91cC5nZXQoJ3JlZnJlc2hJbnRlcnZhbCcpLmVuYWJsZSgpXG4gICAgICA6IHRoaXMuZm9ybUdyb3VwLmdldCgncmVmcmVzaEludGVydmFsJykuZGlzYWJsZSgpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwicC1sLTI0IHAtci0yNFwiXG4gIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInYXV0bydcIlxuICBbc3R5bGUub3BhY2l0eV09XCIxXCJcbj48L2Rpdj5cblxuPGZvcm1cbiAgY2xhc3M9XCJyb3dcIlxuICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldFwiPlxuICAgICAgPGxlZ2VuZD57eyAnT3JkZXJgb2YgaXRlbXMgb24gYSBsaXN0LCBub3VuYCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi0wXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImQtZmxleCBtLWItOCBhLWktY2VudGVyXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgb3JkZXIgb2Ygb3JkZXJMaXN0OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJjOHktcmFkaW8gZ2FwLTRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyBBTEFSTV9PUkRFUl9MQUJFTFNbb3JkZXJdIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9yZGVyXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwib3JkZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYS1zLWNlbnRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPnt7IEFMQVJNX09SREVSX0xBQkVMU1tvcmRlcl0gfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJvcmRlciB8IHNvcnRpbmdEZXNjcmlwdGlvblBvcG92ZXJNZXNzYWdlIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgIDwvZmllbGRzZXQ+XG4gICAgPGZpZWxkc2V0XG4gICAgICBjbGFzcz1cImM4eS1maWVsZHNldFwiXG4gICAgICBmb3JtQXJyYXlOYW1lPVwic2V2ZXJpdGllc1wiXG4gICAgPlxuICAgICAgPGxlZ2VuZD57eyAnU2V2ZXJpdGllcycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgIDxjOHktZm9ybS1ncm91cFxuICAgICAgICBbaGFzRXJyb3JdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLnNldmVyaXRpZXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ20tYi04JzogIWZvcm1Hcm91cC5jb250cm9scy5zZXZlcml0aWVzLmhhc0Vycm9yKCdyZXF1aXJlZCcpXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZXZlcml0eU9wdGlvbiBvZiBzZXZlcml0eUxpc3RcIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IG0tdC0wIGdhcC00XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJTRVZFUklUWV9MQUJFTFNbc2V2ZXJpdHlPcHRpb25dIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJzZXZlcml0eU9wdGlvblwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cInNldmVyaXR5T3B0aW9uXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImEtcy1jZW50ZXJcIj48L3NwYW4+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwieyByZXN1bHQ6IHNldmVyaXR5T3B0aW9uIHwgc2V2ZXJpdHlJY29uIH0gYXMgc2V2ZXJpdHlJY29uXCI+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXMtY2VudGVyIG0tci00IGljb24tMjAge3sgc2V2ZXJpdHlJY29uLnJlc3VsdC5pY29uQ2xhc3MgfX1cIlxuICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cInNldmVyaXR5SWNvbi5yZXN1bHQuYzh5SWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuPnt7IFNFVkVSSVRZX0xBQkVMU1tzZXZlcml0eU9wdGlvbl0gfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxjOHktbWVzc2FnZXM+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLnNldmVyaXRpZXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgIHt7ICdTZWxlY3QgYXQgbGVhc3Qgb25lIHNldmVyaXR5LicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2M4eS1tZXNzYWdlPlxuICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgPGZpZWxkc2V0XG4gICAgICBjbGFzcz1cImM4eS1maWVsZHNldFwiXG4gICAgICBmb3JtQXJyYXlOYW1lPVwic3RhdHVzXCJcbiAgICA+XG4gICAgICA8bGVnZW5kPnt7ICdTdGF0dXMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgW2hhc0Vycm9yXT1cImZvcm1Hcm91cC5jb250cm9scy5zdGF0dXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ20tYi04JzogIWZvcm1Hcm91cC5jb250cm9scy5zdGF0dXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcbiAgICAgICAgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXR1c09wdGlvbiBvZiBzdGF0dXNMaXN0XCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveCBtLXQtMCBnYXAtNFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiU1RBVFVTX0xBQkVMU1tzdGF0dXNPcHRpb25dIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJzdGF0dXNPcHRpb25cIlxuICAgICAgICAgICAgICBbbmFtZV09XCJzdGF0dXNPcHRpb25cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYS1zLWNlbnRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1zLWNlbnRlciBtLWwtNCBtLXItNCB0ZXh0LWdyYXktZGFyayBjOHktaWNvbiBpY29uLTIwXCJcbiAgICAgICAgICAgICAgW2M4eUljb25dPVwiXG4gICAgICAgICAgICAgICAgc3RhdHVzT3B0aW9uID09PSBDTEVBUkVEX1NUQVRVU19WQUxVRVxuICAgICAgICAgICAgICAgICAgPyBDOFlfQUxFUlRfSURMRV9JQ09OXG4gICAgICAgICAgICAgICAgICA6IHN0YXR1c09wdGlvbiA9PT0gQUNLTk9XTEVER0VfU1RBVFVTX1ZBTFVFXG4gICAgICAgICAgICAgICAgICAgID8gQkVMTF9TTEFTSF9JQ09OXG4gICAgICAgICAgICAgICAgICAgIDogQkVMTF9JQ09OXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgU1RBVFVTX0xBQkVMU1tzdGF0dXNPcHRpb25dIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8Yzh5LW1lc3NhZ2VzPlxuICAgICAgICAgIDxjOHktbWVzc2FnZSAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5zdGF0dXMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgIHt7ICdTZWxlY3QgYXQgbGVhc3Qgb25lIHN0YXR1cy4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9jOHktbWVzc2FnZT5cbiAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgIDwvZmllbGRzZXQ+XG5cbiAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgIDxsZWdlbmQ+e3sgJ0NoaWxkIGRldmljZXMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItOFwiPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cImM4eS1zd2l0Y2hcIlxuICAgICAgICAgIFt0aXRsZV09XCInU2hvdyBhbGFybXMgZnJvbSBjaGlsZCBkZXZpY2VzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93QWxhcm1zRm9yQ2hpbGRyZW5cIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7ICdTaG93IGFsYXJtcycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3sgJ1Nob3cgYWxhcm1zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9maWVsZHNldD5cblxuICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldFwiPlxuICAgICAgPGxlZ2VuZD57eyAnVHlwZXMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJtLWItOFwiXG4gICAgICAgIGZvcm1BcnJheU5hbWU9XCJ0eXBlc1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlcy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInZS5nLiB7eyBleGFtcGxlIH19JyB8IHRyYW5zbGF0ZTogeyBleGFtcGxlOiAnYzh5X0FsYXJtJyB9XCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIG0tbC1hdXRvXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidSZW1vdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVUeXBlKGkpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInR5cGVzLmNvbnRyb2xzPy5sZW5ndGggPT09IDEgJiYgIXR5cGUudmFsdWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibWludXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIlxuICAgICAgICAgICAgKm5nSWY9XCJpID09PSB0eXBlcy5jb250cm9scy5sZW5ndGggLSAxXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tcHJpbWFyeSBtLWwtYXV0b1wiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQWRkIGFsYXJtIHR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRUeXBlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgIDwvZmllbGRzZXQ+XG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICA8bGVnZW5kIGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgIHt7IHJlZnJlc2hUeXBlVGl0bGUgfX1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3BvcG92ZXJdPVwicmVmcmVzaFR5cGVQb3BvdmVyTWVzc2FnZVwiXG4gICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9sZWdlbmQ+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItOCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTggYS1pLWNlbnRlclwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhbHRpbWU+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwicmVmcmVzaFRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57eyAnUmVhbHRpbWUgcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCIhY29uZmlnLmlzUmVhbHRpbWU7IGVsc2UgcmVhbHRpbWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZWZyZXNoIG9wdGlvbnNgb3B0aW9ucyBmb3IgcmVmcmVzaGluZyBhIHZpZXdgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVmcmVzaE9wdGlvblwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlUmVmcmVzaE9wdGlvbigpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICB7eyAnTm8gYXV0b21hdGljIHJlZnJlc2gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidSZWZyZXNoaW5nIGFmdGVyIHRoZSBnaXZlbiBpbnRlcnZhbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwiaW50ZXJ2YWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ1VzZSByZWZyZXNoIGludGVydmFsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciB0aGUgZ2l2ZW4gaW50ZXJ2YWwsIHN5bmNocm9uaXplZCBnbG9iYWxseScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwiZ2xvYmFsLWludGVydmFsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdVc2UgZ2xvYmFsIHJlZnJlc2ggaW50ZXJ2YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCIhY29uZmlnLmlzUmVhbHRpbWUgJiYgY29uZmlnLnJlZnJlc2hPcHRpb24gIT09IEdMT0JBTF9JTlRFUlZBTF9PUFRJT05cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cIm0tYi0wXCJcbiAgICAgICAgICAgICAgZm9yPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0ludGVydmFsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtMTJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaCBpbnRlcnZhbCBpbiBzZWNvbmRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcmVmcmVzaEludGVydmFsIG9mIFJFRlJFU0hfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgJ3t7IHNlY29uZHMgfX0gcycgfCB0cmFuc2xhdGU6IHsgc2Vjb25kczogcmVmcmVzaEludGVydmFsIC8gMTAwMCB9IH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8L2ZpZWxkc2V0PlxuICA8L2Rpdj5cbjwvZm9ybT5cblxuPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIG0tYi0wXCI+e3sgJ1ByZXZpZXdgb2YgYW4gYWxhcm0gbGlzdGAnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG48Yzh5LWFsYXJtcy1saXN0XG4gIFthbGFybXNdPVwiYWxhcm1zJCB8IGFzeW5jXCJcbiAgW2lzSW5pdGlhbExvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgW25hdmlnYXRpb25PcHRpb25zXT1cIntcbiAgICBhbGxvd05hdmlnYXRpb25Ub0FsYXJtc1ZpZXc6IGZhbHNlLFxuICAgIGFsd2F5c05hdmlnYXRlVG9BbGxBbGFybXM6IGZhbHNlLFxuICAgIGluY2x1ZGVDbGVhcmVkUXVlcnlQYXJhbXM6IGZhbHNlLFxuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcbiAgfVwiXG4+PC9jOHktYWxhcm1zLWxpc3Q+XG4iXX0=
|