igniteui-angular 16.0.0-beta.2 → 16.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/accordion/accordion.component.mjs +4 -4
- package/esm2022/lib/accordion/accordion.module.mjs +5 -5
- package/esm2022/lib/action-strip/action-strip.component.mjs +7 -7
- package/esm2022/lib/action-strip/action-strip.module.mjs +5 -5
- package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +4 -4
- package/esm2022/lib/action-strip/grid-actions/grid-actions-base.directive.mjs +4 -4
- package/esm2022/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +4 -4
- package/esm2022/lib/action-strip/grid-actions/grid-pinning-actions.component.mjs +4 -4
- package/esm2022/lib/avatar/avatar.component.mjs +4 -4
- package/esm2022/lib/avatar/avatar.module.mjs +5 -5
- package/esm2022/lib/badge/badge.component.mjs +4 -4
- package/esm2022/lib/badge/badge.module.mjs +5 -5
- package/esm2022/lib/banner/banner.component.mjs +4 -4
- package/esm2022/lib/banner/banner.directives.mjs +4 -4
- package/esm2022/lib/banner/banner.module.mjs +5 -5
- package/esm2022/lib/buttonGroup/buttonGroup.component.mjs +4 -4
- package/esm2022/lib/buttonGroup/buttongroup.module.mjs +5 -5
- package/esm2022/lib/calendar/calendar-base.mjs +4 -4
- package/esm2022/lib/calendar/calendar.component.mjs +4 -4
- package/esm2022/lib/calendar/calendar.directives.mjs +16 -16
- package/esm2022/lib/calendar/calendar.module.mjs +5 -5
- package/esm2022/lib/calendar/days-view/day-item.component.mjs +4 -4
- package/esm2022/lib/calendar/days-view/days-view.component.mjs +4 -4
- package/esm2022/lib/calendar/days-view/daysview-navigation.service.mjs +4 -4
- package/esm2022/lib/calendar/month-picker/month-picker-base.mjs +4 -4
- package/esm2022/lib/calendar/month-picker/month-picker.component.mjs +4 -4
- package/esm2022/lib/calendar/months-view/months-view.component.mjs +4 -4
- package/esm2022/lib/calendar/months-view.pipe.mjs +7 -7
- package/esm2022/lib/calendar/years-view/years-view.component.mjs +7 -7
- package/esm2022/lib/card/card.component.mjs +28 -28
- package/esm2022/lib/card/card.module.mjs +5 -5
- package/esm2022/lib/carousel/carousel.component.mjs +7 -7
- package/esm2022/lib/carousel/carousel.directives.mjs +10 -10
- package/esm2022/lib/carousel/carousel.module.mjs +5 -5
- package/esm2022/lib/carousel/slide.component.mjs +4 -4
- package/esm2022/lib/checkbox/checkbox.component.mjs +4 -4
- package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
- package/esm2022/lib/chips/chip.component.mjs +4 -4
- package/esm2022/lib/chips/chips-area.component.mjs +4 -4
- package/esm2022/lib/chips/chips.module.mjs +5 -5
- package/esm2022/lib/combo/combo-add-item.component.mjs +4 -4
- package/esm2022/lib/combo/combo-dropdown.component.mjs +4 -4
- package/esm2022/lib/combo/combo-item.component.mjs +4 -4
- package/esm2022/lib/combo/combo.api.mjs +4 -4
- package/esm2022/lib/combo/combo.common.mjs +4 -4
- package/esm2022/lib/combo/combo.component.mjs +4 -4
- package/esm2022/lib/combo/combo.directives.mjs +25 -25
- package/esm2022/lib/combo/combo.module.mjs +5 -5
- package/esm2022/lib/combo/combo.pipes.mjs +7 -7
- package/esm2022/lib/core/density.mjs +4 -4
- package/esm2022/lib/core/navigation/directives.mjs +7 -7
- package/esm2022/lib/core/navigation/nav.service.mjs +4 -4
- package/esm2022/lib/core/selection.mjs +4 -4
- package/esm2022/lib/core/touch.mjs +4 -4
- package/esm2022/lib/core/utils.mjs +4 -4
- package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +4 -4
- package/esm2022/lib/date-common/picker-base.directive.mjs +4 -4
- package/esm2022/lib/date-common/picker-icons.common.mjs +10 -10
- package/esm2022/lib/date-picker/date-picker.component.mjs +4 -4
- package/esm2022/lib/date-picker/date-picker.module.mjs +5 -5
- package/esm2022/lib/date-range-picker/date-range-picker-inputs.common.mjs +16 -16
- package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +4 -4
- package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +5 -5
- package/esm2022/lib/dialog/dialog.component.mjs +4 -4
- package/esm2022/lib/dialog/dialog.directives.mjs +7 -7
- package/esm2022/lib/dialog/dialog.module.mjs +5 -5
- package/esm2022/lib/directives/autocomplete/autocomplete.directive.mjs +4 -4
- package/esm2022/lib/directives/autocomplete/autocomplete.module.mjs +5 -5
- package/esm2022/lib/directives/button/button.directive.mjs +4 -4
- package/esm2022/lib/directives/button/button.module.mjs +5 -5
- package/esm2022/lib/directives/date-time-editor/date-time-editor.directive.mjs +4 -4
- package/esm2022/lib/directives/date-time-editor/date-time-editor.module.mjs +5 -5
- package/esm2022/lib/directives/divider/divider.directive.mjs +4 -4
- package/esm2022/lib/directives/divider/divider.module.mjs +5 -5
- package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +13 -13
- package/esm2022/lib/directives/drag-drop/drag-drop.module.mjs +5 -5
- package/esm2022/lib/directives/filter/filter.directive.mjs +7 -7
- package/esm2022/lib/directives/filter/filter.module.mjs +5 -5
- package/esm2022/lib/directives/focus/focus.directive.mjs +4 -4
- package/esm2022/lib/directives/focus/focus.module.mjs +5 -5
- package/esm2022/lib/directives/focus-trap/focus-trap.directive.mjs +4 -4
- package/esm2022/lib/directives/focus-trap/focus-trap.module.mjs +5 -5
- package/esm2022/lib/directives/for-of/base.helper.component.mjs +4 -4
- package/esm2022/lib/directives/for-of/display.container.mjs +4 -4
- package/esm2022/lib/directives/for-of/for_of.directive.mjs +7 -7
- package/esm2022/lib/directives/for-of/for_of.module.mjs +5 -5
- package/esm2022/lib/directives/for-of/for_of.sync.service.mjs +7 -7
- package/esm2022/lib/directives/for-of/horizontal.virtual.helper.component.mjs +4 -4
- package/esm2022/lib/directives/for-of/virtual.helper.component.mjs +4 -4
- package/esm2022/lib/directives/form-control/form-control.directive.mjs +4 -4
- package/esm2022/lib/directives/form-control/form-control.module.mjs +5 -5
- package/esm2022/lib/directives/hint/hint.directive.mjs +4 -4
- package/esm2022/lib/directives/input/input.directive.mjs +4 -4
- package/esm2022/lib/directives/label/label.directive.mjs +4 -4
- package/esm2022/lib/directives/layout/layout.directive.mjs +7 -7
- package/esm2022/lib/directives/layout/layout.module.mjs +5 -5
- package/esm2022/lib/directives/mask/mask-parsing.service.mjs +4 -4
- package/esm2022/lib/directives/mask/mask.directive.mjs +4 -4
- package/esm2022/lib/directives/mask/mask.module.mjs +5 -5
- package/esm2022/lib/directives/notification/notifications.directive.mjs +4 -4
- package/esm2022/lib/directives/prefix/prefix.directive.mjs +4 -4
- package/esm2022/lib/directives/radio/radio-group.directive.mjs +4 -4
- package/esm2022/lib/directives/radio/radio-group.module.mjs +5 -5
- package/esm2022/lib/directives/ripple/ripple.directive.mjs +4 -4
- package/esm2022/lib/directives/ripple/ripple.module.mjs +5 -5
- package/esm2022/lib/directives/scroll-inertia/scroll_inertia.directive.mjs +4 -4
- package/esm2022/lib/directives/scroll-inertia/scroll_inertia.module.mjs +5 -5
- package/esm2022/lib/directives/suffix/suffix.directive.mjs +4 -4
- package/esm2022/lib/directives/template-outlet/template_outlet.directive.mjs +4 -4
- package/esm2022/lib/directives/text-highlight/text-highlight.directive.mjs +4 -4
- package/esm2022/lib/directives/text-highlight/text-highlight.module.mjs +5 -5
- package/esm2022/lib/directives/text-selection/text-selection.directive.mjs +4 -4
- package/esm2022/lib/directives/text-selection/text-selection.module.mjs +5 -5
- package/esm2022/lib/directives/toggle/toggle.directive.mjs +10 -10
- package/esm2022/lib/directives/toggle/toggle.module.mjs +5 -5
- package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +4 -4
- package/esm2022/lib/directives/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +4 -4
- package/esm2022/lib/directives/tooltip/tooltip.module.mjs +5 -5
- package/esm2022/lib/drop-down/drop-down-group.component.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down-item.base.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down-item.component.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down-navigation.directive.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down.base.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down.component.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down.module.mjs +5 -5
- package/esm2022/lib/expansion-panel/expansion-panel-body.component.mjs +4 -4
- package/esm2022/lib/expansion-panel/expansion-panel-header.component.mjs +4 -4
- package/esm2022/lib/expansion-panel/expansion-panel.common.mjs +4 -4
- package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +4 -4
- package/esm2022/lib/expansion-panel/expansion-panel.directives.mjs +10 -10
- package/esm2022/lib/expansion-panel/expansion-panel.module.mjs +5 -5
- package/esm2022/lib/expansion-panel/toggle-animation-component.mjs +4 -4
- package/esm2022/lib/grids/api.service.mjs +4 -4
- package/esm2022/lib/grids/cell.component.mjs +4 -4
- package/esm2022/lib/grids/column-actions/column-actions-base.directive.mjs +4 -4
- package/esm2022/lib/grids/column-actions/column-actions.component.mjs +13 -13
- package/esm2022/lib/grids/column-actions/column-hiding.directive.mjs +4 -4
- package/esm2022/lib/grids/column-actions/column-pinning.directive.mjs +4 -4
- package/esm2022/lib/grids/column-actions/public_api.mjs +13 -0
- package/esm2022/lib/grids/columns/column-group.component.mjs +4 -4
- package/esm2022/lib/grids/columns/column-layout.component.mjs +4 -4
- package/esm2022/lib/grids/columns/column.component.mjs +4 -4
- package/esm2022/lib/grids/columns/templates.directive.mjs +25 -25
- package/esm2022/lib/grids/columns/validators.directive.mjs +22 -22
- package/esm2022/lib/grids/common/crud.service.mjs +4 -4
- package/esm2022/lib/grids/common/pipes.mjs +55 -55
- package/esm2022/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/base-filtering.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-clear-filters.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +10 -10
- package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-hiding.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-pinning.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +7 -7
- package/esm2022/lib/grids/filtering/excel-style/excel-style-selecting.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +4 -4
- package/esm2022/lib/grids/filtering/grid-filtering.service.mjs +4 -4
- package/esm2022/lib/grids/grid/expandable-cell.component.mjs +4 -4
- package/esm2022/lib/grids/grid/grid-api.service.mjs +4 -4
- package/esm2022/lib/grids/grid/grid-row.component.mjs +4 -4
- package/esm2022/lib/grids/grid/grid-validation.service.mjs +4 -4
- package/esm2022/lib/grids/grid/grid.component.mjs +4 -4
- package/esm2022/lib/grids/grid/grid.details.pipe.mjs +4 -4
- package/esm2022/lib/grids/grid/grid.directives.mjs +34 -34
- package/esm2022/lib/grids/grid/grid.module.mjs +27 -24
- package/esm2022/lib/grids/grid/grid.pipes.mjs +13 -13
- package/esm2022/lib/grids/grid/grid.summary.pipe.mjs +4 -4
- package/esm2022/lib/grids/grid/groupby-row.component.mjs +4 -4
- package/esm2022/lib/grids/grid-base.directive.mjs +4 -4
- package/esm2022/lib/grids/grid-footer/grid-footer.component.mjs +4 -4
- package/esm2022/lib/grids/grid-mrl-navigation.service.mjs +4 -4
- package/esm2022/lib/grids/grid-navigation.service.mjs +4 -4
- package/esm2022/lib/grids/grid.common.mjs +4 -4
- package/esm2022/lib/grids/grid.rowEdit.directive.mjs +16 -16
- package/esm2022/lib/grids/grouping/grid-group-by-area.component.mjs +4 -4
- package/esm2022/lib/grids/grouping/group-by-area.directive.mjs +7 -7
- package/esm2022/lib/grids/grouping/tree-grid-group-by-area.component.mjs +4 -4
- package/esm2022/lib/grids/headers/grid-header-group.component.mjs +4 -4
- package/esm2022/lib/grids/headers/grid-header-row.component.mjs +4 -4
- package/esm2022/lib/grids/headers/grid-header.component.mjs +4 -4
- package/esm2022/lib/grids/headers/pipes.mjs +10 -10
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-cell.component.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-api.service.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-base.directive.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-navigation.service.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +7 -7
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.module.mjs +27 -24
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.pipes.mjs +7 -7
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-row.component.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/row-island-api.service.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/row-island.component.mjs +4 -4
- package/esm2022/lib/grids/moving/moving.drag.directive.mjs +4 -4
- package/esm2022/lib/grids/moving/moving.drop.directive.mjs +4 -4
- package/esm2022/lib/grids/moving/moving.service.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-filtering.service.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-grid-navigation.service.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-grid.directives.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-grid.module.mjs +27 -24
- package/esm2022/lib/grids/pivot-grid/pivot-grid.pipes.mjs +31 -31
- package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header.component.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-row.component.mjs +4 -4
- package/esm2022/lib/grids/public_api.mjs +5 -2
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resize-handle.directive.mjs +4 -4
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizer.component.mjs +4 -4
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizing.service.mjs +4 -4
- package/esm2022/lib/grids/resizing/resize-handle.directive.mjs +4 -4
- package/esm2022/lib/grids/resizing/resizer.component.mjs +4 -4
- package/esm2022/lib/grids/resizing/resizer.directive.mjs +4 -4
- package/esm2022/lib/grids/resizing/resizing.service.mjs +4 -4
- package/esm2022/lib/grids/row-drag.directive.mjs +10 -10
- package/esm2022/lib/grids/row.directive.mjs +4 -4
- package/esm2022/lib/grids/selection/drag-select.directive.mjs +4 -4
- package/esm2022/lib/grids/selection/row-selectors.mjs +10 -10
- package/esm2022/lib/grids/selection/selection.service.mjs +4 -4
- package/esm2022/lib/grids/state.directive.mjs +4 -4
- package/esm2022/lib/grids/summaries/grid-root-summary.pipe.mjs +4 -4
- package/esm2022/lib/grids/summaries/grid-summary.service.mjs +4 -4
- package/esm2022/lib/grids/summaries/summary-cell.component.mjs +4 -4
- package/esm2022/lib/grids/summaries/summary-row.component.mjs +4 -4
- package/esm2022/lib/grids/toolbar/common.mjs +16 -16
- package/esm2022/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.mjs +4 -4
- package/esm2022/lib/grids/toolbar/grid-toolbar-exporter.component.mjs +4 -4
- package/esm2022/lib/grids/toolbar/grid-toolbar-hiding.component.mjs +4 -4
- package/esm2022/lib/grids/toolbar/grid-toolbar-pinning.component.mjs +4 -4
- package/esm2022/lib/grids/toolbar/grid-toolbar.base.mjs +7 -7
- package/esm2022/lib/grids/toolbar/grid-toolbar.component.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/public_api.mjs +4 -1
- package/esm2022/lib/grids/tree-grid/tree-cell.component.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid-api.service.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid-row.component.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid-selection.service.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.directives.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.filtering.pipe.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.grouping.pipe.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.module.mjs +43 -39
- package/esm2022/lib/grids/tree-grid/tree-grid.pipes.mjs +22 -22
- package/esm2022/lib/grids/tree-grid/tree-grid.summary.pipe.mjs +4 -4
- package/esm2022/lib/icon/icon.component.mjs +4 -4
- package/esm2022/lib/icon/icon.module.mjs +5 -5
- package/esm2022/lib/icon/icon.service.mjs +4 -4
- package/esm2022/lib/input-group/input-group.component.mjs +4 -4
- package/esm2022/lib/input-group/input-group.module.mjs +5 -5
- package/esm2022/lib/list/list-item.component.mjs +4 -4
- package/esm2022/lib/list/list.common.mjs +16 -16
- package/esm2022/lib/list/list.component.mjs +19 -19
- package/esm2022/lib/list/list.module.mjs +5 -5
- package/esm2022/lib/navbar/navbar.component.mjs +10 -10
- package/esm2022/lib/navbar/navbar.module.mjs +5 -5
- package/esm2022/lib/navigation-drawer/navigation-drawer.component.mjs +4 -4
- package/esm2022/lib/navigation-drawer/navigation-drawer.directives.mjs +10 -10
- package/esm2022/lib/navigation-drawer/navigation-drawer.module.mjs +5 -5
- package/esm2022/lib/paginator/paginator-interfaces.mjs +4 -4
- package/esm2022/lib/paginator/paginator.component.mjs +13 -13
- package/esm2022/lib/paginator/paginator.module.mjs +5 -5
- package/esm2022/lib/progressbar/progressbar.common.mjs +7 -7
- package/esm2022/lib/progressbar/progressbar.component.mjs +10 -10
- package/esm2022/lib/progressbar/progressbar.module.mjs +5 -5
- package/esm2022/lib/query-builder/query-builder-header.component.mjs +4 -4
- package/esm2022/lib/query-builder/query-builder.component.mjs +7 -7
- package/esm2022/lib/query-builder/query-builder.module.mjs +5 -5
- package/esm2022/lib/radio/radio.component.mjs +4 -4
- package/esm2022/lib/select/select-group.component.mjs +4 -4
- package/esm2022/lib/select/select-item.component.mjs +4 -4
- package/esm2022/lib/select/select-navigation.directive.mjs +4 -4
- package/esm2022/lib/select/select.component.mjs +13 -13
- package/esm2022/lib/select/select.module.mjs +5 -5
- package/esm2022/lib/services/animation/angular-animation-service.mjs +4 -4
- package/esm2022/lib/services/csv/csv-exporter.mjs +4 -4
- package/esm2022/lib/services/direction/directionality.mjs +4 -4
- package/esm2022/lib/services/excel/excel-exporter.mjs +4 -4
- package/esm2022/lib/services/overlay/overlay.mjs +4 -4
- package/esm2022/lib/services/transaction/transaction-factory.service.mjs +7 -7
- package/esm2022/lib/simple-combo/simple-combo.component.mjs +4 -4
- package/esm2022/lib/simple-combo/simple-combo.module.mjs +5 -5
- package/esm2022/lib/slider/label/thumb-label.component.mjs +4 -4
- package/esm2022/lib/slider/slider.common.mjs +10 -10
- package/esm2022/lib/slider/slider.component.mjs +4 -4
- package/esm2022/lib/slider/slider.module.mjs +5 -5
- package/esm2022/lib/slider/thumb/thumb-slider.component.mjs +4 -4
- package/esm2022/lib/slider/ticks/tick.pipe.mjs +4 -4
- package/esm2022/lib/slider/ticks/ticks.component.mjs +4 -4
- package/esm2022/lib/snackbar/snackbar.component.mjs +4 -4
- package/esm2022/lib/snackbar/snackbar.module.mjs +5 -5
- package/esm2022/lib/splitter/splitter-pane/splitter-pane.component.mjs +4 -4
- package/esm2022/lib/splitter/splitter.component.mjs +7 -7
- package/esm2022/lib/splitter/splitter.module.mjs +5 -5
- package/esm2022/lib/stepper/step/step.component.mjs +4 -4
- package/esm2022/lib/stepper/stepper.component.mjs +4 -4
- package/esm2022/lib/stepper/stepper.directive.mjs +22 -22
- package/esm2022/lib/stepper/stepper.module.mjs +5 -5
- package/esm2022/lib/stepper/stepper.service.mjs +4 -4
- package/esm2022/lib/switch/switch.component.mjs +4 -4
- package/esm2022/lib/switch/switch.module.mjs +5 -5
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-content.component.mjs +4 -4
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-header.component.mjs +4 -4
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-item.component.mjs +4 -4
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.component.mjs +4 -4
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.directives.mjs +7 -7
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.module.mjs +5 -5
- package/esm2022/lib/tabs/tab-content.directive.mjs +4 -4
- package/esm2022/lib/tabs/tab-header.directive.mjs +4 -4
- package/esm2022/lib/tabs/tab-item.directive.mjs +4 -4
- package/esm2022/lib/tabs/tabs/tab-content.component.mjs +4 -4
- package/esm2022/lib/tabs/tabs/tab-header.component.mjs +4 -4
- package/esm2022/lib/tabs/tabs/tab-item.component.mjs +4 -4
- package/esm2022/lib/tabs/tabs/tabs.component.mjs +4 -4
- package/esm2022/lib/tabs/tabs/tabs.directives.mjs +7 -7
- package/esm2022/lib/tabs/tabs/tabs.module.mjs +5 -5
- package/esm2022/lib/tabs/tabs.directive.mjs +4 -4
- package/esm2022/lib/time-picker/time-picker.component.mjs +4 -4
- package/esm2022/lib/time-picker/time-picker.directives.mjs +7 -7
- package/esm2022/lib/time-picker/time-picker.module.mjs +5 -5
- package/esm2022/lib/time-picker/time-picker.pipes.mjs +7 -7
- package/esm2022/lib/toast/toast.component.mjs +4 -4
- package/esm2022/lib/toast/toast.module.mjs +5 -5
- package/esm2022/lib/tree/tree-navigation.service.mjs +4 -4
- package/esm2022/lib/tree/tree-node/tree-node.component.mjs +7 -7
- package/esm2022/lib/tree/tree-selection.service.mjs +4 -4
- package/esm2022/lib/tree/tree.component.mjs +10 -10
- package/esm2022/lib/tree/tree.module.mjs +5 -5
- package/esm2022/lib/tree/tree.service.mjs +4 -4
- package/fesm2022/igniteui-angular.mjs +2330 -2321
- package/fesm2022/igniteui-angular.mjs.map +1 -1
- package/lib/grids/column-actions/public_api.d.ts +7 -0
- package/lib/grids/grid/grid.module.d.ts +23 -20
- package/lib/grids/grid/public_api.d.ts +1 -1
- package/lib/grids/hierarchical-grid/hierarchical-grid.module.d.ts +23 -20
- package/lib/grids/hierarchical-grid/public_api.d.ts +1 -1
- package/lib/grids/pivot-grid/pivot-grid.module.d.ts +23 -20
- package/lib/grids/pivot-grid/public_api.d.ts +1 -1
- package/lib/grids/public_api.d.ts +2 -1
- package/lib/grids/tree-grid/public_api.d.ts +3 -1
- package/lib/grids/tree-grid/tree-grid.module.d.ts +39 -35
- package/package.json +6 -6
|
@@ -43,10 +43,10 @@ export class IgxFieldFormatterPipe {
|
|
|
43
43
|
transform(value, formatter, rowData, fieldData) {
|
|
44
44
|
return formatter(value, rowData, fieldData);
|
|
45
45
|
}
|
|
46
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0
|
|
47
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0
|
|
46
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxFieldFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
47
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: IgxFieldFormatterPipe, isStandalone: true, name: "fieldFormatter" }); }
|
|
48
48
|
}
|
|
49
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxFieldFormatterPipe, decorators: [{
|
|
50
50
|
type: Pipe,
|
|
51
51
|
args: [{
|
|
52
52
|
name: 'fieldFormatter',
|
|
@@ -983,10 +983,10 @@ export class IgxQueryBuilderComponent extends DisplayDensityBase {
|
|
|
983
983
|
const editorIcons = editor;
|
|
984
984
|
editorIcons.forEach(icon => this.iconService.addSvgIconFromText(icon.name, icon.value, 'imx-icons'));
|
|
985
985
|
}
|
|
986
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0
|
|
987
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0-rc.4", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [multiSelection]=\"false\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }] }); }
|
|
986
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxQueryBuilderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.IgxIconService }, { token: i2.PlatformUtil }, { token: LOCALE_ID }, { token: DisplayDensityToken, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
987
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [multiSelection]=\"false\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }] }); }
|
|
988
988
|
}
|
|
989
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0
|
|
989
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxQueryBuilderComponent, decorators: [{
|
|
990
990
|
type: Component,
|
|
991
991
|
args: [{ selector: 'igx-query-builder', standalone: true, imports: [NgIf, IgxQueryBuilderHeaderComponent, IgxButtonDirective, IgxIconComponent, IgxChipComponent, IgxPrefixDirective, IgxSuffixDirective, IgxSelectComponent, FormsModule, NgFor, IgxSelectItemComponent, IgxInputGroupComponent, IgxInputDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, NgClass, IgxToggleDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, DatePipe, IgxFieldFormatterPipe], template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [multiSelection]=\"false\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n" }]
|
|
992
992
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.IgxIconService }, { type: i2.PlatformUtil }, { type: undefined, decorators: [{
|
|
@@ -1056,4 +1056,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-rc.4", ng
|
|
|
1056
1056
|
}], expressionTreeChange: [{
|
|
1057
1057
|
type: Output
|
|
1058
1058
|
}] } });
|
|
1059
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBeUIsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEcsT0FBTyxFQUFF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QURaLFNBQVM7dUJBQUMsUUFBUTtnQkFPWixxQkFBcUI7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU9qRCxrQkFBa0I7c0JBRHhCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU85QyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFPakMsc0JBQXNCO3NCQURoQyxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkF1QjlDLGdCQUFnQjtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBdUJ4Qyw0QkFBNEI7c0JBRHRDLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXVCeEQsaUJBQWlCO3NCQUR2QixTQUFTO3VCQUFDLGtCQUFrQjtnQkFPdEIsS0FBSztzQkFEWCxZQUFZO3VCQUFDLGdCQUFnQjtnQkFPdkIsT0FBTztzQkFEYixXQUFXO3VCQUFDLGVBQWU7Z0JBT2xCLG9CQUFvQjtzQkFEN0IsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBT3RCLGFBQWE7c0JBRHRCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBK0puRSxNQUFNO3NCQURoQixLQUFLO2dCQXlCSyxjQUFjO3NCQUR4QixLQUFLO2dCQVlLLE1BQU07c0JBRGhCLEtBQUs7Z0JBd0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBb0JDLG9CQUFvQjtzQkFEMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbnRlbnRDaGlsZCwgRXZlbnRFbWl0dGVyLCBMT0NBTEVfSUQsIE9wdGlvbmFsLCBPdXRwdXQsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBOZ0lmLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBlZGl0b3IgfSBmcm9tICdAaWduaXRldWkvbWF0ZXJpYWwtaWNvbnMtZXh0ZW5kZWQnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUJ1dHRvbkdyb3VwRXZlbnRBcmdzLCBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbkdyb3VwL2J1dHRvbkdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDaGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcHMvY2hpcC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vZ3JpZHMvY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElBY3RpdmVOb2RlIH0gZnJvbSAnLi4vZ3JpZHMvZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4SWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL2ljb24uc2VydmljZSc7XG5cbmltcG9ydCB7IElneFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhvcml6b250YWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncywgUG9pbnQsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIENsb3NlU2Nyb2xsU3RyYXRlZ3ksIENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LCBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1pY29ucy5jb21tb24nO1xuaW1wb3J0IHsgSWd4SW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNlbGVjdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneFN1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVCA9ICdtZWRpdW1EYXRlJztcbmNvbnN0IERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA9ICdtZWRpdW1UaW1lJztcbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gPSAnMS4wLTMnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ2RkL01NL3l5eXkgSEg6bW06c3MgdHQnO1xuY29uc3QgREVGQVVMVF9USU1FX0ZPUk1BVCA9ICdoaDptbTpzcyB0dCc7XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAnZmllbGRGb3JtYXR0ZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4RmllbGRGb3JtYXR0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGZvcm1hdHRlcjogKHY6IGFueSwgZGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpID0+IGFueSwgcm93RGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSwgZmllbGREYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICovXG5jbGFzcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBpbkVkaXRNb2RlOiBib29sZWFuO1xuICAgIHB1YmxpYyBpbkFkZE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGhvdmVyZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGZpZWxkTGFiZWw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHVzZWQgZm9yIG9wZXJhdGluZyB3aXRoIGNvbXBsZXggZmlsdGVycyBieSBjcmVhdGluZyBvciBlZGl0aW5nIGNvbmRpdGlvbnNcbiAqIGFuZCBncm91cGluZyB0aGVtIHVzaW5nIEFORC9PUiBsb2dpYy5cbiAqIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgQWR2YW5jZWQgRmlsdGVyaW5nIG9mIHRoZSBHcmlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LXF1ZXJ5LWJ1aWxkZXIgW2ZpZWxkc109XCJ0aGlzLmZpZWxkc1wiPlxuICogPC9pZ3gtcXVlcnktYnVpbGRlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1xdWVyeS1idWlsZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVlcnktYnVpbGRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50LCBJZ3hCdXR0b25EaXJlY3RpdmUsIElneEljb25Db21wb25lbnQsIElneENoaXBDb21wb25lbnQsIElneFByZWZpeERpcmVjdGl2ZSwgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hTZWxlY3RDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBOZ0ZvciwgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCwgSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SW5wdXREaXJlY3RpdmUsIElneERhdGVQaWNrZXJDb21wb25lbnQsIElneFBpY2tlclRvZ2dsZUNvbXBvbmVudCwgSWd4UGlja2VyQ2xlYXJDb21wb25lbnQsIElneFRpbWVQaWNrZXJDb21wb25lbnQsIElneERhdGVUaW1lRWRpdG9yRGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBJZ3hUb2dnbGVEaXJlY3RpdmUsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50LCBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBEYXRlUGlwZSwgSWd4RmllbGRGb3JtYXR0ZXJQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hRdWVyeUJ1aWxkZXJDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcXVlcnktYnVpbGRlcicpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1xdWVyeS1idWlsZGVyJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBmaWVsZFNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjb25kaXRpb25TZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoVmFsdWVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZUlucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHB1YmxpYyBwaWNrZXI6IElneERhdGVQaWNrZXJDb21wb25lbnQgfCBJZ3hUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRSb290QW5kR3JvdXBCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRDb25kaXRpb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudClcbiAgICBwdWJsaWMgaGVhZGVyQ29udGVudDogSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnYWRkTW9kZUNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBzZXQgYWRkTW9kZUNvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9hZGRNb2RlQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIgJiYgdGhpcy5fYWRkTW9kZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWRkTW9kZUNvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZGRNb2RlQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTW9kZUNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgc2V0IGN1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwdWJsaWMgY29udGV4dE1lbnVUb2dnbGU6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDaGlwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIHB1YmxpYyBkaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByb3RlY3RlZCBleHByZXNzaW9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgIEBWaWV3Q2hpbGQoJ292ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgICBwcm90ZWN0ZWQgb3ZlcmxheU91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvb3RHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PcGVyYW5kSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEdyb3VwczogRXhwcmVzc2lvbkdyb3VwSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW50R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRNb2RlRXhwcmVzc2lvbjogRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dHVhbEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nTG9naWNzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb25kaXRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0QWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICAgcHVibGljIHBpY2tlck91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEZpZWxkOiBGaWVsZFR5cGU7XG4gICAgcHJpdmF0ZSBfY2xpY2tUaW1lcjtcbiAgICBwcml2YXRlIF9kYmxDbGlja0RlbGF5ID0gMjAwO1xuICAgIHByaXZhdGUgX3ByZXZlbnRDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9lZGl0aW5nSW5wdXRzQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2FkZE1vZGVDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9maWVsZHM6IEZpZWxkVHlwZVtdO1xuICAgIHByaXZhdGUgX2V4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfbG9jYWxlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MuUXVlcnlCdWlsZGVyUmVzU3RyaW5ncztcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LlRvcFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIGljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcm90ZWN0ZWQgX2xvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM/OiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3ZlcmxheU91dGxldDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRGaWVsZCh2YWx1ZTogRmllbGRUeXBlKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcblxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRGaWVsZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAmJiB0aGlzLl9zZWxlY3RlZEZpZWxkICYmIHRoaXMuX3NlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09IG9sZFZhbHVlLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkRmllbGQoKTogRmllbGRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaWVsZHMuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBGaWVsZFR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZmllbGRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBmaWVsZHMoZmllbGRzOiBGaWVsZFR5cGVbXSkge1xuICAgICAgICB0aGlzLl9maWVsZHMgPSBmaWVsZHM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlcnMoZmllbGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybWF0KGZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRyZWUuXG4gICAgKi9cbiAgICAgcHVibGljIGdldCBleHByZXNzaW9uVHJlZSgpOiBJRXhwcmVzc2lvblRyZWUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBleHByZXNzaW9uVHJlZShleHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gZXhwcmVzc2lvblRyZWU7XG5cbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gYXBwbGljYXRpb24ncyBsb2NhbGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEV4cGVjdHMgYSB2YWxpZCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gICAgICAgIC8vIGlmIHZhbHVlIGlzIGludmFsaWQsIHNldCBpdCBiYWNrIHRvIF9sb2NhbGVJZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWsodGhpcy5fbG9jYWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gdGhpcy5fbG9jYWxlSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIGFzIHRoZSBleHByZXNzaW9uIHRyZWUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1xdWVyeS1idWlsZGVyIChleHByZXNzaW9uVHJlZUNoYW5nZSk9J29uRXhwcmVzc2lvblRyZWVDaGFuZ2UoKSc+PC9pZ3gtcXVlcnktYnVpbGRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwcmVzc2lvblRyZWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQ2xvc2VTY3JvbGxTdHJhdGVneSgpXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFBpY2tlck91dGxldChvdXRsZXQ/OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLnBpY2tlck91dGxldCA9IG91dGxldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNDb250ZXh0TWVudVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRlZEV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRlZEV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmVkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkTmFtZSA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWVsZDtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlLCB0aGlzLnNlYXJjaFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5maWVsZExhYmVsID0gdGhpcy5zZWxlY3RlZEZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQuaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKHRoaXMucm9vdEdyb3VwKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsT3BlcmFuZEFkZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZE1vZGVFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBpZiAodGhpcy5lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbSh0aGlzLmVkaXRlZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlcmFuZENhbkJlQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgICghIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGV4aXRPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cHJlc3Npb25Hcm91cChleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcENsaWNrKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5fY2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50Q2hpcENsaWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLl9kYmxDbGlja0RlbGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbGlja1RpbWVyKTtcbiAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IHRydWU7XG4gICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSA/XG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24gP1xuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbDtcblxuICAgICAgICBleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5maWVsZFNlbGVjdC5lbGVtZW50O1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW3RoaXMuZmllbGRTZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLmNvbmRpdGlvblNlbGVjdC5lbGVtZW50O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmNvbmRpdGlvblNlbGVjdC5lbGVtZW50IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkU2VsZWN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoVmFsdWVJbnB1dD8ubmF0aXZlRWxlbWVudCB8fCB0aGlzLnBpY2tlcj8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLnNlbGVjdGVkR3JvdXBzKSB7XG4gICAgICAgICAgICBncm91cC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBleHByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zID0gW107XG5cbiAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRNb2RlRXhwcmVzc2lvbi5pbkFkZE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluQWRkTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQgPyB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb25MaXN0KCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZXIoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLmZvcm1hdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLnBpcGVBcmdzLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZGRCdXR0b25Gb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRDb25kaXRpb25CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhZnRlckV4cHJlc3Npb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTZWxlY3Rpb25FbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLm9wZW4odGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9ybWF0KGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncykge1xuICAgICAgICAgICAgZmllbGQucGlwZUFyZ3MgPSB7IGRpZ2l0c0luZm86IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzLmZvcm1hdCA9IGZpZWxkLmRhdGFUeXBlID09PSBEYXRhVHlwZS5UaW1lID9cbiAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfVElNRV9GT1JNQVQgOiBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuRGF0ZVRpbWUgP1xuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfREFURV9USU1FX0ZPUk1BVCA6IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXQgPSBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCA9IERFRkFVTFRfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZpbHRlcnMoZmllbGQ6IEZpZWxkVHlwZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLk51bWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4VGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBleHByZXNzaW9uSXRlbS5zZWxlY3RlZCA9ICFleHByZXNzaW9uSXRlbS5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXggKyAxLCAwLCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihncm91cEl0ZW0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSwgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBsZXQgZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlLm9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwciwgZ3JvdXBJdGVtKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nRXhwciA9IGV4cHIgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJDb3B5OiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmlsdGVyaW5nRXhwci5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZpbHRlcmluZ0V4cHIuY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBmaWx0ZXJpbmdFeHByLnNlYXJjaFZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGZpbHRlcmluZ0V4cHIuaWdub3JlQ2FzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kSXRlbSA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0oZXhwckNvcHksIGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmlsdGVyaW5nRXhwci5maWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYW5kSXRlbS5maWVsZExhYmVsID0gZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChvcGVyYW5kSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFncm91cEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvblRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGdyb3VwSXRlbS5vcGVyYXRvcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKChpdGVtIGFzIEV4cHJlc3Npb25Hcm91cEl0ZW0pKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKChpdGVtIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250ZXh0TWVudSgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuXG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuXG4gICAgICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdMb2dpY3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3JfYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3Jfb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zQWxsU2VsZWN0ZWRFeHByZXNzaW9ucyA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5ldmVyeShvcCA9PiB0aGlzLmlzSW5zaWRlR3JvdXAob3AsIGdyb3VwKSk7XG5cbiAgICAgICAgICAgIGlmIChjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5zaWRlR3JvdXAoaXRlbTogRXhwcmVzc2lvbkl0ZW0sIGdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBncm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pc0luc2lkZUdyb3VwKGl0ZW0ucGFyZW50LCBncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtID09PSB0aGlzLmN1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLmN1cnJlbnRHcm91cC5wYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGV4cHJlc3Npb25JdGVtLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCk7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbS5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVHcm91cChvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbWluSW5kZXggPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucmVkdWNlKChpLCBlKSA9PiBNYXRoLm1pbihpLCBjaGlwcy5maW5kSW5kZXgoYyA9PiBjLmRhdGEgPT09IGUpKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIGNvbnN0IGZpcnN0RXhwcmVzc2lvbiA9IGNoaXBzW21pbkluZGV4XS5kYXRhO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGZpcnN0RXhwcmVzc2lvbi5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKG9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZmlyc3RFeHByZXNzaW9uKTtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgZ3JvdXBJdGVtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChleHByKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgICAgIGV4cHIucGFyZW50ID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlR3JvdXAoZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIGlmIChncm91cEl0ZW0uY2hpbGRyZW4gJiYgZ3JvdXBJdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW0sICFncm91cEl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFncm91cEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwUmVjdXJzaXZlKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShleHByLCBzZWxlY3RlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhbmRFeHByZXNzaW9uID0gZXhwciBhcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmRFeHByZXNzaW9uLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24ob3BlcmFuZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGV4cHJlc3Npb25JdGVtLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGMuZGF0YSkgIT09IC0xKTtcbiAgICAgICAgbGV0IG1pblRvcCA9IGNoaXBzLnJlZHVjZSgodCwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWluKHQsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5tYXgoY29udGFpbmVyUmVjdC50b3AsIG1pblRvcCk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3QuYm90dG9tLCBtaW5Ub3ApO1xuICAgICAgICBsZXQgbWF4UmlnaHQgPSBjaGlwcy5yZWR1Y2UoKHIsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1heChyLCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpLCAwKTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgY29udGFpbmVyUmVjdC5sZWZ0KTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1pbihtYXhSaWdodCwgY29udGFpbmVyUmVjdC5yaWdodCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IG5ldyBQb2ludChtYXhSaWdodCwgbWluVG9wKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbEVsZW1lbnRJbnRvVmlldyh0YXJnZXQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0Lm9mZnNldFRvcCAtIGNvbnRhaW5lci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gMTA7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBkZWx0YSA+IHRhcmdldE9mZnNldCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCAtIGRlbHRhO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0IDwgdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhKSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhIC0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnJvb3RHcm91cCA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbkdyb3VwSXRlbSh0aGlzLmV4cHJlc3Npb25UcmVlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLnJvb3RHcm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyU1ZHSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRvckljb25zID0gZWRpdG9yIGFzIGFueVtdO1xuICAgICAgICBlZGl0b3JJY29ucy5mb3JFYWNoKGljb24gPT4gdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoaWNvbi5uYW1lLCBpY29uLnZhbHVlLCAnaW14LWljb25zJykpO1xuICAgIH1cbn1cblxuIiwiPGlneC1xdWVyeS1idWlsZGVyLWhlYWRlclxuICAgICpuZ0lmPVwiIWhlYWRlckNvbnRlbnRcIlxuICAgIFt0aXRsZV09XCJ0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl90aXRsZVwiXG4+XG48L2lneC1xdWVyeS1idWlsZGVyLWhlYWRlcj5cblxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXF1ZXJ5LWJ1aWxkZXItaGVhZGVyXCI+PC9uZy1jb250ZW50PlxuXG48ZGl2XG4gICAgI2V4cHJlc3Npb25zQ29udGFpbmVyXG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fbWFpblwiXG4gICAgKHNjcm9sbCk9XCJvbkV4cHJlc3Npb25zU2Nyb2xsZWQoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb290R3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2FkZFJvb3RBbmRHcm91cEJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FuZF9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5XCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5X190aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2luaXRpYWxfdGV4dCB9fVxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgI2FkZEV4cHJlc3Npb25zVGVtcGxhdGVcbiAgICAgICAgbGV0LWV4cHJlc3Npb25JdGVtXG4gICAgICAgIGxldC1hZnRlckV4cHJlc3Npb249XCJhZnRlckV4cHJlc3Npb25cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2FkZENvbmRpdGlvbkJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbmRpdGlvbihleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hZGRfY29uZGl0aW9uXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyT3BlcmFuZFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZVwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1pdGVtXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSB0cnVlXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtY2hpcFxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImV4cHJlc3Npb25JdGVtXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEZW5zaXR5ID09PSAnY29tcGFjdCcgPyAnY29zeScgOiBkaXNwbGF5RGVuc2l0eVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCJvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoaXBTZWxlY3Rpb25FbmQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWd4UHJlZml4IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbHVtblwiPnt7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmZpZWxkTGFiZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlneC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZEZvcm1hdHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5sb2NhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tYWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgZWRpdFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0ucGFyZW50ICE9PSBjdXJyZW50R3JvdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIGFkZFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlXCJcbiAgICAgICAgICAgICNlZGl0aW5nSW5wdXRzQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9faW5wdXRzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1zZWxlY3RcbiAgICAgICAgICAgICAgICAjZmllbGRTZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblNlbGVjdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuaWNvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb25kaXRpb24gb2YgZ2V0Q29uZGl0aW9uTGlzdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9XCJpbXgtaWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlICE9PSAndGltZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlVGltZScpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3ZhbHVlX3BsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cblxuICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICNwaWNrZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdHRlcl09XCJzZWxlY3RlZEZpZWxkLmZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgIFt3ZWVrU3RhcnRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuXG4gICAgICAgICAgICA8aWd4LXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAndGltZSdcIlxuICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3RpbWVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgIFtvdXRsZXRdPVwicGlja2VyT3V0bGV0XCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgPC9pZ3gtdGltZS1waWNrZXI+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAjaW5wdXRHcm91cFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZVRpbWUnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RhdGVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEYXRlVGltZUVkaXRvcl09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHMtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21taXRPcGVyYW5kRWRpdCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5jaGVjazwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3BlcmFuZEVkaXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3BlcmFuZEFkZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25UcmVlVGVtcGxhdGUgbGV0LWV4cHJlc3Npb25JdGVtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fbGluZVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1hbmQnOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tb3InOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbS5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgID48L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGV4cHIgb2YgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4cHJlc3Npb25Hcm91cChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25UcmVlVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWx0ZXJPcGVyYW5kVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEdyb3VwID09PSBleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICNjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbSAhPT0gcm9vdEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFZGl0ZWRFeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDwgMlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbmRHcm91cChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2VuZF9ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm9vdEdyb3VwXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvblRyZWVUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KHJvb3RHcm91cClcbiAgICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXZcbiAgICAgICAgaWd4VG9nZ2xlXG4gICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgIChjbG9zZWQpPVwiY29udGV4dE1lbnVDbG9zZWQoKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudS0tY29zeSc6IGRpc3BsYXlEZW5zaXR5ID09PSAnY29zeScsXG4gICAgICAgICAgICAnaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnUtLWNvbXBhY3QnOiBkaXNwbGF5RGVuc2l0eSA9PT0gJ2NvbXBhY3QnXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19jbG9zZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dHVhbEdyb3VwXCI+XG4gICAgICAgICAgICA8aWd4LWJ1dHRvbmdyb3VwXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIFttdWx0aVNlbGVjdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlc109XCJmaWx0ZXJpbmdMb2dpY3NcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0RmlsdGVyaW5nTG9naWMoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2lneC1idXR0b25ncm91cD5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb250ZXh0dWFsR3JvdXAucGFyZW50XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5ncm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgbmFtZT1cInVuZ3JvdXBcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3VuZ3JvdXBcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUdyb3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5kZWxldGU8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZXh0dWFsR3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVBbmRHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfYW5kX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVPckdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NyZWF0ZV9vcl9ncm91cCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19kZWxldGUtYnRuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kZWxldGVfZmlsdGVycyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2XG4gICAgI292ZXJsYXlPdXRsZXRcbiAgICBpZ3hPdmVybGF5T3V0bGV0XG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fb3V0bGV0XCJcbiAgICAocG9pbnRlcmRvd24pPVwib25PdXRsZXRQb2ludGVyRG93bigkZXZlbnQpXCJcbj48L2Rpdj5cbiJdfQ==
|
|
1059
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBeUIsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEcsT0FBTyxFQUFF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QURaLFNBQVM7dUJBQUMsUUFBUTtnQkFPWixxQkFBcUI7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU9qRCxrQkFBa0I7c0JBRHhCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU85QyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFPakMsc0JBQXNCO3NCQURoQyxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkF1QjlDLGdCQUFnQjtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBdUJ4Qyw0QkFBNEI7c0JBRHRDLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXVCeEQsaUJBQWlCO3NCQUR2QixTQUFTO3VCQUFDLGtCQUFrQjtnQkFPdEIsS0FBSztzQkFEWCxZQUFZO3VCQUFDLGdCQUFnQjtnQkFPdkIsT0FBTztzQkFEYixXQUFXO3VCQUFDLGVBQWU7Z0JBT2xCLG9CQUFvQjtzQkFEN0IsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBT3RCLGFBQWE7c0JBRHRCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBK0puRSxNQUFNO3NCQURoQixLQUFLO2dCQXlCSyxjQUFjO3NCQUR4QixLQUFLO2dCQVlLLE1BQU07c0JBRGhCLEtBQUs7Z0JBd0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBb0JDLG9CQUFvQjtzQkFEMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbnRlbnRDaGlsZCwgRXZlbnRFbWl0dGVyLCBMT0NBTEVfSUQsIE9wdGlvbmFsLCBPdXRwdXQsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBOZ0lmLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBlZGl0b3IgfSBmcm9tICdAaWduaXRldWkvbWF0ZXJpYWwtaWNvbnMtZXh0ZW5kZWQnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUJ1dHRvbkdyb3VwRXZlbnRBcmdzLCBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbkdyb3VwL2J1dHRvbkdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDaGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcHMvY2hpcC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vZ3JpZHMvY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElBY3RpdmVOb2RlIH0gZnJvbSAnLi4vZ3JpZHMvZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4SWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL2ljb24uc2VydmljZSc7XG5cbmltcG9ydCB7IElneFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhvcml6b250YWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncywgUG9pbnQsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIENsb3NlU2Nyb2xsU3RyYXRlZ3ksIENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LCBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1pY29ucy5jb21tb24nO1xuaW1wb3J0IHsgSWd4SW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNlbGVjdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneFN1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVCA9ICdtZWRpdW1EYXRlJztcbmNvbnN0IERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA9ICdtZWRpdW1UaW1lJztcbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gPSAnMS4wLTMnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ2RkL01NL3l5eXkgSEg6bW06c3MgdHQnO1xuY29uc3QgREVGQVVMVF9USU1FX0ZPUk1BVCA9ICdoaDptbTpzcyB0dCc7XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAnZmllbGRGb3JtYXR0ZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4RmllbGRGb3JtYXR0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGZvcm1hdHRlcjogKHY6IGFueSwgZGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpID0+IGFueSwgcm93RGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSwgZmllbGREYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICovXG5jbGFzcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBpbkVkaXRNb2RlOiBib29sZWFuO1xuICAgIHB1YmxpYyBpbkFkZE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGhvdmVyZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGZpZWxkTGFiZWw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHVzZWQgZm9yIG9wZXJhdGluZyB3aXRoIGNvbXBsZXggZmlsdGVycyBieSBjcmVhdGluZyBvciBlZGl0aW5nIGNvbmRpdGlvbnNcbiAqIGFuZCBncm91cGluZyB0aGVtIHVzaW5nIEFORC9PUiBsb2dpYy5cbiAqIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgQWR2YW5jZWQgRmlsdGVyaW5nIG9mIHRoZSBHcmlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LXF1ZXJ5LWJ1aWxkZXIgW2ZpZWxkc109XCJ0aGlzLmZpZWxkc1wiPlxuICogPC9pZ3gtcXVlcnktYnVpbGRlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1xdWVyeS1idWlsZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVlcnktYnVpbGRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50LCBJZ3hCdXR0b25EaXJlY3RpdmUsIElneEljb25Db21wb25lbnQsIElneENoaXBDb21wb25lbnQsIElneFByZWZpeERpcmVjdGl2ZSwgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hTZWxlY3RDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBOZ0ZvciwgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCwgSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SW5wdXREaXJlY3RpdmUsIElneERhdGVQaWNrZXJDb21wb25lbnQsIElneFBpY2tlclRvZ2dsZUNvbXBvbmVudCwgSWd4UGlja2VyQ2xlYXJDb21wb25lbnQsIElneFRpbWVQaWNrZXJDb21wb25lbnQsIElneERhdGVUaW1lRWRpdG9yRGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBJZ3hUb2dnbGVEaXJlY3RpdmUsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50LCBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBEYXRlUGlwZSwgSWd4RmllbGRGb3JtYXR0ZXJQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hRdWVyeUJ1aWxkZXJDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcXVlcnktYnVpbGRlcicpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1xdWVyeS1idWlsZGVyJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBmaWVsZFNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjb25kaXRpb25TZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoVmFsdWVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZUlucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHB1YmxpYyBwaWNrZXI6IElneERhdGVQaWNrZXJDb21wb25lbnQgfCBJZ3hUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRSb290QW5kR3JvdXBCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRDb25kaXRpb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudClcbiAgICBwdWJsaWMgaGVhZGVyQ29udGVudDogSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnYWRkTW9kZUNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBzZXQgYWRkTW9kZUNvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9hZGRNb2RlQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIgJiYgdGhpcy5fYWRkTW9kZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWRkTW9kZUNvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZGRNb2RlQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTW9kZUNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgc2V0IGN1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwdWJsaWMgY29udGV4dE1lbnVUb2dnbGU6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDaGlwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIHB1YmxpYyBkaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByb3RlY3RlZCBleHByZXNzaW9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgIEBWaWV3Q2hpbGQoJ292ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgICBwcm90ZWN0ZWQgb3ZlcmxheU91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvb3RHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PcGVyYW5kSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEdyb3VwczogRXhwcmVzc2lvbkdyb3VwSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW50R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRNb2RlRXhwcmVzc2lvbjogRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dHVhbEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nTG9naWNzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb25kaXRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0QWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICAgcHVibGljIHBpY2tlck91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEZpZWxkOiBGaWVsZFR5cGU7XG4gICAgcHJpdmF0ZSBfY2xpY2tUaW1lcjtcbiAgICBwcml2YXRlIF9kYmxDbGlja0RlbGF5ID0gMjAwO1xuICAgIHByaXZhdGUgX3ByZXZlbnRDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9lZGl0aW5nSW5wdXRzQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2FkZE1vZGVDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9maWVsZHM6IEZpZWxkVHlwZVtdO1xuICAgIHByaXZhdGUgX2V4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfbG9jYWxlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MuUXVlcnlCdWlsZGVyUmVzU3RyaW5ncztcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LlRvcFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIGljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcm90ZWN0ZWQgX2xvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM/OiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3ZlcmxheU91dGxldDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRGaWVsZCh2YWx1ZTogRmllbGRUeXBlKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcblxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRGaWVsZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAmJiB0aGlzLl9zZWxlY3RlZEZpZWxkICYmIHRoaXMuX3NlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09IG9sZFZhbHVlLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkRmllbGQoKTogRmllbGRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaWVsZHMuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBGaWVsZFR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZmllbGRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBmaWVsZHMoZmllbGRzOiBGaWVsZFR5cGVbXSkge1xuICAgICAgICB0aGlzLl9maWVsZHMgPSBmaWVsZHM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlcnMoZmllbGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybWF0KGZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRyZWUuXG4gICAgKi9cbiAgICAgcHVibGljIGdldCBleHByZXNzaW9uVHJlZSgpOiBJRXhwcmVzc2lvblRyZWUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBleHByZXNzaW9uVHJlZShleHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gZXhwcmVzc2lvblRyZWU7XG5cbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gYXBwbGljYXRpb24ncyBsb2NhbGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEV4cGVjdHMgYSB2YWxpZCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gICAgICAgIC8vIGlmIHZhbHVlIGlzIGludmFsaWQsIHNldCBpdCBiYWNrIHRvIF9sb2NhbGVJZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWsodGhpcy5fbG9jYWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gdGhpcy5fbG9jYWxlSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIGFzIHRoZSBleHByZXNzaW9uIHRyZWUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1xdWVyeS1idWlsZGVyIChleHByZXNzaW9uVHJlZUNoYW5nZSk9J29uRXhwcmVzc2lvblRyZWVDaGFuZ2UoKSc+PC9pZ3gtcXVlcnktYnVpbGRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwcmVzc2lvblRyZWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQ2xvc2VTY3JvbGxTdHJhdGVneSgpXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFBpY2tlck91dGxldChvdXRsZXQ/OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLnBpY2tlck91dGxldCA9IG91dGxldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNDb250ZXh0TWVudVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRlZEV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRlZEV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmVkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkTmFtZSA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWVsZDtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlLCB0aGlzLnNlYXJjaFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbi5maWVsZExhYmVsID0gdGhpcy5zZWxlY3RlZEZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQuaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKHRoaXMucm9vdEdyb3VwKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsT3BlcmFuZEFkZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZE1vZGVFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBpZiAodGhpcy5lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbSh0aGlzLmVkaXRlZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlcmFuZENhbkJlQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgICghIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGV4aXRPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cHJlc3Npb25Hcm91cChleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcENsaWNrKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5fY2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50Q2hpcENsaWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLl9kYmxDbGlja0RlbGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbGlja1RpbWVyKTtcbiAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IHRydWU7XG4gICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSA/XG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24gP1xuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbDtcblxuICAgICAgICBleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lZGl0ZWRFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5maWVsZFNlbGVjdC5lbGVtZW50O1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW3RoaXMuZmllbGRTZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLmNvbmRpdGlvblNlbGVjdC5lbGVtZW50O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmNvbmRpdGlvblNlbGVjdC5lbGVtZW50IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkU2VsZWN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoVmFsdWVJbnB1dD8ubmF0aXZlRWxlbWVudCB8fCB0aGlzLnBpY2tlcj8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLnNlbGVjdGVkR3JvdXBzKSB7XG4gICAgICAgICAgICBncm91cC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBleHByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zID0gW107XG5cbiAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRNb2RlRXhwcmVzc2lvbi5pbkFkZE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluQWRkTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQgPyB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb25MaXN0KCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZXIoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLmZvcm1hdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLnBpcGVBcmdzLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZGRCdXR0b25Gb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRDb25kaXRpb25CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhZnRlckV4cHJlc3Npb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTZWxlY3Rpb25FbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLm9wZW4odGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9ybWF0KGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncykge1xuICAgICAgICAgICAgZmllbGQucGlwZUFyZ3MgPSB7IGRpZ2l0c0luZm86IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzLmZvcm1hdCA9IGZpZWxkLmRhdGFUeXBlID09PSBEYXRhVHlwZS5UaW1lID9cbiAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfVElNRV9GT1JNQVQgOiBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuRGF0ZVRpbWUgP1xuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfREFURV9USU1FX0ZPUk1BVCA6IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXQgPSBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCA9IERFRkFVTFRfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZpbHRlcnMoZmllbGQ6IEZpZWxkVHlwZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLk51bWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4VGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBleHByZXNzaW9uSXRlbS5zZWxlY3RlZCA9ICFleHByZXNzaW9uSXRlbS5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXggKyAxLCAwLCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihncm91cEl0ZW0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSwgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBsZXQgZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlLm9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwciwgZ3JvdXBJdGVtKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nRXhwciA9IGV4cHIgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJDb3B5OiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmlsdGVyaW5nRXhwci5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZpbHRlcmluZ0V4cHIuY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBmaWx0ZXJpbmdFeHByLnNlYXJjaFZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGZpbHRlcmluZ0V4cHIuaWdub3JlQ2FzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kSXRlbSA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0oZXhwckNvcHksIGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmlsdGVyaW5nRXhwci5maWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYW5kSXRlbS5maWVsZExhYmVsID0gZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChvcGVyYW5kSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFncm91cEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvblRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGdyb3VwSXRlbS5vcGVyYXRvcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKChpdGVtIGFzIEV4cHJlc3Npb25Hcm91cEl0ZW0pKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKChpdGVtIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250ZXh0TWVudSgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuXG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuXG4gICAgICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdMb2dpY3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3JfYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3Jfb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zQWxsU2VsZWN0ZWRFeHByZXNzaW9ucyA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5ldmVyeShvcCA9PiB0aGlzLmlzSW5zaWRlR3JvdXAob3AsIGdyb3VwKSk7XG5cbiAgICAgICAgICAgIGlmIChjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5zaWRlR3JvdXAoaXRlbTogRXhwcmVzc2lvbkl0ZW0sIGdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBncm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pc0luc2lkZUdyb3VwKGl0ZW0ucGFyZW50LCBncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtID09PSB0aGlzLmN1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLmN1cnJlbnRHcm91cC5wYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGV4cHJlc3Npb25JdGVtLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCk7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbS5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVHcm91cChvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbWluSW5kZXggPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucmVkdWNlKChpLCBlKSA9PiBNYXRoLm1pbihpLCBjaGlwcy5maW5kSW5kZXgoYyA9PiBjLmRhdGEgPT09IGUpKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIGNvbnN0IGZpcnN0RXhwcmVzc2lvbiA9IGNoaXBzW21pbkluZGV4XS5kYXRhO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGZpcnN0RXhwcmVzc2lvbi5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKG9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZmlyc3RFeHByZXNzaW9uKTtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgZ3JvdXBJdGVtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChleHByKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgICAgIGV4cHIucGFyZW50ID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlR3JvdXAoZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIGlmIChncm91cEl0ZW0uY2hpbGRyZW4gJiYgZ3JvdXBJdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW0sICFncm91cEl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFncm91cEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwUmVjdXJzaXZlKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShleHByLCBzZWxlY3RlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhbmRFeHByZXNzaW9uID0gZXhwciBhcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmRFeHByZXNzaW9uLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24ob3BlcmFuZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGV4cHJlc3Npb25JdGVtLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGMuZGF0YSkgIT09IC0xKTtcbiAgICAgICAgbGV0IG1pblRvcCA9IGNoaXBzLnJlZHVjZSgodCwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWluKHQsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5tYXgoY29udGFpbmVyUmVjdC50b3AsIG1pblRvcCk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3QuYm90dG9tLCBtaW5Ub3ApO1xuICAgICAgICBsZXQgbWF4UmlnaHQgPSBjaGlwcy5yZWR1Y2UoKHIsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1heChyLCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpLCAwKTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgY29udGFpbmVyUmVjdC5sZWZ0KTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1pbihtYXhSaWdodCwgY29udGFpbmVyUmVjdC5yaWdodCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IG5ldyBQb2ludChtYXhSaWdodCwgbWluVG9wKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbEVsZW1lbnRJbnRvVmlldyh0YXJnZXQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0Lm9mZnNldFRvcCAtIGNvbnRhaW5lci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gMTA7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBkZWx0YSA+IHRhcmdldE9mZnNldCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCAtIGRlbHRhO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0IDwgdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhKSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhIC0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnJvb3RHcm91cCA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbkdyb3VwSXRlbSh0aGlzLmV4cHJlc3Npb25UcmVlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLnJvb3RHcm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyU1ZHSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRvckljb25zID0gZWRpdG9yIGFzIGFueVtdO1xuICAgICAgICBlZGl0b3JJY29ucy5mb3JFYWNoKGljb24gPT4gdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoaWNvbi5uYW1lLCBpY29uLnZhbHVlLCAnaW14LWljb25zJykpO1xuICAgIH1cbn1cblxuIiwiPGlneC1xdWVyeS1idWlsZGVyLWhlYWRlclxuICAgICpuZ0lmPVwiIWhlYWRlckNvbnRlbnRcIlxuICAgIFt0aXRsZV09XCJ0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl90aXRsZVwiXG4+XG48L2lneC1xdWVyeS1idWlsZGVyLWhlYWRlcj5cblxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXF1ZXJ5LWJ1aWxkZXItaGVhZGVyXCI+PC9uZy1jb250ZW50PlxuXG48ZGl2XG4gICAgI2V4cHJlc3Npb25zQ29udGFpbmVyXG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fbWFpblwiXG4gICAgKHNjcm9sbCk9XCJvbkV4cHJlc3Npb25zU2Nyb2xsZWQoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb290R3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2FkZFJvb3RBbmRHcm91cEJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FuZF9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5XCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5X190aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2luaXRpYWxfdGV4dCB9fVxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgI2FkZEV4cHJlc3Npb25zVGVtcGxhdGVcbiAgICAgICAgbGV0LWV4cHJlc3Npb25JdGVtXG4gICAgICAgIGxldC1hZnRlckV4cHJlc3Npb249XCJhZnRlckV4cHJlc3Npb25cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2FkZENvbmRpdGlvbkJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbmRpdGlvbihleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hZGRfY29uZGl0aW9uXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyT3BlcmFuZFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZVwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1pdGVtXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSB0cnVlXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtY2hpcFxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImV4cHJlc3Npb25JdGVtXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEZW5zaXR5ID09PSAnY29tcGFjdCcgPyAnY29zeScgOiBkaXNwbGF5RGVuc2l0eVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCJvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoaXBTZWxlY3Rpb25FbmQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWd4UHJlZml4IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbHVtblwiPnt7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmZpZWxkTGFiZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlneC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZEZvcm1hdHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5sb2NhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tYWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgZWRpdFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0ucGFyZW50ICE9PSBjdXJyZW50R3JvdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIGFkZFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlXCJcbiAgICAgICAgICAgICNlZGl0aW5nSW5wdXRzQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9faW5wdXRzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1zZWxlY3RcbiAgICAgICAgICAgICAgICAjZmllbGRTZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblNlbGVjdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuaWNvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb25kaXRpb24gb2YgZ2V0Q29uZGl0aW9uTGlzdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9XCJpbXgtaWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlICE9PSAndGltZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlVGltZScpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3ZhbHVlX3BsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cblxuICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICNwaWNrZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdHRlcl09XCJzZWxlY3RlZEZpZWxkLmZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgIFt3ZWVrU3RhcnRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuXG4gICAgICAgICAgICA8aWd4LXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAndGltZSdcIlxuICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3RpbWVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgIFtvdXRsZXRdPVwicGlja2VyT3V0bGV0XCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgPC9pZ3gtdGltZS1waWNrZXI+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAjaW5wdXRHcm91cFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZVRpbWUnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RhdGVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEYXRlVGltZUVkaXRvcl09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHMtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21taXRPcGVyYW5kRWRpdCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5jaGVjazwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3BlcmFuZEVkaXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3BlcmFuZEFkZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25UcmVlVGVtcGxhdGUgbGV0LWV4cHJlc3Npb25JdGVtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fbGluZVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1hbmQnOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tb3InOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbS5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgID48L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGV4cHIgb2YgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4cHJlc3Npb25Hcm91cChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25UcmVlVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWx0ZXJPcGVyYW5kVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEdyb3VwID09PSBleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICNjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbSAhPT0gcm9vdEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFZGl0ZWRFeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDwgMlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbmRHcm91cChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2VuZF9ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm9vdEdyb3VwXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvblRyZWVUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KHJvb3RHcm91cClcbiAgICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXZcbiAgICAgICAgaWd4VG9nZ2xlXG4gICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgIChjbG9zZWQpPVwiY29udGV4dE1lbnVDbG9zZWQoKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudS0tY29zeSc6IGRpc3BsYXlEZW5zaXR5ID09PSAnY29zeScsXG4gICAgICAgICAgICAnaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnUtLWNvbXBhY3QnOiBkaXNwbGF5RGVuc2l0eSA9PT0gJ2NvbXBhY3QnXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19jbG9zZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dHVhbEdyb3VwXCI+XG4gICAgICAgICAgICA8aWd4LWJ1dHRvbmdyb3VwXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIFttdWx0aVNlbGVjdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlc109XCJmaWx0ZXJpbmdMb2dpY3NcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0RmlsdGVyaW5nTG9naWMoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2lneC1idXR0b25ncm91cD5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb250ZXh0dWFsR3JvdXAucGFyZW50XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5ncm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgbmFtZT1cInVuZ3JvdXBcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3VuZ3JvdXBcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUdyb3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5kZWxldGU8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZXh0dWFsR3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVBbmRHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfYW5kX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVPckdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NyZWF0ZV9vcl9ncm91cCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19kZWxldGUtYnRuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kZWxldGVfZmlsdGVycyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2XG4gICAgI292ZXJsYXlPdXRsZXRcbiAgICBpZ3hPdmVybGF5T3V0bGV0XG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fb3V0bGV0XCJcbiAgICAocG9pbnRlcmRvd24pPVwib25PdXRsZXRQb2ludGVyRG93bigkZXZlbnQpXCJcbj48L2Rpdj5cbiJdfQ==
|