igniteui-angular 17.0.13 → 17.0.15
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 +3 -3
- package/esm2022/lib/accordion/accordion.module.mjs +4 -4
- package/esm2022/lib/action-strip/action-strip.component.mjs +6 -6
- package/esm2022/lib/action-strip/action-strip.module.mjs +4 -4
- package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +3 -3
- package/esm2022/lib/action-strip/grid-actions/grid-actions-base.directive.mjs +3 -3
- package/esm2022/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +3 -3
- package/esm2022/lib/action-strip/grid-actions/grid-pinning-actions.component.mjs +3 -3
- package/esm2022/lib/avatar/avatar.component.mjs +3 -3
- package/esm2022/lib/avatar/avatar.module.mjs +4 -4
- package/esm2022/lib/badge/badge.component.mjs +3 -3
- package/esm2022/lib/badge/badge.module.mjs +4 -4
- package/esm2022/lib/banner/banner.component.mjs +3 -3
- package/esm2022/lib/banner/banner.directives.mjs +3 -3
- package/esm2022/lib/banner/banner.module.mjs +4 -4
- package/esm2022/lib/buttonGroup/buttonGroup.component.mjs +26 -20
- package/esm2022/lib/buttonGroup/buttongroup.module.mjs +4 -4
- package/esm2022/lib/calendar/calendar-base.mjs +9 -7
- package/esm2022/lib/calendar/calendar.component.mjs +3 -3
- package/esm2022/lib/calendar/calendar.directives.mjs +15 -15
- package/esm2022/lib/calendar/calendar.module.mjs +4 -4
- package/esm2022/lib/calendar/days-view/day-item.component.mjs +3 -3
- package/esm2022/lib/calendar/days-view/days-view.component.mjs +3 -3
- package/esm2022/lib/calendar/days-view/daysview-navigation.service.mjs +3 -3
- package/esm2022/lib/calendar/month-picker/month-picker-base.mjs +3 -3
- package/esm2022/lib/calendar/month-picker/month-picker.component.mjs +3 -3
- package/esm2022/lib/calendar/months-view/months-view.component.mjs +3 -3
- package/esm2022/lib/calendar/months-view.pipe.mjs +6 -6
- package/esm2022/lib/calendar/years-view/years-view.component.mjs +6 -6
- package/esm2022/lib/card/card.component.mjs +27 -27
- package/esm2022/lib/card/card.module.mjs +4 -4
- package/esm2022/lib/carousel/carousel.component.mjs +6 -6
- package/esm2022/lib/carousel/carousel.directives.mjs +9 -9
- package/esm2022/lib/carousel/carousel.module.mjs +4 -4
- package/esm2022/lib/carousel/slide.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
- package/esm2022/lib/chips/chip.component.mjs +3 -3
- package/esm2022/lib/chips/chips-area.component.mjs +3 -3
- package/esm2022/lib/chips/chips.module.mjs +4 -4
- package/esm2022/lib/combo/combo-add-item.component.mjs +3 -3
- package/esm2022/lib/combo/combo-dropdown.component.mjs +3 -3
- package/esm2022/lib/combo/combo-item.component.mjs +3 -3
- package/esm2022/lib/combo/combo.api.mjs +3 -3
- package/esm2022/lib/combo/combo.common.mjs +5 -5
- package/esm2022/lib/combo/combo.component.mjs +3 -3
- package/esm2022/lib/combo/combo.directives.mjs +24 -24
- package/esm2022/lib/combo/combo.module.mjs +4 -4
- package/esm2022/lib/combo/combo.pipes.mjs +6 -6
- package/esm2022/lib/core/density.mjs +25 -21
- package/esm2022/lib/core/navigation/directives.mjs +6 -6
- package/esm2022/lib/core/navigation/nav.service.mjs +3 -3
- package/esm2022/lib/core/selection.mjs +11 -4
- package/esm2022/lib/core/touch.mjs +3 -3
- package/esm2022/lib/core/utils.mjs +3 -3
- package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
- package/esm2022/lib/date-common/picker-base.directive.mjs +3 -3
- package/esm2022/lib/date-common/picker-icons.common.mjs +9 -9
- package/esm2022/lib/date-picker/date-picker.component.mjs +3 -3
- package/esm2022/lib/date-picker/date-picker.module.mjs +4 -4
- package/esm2022/lib/date-range-picker/date-range-picker-inputs.common.mjs +15 -15
- package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +3 -3
- package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +4 -4
- package/esm2022/lib/dialog/dialog.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog.directives.mjs +6 -6
- package/esm2022/lib/dialog/dialog.module.mjs +4 -4
- package/esm2022/lib/directives/autocomplete/autocomplete.directive.mjs +3 -3
- package/esm2022/lib/directives/autocomplete/autocomplete.module.mjs +4 -4
- package/esm2022/lib/directives/button/button.directive.mjs +3 -3
- package/esm2022/lib/directives/button/button.module.mjs +4 -4
- package/esm2022/lib/directives/date-time-editor/date-time-editor.directive.mjs +3 -3
- package/esm2022/lib/directives/date-time-editor/date-time-editor.module.mjs +4 -4
- package/esm2022/lib/directives/divider/divider.directive.mjs +3 -3
- package/esm2022/lib/directives/divider/divider.module.mjs +4 -4
- package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +12 -12
- package/esm2022/lib/directives/drag-drop/drag-drop.module.mjs +4 -4
- package/esm2022/lib/directives/filter/filter.directive.mjs +6 -6
- package/esm2022/lib/directives/filter/filter.module.mjs +4 -4
- package/esm2022/lib/directives/focus/focus.directive.mjs +3 -3
- package/esm2022/lib/directives/focus/focus.module.mjs +4 -4
- package/esm2022/lib/directives/focus-trap/focus-trap.directive.mjs +3 -3
- package/esm2022/lib/directives/focus-trap/focus-trap.module.mjs +4 -4
- package/esm2022/lib/directives/for-of/base.helper.component.mjs +3 -3
- package/esm2022/lib/directives/for-of/display.container.mjs +3 -3
- package/esm2022/lib/directives/for-of/for_of.directive.mjs +6 -6
- package/esm2022/lib/directives/for-of/for_of.module.mjs +4 -4
- package/esm2022/lib/directives/for-of/for_of.sync.service.mjs +6 -6
- package/esm2022/lib/directives/for-of/horizontal.virtual.helper.component.mjs +3 -3
- package/esm2022/lib/directives/for-of/virtual.helper.component.mjs +3 -3
- package/esm2022/lib/directives/form-control/form-control.directive.mjs +3 -3
- package/esm2022/lib/directives/form-control/form-control.module.mjs +4 -4
- package/esm2022/lib/directives/hint/hint.directive.mjs +3 -3
- package/esm2022/lib/directives/input/input.directive.mjs +3 -3
- package/esm2022/lib/directives/label/label.directive.mjs +3 -3
- package/esm2022/lib/directives/layout/layout.directive.mjs +6 -6
- package/esm2022/lib/directives/layout/layout.module.mjs +4 -4
- package/esm2022/lib/directives/mask/mask-parsing.service.mjs +3 -3
- package/esm2022/lib/directives/mask/mask.directive.mjs +3 -3
- package/esm2022/lib/directives/mask/mask.module.mjs +4 -4
- package/esm2022/lib/directives/notification/notifications.directive.mjs +3 -3
- package/esm2022/lib/directives/prefix/prefix.directive.mjs +3 -3
- package/esm2022/lib/directives/radio/radio-group.directive.mjs +3 -3
- package/esm2022/lib/directives/radio/radio-group.module.mjs +4 -4
- package/esm2022/lib/directives/ripple/ripple.directive.mjs +3 -3
- package/esm2022/lib/directives/ripple/ripple.module.mjs +4 -4
- package/esm2022/lib/directives/scroll-inertia/scroll_inertia.directive.mjs +3 -3
- package/esm2022/lib/directives/scroll-inertia/scroll_inertia.module.mjs +4 -4
- package/esm2022/lib/directives/suffix/suffix.directive.mjs +3 -3
- package/esm2022/lib/directives/template-outlet/template_outlet.directive.mjs +3 -3
- package/esm2022/lib/directives/text-highlight/text-highlight.directive.mjs +3 -3
- package/esm2022/lib/directives/text-highlight/text-highlight.module.mjs +4 -4
- package/esm2022/lib/directives/text-selection/text-selection.directive.mjs +3 -3
- package/esm2022/lib/directives/text-selection/text-selection.module.mjs +4 -4
- package/esm2022/lib/directives/toggle/toggle.directive.mjs +9 -9
- package/esm2022/lib/directives/toggle/toggle.module.mjs +4 -4
- package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +3 -3
- package/esm2022/lib/directives/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +3 -3
- package/esm2022/lib/directives/tooltip/tooltip.module.mjs +4 -4
- package/esm2022/lib/drop-down/drop-down-group.component.mjs +3 -3
- package/esm2022/lib/drop-down/drop-down-item.base.mjs +3 -3
- package/esm2022/lib/drop-down/drop-down-item.component.mjs +3 -3
- package/esm2022/lib/drop-down/drop-down-navigation.directive.mjs +3 -3
- package/esm2022/lib/drop-down/drop-down.base.mjs +3 -3
- package/esm2022/lib/drop-down/drop-down.component.mjs +6 -6
- package/esm2022/lib/drop-down/drop-down.module.mjs +4 -4
- package/esm2022/lib/expansion-panel/expansion-panel-body.component.mjs +3 -3
- package/esm2022/lib/expansion-panel/expansion-panel-header.component.mjs +3 -3
- package/esm2022/lib/expansion-panel/expansion-panel.common.mjs +3 -3
- package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +3 -3
- package/esm2022/lib/expansion-panel/expansion-panel.directives.mjs +9 -9
- package/esm2022/lib/expansion-panel/expansion-panel.module.mjs +4 -4
- package/esm2022/lib/expansion-panel/toggle-animation-component.mjs +3 -3
- package/esm2022/lib/grids/api.service.mjs +3 -3
- package/esm2022/lib/grids/cell.component.mjs +3 -3
- package/esm2022/lib/grids/column-actions/column-actions-base.directive.mjs +3 -3
- package/esm2022/lib/grids/column-actions/column-actions.component.mjs +12 -12
- package/esm2022/lib/grids/column-actions/column-hiding.directive.mjs +3 -3
- package/esm2022/lib/grids/column-actions/column-pinning.directive.mjs +3 -3
- package/esm2022/lib/grids/columns/column-group.component.mjs +3 -3
- package/esm2022/lib/grids/columns/column-layout.component.mjs +3 -3
- package/esm2022/lib/grids/columns/column.component.mjs +5 -5
- package/esm2022/lib/grids/columns/templates.directive.mjs +24 -24
- package/esm2022/lib/grids/columns/validators.directive.mjs +21 -21
- package/esm2022/lib/grids/common/crud.service.mjs +3 -3
- package/esm2022/lib/grids/common/pipes.mjs +54 -54
- package/esm2022/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/base-filtering.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-clear-filters.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +9 -9
- package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-hiding.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-pinning.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +6 -6
- package/esm2022/lib/grids/filtering/excel-style/excel-style-selecting.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
- package/esm2022/lib/grids/filtering/grid-filtering.service.mjs +3 -3
- package/esm2022/lib/grids/grid/expandable-cell.component.mjs +3 -3
- package/esm2022/lib/grids/grid/grid-api.service.mjs +3 -3
- package/esm2022/lib/grids/grid/grid-row.component.mjs +3 -3
- package/esm2022/lib/grids/grid/grid-validation.service.mjs +3 -3
- package/esm2022/lib/grids/grid/grid.component.mjs +3 -3
- package/esm2022/lib/grids/grid/grid.details.pipe.mjs +3 -3
- package/esm2022/lib/grids/grid/grid.module.mjs +4 -4
- package/esm2022/lib/grids/grid/grid.pipes.mjs +12 -12
- package/esm2022/lib/grids/grid/grid.summary.pipe.mjs +3 -3
- package/esm2022/lib/grids/grid/groupby-row.component.mjs +3 -3
- package/esm2022/lib/grids/grid-base.directive.mjs +3 -3
- package/esm2022/lib/grids/grid-footer/grid-footer.component.mjs +3 -3
- package/esm2022/lib/grids/grid-mrl-navigation.service.mjs +3 -3
- package/esm2022/lib/grids/grid-navigation.service.mjs +3 -3
- package/esm2022/lib/grids/grid.common.mjs +3 -3
- package/esm2022/lib/grids/grid.directives.mjs +33 -33
- package/esm2022/lib/grids/grid.rowEdit.directive.mjs +15 -15
- package/esm2022/lib/grids/grouping/grid-group-by-area.component.mjs +3 -3
- package/esm2022/lib/grids/grouping/group-by-area.directive.mjs +6 -6
- package/esm2022/lib/grids/grouping/tree-grid-group-by-area.component.mjs +3 -3
- package/esm2022/lib/grids/headers/grid-header-group.component.mjs +3 -3
- package/esm2022/lib/grids/headers/grid-header-row.component.mjs +3 -3
- package/esm2022/lib/grids/headers/grid-header.component.mjs +3 -3
- package/esm2022/lib/grids/headers/pipes.mjs +9 -9
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-cell.component.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-api.service.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-base.directive.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-navigation.service.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +31 -24
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.module.mjs +4 -4
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.pipes.mjs +6 -6
- package/esm2022/lib/grids/hierarchical-grid/hierarchical-row.component.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/row-island-api.service.mjs +3 -3
- package/esm2022/lib/grids/hierarchical-grid/row-island.component.mjs +3 -3
- package/esm2022/lib/grids/moving/moving.drag.directive.mjs +3 -3
- package/esm2022/lib/grids/moving/moving.drop.directive.mjs +3 -3
- package/esm2022/lib/grids/moving/moving.service.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-filtering.service.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-grid-navigation.service.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-grid.directives.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-grid.module.mjs +4 -4
- package/esm2022/lib/grids/pivot-grid/pivot-grid.pipes.mjs +30 -30
- package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-row.component.mjs +3 -3
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resize-handle.directive.mjs +3 -3
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizer.component.mjs +3 -3
- package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizing.service.mjs +3 -3
- package/esm2022/lib/grids/resizing/resize-handle.directive.mjs +3 -3
- package/esm2022/lib/grids/resizing/resizer.component.mjs +3 -3
- package/esm2022/lib/grids/resizing/resizer.directive.mjs +3 -3
- package/esm2022/lib/grids/resizing/resizing.service.mjs +3 -3
- package/esm2022/lib/grids/row-drag.directive.mjs +9 -9
- package/esm2022/lib/grids/row.directive.mjs +3 -3
- package/esm2022/lib/grids/selection/drag-select.directive.mjs +3 -3
- package/esm2022/lib/grids/selection/row-selectors.mjs +9 -9
- package/esm2022/lib/grids/selection/selection.service.mjs +3 -3
- package/esm2022/lib/grids/state.directive.mjs +8 -5
- package/esm2022/lib/grids/summaries/grid-root-summary.pipe.mjs +3 -3
- package/esm2022/lib/grids/summaries/grid-summary.service.mjs +3 -3
- package/esm2022/lib/grids/summaries/summary-cell.component.mjs +3 -3
- package/esm2022/lib/grids/summaries/summary-row.component.mjs +3 -3
- package/esm2022/lib/grids/toolbar/common.mjs +15 -15
- package/esm2022/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.mjs +3 -3
- package/esm2022/lib/grids/toolbar/grid-toolbar-exporter.component.mjs +3 -3
- package/esm2022/lib/grids/toolbar/grid-toolbar-hiding.component.mjs +3 -3
- package/esm2022/lib/grids/toolbar/grid-toolbar-pinning.component.mjs +3 -3
- package/esm2022/lib/grids/toolbar/grid-toolbar.base.mjs +6 -6
- package/esm2022/lib/grids/toolbar/grid-toolbar.component.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-cell.component.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid-api.service.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid-row.component.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid-selection.service.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid.directives.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid.filtering.pipe.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid.grouping.pipe.mjs +3 -3
- package/esm2022/lib/grids/tree-grid/tree-grid.module.mjs +4 -4
- package/esm2022/lib/grids/tree-grid/tree-grid.pipes.mjs +21 -21
- package/esm2022/lib/grids/tree-grid/tree-grid.summary.pipe.mjs +3 -3
- package/esm2022/lib/icon/icon.component.mjs +3 -3
- package/esm2022/lib/icon/icon.module.mjs +4 -4
- package/esm2022/lib/icon/icon.service.mjs +3 -3
- package/esm2022/lib/input-group/input-group.component.mjs +3 -3
- package/esm2022/lib/input-group/input-group.module.mjs +4 -4
- package/esm2022/lib/list/list-item.component.mjs +3 -3
- package/esm2022/lib/list/list.common.mjs +15 -15
- package/esm2022/lib/list/list.component.mjs +18 -18
- package/esm2022/lib/list/list.module.mjs +4 -4
- package/esm2022/lib/navbar/navbar.component.mjs +9 -9
- package/esm2022/lib/navbar/navbar.module.mjs +4 -4
- package/esm2022/lib/navigation-drawer/navigation-drawer.component.mjs +3 -3
- package/esm2022/lib/navigation-drawer/navigation-drawer.directives.mjs +9 -9
- package/esm2022/lib/navigation-drawer/navigation-drawer.module.mjs +4 -4
- package/esm2022/lib/paginator/paginator-interfaces.mjs +3 -3
- package/esm2022/lib/paginator/paginator.component.mjs +12 -12
- package/esm2022/lib/paginator/paginator.module.mjs +4 -4
- package/esm2022/lib/progressbar/progressbar.common.mjs +6 -6
- package/esm2022/lib/progressbar/progressbar.component.mjs +9 -9
- package/esm2022/lib/progressbar/progressbar.module.mjs +4 -4
- package/esm2022/lib/query-builder/query-builder-header.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder.component.mjs +6 -6
- package/esm2022/lib/query-builder/query-builder.module.mjs +4 -4
- package/esm2022/lib/radio/radio.component.mjs +3 -3
- package/esm2022/lib/select/select-group.component.mjs +3 -3
- package/esm2022/lib/select/select-item.component.mjs +3 -3
- package/esm2022/lib/select/select-navigation.directive.mjs +3 -3
- package/esm2022/lib/select/select.component.mjs +13 -21
- package/esm2022/lib/select/select.module.mjs +4 -4
- package/esm2022/lib/services/animation/angular-animation-service.mjs +3 -3
- package/esm2022/lib/services/csv/csv-exporter.mjs +3 -3
- package/esm2022/lib/services/direction/directionality.mjs +3 -3
- package/esm2022/lib/services/excel/excel-exporter.mjs +3 -3
- package/esm2022/lib/services/excel/excel-files.mjs +5 -4
- package/esm2022/lib/services/exporter-common/base-export-service.mjs +2 -2
- package/esm2022/lib/services/overlay/overlay.mjs +3 -3
- package/esm2022/lib/services/transaction/transaction-factory.service.mjs +6 -6
- package/esm2022/lib/simple-combo/simple-combo.component.mjs +3 -3
- package/esm2022/lib/simple-combo/simple-combo.module.mjs +4 -4
- package/esm2022/lib/slider/label/thumb-label.component.mjs +3 -3
- package/esm2022/lib/slider/slider.common.mjs +9 -9
- package/esm2022/lib/slider/slider.component.mjs +3 -3
- package/esm2022/lib/slider/slider.module.mjs +4 -4
- package/esm2022/lib/slider/thumb/thumb-slider.component.mjs +3 -3
- package/esm2022/lib/slider/ticks/tick.pipe.mjs +3 -3
- package/esm2022/lib/slider/ticks/ticks.component.mjs +3 -3
- package/esm2022/lib/snackbar/snackbar.component.mjs +3 -3
- package/esm2022/lib/snackbar/snackbar.module.mjs +4 -4
- package/esm2022/lib/splitter/splitter-pane/splitter-pane.component.mjs +3 -3
- package/esm2022/lib/splitter/splitter.component.mjs +6 -6
- package/esm2022/lib/splitter/splitter.module.mjs +4 -4
- package/esm2022/lib/stepper/step/step.component.mjs +3 -3
- package/esm2022/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/stepper/stepper.directive.mjs +21 -21
- package/esm2022/lib/stepper/stepper.module.mjs +4 -4
- package/esm2022/lib/stepper/stepper.service.mjs +3 -3
- package/esm2022/lib/switch/switch.component.mjs +3 -3
- package/esm2022/lib/switch/switch.module.mjs +4 -4
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-content.component.mjs +3 -3
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-header.component.mjs +3 -3
- package/esm2022/lib/tabs/bottom-nav/bottom-nav-item.component.mjs +3 -3
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.component.mjs +3 -3
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.directives.mjs +6 -6
- package/esm2022/lib/tabs/bottom-nav/bottom-nav.module.mjs +4 -4
- package/esm2022/lib/tabs/tab-content.directive.mjs +3 -3
- package/esm2022/lib/tabs/tab-header.directive.mjs +3 -3
- package/esm2022/lib/tabs/tab-item.directive.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tab-content.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tab-header.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tab-item.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tabs.directives.mjs +6 -6
- package/esm2022/lib/tabs/tabs/tabs.module.mjs +4 -4
- package/esm2022/lib/tabs/tabs.directive.mjs +3 -3
- package/esm2022/lib/time-picker/time-picker.component.mjs +3 -3
- package/esm2022/lib/time-picker/time-picker.directives.mjs +6 -6
- package/esm2022/lib/time-picker/time-picker.module.mjs +4 -4
- package/esm2022/lib/time-picker/time-picker.pipes.mjs +6 -6
- package/esm2022/lib/toast/toast.component.mjs +3 -3
- package/esm2022/lib/toast/toast.module.mjs +4 -4
- package/esm2022/lib/tree/tree-navigation.service.mjs +3 -3
- package/esm2022/lib/tree/tree-node/tree-node.component.mjs +6 -6
- package/esm2022/lib/tree/tree-selection.service.mjs +3 -3
- package/esm2022/lib/tree/tree.component.mjs +9 -9
- package/esm2022/lib/tree/tree.module.mjs +4 -4
- package/esm2022/lib/tree/tree.service.mjs +3 -3
- package/fesm2022/igniteui-angular.mjs +1655 -1633
- package/fesm2022/igniteui-angular.mjs.map +1 -1
- package/lib/core/density.d.ts +0 -1
- package/lib/core/selection.d.ts +5 -0
- package/lib/core/styles/components/button/_button-theme.scss +0 -6
- package/lib/core/styles/components/grid/_excel-filtering-theme.scss +5 -0
- package/lib/core/styles/components/grid/_grid-theme.scss +6 -0
- package/lib/directives/autocomplete/autocomplete.directive.d.ts +1 -1
- package/lib/grids/filtering/base/grid-filtering-row.component.d.ts +2 -2
- package/lib/grids/filtering/excel-style/excel-style-default-expression.component.d.ts +1 -1
- package/lib/grids/filtering/excel-style/excel-style-filtering.component.d.ts +1 -1
- package/lib/grids/grid-base.directive.d.ts +1 -1
- package/lib/grids/hierarchical-grid/hierarchical-grid.component.d.ts +4 -0
- package/lib/grids/state.directive.d.ts +3 -0
- package/lib/select/select.component.d.ts +0 -4
- package/lib/tabs/tab-content.directive.d.ts +1 -1
- package/package.json +1 -1
- package/schematics/tsconfig.tsbuildinfo +1 -1
- package/styles/igniteui-bootstrap-dark.css +1 -1
- package/styles/igniteui-bootstrap-light.css +1 -1
- package/styles/maps/igniteui-angular-dark.css.map +1 -1
- package/styles/maps/igniteui-angular.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
- package/styles/maps/igniteui-dark-green.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-light.css.map +1 -1
- package/styles/maps/igniteui-indigo-dark.css.map +1 -1
- package/styles/maps/igniteui-indigo-light.css.map +1 -1
|
@@ -320,7 +320,7 @@ export class WorksheetFile {
|
|
|
320
320
|
if (worksheetData.hasSummaries && (isValidRecordType || (worksheetData.isGroupedGrid && isSummaryRecord))) {
|
|
321
321
|
this.setSummaryCoordinates(columnName, key, fullRow.hierarchicalOwner, worksheetData.isGroupedGrid && isSummaryRecord);
|
|
322
322
|
}
|
|
323
|
-
if (fullRow.summaryKey && fullRow.summaryKey === GRID_ROOT_SUMMARY && key !== GRID_LEVEL_COL &&
|
|
323
|
+
if (fullRow.summaryKey && fullRow.summaryKey === GRID_ROOT_SUMMARY && key !== GRID_LEVEL_COL && worksheetData.isGroupedGrid) {
|
|
324
324
|
this.setRootSummaryStartCoordinate(column, key);
|
|
325
325
|
if (this.firstColumn > column) {
|
|
326
326
|
this.setRootSummaryStartCoordinate(worksheetData.columnCount + 1, GRID_LEVEL_COL);
|
|
@@ -464,8 +464,9 @@ export class WorksheetFile {
|
|
|
464
464
|
}
|
|
465
465
|
setRootSummaryStartCoordinate(column, key) {
|
|
466
466
|
const firstDataRecordColName = ExcelStrings.getExcelColumn(column) + (this.firstDataRow);
|
|
467
|
-
|
|
468
|
-
|
|
467
|
+
const targetMap = this.hierarchicalDimensionMap.get(GRID_PARENT);
|
|
468
|
+
if (targetMap.get(key).startCoordinate !== firstDataRecordColName) {
|
|
469
|
+
targetMap.get(key).startCoordinate = firstDataRecordColName;
|
|
469
470
|
}
|
|
470
471
|
}
|
|
471
472
|
printHeaders(worksheetData, headersForLevel, i, isVertical) {
|
|
@@ -621,4 +622,4 @@ export class WorksheetRelsFile {
|
|
|
621
622
|
folder['sheet1.xml.rels'] = strToU8(ExcelStrings.getWorksheetRels());
|
|
622
623
|
}
|
|
623
624
|
}
|
|
624
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvZXhjZWwvZXhjZWwtZmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBMkMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXJMOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDZCxZQUFZLENBQUMsTUFBYztRQUM5QixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDSjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDVCxZQUFZLENBQUMsTUFBYyxFQUFFLGFBQTRCO1FBQzVELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNKO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNWLFlBQVksQ0FBQyxNQUFjO1FBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLFlBQVksQ0FBQyxNQUFjLEVB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O0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRXhjZWxGaWxlIH0gZnJvbSAnLi9leGNlbC1pbnRlcmZhY2VzJztcbmltcG9ydCB7IEV4Y2VsU3RyaW5ncyB9IGZyb20gJy4vZXhjZWwtc3RyaW5ncyc7XG5pbXBvcnQgeyBXb3Jrc2hlZXREYXRhIH0gZnJvbSAnLi93b3Jrc2hlZXQtZGF0YSc7XG5cbmltcG9ydCB7IHN0clRvVTggfSBmcm9tICdmZmxhdGUnO1xuaW1wb3J0IHsgeWllbGRpbmdMb29wIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBFeHBvcnRIZWFkZXJUeXBlLCBFeHBvcnRSZWNvcmRUeXBlLCBJRXhwb3J0UmVjb3JkLCBJQ29sdW1uTGlzdCwgSUNvbHVtbkluZm8sIEdSSURfUk9PVF9TVU1NQVJZLCBHUklEX1BBUkVOVCwgR1JJRF9MRVZFTF9DT0wgfSBmcm9tICcuLi9leHBvcnRlci1jb21tb24vYmFzZS1leHBvcnQtc2VydmljZSc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgUm9vdFJlbHNGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCkge1xuICAgICAgICBmb2xkZXJbJy5yZWxzJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRSZWxzKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICBmb2xkZXJbJ2FwcC54bWwnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldEFwcCh3b3Jrc2hlZXREYXRhLm9wdGlvbnMud29ya3NoZWV0TmFtZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QpIHtcbiAgICAgICAgZm9sZGVyWydjb3JlLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0Q29yZSgpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tSZWxzRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QsIHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzU2hhcmVkU3RyaW5ncyA9ICF3b3Jrc2hlZXREYXRhLmlzRW1wdHkgfHwgd29ya3NoZWV0RGF0YS5vcHRpb25zLmFsd2F5c0V4cG9ydEhlYWRlcnM7XG4gICAgICAgIGZvbGRlclsnd29ya2Jvb2sueG1sLnJlbHMnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldFdvcmtib29rUmVscyhoYXNTaGFyZWRTdHJpbmdzKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFRoZW1lRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QpIHtcbiAgICAgICAgZm9sZGVyWyd0aGVtZTEueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRUaGVtZSgpKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBEaW1lbnNpb25zIHtcbiAgICBzdGFydENvb3JkaW5hdGU6IHN0cmluZ1xuICAgIGVuZENvb3JkaW5hdGU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ3VycmVuY3lJbmZvIHtcbiAgICBzdHlsZVhmOiBudW1iZXJcbiAgICBzeW1ib2w6IHN0cmluZ1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwcml2YXRlIHN0YXRpYyBNSU5fV0lEVEggPSA4LjQzO1xuICAgIHByaXZhdGUgbWF4T3V0bGluZUxldmVsID0gMDtcbiAgICBwcml2YXRlIHNoZWV0RGF0YSA9ICcnO1xuICAgIHByaXZhdGUgZGltZW5zaW9uID0gJyc7XG4gICAgcHJpdmF0ZSBmcmVlemVQYW5lID0gJyc7XG4gICAgcHJpdmF0ZSByb3dIZWlnaHQgPSAnJztcblxuICAgIHByaXZhdGUgbWVyZ2VDZWxsU3RyID0gJyc7XG4gICAgcHJpdmF0ZSBtZXJnZUNlbGxzQ291bnRlciA9IDA7XG4gICAgcHJpdmF0ZSByb3dJbmRleCA9IDA7XG4gICAgcHJpdmF0ZSBwaXZvdEdyaWRSb3dIZWFkZXJzTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICAgIHByaXZhdGUgZGltZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBEaW1lbnNpb25zPiA9IG5ldyBNYXA8c3RyaW5nLCBEaW1lbnNpb25zPigpO1xuICAgIHByaXZhdGUgaGllcmFyY2hpY2FsRGltZW5zaW9uTWFwOiBNYXA8YW55LCAgTWFwPHN0cmluZywgRGltZW5zaW9ucz4+ID0gbmV3IE1hcDxhbnksICBNYXA8c3RyaW5nLCBEaW1lbnNpb25zPj4oKTtcbiAgICBwcml2YXRlIGN1cnJlbnRTdW1tYXJ5T3duZXIgPSAnJztcbiAgICBwcml2YXRlIGN1cnJlbnRIaWVyYXJjaGljYWxPd25lciA9ICcnO1xuICAgIHByaXZhdGUgZmlyc3RDb2x1bW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHByaXZhdGUgZmlyc3REYXRhUm93ID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICBwcml2YXRlIGlzVmFsaWRHcmlkOiBib29sZWFuO1xuICAgIHByaXZhdGUgbGFzdFZhbGlkUm93OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGN1cnJlbmN5U3R5bGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ3VycmVuY3lJbmZvPihbXG4gICAgICAgIFsnVVNEJywge3N0eWxlWGY6IDUsIHN5bWJvbDogJyQnfV0sXG4gICAgICAgIFsnR0JQJywge3N0eWxlWGY6IDYsIHN5bWJvbDogJ8KjJ31dLFxuICAgICAgICBbJ0NOWScsIHtzdHlsZVhmOiA3LCBzeW1ib2w6ICfCpSd9XSxcbiAgICAgICAgWydFVVInLCB7c3R5bGVYZjogOCwgc3ltYm9sOiAn4oKsJ31dLFxuICAgICAgICBbJ0pQWScsIHtzdHlsZVhmOiA5LCBzeW1ib2w6ICfCpSd9XSxcbiAgICBdKTtcblxuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoKSB7fVxuXG4gICAgcHVibGljIGFzeW5jIHdyaXRlRWxlbWVudEFzeW5jKGZvbGRlcjogT2JqZWN0LCB3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZURhdGFBc3luYyh3b3Jrc2hlZXREYXRhLCAoY29scywgcm93cykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1RhYmxlID0gKCF3b3Jrc2hlZXREYXRhLmlzRW1wdHkgfHwgd29ya3NoZWV0RGF0YS5vcHRpb25zLmFsd2F5c0V4cG9ydEhlYWRlcnMpXG4gICAgICAgICAgICAgICAgICAgICYmIHdvcmtzaGVldERhdGEub3B0aW9ucy5leHBvcnRBc1RhYmxlO1xuXG4gICAgICAgICAgICAgICAgZm9sZGVyWydzaGVldDEueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRTaGVldFhNTChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaW1lbnNpb24sIHRoaXMuZnJlZXplUGFuZSwgY29scywgcm93cywgaGFzVGFibGUsIHRoaXMubWF4T3V0bGluZUxldmVsLCB3b3Jrc2hlZXREYXRhLmlzSGllcmFyY2hpY2FsKSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZURhdGFBc3luYyh3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhLCBkb25lOiAoY29sczogc3RyaW5nLCBzaGVldERhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLnNoZWV0RGF0YSA9ICcnO1xuICAgICAgICBsZXQgY29scyA9ICcnO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gd29ya3NoZWV0RGF0YS5kYXRhRGljdGlvbmFyeTtcbiAgICAgICAgdGhpcy5yb3dJbmRleCA9IDA7XG5cbiAgICAgICAgaWYgKHdvcmtzaGVldERhdGEuaXNFbXB0eSAmJiAoIXdvcmtzaGVldERhdGEub3B0aW9ucy5hbHdheXNFeHBvcnRIZWFkZXJzIHx8IHdvcmtzaGVldERhdGEub3duZXIuY29sdW1ucy5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSAnPHNoZWV0RGF0YS8+JztcbiAgICAgICAgICAgIHRoaXMuZGltZW5zaW9uID0gJ0ExJztcbiAgICAgICAgICAgIGRvbmUoJycsIHRoaXMuc2hlZXREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVyID0gd29ya3NoZWV0RGF0YS5vd25lcjtcbiAgICAgICAgICAgIGNvbnN0IGlzSGllcmFyY2hpY2FsR3JpZCA9IHdvcmtzaGVldERhdGEuaXNIaWVyYXJjaGljYWw7XG4gICAgICAgICAgICBjb25zdCBoYXNNdWx0aUNvbHVtbkhlYWRlciA9IHdvcmtzaGVldERhdGEuaGFzTXVsdGlDb2x1bW5IZWFkZXI7XG4gICAgICAgICAgICBjb25zdCBoYXNNdWx0aVJvd0hlYWRlciA9IHdvcmtzaGVldERhdGEuaGFzTXVsdGlSb3dIZWFkZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhc1VzZXJTZXRJbmRleCA9IG93bmVyLmNvbHVtbnMuc29tZShjb2wgPT4gY29sLmV4cG9ydEluZGV4ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAgd29ya3NoZWV0RGF0YS5vcHRpb25zLnJvd0hlaWdodDtcblxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkR3JpZCA9IHdvcmtzaGVldERhdGEuaXNIaWVyYXJjaGljYWwgfHwgd29ya3NoZWV0RGF0YS5pc1RyZWVHcmlkIHx8IHdvcmtzaGVldERhdGEuaXNHcm91cGVkR3JpZDtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gaGVpZ2h0ID8gYCBodD1cIiR7aGVpZ2h0fVwiIGN1c3RvbUhlaWdodD1cIjFcImAgOiAnJztcbiAgICAgICAgICAgIHRoaXMuc2hlZXREYXRhICs9IGA8c2hlZXREYXRhPmA7XG5cbiAgICAgICAgICAgIGxldCBoZWFkZXJzRm9yTGV2ZWw6IElDb2x1bW5JbmZvW10gPSBbXTtcblxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8PSBvd25lci5tYXhSb3dMZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc0ZvckxldmVsID0gIG93bmVyLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5sZXZlbCA9PT0gaSAmJiBjLnJvd1NwYW4gPiAwICYmICFjLnNraXApXG5cbiAgICAgICAgICAgICAgICB0aGlzLnByaW50SGVhZGVycyh3b3Jrc2hlZXREYXRhLCBoZWFkZXJzRm9yTGV2ZWwsIGksIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dJbmRleCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd0luZGV4ID0gMDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gb3duZXIubWF4TGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucm93SW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb25zdCBwaXZvdEdyaWRDb2x1bW5zID0gdGhpcy5waXZvdEdyaWRSb3dIZWFkZXJzTWFwLmdldCh0aGlzLnJvd0luZGV4KSA/PyBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hlZXREYXRhICs9IGA8cm93IHI9XCIke3RoaXMucm93SW5kZXh9XCIke3RoaXMucm93SGVpZ2h0fT4ke3Bpdm90R3JpZENvbHVtbnN9YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRDb2x1bW5zID0gb3duZXIuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmhlYWRlclR5cGUgIT09IEV4cG9ydEhlYWRlclR5cGUuUm93SGVhZGVyICYmIGMuaGVhZGVyVHlwZSAhPT0gRXhwb3J0SGVhZGVyVHlwZS5NdWx0aVJvd0hlYWRlcik7XG5cbiAgICAgICAgICAgICAgICBoZWFkZXJzRm9yTGV2ZWwgPSBoYXNNdWx0aUNvbHVtbkhlYWRlciA/XG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgPT4gKGMubGV2ZWwgPCBpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5oZWFkZXJUeXBlICE9PSBFeHBvcnRIZWFkZXJUeXBlLk11bHRpQ29sdW1uSGVhZGVyIHx8IGMubGV2ZWwgPT09IGkpICYmIGMuY29sdW1uU3BhbiA+IDAgJiYgIWMuc2tpcClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0SW5kZXggLSBiLnN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5waW5uZWRJbmRleCAtIGIucGlubmVkSW5kZXgpIDpcbiAgICAgICAgICAgICAgICAgICAgaGFzVXNlclNldEluZGV4ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLnNraXApIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLnNraXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRJbmRleCAtIGIuc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5waW5uZWRJbmRleCAtIGIucGlubmVkSW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludEhlYWRlcnMod29ya3NoZWV0RGF0YSwgaGVhZGVyc0ZvckxldmVsLCBpLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSBgPC9yb3c+YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbXVsdGlDb2x1bW5IZWFkZXJMZXZlbCA9IHdvcmtzaGVldERhdGEub3B0aW9ucy5pZ25vcmVNdWx0aUNvbHVtbkhlYWRlcnMgPyAwIDogb3duZXIubWF4TGV2ZWw7XG4gICAgICAgICAgICBjb25zdCBmcmVlemVIZWFkZXJzID0gd29ya3NoZWV0RGF0YS5vcHRpb25zLmZyZWV6ZUhlYWRlcnMgPyAyICsgbXVsdGlDb2x1bW5IZWFkZXJMZXZlbCA6IDE7XG5cbiAgICAgICAgICAgIGlmICghaXNIaWVyYXJjaGljYWxHcmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gd29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMgPyB3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50ICsgMSA6IHdvcmtzaGVldERhdGEuY29sdW1uQ291bnQgLSAxXG4gICAgICAgICAgICAgICAgdGhpcy5kaW1lbnNpb24gPSAnQTE6JyArIEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihjb2wpICsgKHdvcmtzaGVldERhdGEucm93Q291bnQpO1xuXG4gICAgICAgICAgICAgICAgY29scyArPSAnPGNvbHM+JztcblxuICAgICAgICAgICAgICAgIGlmICghaGFzTXVsdGlDb2x1bW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gZGljdGlvbmFyeS5jb2x1bW5XaWR0aHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHdpZHRoIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoSW5Ud2lwcyA9IHdvcmtzaGVldERhdGEub3B0aW9ucy5jb2x1bW5XaWR0aCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldERhdGEub3B0aW9ucy5jb2x1bW5XaWR0aCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgoKHdpZHRoIC8gOTYpICogMTQuNCksIFdvcmtzaGVldEZpbGUuTUlOX1dJRFRIKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdpZHRoSW5Ud2lwcyA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhJblR3aXBzID0gV29ya3NoZWV0RmlsZS5NSU5fV0lEVEg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgKz0gYDxjb2wgbWluPVwiJHsoaiArIDEpfVwiIG1heD1cIiR7KGogKyAxKX1cIiB3aWR0aD1cIiR7d2lkdGhJblR3aXBzfVwiIGN1c3RvbVdpZHRoPVwiMVwiLz5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29scyArPSBgPGNvbCBtaW49XCIxXCIgbWF4PVwiJHt3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50fVwiIHdpZHRoPVwiMTVcIiBjdXN0b21XaWR0aD1cIjFcIi8+YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mTGFzdFBpbm5lZENvbHVtbiA9IHdvcmtzaGVldERhdGEuaW5kZXhPZkxhc3RQaW5uZWRDb2x1bW47XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvemVuQ29sdW1uQ291bnQgPSBpbmRleE9mTGFzdFBpbm5lZENvbHVtbiArIDE7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0Q2VsbCA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihmcm96ZW5Db2x1bW5Db3VudCkgKyBmcmVlemVIZWFkZXJzO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mTGFzdFBpbm5lZENvbHVtbiAhPT0gdW5kZWZpbmVkICYmIGluZGV4T2ZMYXN0UGlubmVkQ29sdW1uICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAhd29ya3NoZWV0RGF0YS5vcHRpb25zLmlnbm9yZVBpbm5pbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtzaGVldERhdGEub3B0aW9ucy5pZ25vcmVDb2x1bW5zT3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmVlemVQYW5lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGA8cGFuZSB4U3BsaXQ9XCIke2Zyb3plbkNvbHVtbkNvdW50fVwiIHlTcGxpdD1cIiR7ZnJlZXplSGVhZGVycyAtIDF9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0Q2VsbD1cIiR7Zmlyc3RDZWxsfVwiIGFjdGl2ZVBhbmU9XCJ0b3BSaWdodFwiIHN0YXRlPVwiZnJvemVuXCIvPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3b3Jrc2hlZXREYXRhLm9wdGlvbnMuZnJlZXplSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdENlbGwgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oMCkgKyBmcmVlemVIZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVBhbmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgYDxwYW5lIHhTcGxpdD1cIjBcIiB5U3BsaXQ9XCIke2ZyZWV6ZUhlYWRlcnMgLSAxfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdENlbGw9XCIke2ZpcnN0Q2VsbH1cIiBhY3RpdmVQYW5lPVwidG9wUmlnaHRcIiBzdGF0ZT1cImZyb3plblwiLz5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuY29sdW1uV2lkdGggPyB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuY29sdW1uV2lkdGggOiAyMDtcbiAgICAgICAgICAgICAgICBjb2xzICs9IGA8Y29scz48Y29sIG1pbj1cIjFcIiBtYXg9XCIke3dvcmtzaGVldERhdGEuY29sdW1uQ291bnR9XCIgd2lkdGg9XCIke2NvbHVtbldpZHRofVwiIGN1c3RvbVdpZHRoPVwiMVwiLz5gO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldERhdGEub3B0aW9ucy5mcmVlemVIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2VsbCA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbigwKSArIGZyZWV6ZUhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJlZXplUGFuZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBgPHBhbmUgeFNwbGl0PVwiMFwiIHlTcGxpdD1cIiR7ZnJlZXplSGVhZGVycyAtIDF9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0Q2VsbD1cIiR7Zmlyc3RDZWxsfVwiIGFjdGl2ZVBhbmU9XCJ0b3BSaWdodFwiIHN0YXRlPVwiZnJvemVuXCIvPmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb2xzICs9IGA8Y29sIG1pbj1cIiR7d29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDJ9XCIgbWF4PVwiJHt3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50ICsgMn1cIiBoaWRkZW49XCIxXCIvPmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbHMgKz0gJzwvY29scz4nO1xuXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEYXRhUmVjb3Jkc0FzeW5jKHdvcmtzaGVldERhdGEsIChyb3dzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGVldERhdGEgKz0gcm93cztcbiAgICAgICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSAnPC9zaGVldERhdGE+JztcblxuICAgICAgICAgICAgICAgIGlmICgoaGFzTXVsdGlDb2x1bW5IZWFkZXIgfHwgaGFzTXVsdGlSb3dIZWFkZXIpICYmIHRoaXMubWVyZ2VDZWxsc0NvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlZXREYXRhICs9IGA8bWVyZ2VDZWxscyBjb3VudD1cIiR7dGhpcy5tZXJnZUNlbGxzQ291bnRlcn1cIj4ke3RoaXMubWVyZ2VDZWxsU3RyfTwvbWVyZ2VDZWxscz5gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUoY29scywgdGhpcy5zaGVldERhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NEYXRhUmVjb3Jkc0FzeW5jKHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEsIGRvbmU6IChyb3dzOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICAgICAgY29uc3Qgcm93RGF0YUFyciA9IFtdO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSAgd29ya3NoZWV0RGF0YS5vcHRpb25zLnJvd0hlaWdodDtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBoZWlnaHQgPyAnIGh0PVwiJyArIGhlaWdodCArICdcIiBjdXN0b21IZWlnaHQ9XCIxXCInIDogJyc7XG5cbiAgICAgICAgY29uc3QgaXNIaWVyYXJjaGljYWxHcmlkID0gd29ya3NoZWV0RGF0YS5pc0hpZXJhcmNoaWNhbDtcbiAgICAgICAgY29uc3QgaGFzVXNlclNldEluZGV4ID0gd29ya3NoZWV0RGF0YS5vd25lci5jb2x1bW5zLnNvbWUoYyA9PiBjLmV4cG9ydEluZGV4ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGxldCByZWNvcmRIZWFkZXJzID0gW107XG5cbiAgICAgICAgeWllbGRpbmdMb29wKHdvcmtzaGVldERhdGEucm93Q291bnQgLSB3b3Jrc2hlZXREYXRhLm11bHRpQ29sdW1uSGVhZGVyUm93cyAtIDEsIDEwMDAsXG4gICAgICAgICAgICAoaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghd29ya3NoZWV0RGF0YS5pc0VtcHR5KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0hpZXJhcmNoaWNhbEdyaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNVc2VyU2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRIZWFkZXJzID0gd29ya3NoZWV0RGF0YS5yb290S2V5cztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkSGVhZGVycyA9IHdvcmtzaGVldERhdGEub3duZXIuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5oZWFkZXJUeXBlID09PSBFeHBvcnRIZWFkZXJUeXBlLkNvbHVtbkhlYWRlciAmJiAhYy5za2lwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5zdGFydEluZGV4LWIuc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucGlubmVkSW5kZXgtYi5waW5uZWRJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChjID0+IGMuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gd29ya3NoZWV0RGF0YS5kYXRhW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuSGVhZGVyUmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkT3duZXIgPSB3b3Jrc2hlZXREYXRhLm93bmVycy5nZXQocmVjb3JkLm93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNNdWx0aUNvbHVtbkhlYWRlcnMgPSByZWNvcmRPd25lci5jb2x1bW5zLnNvbWUoYyA9PiAhYy5za2lwICYmIGMuaGVhZGVyVHlwZSA9PT0gRXhwb3J0SGVhZGVyVHlwZS5NdWx0aUNvbHVtbkhlYWRlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTXVsdGlDb2x1bW5IZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaEdyaWRQcmludE11bHRpQ29sSGVhZGVycyh3b3Jrc2hlZXREYXRhLCByb3dEYXRhQXJyLCByZWNvcmQsIHJlY29yZE93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZEhlYWRlcnMgPSBPYmplY3Qua2V5cyh3b3Jrc2hlZXREYXRhLmRhdGFbaV0uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhQXJyLnB1c2godGhpcy5wcm9jZXNzUm93KHdvcmtzaGVldERhdGEsIGksIHJlY29yZEhlYWRlcnMsIGlzSGllcmFyY2hpY2FsR3JpZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShyb3dEYXRhQXJyLmpvaW4oJycpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoR3JpZFByaW50TXVsdGlDb2xIZWFkZXJzKHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEsIHJvd0RhdGFBcnI6IGFueVtdLCByZWNvcmQ6IElFeHBvcnRSZWNvcmQsXG4gICAgICAgIG93bmVyOiBJQ29sdW1uTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bmVyLm1heExldmVsOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZExldmVsID0gcmVjb3JkLmxldmVsO1xuICAgICAgICAgICAgY29uc3Qgb3V0bGluZUxldmVsID0gcmVjb3JkTGV2ZWwgPiAwID8gYCBvdXRsaW5lTGV2ZWw9XCIke3JlY29yZExldmVsfVwiYCA6ICcnO1xuICAgICAgICAgICAgdGhpcy5tYXhPdXRsaW5lTGV2ZWwgPSB0aGlzLm1heE91dGxpbmVMZXZlbCA8IHJlY29yZExldmVsID8gcmVjb3JkTGV2ZWwgOiB0aGlzLm1heE91dGxpbmVMZXZlbDtcbiAgICAgICAgICAgIGNvbnN0IHNIaWRkZW4gPSByZWNvcmQuaGlkZGVuID8gYCBoaWRkZW49XCIxXCJgIDogJyc7XG5cbiAgICAgICAgICAgIHRoaXMucm93SW5kZXgrKztcbiAgICAgICAgICAgIGxldCByb3cgPSBgPHJvdyByPVwiJHt0aGlzLnJvd0luZGV4fVwiJHt0aGlzLnJvd0hlaWdodH0ke291dGxpbmVMZXZlbH0ke3NIaWRkZW59PmA7XG5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnNGb3JMZXZlbCA9IG93bmVyLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGMgPT4gKGMubGV2ZWwgPCBqICYmXG4gICAgICAgICAgICAgICAgICAgIGMuaGVhZGVyVHlwZSAhPT0gRXhwb3J0SGVhZGVyVHlwZS5NdWx0aUNvbHVtbkhlYWRlciB8fCBjLmxldmVsID09PSBqKSAmJiBjLmNvbHVtblNwYW4gPiAwICYmICFjLnNraXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRJbmRleCAtIGIuc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5waW5uZWRJbmRleCAtIGIucGlubmVkSW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgc3RhcnRWYWx1ZSA9IDAgKyByZWNvcmQubGV2ZWw7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbCBvZiBoZWFkZXJzRm9yTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENvbC5sZXZlbCA9PT0gaikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29sdW1uQ29vcmRpbmF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29vcmRpbmF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oc3RhcnRWYWx1ZSkgKyB0aGlzLnJvd0luZGV4O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gd29ya3NoZWV0RGF0YS5kYXRhRGljdGlvbmFyeS5zYXZlVmFsdWUoY3VycmVudENvbC5oZWFkZXIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYDxjIHI9XCIke2NvbHVtbkNvb3JkaW5hdGV9XCIgcz1cIjNcIiB0PVwic1wiPjx2PiR7Y29sdW1uVmFsdWV9PC92PjwvYz5gO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChqICE9PSBvd25lci5tYXhMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNlbGxzQ291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNlbGxTdHIgKz0gYCA8bWVyZ2VDZWxsIHJlZj1cIiR7Y29sdW1uQ29vcmRpbmF0ZX06YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2wuaGVhZGVyVHlwZSA9PT0gRXhwb3J0SGVhZGVyVHlwZS5Db2x1bW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db29yZGluYXRlID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKHN0YXJ0VmFsdWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucm93SW5kZXggKyBvd25lci5tYXhMZXZlbCAtIGN1cnJlbnRDb2wubGV2ZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMTsgayA8IGN1cnJlbnRDb2wuY29sdW1uU3BhbjsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvb3JkaW5hdGUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oc3RhcnRWYWx1ZSArIGspICsgdGhpcy5yb3dJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93ICs9IGA8YyByPVwiJHtjb2x1bW5Db29yZGluYXRlfVwiIHM9XCIzXCIgLz5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNlbGxTdHIgKz0gYCR7Y29sdW1uQ29vcmRpbmF0ZX1cIiAvPmA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlICs9IGN1cnJlbnRDb2wuY29sdW1uU3BhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvdyArPSBgPC9yb3c+YDtcbiAgICAgICAgICAgIHJvd0RhdGFBcnIucHVzaChyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUm93KHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEsIGk6IG51bWJlciwgaGVhZGVyc0ZvckxldmVsOiBhbnlbXSwgaXNIaWVyYXJjaGljYWxHcmlkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHdvcmtzaGVldERhdGEuZGF0YVtpXTtcblxuICAgICAgICBjb25zdCByb3dEYXRhID0gbmV3IEFycmF5KHdvcmtzaGVldERhdGEuY29sdW1uQ291bnQgKyAyKTtcblxuICAgICAgICBjb25zdCByb3dMZXZlbCA9IHJlY29yZC5sZXZlbDtcbiAgICAgICAgY29uc3Qgb3V0bGluZUxldmVsID0gcm93TGV2ZWwgPiAwID8gYCBvdXRsaW5lTGV2ZWw9XCIke3Jvd0xldmVsfVwiYCA6ICcnO1xuICAgICAgICB0aGlzLm1heE91dGxpbmVMZXZlbCA9IHRoaXMubWF4T3V0bGluZUxldmVsIDwgcm93TGV2ZWwgPyByb3dMZXZlbCA6IHRoaXMubWF4T3V0bGluZUxldmVsO1xuXG4gICAgICAgIGNvbnN0IHNIaWRkZW4gPSByZWNvcmQuaGlkZGVuID8gYCBoaWRkZW49XCIxXCJgIDogJyc7XG5cbiAgICAgICAgdGhpcy5yb3dJbmRleCsrO1xuICAgICAgICBjb25zdCBwaXZvdEdyaWRDb2x1bW5zID0gdGhpcy5waXZvdEdyaWRSb3dIZWFkZXJzTWFwLmdldCh0aGlzLnJvd0luZGV4KSA/PyBcIlwiO1xuXG4gICAgICAgIHJvd0RhdGFbMF0gPSBgPHJvdyByPVwiJHt0aGlzLnJvd0luZGV4fVwiJHt0aGlzLnJvd0hlaWdodH0ke291dGxpbmVMZXZlbH0ke3NIaWRkZW59PiR7cGl2b3RHcmlkQ29sdW1uc31gO1xuICAgICAgICBjb25zdCBrZXlzID0gd29ya3NoZWV0RGF0YS5pc1NwZWNpYWxEYXRhID8gW3JlY29yZC5kYXRhXSA6IGhlYWRlcnNGb3JMZXZlbDtcbiAgICAgICAgY29uc3QgaXNEYXRhUmVjb3JkID0gcmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuSGllcmFyY2hpY2FsR3JpZFJlY29yZFxuICAgICAgICAgICAgfHwgcmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuRGF0YVJlY29yZFxuICAgICAgICAgICAgfHwgcmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuR3JvdXBlZFJlY29yZFxuICAgICAgICAgICAgfHwgcmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuVHJlZUdyaWRSZWNvcmQ7XG5cbiAgICAgICAgY29uc3QgaXNWYWxpZFJlY29yZFR5cGUgPSBpc0RhdGFSZWNvcmQgfHwgcmVjb3JkLnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuU3VtbWFyeVJlY29yZDtcblxuICAgICAgICBpZiAoaXNWYWxpZFJlY29yZFR5cGUgJiYgd29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVN1bW1hcnlEaW1lbnNpb25zKHJlY29yZCwgaXNEYXRhUmVjb3JkLCB3b3Jrc2hlZXREYXRhLmlzR3JvdXBlZEdyaWQpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGogKyAoaXNIaWVyYXJjaGljYWxHcmlkID8gcm93TGV2ZWwgOiB3b3Jrc2hlZXREYXRhLmlzUGl2b3RHcmlkID8gd29ya3NoZWV0RGF0YS5vd25lci5tYXhSb3dMZXZlbCA6IDApO1xuXG4gICAgICAgICAgICBjb25zdCBjZWxsRGF0YSA9IHRoaXMuZ2V0Q2VsbERhdGEod29ya3NoZWV0RGF0YSwgaSwgY29sLCBrZXlzW2pdKTtcblxuICAgICAgICAgICAgcm93RGF0YVtqICsgMV0gPSBjZWxsRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd0RhdGFba2V5cy5sZW5ndGggKyAxXSA9ICc8L3Jvdz4nO1xuXG4gICAgICAgIHJldHVybiByb3dEYXRhLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2VsbERhdGEod29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSwgcm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB3b3Jrc2hlZXREYXRhLmRhdGFEaWN0aW9uYXJ5O1xuICAgICAgICBsZXQgY29sdW1uTmFtZSA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihjb2x1bW4pICsgKHRoaXMucm93SW5kZXgpO1xuICAgICAgICBjb25zdCBmdWxsUm93ID0gd29ya3NoZWV0RGF0YS5kYXRhW3Jvd107XG4gICAgICAgIGNvbnN0IGlzSGVhZGVyUmVjb3JkID0gZnVsbFJvdy50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkhlYWRlclJlY29yZDtcbiAgICAgICAgY29uc3QgaXNTdW1tYXJ5UmVjb3JkID0gZnVsbFJvdy50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLlN1bW1hcnlSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGlzVmFsaWRSZWNvcmRUeXBlID0gZnVsbFJvdy50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkdyb3VwZWRSZWNvcmRcbiAgICAgICAgICAgIHx8IGZ1bGxSb3cudHlwZSA9PT0gRXhwb3J0UmVjb3JkVHlwZS5EYXRhUmVjb3JkXG4gICAgICAgICAgICB8fCBmdWxsUm93LnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuSGllcmFyY2hpY2FsR3JpZFJlY29yZFxuICAgICAgICAgICAgfHwgZnVsbFJvdy50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLlRyZWVHcmlkUmVjb3JkO1xuXG4gICAgICAgIHRoaXMuZmlyc3REYXRhUm93ID0gdGhpcy5maXJzdERhdGFSb3cgPiB0aGlzLnJvd0luZGV4ID8gdGhpcy5yb3dJbmRleCA6IHRoaXMuZmlyc3REYXRhUm93O1xuXG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHdvcmtzaGVldERhdGEuaXNTcGVjaWFsRGF0YSA/XG4gICAgICAgICAgICBmdWxsUm93LmRhdGEgOlxuICAgICAgICAgICAgZnVsbFJvdy5kYXRhW2tleV07XG5cbiAgICAgICAgaWYgKGNlbGxWYWx1ZSA9PT0gR1JJRF9MRVZFTF9DT0wgfHwga2V5ID09PSBHUklEX0xFVkVMX0NPTCkge1xuICAgICAgICAgICAgY29sdW1uTmFtZSA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbih3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50ICsgMSkgKyAodGhpcy5yb3dJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMgJiYgKGlzVmFsaWRSZWNvcmRUeXBlIHx8ICh3b3Jrc2hlZXREYXRhLmlzR3JvdXBlZEdyaWQgJiYgaXNTdW1tYXJ5UmVjb3JkKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3VtbWFyeUNvb3JkaW5hdGVzKGNvbHVtbk5hbWUsIGtleSwgZnVsbFJvdy5oaWVyYXJjaGljYWxPd25lciwgd29ya3NoZWV0RGF0YS5pc0dyb3VwZWRHcmlkICYmIGlzU3VtbWFyeVJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdWxsUm93LnN1bW1hcnlLZXkgJiYgZnVsbFJvdy5zdW1tYXJ5S2V5ID09PSBHUklEX1JPT1RfU1VNTUFSWSAmJiBrZXkgIT09IEdSSURfTEVWRUxfQ09MICYmICF0aGlzLmlzVmFsaWRHcmlkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFJvb3RTdW1tYXJ5U3RhcnRDb29yZGluYXRlKGNvbHVtbiwga2V5KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RDb2x1bW4gPiBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJvb3RTdW1tYXJ5U3RhcnRDb29yZGluYXRlKHdvcmtzaGVldERhdGEuY29sdW1uQ291bnQgKyAxLCBHUklEX0xFVkVMX0NPTCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdENvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldENvbEFyciA9IEFycmF5LmZyb20od29ya3NoZWV0RGF0YS5vd25lcnMudmFsdWVzKCkpLm1hcChhcnIgPT4gYXJyLmNvbHVtbnMpLmZpbmQocHJvZHVjdCA9PiBwcm9kdWN0LnNvbWUoaXRlbSA9PiBpdGVtLmZpZWxkID09PSBrZXkpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29sID0gdGFyZ2V0Q29sQXJyID8gdGFyZ2V0Q29sQXJyLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0ga2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoKGNlbGxWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGNlbGxWYWx1ZSA9PT0gbnVsbCkgJiYgIXdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxjIHI9XCIke2NvbHVtbk5hbWV9XCIgcz1cIjFcIi8+YDtcbiAgICAgICAgfSBlbHNlIGlmICgod29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMgJiYgKGlzVmFsaWRSZWNvcmRUeXBlIHx8IGlzSGVhZGVyUmVjb3JkKSkgfHwgIXdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzYXZlZFZhbHVlID0gZGljdGlvbmFyeS5zYXZlVmFsdWUoY2VsbFZhbHVlLCBpc0hlYWRlclJlY29yZCk7XG4gICAgICAgICAgICBjb25zdCBpc1NhdmVkQXNTdHJpbmcgPSBzYXZlZFZhbHVlICE9PSAtMTtcblxuICAgICAgICAgICAgY29uc3QgaXNTYXZlZEFzRGF0ZSA9ICFpc1NhdmVkQXNTdHJpbmcgJiYgY2VsbFZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gaXNTYXZlZEFzU3RyaW5nID8gc2F2ZWRWYWx1ZSA6IGNlbGxWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGlzU2F2ZWRBc0RhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lWm9uZU9mZnNldCA9IHZhbHVlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcbiAgICAgICAgICAgICAgICBjb25zdCBpc29TdHJpbmcgPSAobmV3IERhdGUodmFsdWUgLSB0aW1lWm9uZU9mZnNldCkpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpc29TdHJpbmcuc3Vic3RyaW5nKDAsIGlzb1N0cmluZy5pbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaXNTYXZlZEFzU3RyaW5nID8gYCB0PVwic1wiYCA6IGlzU2F2ZWRBc0RhdGUgPyBgIHQ9XCJkXCJgIDogJyc7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzVGltZSA9IHRhcmdldENvbD8uZGF0YVR5cGUgPT09ICd0aW1lJztcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0ZVRpbWUgPSB0YXJnZXRDb2w/LmRhdGFUeXBlID09PSAnZGF0ZVRpbWUnO1xuICAgICAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlID0gdGFyZ2V0Q29sPy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnO1xuICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DdXJyZW5jeVR5cGUgPSB0YXJnZXRDb2w/LmRhdGFUeXBlID09PSAnY3VycmVuY3knO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBpc1BlcmNlbnRhZ2UgPyBgIHM9XCIxMlwiYCA6IGlzRGF0ZVRpbWUgPyBgIHM9XCIxMVwiYCA6IGlzVGltZSA/IGAgcz1cIjEwXCJgIDogaXNIZWFkZXJSZWNvcmQgPyBgIHM9XCIzXCJgIDogaXNTYXZlZEFzU3RyaW5nID8gJycgOiBpc1NhdmVkQXNEYXRlID8gYCBzPVwiMlwiYCA6IGlzQ29sdW1uQ3VycmVuY3lUeXBlID8gYCBzPVwiJHt0aGlzLmN1cnJlbmN5U3R5bGVNYXAuZ2V0KHRhcmdldENvbC5jdXJyZW5jeUNvZGUpPy5zdHlsZVhmIHx8IDB9XCJgIDogYCBzPVwiMVwiYDtcblxuICAgICAgICAgICAgcmV0dXJuIGA8YyByPVwiJHtjb2x1bW5OYW1lfVwiJHt0eXBlfSR7Zm9ybWF0fT48dj4ke3ZhbHVlfTwvdj48L2M+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5RnVuYyA9IGBcIiR7Y2VsbFZhbHVlID8/IFwiXCJ9XCJgO1xuXG4gICAgICAgICAgICBpZiAoaXNTdW1tYXJ5UmVjb3JkICYmIGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbk1hcEtleSA9IHRoaXMuaXNWYWxpZEdyaWQgPyBmdWxsUm93LmhpZXJhcmNoaWNhbE93bmVyID8/IEdSSURfUEFSRU5UIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbCA9IHdvcmtzaGVldERhdGEuaXNHcm91cGVkR3JpZCA/IHdvcmtzaGVldERhdGEubWF4TGV2ZWwgOiBmdWxsUm93LmxldmVsO1xuXG4gICAgICAgICAgICAgICAgc3VtbWFyeUZ1bmMgPSB0aGlzLmdldFN1bW1hcnlGdW5jdGlvbihjZWxsVmFsdWUubGFiZWwsIGtleSwgZGltZW5zaW9uTWFwS2V5LCBsZXZlbCwgdGFyZ2V0Q29sKTtcblxuICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFN0ciA9IGAke2NlbGxWYWx1ZS5sYWJlbH06ICR7Y2VsbFZhbHVlLnZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkVmFsdWUgPSBkaWN0aW9uYXJ5LnNhdmVWYWx1ZShjZWxsU3RyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGMgcj1cIiR7Y29sdW1uTmFtZX1cIiB0PVwic1wiIHM9XCIxXCI+PHY+JHtzYXZlZFZhbHVlfTwvdj48L2M+YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYDxjIHI9XCIke2NvbHVtbk5hbWV9XCI+PGYgdD1cImFycmF5XCIgcmVmPVwiJHtjb2x1bW5OYW1lfVwiPiR7c3VtbWFyeUZ1bmN9PC9mPjwvYz5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYDxjIHI9XCIke2NvbHVtbk5hbWV9XCIgcz1cIjFcIj48Zj4ke3N1bW1hcnlGdW5jfTwvZj48L2M+YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZVN1bW1hcnlEaW1lbnNpb25zKHJlY29yZDogSUV4cG9ydFJlY29yZCwgaXNEYXRhUmVjb3JkOiBib29sZWFuLCBpc0dyb3VwZWRHcmlkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWRHcmlkICYmXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIaWVyYXJjaGljYWxPd25lciAhPT0gJycgJiZcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpZXJhcmNoaWNhbE93bmVyICE9PSByZWNvcmQub3duZXIgJiZcbiAgICAgICAgICAgICF0aGlzLmhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcC5nZXQodGhpcy5jdXJyZW50SGllcmFyY2hpY2FsT3duZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcC5zZXQodGhpcy5jdXJyZW50SGllcmFyY2hpY2FsT3duZXIsIG5ldyBNYXAodGhpcy5kaW1lbnNpb25NYXApKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGF0YVJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN1bW1hcnlPd25lciAhPT0gcmVjb3JkLnN1bW1hcnlLZXkgfHwgdGhpcy5jdXJyZW50SGllcmFyY2hpY2FsT3duZXIgIT09IHJlY29yZC5oaWVyYXJjaGljYWxPd25lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGltZW5zaW9uTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1bW1hcnlPd25lciA9IHJlY29yZC5zdW1tYXJ5S2V5O1xuXG4gICAgICAgICAgICAvLyBGb3IgZ3JvdXBlZCBncmlkIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHBhcmVudCBtYXBcbiAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIHN0YXJ0Q29vcmRpbmF0ZSBmb3IgZWFjaCByZWNvcmRcbiAgICAgICAgICAgIGlmIChpc0dyb3VwZWRHcmlkICYmIHRoaXMuY3VycmVudEhpZXJhcmNoaWNhbE93bmVyICE9PSAnJyAmJiByZWNvcmQuaGllcmFyY2hpY2FsT3duZXIgPT09IEdSSURfUEFSRU5UKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljYWxEaW1lbnNpb25NYXAuZGVsZXRlKEdSSURfUEFSRU5UKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIaWVyYXJjaGljYWxPd25lciA9IHJlY29yZC5oaWVyYXJjaGljYWxPd25lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3VtbWFyeUNvb3JkaW5hdGVzKGNvbHVtbk5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIGhpZXJhcmNoaWNhbE93bmVyOiBzdHJpbmcsIHVzZUxhc3RWYWxpZEVuZENvb3JkaW5hdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGltZW5zaW9uTWFwID0gdGhpcy5oaWVyYXJjaGljYWxEaW1lbnNpb25NYXAuZ2V0KGhpZXJhcmNoaWNhbE93bmVyKSA/PyB0aGlzLmRpbWVuc2lvbk1hcDtcblxuICAgICAgICBpZiAoIXRhcmdldERpbWVuc2lvbk1hcC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbERpbWVuc2lvbnM6IERpbWVuc2lvbnMgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRDb29yZGluYXRlOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgIGVuZENvb3JkaW5hdGU6IGNvbHVtbk5hbWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRhcmdldERpbWVuc2lvbk1hcC5zZXQoa2V5LCBpbml0aWFsRGltZW5zaW9ucylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1c2VMYXN0VmFsaWRFbmRDb29yZGluYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRFbmRDb29yZGluYXRlcyh0YXJnZXREaW1lbnNpb25NYXAsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXREaW1lbnNpb25NYXAuZ2V0KGtleSkuZW5kQ29vcmRpbmF0ZSA9IGNvbHVtbk5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsaWRSb3cgPSB0YXJnZXREaW1lbnNpb25NYXAuZ2V0KGtleSkuZW5kQ29vcmRpbmF0ZS5tYXRjaCgvW2Etel0rfFteYS16XSsvZ2kpWzFdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkR3JpZCAmJiAhdXNlTGFzdFZhbGlkRW5kQ29vcmRpbmF0ZSAmJiBoaWVyYXJjaGljYWxPd25lciAhPT0gR1JJRF9QQVJFTlQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hcCA9IHRoaXMuaGllcmFyY2hpY2FsRGltZW5zaW9uTWFwLmdldChHUklEX1BBUkVOVCk7XG4gICAgICAgICAgICB0aGlzLnNldEVuZENvb3JkaW5hdGVzKHBhcmVudE1hcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEVuZENvb3JkaW5hdGVzKG1hcDogTWFwPHN0cmluZywgRGltZW5zaW9ucz4sIHVzZUxhc3RWYWxpZEVuZENvb3JkaW5hdGUgPSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGEgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xOYW1lID0gYS5lbmRDb29yZGluYXRlLm1hdGNoKC9bYS16XSt8W15hLXpdKy9naSlbMF07XG4gICAgICAgICAgICBhLmVuZENvb3JkaW5hdGUgPSBgJHtjb2xOYW1lfSR7dXNlTGFzdFZhbGlkRW5kQ29vcmRpbmF0ZSA/IHRoaXMubGFzdFZhbGlkUm93IDogdGhpcy5yb3dJbmRleH1gO1xuICAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeUZ1bmN0aW9uKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcsIGRpbWVuc2lvbk1hcEtleTogYW55LCByZWNvcmRMZXZlbDogbnVtYmVyLCBjb2w6IElDb2x1bW5JbmZvKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGltZW5zaW9uTWFwID0gZGltZW5zaW9uTWFwS2V5ID8gdGhpcy5oaWVyYXJjaGljYWxEaW1lbnNpb25NYXAuZ2V0KGRpbWVuc2lvbk1hcEtleSkgOiB0aGlzLmRpbWVuc2lvbk1hcDtcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IGRpbWVuc2lvbk1hcC5nZXQoa2V5KTtcbiAgICAgICAgY29uc3QgbGV2ZWxEaW1lbnNpb25zID0gZGltZW5zaW9uTWFwLmdldChHUklEX0xFVkVMX0NPTCk7XG5cbiAgICAgICAgbGV0IGZ1bmMgPSAnJztcbiAgICAgICAgbGV0IGZ1bmNUeXBlID0gJyc7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgY29uc3QgY3VycmVuY3lJbmZvID0gdGhpcy5jdXJyZW5jeVN0eWxlTWFwLmdldChjb2wuY3VycmVuY3lDb2RlKTtcblxuICAgICAgICBzd2l0Y2godHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiY291bnRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYFwiQ291bnQ6IFwiJmFtcDtfeGxmbi5DT1VOVElGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0sICR7cmVjb3JkTGV2ZWx9KWBcbiAgICAgICAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgICAgICAgICBmdW5jID0gYF94bGZuLk1JTihfeGxmbi5JRigke2xldmVsRGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7bGV2ZWxEaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9PSR7cmVjb3JkTGV2ZWx9LCAke2RpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2RpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0pKWBcbiAgICAgICAgICAgICAgICBmdW5jVHlwZSA9IGBcIk1pbjogXCImYW1wO2A7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jVHlwZSArIChjb2wuZGF0YVR5cGUgPT09ICdjdXJyZW5jeScgJiYgY3VycmVuY3lJbmZvXG4gICAgICAgICAgICAgICAgICAgID8gYF94bGZuLlRFWFQoJHtmdW5jfSwgXCIke2N1cnJlbmN5SW5mby5zeW1ib2x9IywjIzAuMDBcIilgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ZnVuY31gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgICAgICAgICBmdW5jID0gYF94bGZuLk1BWChfeGxmbi5JRigke2xldmVsRGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7bGV2ZWxEaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9PSR7cmVjb3JkTGV2ZWx9LCAke2RpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2RpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0pKWBcbiAgICAgICAgICAgICAgICBmdW5jVHlwZSA9IGBcIk1heDogXCImYW1wO2A7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jVHlwZSArIChjb2wuZGF0YVR5cGUgPT09ICdjdXJyZW5jeScgJiYgY3VycmVuY3lJbmZvXG4gICAgICAgICAgICAgICAgICAgID8gYF94bGZuLlRFWFQoJHtmdW5jfSwgXCIke2N1cnJlbmN5SW5mby5zeW1ib2x9IywjIzAuMDBcIilgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ZnVuY31gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIGNhc2UgXCJzdW1cIjpcbiAgICAgICAgICAgICAgICBmdW5jID0gIGBfeGxmbi5TVU1JRigke2xldmVsRGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7bGV2ZWxEaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9LCAke3JlY29yZExldmVsfSwgJHtkaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtkaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9KWBcbiAgICAgICAgICAgICAgICBmdW5jVHlwZSA9IGBcIlN1bTogXCImYW1wO2A7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jVHlwZSArIChjb2wuZGF0YVR5cGUgPT09ICdjdXJyZW5jeScgJiYgY3VycmVuY3lJbmZvXG4gICAgICAgICAgICAgICAgICAgID8gYF94bGZuLlRFWFQoJHtmdW5jfSwgXCIke2N1cnJlbmN5SW5mby5zeW1ib2x9IywjIzAuMDBcIilgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ZnVuY31gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIGNhc2UgXCJhdmdcIjpcbiAgICAgICAgICAgICAgICBmdW5jID0gYF94bGZuLkFWRVJBR0VJRigke2xldmVsRGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7bGV2ZWxEaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9LCAke3JlY29yZExldmVsfSwgJHtkaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtkaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9KWBcbiAgICAgICAgICAgICAgICBmdW5jVHlwZSA9IGBcIkF2ZzogXCImYW1wO2A7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jVHlwZSArIChjb2wuZGF0YVR5cGUgPT09ICdjdXJyZW5jeScgJiYgY3VycmVuY3lJbmZvXG4gICAgICAgICAgICAgICAgICAgID8gYF94bGZuLlRFWFQoJHtmdW5jfSwgXCIke2N1cnJlbmN5SW5mby5zeW1ib2x9IywjIzAuMDBcIilgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ZnVuY31gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIGNhc2UgXCJlYXJsaWVzdFwiOlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGdldCBkYXRlIGZvcm1hdCBmcm9tIGxvY2FsZVxuICAgICAgICAgICAgICAgIHJldHVybiBgXCJFYXJsaWVzdDogXCImYW1wO194bGZuLlRFWFQoX3hsZm4uTUlOKF94bGZuLklGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX09JHtyZWNvcmRMZXZlbH0sICR7ZGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7ZGltZW5zaW9ucy5lbmRDb29yZGluYXRlfSkpLCBcIm0vZC95eXl5XCIpYFxuICAgICAgICAgICAgY2FzZSBcImxhdGVzdFwiOlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGdldCBkYXRlIGZvcm1hdCBmcm9tIGxvY2FsZVxuICAgICAgICAgICAgICAgIHJldHVybiBgXCJMYXRlc3Q6IFwiJmFtcDtfeGxmbi5URVhUKF94bGZuLk1BWChfeGxmbi5JRigke2xldmVsRGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7bGV2ZWxEaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9PSR7cmVjb3JkTGV2ZWx9LCAke2RpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2RpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0pKSwgXCJtL2QveXl5eVwiKWBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Um9vdFN1bW1hcnlTdGFydENvb3JkaW5hdGUoY29sdW1uOiBudW1iZXIsIGtleTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF0YVJlY29yZENvbE5hbWUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sdW1uKSArICh0aGlzLmZpcnN0RGF0YVJvdyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGltZW5zaW9uTWFwLmdldChrZXkpLnN0YXJ0Q29vcmRpbmF0ZSAhPT0gZmlyc3REYXRhUmVjb3JkQ29sTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5kaW1lbnNpb25NYXAuZ2V0KGtleSkuc3RhcnRDb29yZGluYXRlID0gZmlyc3REYXRhUmVjb3JkQ29sTmFtZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRIZWFkZXJzKHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEsIGhlYWRlcnNGb3JMZXZlbDogSUNvbHVtbkluZm9bXSwgaTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBzdGFydFZhbHVlID0gMDtcbiAgICAgICAgbGV0IHN0ciA9ICcnO1xuXG4gICAgICAgIGNvbnN0IGlzSGllcmFyY2hpY2FsR3JpZCA9IHdvcmtzaGVldERhdGEuaXNIaWVyYXJjaGljYWw7XG4gICAgICAgIGxldCByb3dTdHlsZSA9IGlzSGllcmFyY2hpY2FsR3JpZCA/ICcgcz1cIjNcIicgOiAnJztcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHdvcmtzaGVldERhdGEuZGF0YURpY3Rpb25hcnk7XG4gICAgICAgIGNvbnN0IG93bmVyID0gd29ya3NoZWV0RGF0YS5vd25lcjtcbiAgICAgICAgY29uc3QgbWF4TGV2ZWwgPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICA/IG93bmVyLm1heFJvd0xldmVsXG4gICAgICAgICAgICA6IG93bmVyLm1heExldmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbCBvZiBoZWFkZXJzRm9yTGV2ZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYW5MZW5ndGggPSBpc1ZlcnRpY2FsID8gY3VycmVudENvbC5yb3dTcGFuIDogY3VycmVudENvbC5jb2x1bW5TcGFuO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudENvbC5sZXZlbCA9PT0gaSkge1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5Db29yZGluYXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGlzVmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJvd0luZGV4XG4gICAgICAgICAgICAgICAgICAgIDogc3RhcnRWYWx1ZSArIChvd25lci5tYXhSb3dMZXZlbCA/PyAwKVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93Q29vcmRpbmF0ZSA9IGlzVmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgPyBzdGFydFZhbHVlICsgb3duZXIubWF4TGV2ZWwgKyAyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5yb3dJbmRleFxuXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBkaWN0aW9uYXJ5LnNhdmVWYWx1ZShjdXJyZW50Q29sLmhlYWRlciwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgY29sdW1uQ29vcmRpbmF0ZSA9IChjdXJyZW50Q29sLmZpZWxkID09PSBHUklEX0xFVkVMX0NPTFxuICAgICAgICAgICAgICAgICAgICA/IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbih3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgOiBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sdW1uKSkgKyByb3dDb29yZGluYXRlO1xuXG4gICAgICAgICAgICAgICAgcm93U3R5bGUgPSBpc1ZlcnRpY2FsICYmIGN1cnJlbnRDb2wucm93U3BhbiA+IDEgPyAnIHM9XCI0XCInIDogcm93U3R5bGU7XG4gICAgICAgICAgICAgICAgc3RyID0gYDxjIHI9XCIke2NvbHVtbkNvb3JkaW5hdGV9XCIke3Jvd1N0eWxlfSB0PVwic1wiPjx2PiR7Y29sdW1uVmFsdWV9PC92PjwvYz5gO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5oYXMocm93Q29vcmRpbmF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5zZXQocm93Q29vcmRpbmF0ZSwgdGhpcy5waXZvdEdyaWRSb3dIZWFkZXJzTWFwLmdldChyb3dDb29yZGluYXRlKSArIHN0cilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5zZXQocm93Q29vcmRpbmF0ZSwgc3RyKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVldERhdGEgKz0gc3RyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBtYXhMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2VsbHNDb3VudGVyKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDZWxsU3RyICs9IGAgPG1lcmdlQ2VsbCByZWY9XCIke2NvbHVtbkNvb3JkaW5hdGV9OmA7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2wuaGVhZGVyVHlwZSA9PT0gRXhwb3J0SGVhZGVyVHlwZS5Db2x1bW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IGlzVmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1heExldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGFydFZhbHVlICsgKG93bmVyLm1heFJvd0xldmVsID8/IDApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByb3dDb29yZGluYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvd25lci5tYXhMZXZlbCArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvb3JkaW5hdGUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sKSArIHJvdztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc3Bhbkxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sID0gaXNWZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbiArIGs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm93Q29vcmRpbmF0ZSArIGtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJvd0luZGV4O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29vcmRpbmF0ZSA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihjb2wpICsgcm93O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IGA8YyByPVwiJHtjb2x1bW5Db29yZGluYXRlfVwiJHtyb3dTdHlsZX0gLz5gO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5zZXQocm93LCBzdHIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5zaGVldERhdGEgKz0gc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2VsbFN0ciArPSBgJHtjb2x1bW5Db29yZGluYXRlfVwiIC8+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0VmFsdWUgKz0gc3Bhbkxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZUZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0KSB7XG4gICAgICAgIGZvbGRlclsnc3R5bGVzLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0U3R5bGVzKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0ZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0LCB3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhKSB7XG4gICAgICAgIGZvbGRlclsnd29ya2Jvb2sueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRXb3JrYm9vayh3b3Jrc2hlZXREYXRhLm9wdGlvbnMud29ya3NoZWV0TmFtZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50VHlwZXNGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICBjb25zdCBoYXNTaGFyZWRTdHJpbmdzID0gIXdvcmtzaGVldERhdGEuaXNFbXB0eSB8fCB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuYWx3YXlzRXhwb3J0SGVhZGVycztcbiAgICAgICAgZm9sZGVyWydbQ29udGVudF9UeXBlc10ueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRDb250ZW50VHlwZXNYTUwoaGFzU2hhcmVkU3RyaW5ncywgd29ya3NoZWV0RGF0YS5vcHRpb25zLmV4cG9ydEFzVGFibGUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkU3RyaW5nc0ZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0LCB3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhKSB7XG4gICAgICAgIGNvbnN0IGRpY3QgPSB3b3Jrc2hlZXREYXRhLmRhdGFEaWN0aW9uYXJ5O1xuICAgICAgICBjb25zdCBzb3J0ZWRWYWx1ZXMgPSBkaWN0LmdldEtleXMoKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkU3RyaW5ncyA9IG5ldyBBcnJheTxzdHJpbmc+KHNvcnRlZFZhbHVlcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc29ydGVkVmFsdWVzKSB7XG4gICAgICAgICAgICBzaGFyZWRTdHJpbmdzW2RpY3QuZ2V0U2FuaXRpemVkVmFsdWUodmFsdWUpXSA9ICc8c2k+PHQ+JyArIHZhbHVlICsgJzwvdD48L3NpPic7XG4gICAgICAgIH1cblxuICAgICAgICBmb2xkZXJbJ3NoYXJlZFN0cmluZ3MueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRTaGFyZWRTdHJpbmdYTUwoXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWN0LnN0cmluZ3NDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRTdHJpbmdzLmpvaW4oJycpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZXNGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHdvcmtzaGVldERhdGEuY29sdW1uQ291bnQ7XG4gICAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sdW1uQ291bnQgLSAxKSArIHdvcmtzaGVldERhdGEucm93Q291bnQ7XG4gICAgICAgIGNvbnN0IGF1dG9GaWx0ZXJEaW1lbnNpb24gPSAnQTE6JyArIGxhc3RDb2x1bW47XG4gICAgICAgIGNvbnN0IHRhYmxlRGltZW5zaW9uID0gd29ya3NoZWV0RGF0YS5pc0VtcHR5XG4gICAgICAgICAgICA/ICdBMTonICsgRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKGNvbHVtbkNvdW50IC0gMSkgKyAod29ya3NoZWV0RGF0YS5yb3dDb3VudCArIDEpXG4gICAgICAgICAgICA6IGF1dG9GaWx0ZXJEaW1lbnNpb247XG4gICAgICAgIGNvbnN0IGhhc1VzZXJTZXRJbmRleCA9IHdvcmtzaGVldERhdGEub3duZXIuY29sdW1ucy5zb21lKGMgPT4gYy5leHBvcnRJbmRleCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gaGFzVXNlclNldEluZGV4XG4gICAgICAgICAgICA/IHdvcmtzaGVldERhdGEucm9vdEtleXNcbiAgICAgICAgICAgIDogd29ya3NoZWV0RGF0YS5vd25lci5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjID0+ICFjLnNraXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRJbmRleCAtIGIuc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5waW5uZWRJbmRleCAtIGIucGlubmVkSW5kZXgpXG4gICAgICAgICAgICAgICAgLm1hcChjID0+IGMuaGVhZGVyKTtcblxuICAgICAgICBsZXQgc29ydFN0cmluZyA9ICcnO1xuXG4gICAgICAgIGxldCB0YWJsZUNvbHVtbnMgPSAnPHRhYmxlQ29sdW1ucyBjb3VudD1cIicgKyBjb2x1bW5Db3VudCArICdcIj4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gIHZhbHVlc1tpXTtcbiAgICAgICAgICAgIHRhYmxlQ29sdW1ucyArPSAnPHRhYmxlQ29sdW1uIGlkPVwiJyArIChpICsgMSkgKyAnXCIgbmFtZT1cIicgKyB2YWx1ZSArICdcIi8+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRhYmxlQ29sdW1ucyArPSAnPC90YWJsZUNvbHVtbnM+JztcblxuICAgICAgICBpZiAod29ya3NoZWV0RGF0YS5zb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0aW5nRXhwcmVzc2lvbiA9IHdvcmtzaGVldERhdGEuc29ydDtcbiAgICAgICAgICAgIGNvbnN0IHNjID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKHZhbHVlcy5pbmRleE9mKHNvcnRpbmdFeHByZXNzaW9uLmZpZWxkTmFtZSkpO1xuICAgICAgICAgICAgY29uc3QgZGlyID0gc29ydGluZ0V4cHJlc3Npb24uZGlyIC0gMTtcbiAgICAgICAgICAgIHNvcnRTdHJpbmcgPSBgPHNvcnRTdGF0ZSByZWY9XCJBMjoke2xhc3RDb2x1bW59XCI+PHNvcnRDb25kaXRpb24gZGVzY2VuZGluZz1cIiR7ZGlyfVwiIHJlZj1cIiR7c2N9MToke3NjfTE1XCIvPjwvc29ydFN0YXRlPmA7XG4gICAgICAgIH1cblxuICAgICAgICBmb2xkZXJbJ3RhYmxlMS54bWwnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldFRhYmxlc1hNTChhdXRvRmlsdGVyRGltZW5zaW9uLCB0YWJsZURpbWVuc2lvbiwgdGFibGVDb2x1bW5zLCBzb3J0U3RyaW5nKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldFJlbHNGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCkge1xuICAgICAgICBmb2xkZXJbJ3NoZWV0MS54bWwucmVscyddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0V29ya3NoZWV0UmVscygpKTtcbiAgICB9XG59XG4iXX0=
|
|
625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvZXhjZWwvZXhjZWwtZmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBMkMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXJMOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDZCxZQUFZLENBQUMsTUFBYztRQUM5QixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDSjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDVCxZQUFZLENBQUMsTUFBYyxFQUFFLGFBQTRCO1FBQzVELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNKO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNWLFlBQVksQ0FBQyxNQUFjO1FBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLFlBQVksQ0FBQyxNQUFjLEVB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LFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUV4Y2VsRmlsZSB9IGZyb20gJy4vZXhjZWwtaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFeGNlbFN0cmluZ3MgfSBmcm9tICcuL2V4Y2VsLXN0cmluZ3MnO1xuaW1wb3J0IHsgV29ya3NoZWV0RGF0YSB9IGZyb20gJy4vd29ya3NoZWV0LWRhdGEnO1xuXG5pbXBvcnQgeyBzdHJUb1U4IH0gZnJvbSAnZmZsYXRlJztcbmltcG9ydCB7IHlpZWxkaW5nTG9vcCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRXhwb3J0SGVhZGVyVHlwZSwgRXhwb3J0UmVjb3JkVHlwZSwgSUV4cG9ydFJlY29yZCwgSUNvbHVtbkxpc3QsIElDb2x1bW5JbmZvLCBHUklEX1JPT1RfU1VNTUFSWSwgR1JJRF9QQVJFTlQsIEdSSURfTEVWRUxfQ09MIH0gZnJvbSAnLi4vZXhwb3J0ZXItY29tbW9uL2Jhc2UtZXhwb3J0LXNlcnZpY2UnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFJvb3RSZWxzRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QpIHtcbiAgICAgICAgZm9sZGVyWycucmVscyddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0UmVscygpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgQXBwRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QsIHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEpIHtcbiAgICAgICAgZm9sZGVyWydhcHAueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRBcHAod29ya3NoZWV0RGF0YS5vcHRpb25zLndvcmtzaGVldE5hbWUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgQ29yZUZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0KSB7XG4gICAgICAgIGZvbGRlclsnY29yZS54bWwnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldENvcmUoKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtib29rUmVsc0ZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0LCB3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc1NoYXJlZFN0cmluZ3MgPSAhd29ya3NoZWV0RGF0YS5pc0VtcHR5IHx8IHdvcmtzaGVldERhdGEub3B0aW9ucy5hbHdheXNFeHBvcnRIZWFkZXJzO1xuICAgICAgICBmb2xkZXJbJ3dvcmtib29rLnhtbC5yZWxzJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRXb3JrYm9va1JlbHMoaGFzU2hhcmVkU3RyaW5ncykpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaGVtZUZpbGUgaW1wbGVtZW50cyBJRXhjZWxGaWxlIHtcbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KGZvbGRlcjogT2JqZWN0KSB7XG4gICAgICAgIGZvbGRlclsndGhlbWUxLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0VGhlbWUoKSk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgRGltZW5zaW9ucyB7XG4gICAgc3RhcnRDb29yZGluYXRlOiBzdHJpbmdcbiAgICBlbmRDb29yZGluYXRlOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIEN1cnJlbmN5SW5mbyB7XG4gICAgc3R5bGVYZjogbnVtYmVyXG4gICAgc3ltYm9sOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgTUlOX1dJRFRIID0gOC40MztcbiAgICBwcml2YXRlIG1heE91dGxpbmVMZXZlbCA9IDA7XG4gICAgcHJpdmF0ZSBzaGVldERhdGEgPSAnJztcbiAgICBwcml2YXRlIGRpbWVuc2lvbiA9ICcnO1xuICAgIHByaXZhdGUgZnJlZXplUGFuZSA9ICcnO1xuICAgIHByaXZhdGUgcm93SGVpZ2h0ID0gJyc7XG5cbiAgICBwcml2YXRlIG1lcmdlQ2VsbFN0ciA9ICcnO1xuICAgIHByaXZhdGUgbWVyZ2VDZWxsc0NvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgcm93SW5kZXggPSAwO1xuICAgIHByaXZhdGUgcGl2b3RHcmlkUm93SGVhZGVyc01hcCA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIGRpbWVuc2lvbk1hcDogTWFwPHN0cmluZywgRGltZW5zaW9ucz4gPSBuZXcgTWFwPHN0cmluZywgRGltZW5zaW9ucz4oKTtcbiAgICBwcml2YXRlIGhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcDogTWFwPGFueSwgIE1hcDxzdHJpbmcsIERpbWVuc2lvbnM+PiA9IG5ldyBNYXA8YW55LCAgTWFwPHN0cmluZywgRGltZW5zaW9ucz4+KCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50U3VtbWFyeU93bmVyID0gJyc7XG4gICAgcHJpdmF0ZSBjdXJyZW50SGllcmFyY2hpY2FsT3duZXIgPSAnJztcbiAgICBwcml2YXRlIGZpcnN0Q29sdW1uID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICBwcml2YXRlIGZpcnN0RGF0YVJvdyA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgcHJpdmF0ZSBpc1ZhbGlkR3JpZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGxhc3RWYWxpZFJvdzogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW5jeVN0eWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEN1cnJlbmN5SW5mbz4oW1xuICAgICAgICBbJ1VTRCcsIHtzdHlsZVhmOiA1LCBzeW1ib2w6ICckJ31dLFxuICAgICAgICBbJ0dCUCcsIHtzdHlsZVhmOiA2LCBzeW1ib2w6ICfCoyd9XSxcbiAgICAgICAgWydDTlknLCB7c3R5bGVYZjogNywgc3ltYm9sOiAnwqUnfV0sXG4gICAgICAgIFsnRVVSJywge3N0eWxlWGY6IDgsIHN5bWJvbDogJ+KCrCd9XSxcbiAgICAgICAgWydKUFknLCB7c3R5bGVYZjogOSwgc3ltYm9sOiAnwqUnfV0sXG4gICAgXSk7XG5cbiAgICBwdWJsaWMgd3JpdGVFbGVtZW50KCkge31cblxuICAgIHB1YmxpYyBhc3luYyB3cml0ZUVsZW1lbnRBc3luYyhmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVEYXRhQXN5bmMod29ya3NoZWV0RGF0YSwgKGNvbHMsIHJvd3MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNUYWJsZSA9ICghd29ya3NoZWV0RGF0YS5pc0VtcHR5IHx8IHdvcmtzaGVldERhdGEub3B0aW9ucy5hbHdheXNFeHBvcnRIZWFkZXJzKVxuICAgICAgICAgICAgICAgICAgICAmJiB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuZXhwb3J0QXNUYWJsZTtcblxuICAgICAgICAgICAgICAgIGZvbGRlclsnc2hlZXQxLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0U2hlZXRYTUwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGltZW5zaW9uLCB0aGlzLmZyZWV6ZVBhbmUsIGNvbHMsIHJvd3MsIGhhc1RhYmxlLCB0aGlzLm1heE91dGxpbmVMZXZlbCwgd29ya3NoZWV0RGF0YS5pc0hpZXJhcmNoaWNhbCkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEYXRhQXN5bmMod29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSwgZG9uZTogKGNvbHM6IHN0cmluZywgc2hlZXREYXRhOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5zaGVldERhdGEgPSAnJztcbiAgICAgICAgbGV0IGNvbHMgPSAnJztcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHdvcmtzaGVldERhdGEuZGF0YURpY3Rpb25hcnk7XG4gICAgICAgIHRoaXMucm93SW5kZXggPSAwO1xuXG4gICAgICAgIGlmICh3b3Jrc2hlZXREYXRhLmlzRW1wdHkgJiYgKCF3b3Jrc2hlZXREYXRhLm9wdGlvbnMuYWx3YXlzRXhwb3J0SGVhZGVycyB8fCB3b3Jrc2hlZXREYXRhLm93bmVyLmNvbHVtbnMubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhpcy5zaGVldERhdGEgKz0gJzxzaGVldERhdGEvPic7XG4gICAgICAgICAgICB0aGlzLmRpbWVuc2lvbiA9ICdBMSc7XG4gICAgICAgICAgICBkb25lKCcnLCB0aGlzLnNoZWV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvd25lciA9IHdvcmtzaGVldERhdGEub3duZXI7XG4gICAgICAgICAgICBjb25zdCBpc0hpZXJhcmNoaWNhbEdyaWQgPSB3b3Jrc2hlZXREYXRhLmlzSGllcmFyY2hpY2FsO1xuICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlDb2x1bW5IZWFkZXIgPSB3b3Jrc2hlZXREYXRhLmhhc011bHRpQ29sdW1uSGVhZGVyO1xuICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlSb3dIZWFkZXIgPSB3b3Jrc2hlZXREYXRhLmhhc011bHRpUm93SGVhZGVyO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNVc2VyU2V0SW5kZXggPSBvd25lci5jb2x1bW5zLnNvbWUoY29sID0+IGNvbC5leHBvcnRJbmRleCAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gIHdvcmtzaGVldERhdGEub3B0aW9ucy5yb3dIZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZEdyaWQgPSB3b3Jrc2hlZXREYXRhLmlzSGllcmFyY2hpY2FsIHx8IHdvcmtzaGVldERhdGEuaXNUcmVlR3JpZCB8fCB3b3Jrc2hlZXREYXRhLmlzR3JvdXBlZEdyaWQ7XG4gICAgICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGhlaWdodCA/IGAgaHQ9XCIke2hlaWdodH1cIiBjdXN0b21IZWlnaHQ9XCIxXCJgIDogJyc7XG4gICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSBgPHNoZWV0RGF0YT5gO1xuXG4gICAgICAgICAgICBsZXQgaGVhZGVyc0ZvckxldmVsOiBJQ29sdW1uSW5mb1tdID0gW107XG5cbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPD0gb3duZXIubWF4Um93TGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNGb3JMZXZlbCA9ICBvd25lci5jb2x1bW5zLmZpbHRlcihjID0+IGMubGV2ZWwgPT09IGkgJiYgYy5yb3dTcGFuID4gMCAmJiAhYy5za2lwKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludEhlYWRlcnMod29ya3NoZWV0RGF0YSwgaGVhZGVyc0ZvckxldmVsLCBpLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucm93SW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yb3dJbmRleCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG93bmVyLm1heExldmVsOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0luZGV4Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl2b3RHcmlkQ29sdW1ucyA9IHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5nZXQodGhpcy5yb3dJbmRleCkgPz8gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSBgPHJvdyByPVwiJHt0aGlzLnJvd0luZGV4fVwiJHt0aGlzLnJvd0hlaWdodH0+JHtwaXZvdEdyaWRDb2x1bW5zfWA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbGxvd2VkQ29sdW1ucyA9IG93bmVyLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5oZWFkZXJUeXBlICE9PSBFeHBvcnRIZWFkZXJUeXBlLlJvd0hlYWRlciAmJiBjLmhlYWRlclR5cGUgIT09IEV4cG9ydEhlYWRlclR5cGUuTXVsdGlSb3dIZWFkZXIpO1xuXG4gICAgICAgICAgICAgICAgaGVhZGVyc0ZvckxldmVsID0gaGFzTXVsdGlDb2x1bW5IZWFkZXIgP1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjID0+IChjLmxldmVsIDwgaSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuaGVhZGVyVHlwZSAhPT0gRXhwb3J0SGVhZGVyVHlwZS5NdWx0aUNvbHVtbkhlYWRlciB8fCBjLmxldmVsID09PSBpKSAmJiBjLmNvbHVtblNwYW4gPiAwICYmICFjLnNraXApXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5zdGFydEluZGV4IC0gYi5zdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucGlubmVkSW5kZXggLSBiLnBpbm5lZEluZGV4KSA6XG4gICAgICAgICAgICAgICAgICAgIGhhc1VzZXJTZXRJbmRleCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29sdW1ucy5maWx0ZXIoYyA9PiAhYy5za2lwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29sdW1ucy5maWx0ZXIoYyA9PiAhYy5za2lwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0SW5kZXggLSBiLnN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucGlubmVkSW5kZXggLSBiLnBpbm5lZEluZGV4KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRIZWFkZXJzKHdvcmtzaGVldERhdGEsIGhlYWRlcnNGb3JMZXZlbCwgaSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zaGVldERhdGEgKz0gYDwvcm93PmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG11bHRpQ29sdW1uSGVhZGVyTGV2ZWwgPSB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuaWdub3JlTXVsdGlDb2x1bW5IZWFkZXJzID8gMCA6IG93bmVyLm1heExldmVsO1xuICAgICAgICAgICAgY29uc3QgZnJlZXplSGVhZGVycyA9IHdvcmtzaGVldERhdGEub3B0aW9ucy5mcmVlemVIZWFkZXJzID8gMiArIG11bHRpQ29sdW1uSGVhZGVyTGV2ZWwgOiAxO1xuXG4gICAgICAgICAgICBpZiAoIWlzSGllcmFyY2hpY2FsR3JpZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzID8gd29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDEgOiB3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50IC0gMVxuICAgICAgICAgICAgICAgIHRoaXMuZGltZW5zaW9uID0gJ0ExOicgKyBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sKSArICh3b3Jrc2hlZXREYXRhLnJvd0NvdW50KTtcblxuICAgICAgICAgICAgICAgIGNvbHMgKz0gJzxjb2xzPic7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWhhc011bHRpQ29sdW1uSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGRpY3Rpb25hcnkuY29sdW1uV2lkdGhzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB3aWR0aCBwcm92aWRlZCBpbiB0aGUgb3B0aW9ucyBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aEluVHdpcHMgPSB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuY29sdW1uV2lkdGggIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXREYXRhLm9wdGlvbnMuY29sdW1uV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoKCh3aWR0aCAvIDk2KSAqIDE0LjQpLCBXb3Jrc2hlZXRGaWxlLk1JTl9XSURUSCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh3aWR0aEluVHdpcHMgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoSW5Ud2lwcyA9IFdvcmtzaGVldEZpbGUuTUlOX1dJRFRIO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xzICs9IGA8Y29sIG1pbj1cIiR7KGogKyAxKX1cIiBtYXg9XCIkeyhqICsgMSl9XCIgd2lkdGg9XCIke3dpZHRoSW5Ud2lwc31cIiBjdXN0b21XaWR0aD1cIjFcIi8+YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHMgKz0gYDxjb2wgbWluPVwiMVwiIG1heD1cIiR7d29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudH1cIiB3aWR0aD1cIjE1XCIgY3VzdG9tV2lkdGg9XCIxXCIvPmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhPZkxhc3RQaW5uZWRDb2x1bW4gPSB3b3Jrc2hlZXREYXRhLmluZGV4T2ZMYXN0UGlubmVkQ29sdW1uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb3plbkNvbHVtbkNvdW50ID0gaW5kZXhPZkxhc3RQaW5uZWRDb2x1bW4gKyAxO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdENlbGwgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oZnJvemVuQ29sdW1uQ291bnQpICsgZnJlZXplSGVhZGVycztcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZkxhc3RQaW5uZWRDb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBpbmRleE9mTGFzdFBpbm5lZENvbHVtbiAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtzaGVldERhdGEub3B0aW9ucy5pZ25vcmVQaW5uaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICF3b3Jrc2hlZXREYXRhLm9wdGlvbnMuaWdub3JlQ29sdW1uc09yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJlZXplUGFuZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBgPHBhbmUgeFNwbGl0PVwiJHtmcm96ZW5Db2x1bW5Db3VudH1cIiB5U3BsaXQ9XCIke2ZyZWV6ZUhlYWRlcnMgLSAxfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdENlbGw9XCIke2ZpcnN0Q2VsbH1cIiBhY3RpdmVQYW5lPVwidG9wUmlnaHRcIiBzdGF0ZT1cImZyb3plblwiLz5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya3NoZWV0RGF0YS5vcHRpb25zLmZyZWV6ZUhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDZWxsID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKDApICsgZnJlZXplSGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmVlemVQYW5lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGA8cGFuZSB4U3BsaXQ9XCIwXCIgeVNwbGl0PVwiJHtmcmVlemVIZWFkZXJzIC0gMX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnRDZWxsPVwiJHtmaXJzdENlbGx9XCIgYWN0aXZlUGFuZT1cInRvcFJpZ2h0XCIgc3RhdGU9XCJmcm96ZW5cIi8+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd29ya3NoZWV0RGF0YS5vcHRpb25zLmNvbHVtbldpZHRoID8gd29ya3NoZWV0RGF0YS5vcHRpb25zLmNvbHVtbldpZHRoIDogMjA7XG4gICAgICAgICAgICAgICAgY29scyArPSBgPGNvbHM+PGNvbCBtaW49XCIxXCIgbWF4PVwiJHt3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50fVwiIHdpZHRoPVwiJHtjb2x1bW5XaWR0aH1cIiBjdXN0b21XaWR0aD1cIjFcIi8+YDtcblxuICAgICAgICAgICAgICAgIGlmICh3b3Jrc2hlZXREYXRhLm9wdGlvbnMuZnJlZXplSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENlbGwgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oMCkgKyBmcmVlemVIZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVBhbmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgYDxwYW5lIHhTcGxpdD1cIjBcIiB5U3BsaXQ9XCIke2ZyZWV6ZUhlYWRlcnMgLSAxfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdENlbGw9XCIke2ZpcnN0Q2VsbH1cIiBhY3RpdmVQYW5lPVwidG9wUmlnaHRcIiBzdGF0ZT1cImZyb3plblwiLz5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29scyArPSBgPGNvbCBtaW49XCIke3dvcmtzaGVldERhdGEuY29sdW1uQ291bnQgKyAyfVwiIG1heD1cIiR7d29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDJ9XCIgaGlkZGVuPVwiMVwiLz5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2xzICs9ICc8L2NvbHM+JztcblxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGF0YVJlY29yZHNBc3luYyh3b3Jrc2hlZXREYXRhLCAocm93cykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hlZXREYXRhICs9IHJvd3M7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGVldERhdGEgKz0gJzwvc2hlZXREYXRhPic7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGhhc011bHRpQ29sdW1uSGVhZGVyIHx8IGhhc011bHRpUm93SGVhZGVyKSAmJiB0aGlzLm1lcmdlQ2VsbHNDb3VudGVyID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZWV0RGF0YSArPSBgPG1lcmdlQ2VsbHMgY291bnQ9XCIke3RoaXMubWVyZ2VDZWxsc0NvdW50ZXJ9XCI+JHt0aGlzLm1lcmdlQ2VsbFN0cn08L21lcmdlQ2VsbHM+YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKGNvbHMsIHRoaXMuc2hlZXREYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRGF0YVJlY29yZHNBc3luYyh3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhLCBkb25lOiAocm93czogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgICAgIGNvbnN0IHJvd0RhdGFBcnIgPSBbXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gIHdvcmtzaGVldERhdGEub3B0aW9ucy5yb3dIZWlnaHQ7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gaGVpZ2h0ID8gJyBodD1cIicgKyBoZWlnaHQgKyAnXCIgY3VzdG9tSGVpZ2h0PVwiMVwiJyA6ICcnO1xuXG4gICAgICAgIGNvbnN0IGlzSGllcmFyY2hpY2FsR3JpZCA9IHdvcmtzaGVldERhdGEuaXNIaWVyYXJjaGljYWw7XG4gICAgICAgIGNvbnN0IGhhc1VzZXJTZXRJbmRleCA9IHdvcmtzaGVldERhdGEub3duZXIuY29sdW1ucy5zb21lKGMgPT4gYy5leHBvcnRJbmRleCAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBsZXQgcmVjb3JkSGVhZGVycyA9IFtdO1xuXG4gICAgICAgIHlpZWxkaW5nTG9vcCh3b3Jrc2hlZXREYXRhLnJvd0NvdW50IC0gd29ya3NoZWV0RGF0YS5tdWx0aUNvbHVtbkhlYWRlclJvd3MgLSAxLCAxMDAwLFxuICAgICAgICAgICAgKGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtzaGVldERhdGEuaXNFbXB0eSl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNIaWVyYXJjaGljYWxHcmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVXNlclNldEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkSGVhZGVycyA9IHdvcmtzaGVldERhdGEucm9vdEtleXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZEhlYWRlcnMgPSB3b3Jrc2hlZXREYXRhLm93bmVyLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjID0+IGMuaGVhZGVyVHlwZSA9PT0gRXhwb3J0SGVhZGVyVHlwZS5Db2x1bW5IZWFkZXIgJiYgIWMuc2tpcClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRJbmRleC1iLnN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnBpbm5lZEluZGV4LWIucGlubmVkSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHdvcmtzaGVldERhdGEuZGF0YVtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkhlYWRlclJlY29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZE93bmVyID0gd29ya3NoZWV0RGF0YS5vd25lcnMuZ2V0KHJlY29yZC5vd25lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlDb2x1bW5IZWFkZXJzID0gcmVjb3JkT3duZXIuY29sdW1ucy5zb21lKGMgPT4gIWMuc2tpcCAmJiBjLmhlYWRlclR5cGUgPT09IEV4cG9ydEhlYWRlclR5cGUuTXVsdGlDb2x1bW5IZWFkZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc011bHRpQ29sdW1uSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhHcmlkUHJpbnRNdWx0aUNvbEhlYWRlcnMod29ya3NoZWV0RGF0YSwgcm93RGF0YUFyciwgcmVjb3JkLCByZWNvcmRPd25lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRIZWFkZXJzID0gT2JqZWN0LmtleXMod29ya3NoZWV0RGF0YS5kYXRhW2ldLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YUFyci5wdXNoKHRoaXMucHJvY2Vzc1Jvdyh3b3Jrc2hlZXREYXRhLCBpLCByZWNvcmRIZWFkZXJzLCBpc0hpZXJhcmNoaWNhbEdyaWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUocm93RGF0YUFyci5qb2luKCcnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaEdyaWRQcmludE11bHRpQ29sSGVhZGVycyh3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhLCByb3dEYXRhQXJyOiBhbnlbXSwgcmVjb3JkOiBJRXhwb3J0UmVjb3JkLFxuICAgICAgICBvd25lcjogSUNvbHVtbkxpc3QpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lci5tYXhMZXZlbDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmRMZXZlbCA9IHJlY29yZC5sZXZlbDtcbiAgICAgICAgICAgIGNvbnN0IG91dGxpbmVMZXZlbCA9IHJlY29yZExldmVsID4gMCA/IGAgb3V0bGluZUxldmVsPVwiJHtyZWNvcmRMZXZlbH1cImAgOiAnJztcbiAgICAgICAgICAgIHRoaXMubWF4T3V0bGluZUxldmVsID0gdGhpcy5tYXhPdXRsaW5lTGV2ZWwgPCByZWNvcmRMZXZlbCA/IHJlY29yZExldmVsIDogdGhpcy5tYXhPdXRsaW5lTGV2ZWw7XG4gICAgICAgICAgICBjb25zdCBzSGlkZGVuID0gcmVjb3JkLmhpZGRlbiA/IGAgaGlkZGVuPVwiMVwiYCA6ICcnO1xuXG4gICAgICAgICAgICB0aGlzLnJvd0luZGV4Kys7XG4gICAgICAgICAgICBsZXQgcm93ID0gYDxyb3cgcj1cIiR7dGhpcy5yb3dJbmRleH1cIiR7dGhpcy5yb3dIZWlnaHR9JHtvdXRsaW5lTGV2ZWx9JHtzSGlkZGVufT5gO1xuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzRm9yTGV2ZWwgPSBvd25lci5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjID0+IChjLmxldmVsIDwgaiAmJlxuICAgICAgICAgICAgICAgICAgICBjLmhlYWRlclR5cGUgIT09IEV4cG9ydEhlYWRlclR5cGUuTXVsdGlDb2x1bW5IZWFkZXIgfHwgYy5sZXZlbCA9PT0gaikgJiYgYy5jb2x1bW5TcGFuID4gMCAmJiAhYy5za2lwKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0SW5kZXggLSBiLnN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucGlubmVkSW5kZXggLSBiLnBpbm5lZEluZGV4KTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0VmFsdWUgPSAwICsgcmVjb3JkLmxldmVsO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb2wgb2YgaGVhZGVyc0ZvckxldmVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2wubGV2ZWwgPT09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHVtbkNvb3JkaW5hdGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvb3JkaW5hdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKHN0YXJ0VmFsdWUpICsgdGhpcy5yb3dJbmRleDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IHdvcmtzaGVldERhdGEuZGF0YURpY3Rpb25hcnkuc2F2ZVZhbHVlKGN1cnJlbnRDb2wuaGVhZGVyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcm93ICs9IGA8YyByPVwiJHtjb2x1bW5Db29yZGluYXRlfVwiIHM9XCIzXCIgdD1cInNcIj48dj4ke2NvbHVtblZhbHVlfTwvdj48L2M+YDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPT0gb3duZXIubWF4TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDZWxsc0NvdW50ZXIrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDZWxsU3RyICs9IGAgPG1lcmdlQ2VsbCByZWY9XCIke2NvbHVtbkNvb3JkaW5hdGV9OmA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29sLmhlYWRlclR5cGUgPT09IEV4cG9ydEhlYWRlclR5cGUuQ29sdW1uSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29vcmRpbmF0ZSA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihzdGFydFZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJvd0luZGV4ICsgb3duZXIubWF4TGV2ZWwgLSBjdXJyZW50Q29sLmxldmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBjdXJyZW50Q29sLmNvbHVtblNwYW47IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db29yZGluYXRlID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKHN0YXJ0VmFsdWUgKyBrKSArIHRoaXMucm93SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyArPSBgPGMgcj1cIiR7Y29sdW1uQ29vcmRpbmF0ZX1cIiBzPVwiM1wiIC8+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDZWxsU3RyICs9IGAke2NvbHVtbkNvb3JkaW5hdGV9XCIgLz5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZSArPSBjdXJyZW50Q29sLmNvbHVtblNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3cgKz0gYDwvcm93PmA7XG4gICAgICAgICAgICByb3dEYXRhQXJyLnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1Jvdyh3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhLCBpOiBudW1iZXIsIGhlYWRlcnNGb3JMZXZlbDogYW55W10sIGlzSGllcmFyY2hpY2FsR3JpZDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB3b3Jrc2hlZXREYXRhLmRhdGFbaV07XG5cbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IG5ldyBBcnJheSh3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50ICsgMik7XG5cbiAgICAgICAgY29uc3Qgcm93TGV2ZWwgPSByZWNvcmQubGV2ZWw7XG4gICAgICAgIGNvbnN0IG91dGxpbmVMZXZlbCA9IHJvd0xldmVsID4gMCA/IGAgb3V0bGluZUxldmVsPVwiJHtyb3dMZXZlbH1cImAgOiAnJztcbiAgICAgICAgdGhpcy5tYXhPdXRsaW5lTGV2ZWwgPSB0aGlzLm1heE91dGxpbmVMZXZlbCA8IHJvd0xldmVsID8gcm93TGV2ZWwgOiB0aGlzLm1heE91dGxpbmVMZXZlbDtcblxuICAgICAgICBjb25zdCBzSGlkZGVuID0gcmVjb3JkLmhpZGRlbiA/IGAgaGlkZGVuPVwiMVwiYCA6ICcnO1xuXG4gICAgICAgIHRoaXMucm93SW5kZXgrKztcbiAgICAgICAgY29uc3QgcGl2b3RHcmlkQ29sdW1ucyA9IHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5nZXQodGhpcy5yb3dJbmRleCkgPz8gXCJcIjtcblxuICAgICAgICByb3dEYXRhWzBdID0gYDxyb3cgcj1cIiR7dGhpcy5yb3dJbmRleH1cIiR7dGhpcy5yb3dIZWlnaHR9JHtvdXRsaW5lTGV2ZWx9JHtzSGlkZGVufT4ke3Bpdm90R3JpZENvbHVtbnN9YDtcbiAgICAgICAgY29uc3Qga2V5cyA9IHdvcmtzaGVldERhdGEuaXNTcGVjaWFsRGF0YSA/IFtyZWNvcmQuZGF0YV0gOiBoZWFkZXJzRm9yTGV2ZWw7XG4gICAgICAgIGNvbnN0IGlzRGF0YVJlY29yZCA9IHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkhpZXJhcmNoaWNhbEdyaWRSZWNvcmRcbiAgICAgICAgICAgIHx8IHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkRhdGFSZWNvcmRcbiAgICAgICAgICAgIHx8IHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkdyb3VwZWRSZWNvcmRcbiAgICAgICAgICAgIHx8IHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLlRyZWVHcmlkUmVjb3JkO1xuXG4gICAgICAgIGNvbnN0IGlzVmFsaWRSZWNvcmRUeXBlID0gaXNEYXRhUmVjb3JkIHx8IHJlY29yZC50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLlN1bW1hcnlSZWNvcmQ7XG5cbiAgICAgICAgaWYgKGlzVmFsaWRSZWNvcmRUeXBlICYmIHdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVTdW1tYXJ5RGltZW5zaW9ucyhyZWNvcmQsIGlzRGF0YVJlY29yZCwgd29ya3NoZWV0RGF0YS5pc0dyb3VwZWRHcmlkKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBqICsgKGlzSGllcmFyY2hpY2FsR3JpZCA/IHJvd0xldmVsIDogd29ya3NoZWV0RGF0YS5pc1Bpdm90R3JpZCA/IHdvcmtzaGVldERhdGEub3duZXIubWF4Um93TGV2ZWwgOiAwKTtcblxuICAgICAgICAgICAgY29uc3QgY2VsbERhdGEgPSB0aGlzLmdldENlbGxEYXRhKHdvcmtzaGVldERhdGEsIGksIGNvbCwga2V5c1tqXSk7XG5cbiAgICAgICAgICAgIHJvd0RhdGFbaiArIDFdID0gY2VsbERhdGE7XG4gICAgICAgIH1cblxuICAgICAgICByb3dEYXRhW2tleXMubGVuZ3RoICsgMV0gPSAnPC9yb3c+JztcblxuICAgICAgICByZXR1cm4gcm93RGF0YS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENlbGxEYXRhKHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEsIHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlciwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gd29ya3NoZWV0RGF0YS5kYXRhRGljdGlvbmFyeTtcbiAgICAgICAgbGV0IGNvbHVtbk5hbWUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sdW1uKSArICh0aGlzLnJvd0luZGV4KTtcbiAgICAgICAgY29uc3QgZnVsbFJvdyA9IHdvcmtzaGVldERhdGEuZGF0YVtyb3ddO1xuICAgICAgICBjb25zdCBpc0hlYWRlclJlY29yZCA9IGZ1bGxSb3cudHlwZSA9PT0gRXhwb3J0UmVjb3JkVHlwZS5IZWFkZXJSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGlzU3VtbWFyeVJlY29yZCA9IGZ1bGxSb3cudHlwZSA9PT0gRXhwb3J0UmVjb3JkVHlwZS5TdW1tYXJ5UmVjb3JkO1xuICAgICAgICBjb25zdCBpc1ZhbGlkUmVjb3JkVHlwZSA9IGZ1bGxSb3cudHlwZSA9PT0gRXhwb3J0UmVjb3JkVHlwZS5Hcm91cGVkUmVjb3JkXG4gICAgICAgICAgICB8fCBmdWxsUm93LnR5cGUgPT09IEV4cG9ydFJlY29yZFR5cGUuRGF0YVJlY29yZFxuICAgICAgICAgICAgfHwgZnVsbFJvdy50eXBlID09PSBFeHBvcnRSZWNvcmRUeXBlLkhpZXJhcmNoaWNhbEdyaWRSZWNvcmRcbiAgICAgICAgICAgIHx8IGZ1bGxSb3cudHlwZSA9PT0gRXhwb3J0UmVjb3JkVHlwZS5UcmVlR3JpZFJlY29yZDtcblxuICAgICAgICB0aGlzLmZpcnN0RGF0YVJvdyA9IHRoaXMuZmlyc3REYXRhUm93ID4gdGhpcy5yb3dJbmRleCA/IHRoaXMucm93SW5kZXggOiB0aGlzLmZpcnN0RGF0YVJvdztcblxuICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSB3b3Jrc2hlZXREYXRhLmlzU3BlY2lhbERhdGEgP1xuICAgICAgICAgICAgZnVsbFJvdy5kYXRhIDpcbiAgICAgICAgICAgIGZ1bGxSb3cuZGF0YVtrZXldO1xuXG4gICAgICAgIGlmIChjZWxsVmFsdWUgPT09IEdSSURfTEVWRUxfQ09MIHx8IGtleSA9PT0gR1JJRF9MRVZFTF9DT0wpIHtcbiAgICAgICAgICAgIGNvbHVtbk5hbWUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4od29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDEpICsgKHRoaXMucm93SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdvcmtzaGVldERhdGEuaGFzU3VtbWFyaWVzICYmIChpc1ZhbGlkUmVjb3JkVHlwZSB8fCAod29ya3NoZWV0RGF0YS5pc0dyb3VwZWRHcmlkICYmIGlzU3VtbWFyeVJlY29yZCkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN1bW1hcnlDb29yZGluYXRlcyhjb2x1bW5OYW1lLCBrZXksIGZ1bGxSb3cuaGllcmFyY2hpY2FsT3duZXIsIHdvcmtzaGVldERhdGEuaXNHcm91cGVkR3JpZCAmJiBpc1N1bW1hcnlSZWNvcmQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVsbFJvdy5zdW1tYXJ5S2V5ICYmIGZ1bGxSb3cuc3VtbWFyeUtleSA9PT0gR1JJRF9ST09UX1NVTU1BUlkgJiYga2V5ICE9PSBHUklEX0xFVkVMX0NPTCAmJiB3b3Jrc2hlZXREYXRhLmlzR3JvdXBlZEdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Um9vdFN1bW1hcnlTdGFydENvb3JkaW5hdGUoY29sdW1uLCBrZXkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvbHVtbiA+IGNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Um9vdFN1bW1hcnlTdGFydENvb3JkaW5hdGUod29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDEsIEdSSURfTEVWRUxfQ09MKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0Q29sdW1uID0gY29sdW1uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0Q29sQXJyID0gQXJyYXkuZnJvbSh3b3Jrc2hlZXREYXRhLm93bmVycy52YWx1ZXMoKSkubWFwKGFyciA9PiBhcnIuY29sdW1ucykuZmluZChwcm9kdWN0ID0+IHByb2R1Y3Quc29tZShpdGVtID0+IGl0ZW0uZmllbGQgPT09IGtleSkpO1xuICAgICAgICBjb25zdCB0YXJnZXRDb2wgPSB0YXJnZXRDb2xBcnIgPyB0YXJnZXRDb2xBcnIuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBrZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICgoY2VsbFZhbHVlID09PSB1bmRlZmluZWQgfHwgY2VsbFZhbHVlID09PSBudWxsKSAmJiAhd29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBgPGMgcj1cIiR7Y29sdW1uTmFtZX1cIiBzPVwiMVwiLz5gO1xuICAgICAgICB9IGVsc2UgaWYgKCh3b3Jrc2hlZXREYXRhLmhhc1N1bW1hcmllcyAmJiAoaXNWYWxpZFJlY29yZFR5cGUgfHwgaXNIZWFkZXJSZWNvcmQpKSB8fCAhd29ya3NoZWV0RGF0YS5oYXNTdW1tYXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkVmFsdWUgPSBkaWN0aW9uYXJ5LnNhdmVWYWx1ZShjZWxsVmFsdWUsIGlzSGVhZGVyUmVjb3JkKTtcbiAgICAgICAgICAgIGNvbnN0IGlzU2F2ZWRBc1N0cmluZyA9IHNhdmVkVmFsdWUgIT09IC0xO1xuXG4gICAgICAgICAgICBjb25zdCBpc1NhdmVkQXNEYXRlID0gIWlzU2F2ZWRBc1N0cmluZyAmJiBjZWxsVmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBpc1NhdmVkQXNTdHJpbmcgPyBzYXZlZFZhbHVlIDogY2VsbFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoaXNTYXZlZEFzRGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVab25lT2Zmc2V0ID0gdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzb1N0cmluZyA9IChuZXcgRGF0ZSh2YWx1ZSAtIHRpbWVab25lT2Zmc2V0KSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGlzb1N0cmluZy5zdWJzdHJpbmcoMCwgaXNvU3RyaW5nLmluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBpc1NhdmVkQXNTdHJpbmcgPyBgIHQ9XCJzXCJgIDogaXNTYXZlZEFzRGF0ZSA/IGAgdD1cImRcImAgOiAnJztcblxuICAgICAgICAgICAgY29uc3QgaXNUaW1lID0gdGFyZ2V0Q29sPy5kYXRhVHlwZSA9PT0gJ3RpbWUnO1xuICAgICAgICAgICAgY29uc3QgaXNEYXRlVGltZSA9IHRhcmdldENvbD8uZGF0YVR5cGUgPT09ICdkYXRlVGltZSc7XG4gICAgICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2UgPSB0YXJnZXRDb2w/LmRhdGFUeXBlID09PSAncGVyY2VudCc7XG4gICAgICAgICAgICBjb25zdCBpc0NvbHVtbkN1cnJlbmN5VHlwZSA9IHRhcmdldENvbD8uZGF0YVR5cGUgPT09ICdjdXJyZW5jeSc7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGlzUGVyY2VudGFnZSA/IGAgcz1cIjEyXCJgIDogaXNEYXRlVGltZSA/IGAgcz1cIjExXCJgIDogaXNUaW1lID8gYCBzPVwiMTBcImAgOiBpc0hlYWRlclJlY29yZCA/IGAgcz1cIjNcImAgOiBpc1NhdmVkQXNTdHJpbmcgPyAnJyA6IGlzU2F2ZWRBc0RhdGUgPyBgIHM9XCIyXCJgIDogaXNDb2x1bW5DdXJyZW5jeVR5cGUgPyBgIHM9XCIke3RoaXMuY3VycmVuY3lTdHlsZU1hcC5nZXQodGFyZ2V0Q29sLmN1cnJlbmN5Q29kZSk/LnN0eWxlWGYgfHwgMH1cImAgOiBgIHM9XCIxXCJgO1xuXG4gICAgICAgICAgICByZXR1cm4gYDxjIHI9XCIke2NvbHVtbk5hbWV9XCIke3R5cGV9JHtmb3JtYXR9Pjx2PiR7dmFsdWV9PC92PjwvYz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN1bW1hcnlGdW5jID0gYFwiJHtjZWxsVmFsdWUgPz8gXCJcIn1cImA7XG5cbiAgICAgICAgICAgIGlmIChpc1N1bW1hcnlSZWNvcmQgJiYgY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGltZW5zaW9uTWFwS2V5ID0gdGhpcy5pc1ZhbGlkR3JpZCA/IGZ1bGxSb3cuaGllcmFyY2hpY2FsT3duZXIgPz8gR1JJRF9QQVJFTlQgOiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldmVsID0gd29ya3NoZWV0RGF0YS5pc0dyb3VwZWRHcmlkID8gd29ya3NoZWV0RGF0YS5tYXhMZXZlbCA6IGZ1bGxSb3cubGV2ZWw7XG5cbiAgICAgICAgICAgICAgICBzdW1tYXJ5RnVuYyA9IHRoaXMuZ2V0U3VtbWFyeUZ1bmN0aW9uKGNlbGxWYWx1ZS5sYWJlbCwga2V5LCBkaW1lbnNpb25NYXBLZXksIGxldmVsLCB0YXJnZXRDb2wpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzdW1tYXJ5RnVuYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsU3RyID0gYCR7Y2VsbFZhbHVlLmxhYmVsfTogJHtjZWxsVmFsdWUudmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F2ZWRWYWx1ZSA9IGRpY3Rpb25hcnkuc2F2ZVZhbHVlKGNlbGxTdHIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8YyByPVwiJHtjb2x1bW5OYW1lfVwiIHQ9XCJzXCIgcz1cIjFcIj48dj4ke3NhdmVkVmFsdWV9PC92PjwvYz5gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBgPGMgcj1cIiR7Y29sdW1uTmFtZX1cIj48ZiB0PVwiYXJyYXlcIiByZWY9XCIke2NvbHVtbk5hbWV9XCI+JHtzdW1tYXJ5RnVuY308L2Y+PC9jPmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBgPGMgcj1cIiR7Y29sdW1uTmFtZX1cIiBzPVwiMVwiPjxmPiR7c3VtbWFyeUZ1bmN9PC9mPjwvYz5gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlU3VtbWFyeURpbWVuc2lvbnMocmVjb3JkOiBJRXhwb3J0UmVjb3JkLCBpc0RhdGFSZWNvcmQ6IGJvb2xlYW4sIGlzR3JvdXBlZEdyaWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEdyaWQgJiZcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpZXJhcmNoaWNhbE93bmVyICE9PSAnJyAmJlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SGllcmFyY2hpY2FsT3duZXIgIT09IHJlY29yZC5vd25lciAmJlxuICAgICAgICAgICAgIXRoaXMuaGllcmFyY2hpY2FsRGltZW5zaW9uTWFwLmdldCh0aGlzLmN1cnJlbnRIaWVyYXJjaGljYWxPd25lcikpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY2FsRGltZW5zaW9uTWFwLnNldCh0aGlzLmN1cnJlbnRIaWVyYXJjaGljYWxPd25lciwgbmV3IE1hcCh0aGlzLmRpbWVuc2lvbk1hcCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEYXRhUmVjb3JkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3VtbWFyeU93bmVyICE9PSByZWNvcmQuc3VtbWFyeUtleSB8fCB0aGlzLmN1cnJlbnRIaWVyYXJjaGljYWxPd25lciAhPT0gcmVjb3JkLmhpZXJhcmNoaWNhbE93bmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaW1lbnNpb25NYXAuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3VtbWFyeU93bmVyID0gcmVjb3JkLnN1bW1hcnlLZXk7XG5cbiAgICAgICAgICAgIC8vIEZvciBncm91cGVkIGdyaWQgd2UgbmVlZCB0byByZXNldCB0aGUgcGFyZW50IG1hcFxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgc3RhcnRDb29yZGluYXRlIGZvciBlYWNoIHJlY29yZFxuICAgICAgICAgICAgaWYgKGlzR3JvdXBlZEdyaWQgJiYgdGhpcy5jdXJyZW50SGllcmFyY2hpY2FsT3duZXIgIT09ICcnICYmIHJlY29yZC5oaWVyYXJjaGljYWxPd25lciA9PT0gR1JJRF9QQVJFTlQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcC5kZWxldGUoR1JJRF9QQVJFTlQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpZXJhcmNoaWNhbE93bmVyID0gcmVjb3JkLmhpZXJhcmNoaWNhbE93bmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTdW1tYXJ5Q29vcmRpbmF0ZXMoY29sdW1uTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgaGllcmFyY2hpY2FsT3duZXI6IHN0cmluZywgdXNlTGFzdFZhbGlkRW5kQ29vcmRpbmF0ZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCB0YXJnZXREaW1lbnNpb25NYXAgPSB0aGlzLmhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcC5nZXQoaGllcmFyY2hpY2FsT3duZXIpID8/IHRoaXMuZGltZW5zaW9uTWFwO1xuXG4gICAgICAgIGlmICghdGFyZ2V0RGltZW5zaW9uTWFwLmdldChrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGltZW5zaW9uczogRGltZW5zaW9ucyA9IHtcbiAgICAgICAgICAgICAgICBzdGFydENvb3JkaW5hdGU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgZW5kQ29vcmRpbmF0ZTogY29sdW1uTmFtZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGFyZ2V0RGltZW5zaW9uTWFwLnNldChrZXksIGluaXRpYWxEaW1lbnNpb25zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVzZUxhc3RWYWxpZEVuZENvb3JkaW5hdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEVuZENvb3JkaW5hdGVzKHRhcmdldERpbWVuc2lvbk1hcCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldERpbWVuc2lvbk1hcC5nZXQoa2V5KS5lbmRDb29yZGluYXRlID0gY29sdW1uTmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RWYWxpZFJvdyA9IHRhcmdldERpbWVuc2lvbk1hcC5nZXQoa2V5KS5lbmRDb29yZGluYXRlLm1hdGNoKC9bYS16XSt8W15hLXpdKy9naSlbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWRHcmlkICYmICF1c2VMYXN0VmFsaWRFbmRDb29yZGluYXRlICYmIGhpZXJhcmNoaWNhbE93bmVyICE9PSBHUklEX1BBUkVOVCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TWFwID0gdGhpcy5oaWVyYXJjaGljYWxEaW1lbnNpb25NYXAuZ2V0KEdSSURfUEFSRU5UKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RW5kQ29vcmRpbmF0ZXMocGFyZW50TWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RW5kQ29vcmRpbmF0ZXMobWFwOiBNYXA8c3RyaW5nLCBEaW1lbnNpb25zPiwgdXNlTGFzdFZhbGlkRW5kQ29vcmRpbmF0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgYSBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbE5hbWUgPSBhLmVuZENvb3JkaW5hdGUubWF0Y2goL1thLXpdK3xbXmEtel0rL2dpKVswXTtcbiAgICAgICAgICAgIGEuZW5kQ29vcmRpbmF0ZSA9IGAke2NvbE5hbWV9JHt1c2VMYXN0VmFsaWRFbmRDb29yZGluYXRlID8gdGhpcy5sYXN0VmFsaWRSb3cgOiB0aGlzLnJvd0luZGV4fWA7XG4gICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdW1tYXJ5RnVuY3Rpb24odHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZGltZW5zaW9uTWFwS2V5OiBhbnksIHJlY29yZExldmVsOiBudW1iZXIsIGNvbDogSUNvbHVtbkluZm8pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25NYXAgPSBkaW1lbnNpb25NYXBLZXkgPyB0aGlzLmhpZXJhcmNoaWNhbERpbWVuc2lvbk1hcC5nZXQoZGltZW5zaW9uTWFwS2V5KSA6IHRoaXMuZGltZW5zaW9uTWFwO1xuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gZGltZW5zaW9uTWFwLmdldChrZXkpO1xuICAgICAgICBjb25zdCBsZXZlbERpbWVuc2lvbnMgPSBkaW1lbnNpb25NYXAuZ2V0KEdSSURfTEVWRUxfQ09MKTtcblxuICAgICAgICBsZXQgZnVuYyA9ICcnO1xuICAgICAgICBsZXQgZnVuY1R5cGUgPSAnJztcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBjb25zdCBjdXJyZW5jeUluZm8gPSB0aGlzLmN1cnJlbmN5U3R5bGVNYXAuZ2V0KGNvbC5jdXJyZW5jeUNvZGUpO1xuXG4gICAgICAgIHN3aXRjaCh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjb3VudFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgXCJDb3VudDogXCImYW1wO194bGZuLkNPVU5USUYoJHtsZXZlbERpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2xldmVsRGltZW5zaW9ucy5lbmRDb29yZGluYXRlfSwgJHtyZWNvcmRMZXZlbH0pYFxuICAgICAgICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICAgICAgICAgIGZ1bmMgPSBgX3hsZm4uTUlOKF94bGZuLklGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX09JHtyZWNvcmRMZXZlbH0sICR7ZGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7ZGltZW5zaW9ucy5lbmRDb29yZGluYXRlfSkpYFxuICAgICAgICAgICAgICAgIGZ1bmNUeXBlID0gYFwiTWluOiBcIiZhbXA7YDtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNUeXBlICsgKGNvbC5kYXRhVHlwZSA9PT0gJ2N1cnJlbmN5JyAmJiBjdXJyZW5jeUluZm9cbiAgICAgICAgICAgICAgICAgICAgPyBgX3hsZm4uVEVYVCgke2Z1bmN9LCBcIiR7Y3VycmVuY3lJbmZvLnN5bWJvbH0jLCMjMC4wMFwiKWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtmdW5jfWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICAgICAgICAgIGZ1bmMgPSBgX3hsZm4uTUFYKF94bGZuLklGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX09JHtyZWNvcmRMZXZlbH0sICR7ZGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7ZGltZW5zaW9ucy5lbmRDb29yZGluYXRlfSkpYFxuICAgICAgICAgICAgICAgIGZ1bmNUeXBlID0gYFwiTWF4OiBcIiZhbXA7YDtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNUeXBlICsgKGNvbC5kYXRhVHlwZSA9PT0gJ2N1cnJlbmN5JyAmJiBjdXJyZW5jeUluZm9cbiAgICAgICAgICAgICAgICAgICAgPyBgX3hsZm4uVEVYVCgke2Z1bmN9LCBcIiR7Y3VycmVuY3lJbmZvLnN5bWJvbH0jLCMjMC4wMFwiKWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtmdW5jfWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgY2FzZSBcInN1bVwiOlxuICAgICAgICAgICAgICAgIGZ1bmMgPSAgYF94bGZuLlNVTUlGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0sICR7cmVjb3JkTGV2ZWx9LCAke2RpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2RpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0pYFxuICAgICAgICAgICAgICAgIGZ1bmNUeXBlID0gYFwiU3VtOiBcIiZhbXA7YDtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNUeXBlICsgKGNvbC5kYXRhVHlwZSA9PT0gJ2N1cnJlbmN5JyAmJiBjdXJyZW5jeUluZm9cbiAgICAgICAgICAgICAgICAgICAgPyBgX3hsZm4uVEVYVCgke2Z1bmN9LCBcIiR7Y3VycmVuY3lJbmZvLnN5bWJvbH0jLCMjMC4wMFwiKWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtmdW5jfWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgY2FzZSBcImF2Z1wiOlxuICAgICAgICAgICAgICAgIGZ1bmMgPSBgX3hsZm4uQVZFUkFHRUlGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0sICR7cmVjb3JkTGV2ZWx9LCAke2RpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2RpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX0pYFxuICAgICAgICAgICAgICAgIGZ1bmNUeXBlID0gYFwiQXZnOiBcIiZhbXA7YDtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNUeXBlICsgKGNvbC5kYXRhVHlwZSA9PT0gJ2N1cnJlbmN5JyAmJiBjdXJyZW5jeUluZm9cbiAgICAgICAgICAgICAgICAgICAgPyBgX3hsZm4uVEVYVCgke2Z1bmN9LCBcIiR7Y3VycmVuY3lJbmZvLnN5bWJvbH0jLCMjMC4wMFwiKWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtmdW5jfWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgY2FzZSBcImVhcmxpZXN0XCI6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZ2V0IGRhdGUgZm9ybWF0IGZyb20gbG9jYWxlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcIkVhcmxpZXN0OiBcIiZhbXA7X3hsZm4uVEVYVChfeGxmbi5NSU4oX3hsZm4uSUYoJHtsZXZlbERpbWVuc2lvbnMuc3RhcnRDb29yZGluYXRlfToke2xldmVsRGltZW5zaW9ucy5lbmRDb29yZGluYXRlfT0ke3JlY29yZExldmVsfSwgJHtkaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtkaW1lbnNpb25zLmVuZENvb3JkaW5hdGV9KSksIFwibS9kL3l5eXlcIilgXG4gICAgICAgICAgICBjYXNlIFwibGF0ZXN0XCI6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZ2V0IGRhdGUgZm9ybWF0IGZyb20gbG9jYWxlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcIkxhdGVzdDogXCImYW1wO194bGZuLlRFWFQoX3hsZm4uTUFYKF94bGZuLklGKCR7bGV2ZWxEaW1lbnNpb25zLnN0YXJ0Q29vcmRpbmF0ZX06JHtsZXZlbERpbWVuc2lvbnMuZW5kQ29vcmRpbmF0ZX09JHtyZWNvcmRMZXZlbH0sICR7ZGltZW5zaW9ucy5zdGFydENvb3JkaW5hdGV9OiR7ZGltZW5zaW9ucy5lbmRDb29yZGluYXRlfSkpLCBcIm0vZC95eXl5XCIpYFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSb290U3VtbWFyeVN0YXJ0Q29vcmRpbmF0ZShjb2x1bW46IG51bWJlciwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRhUmVjb3JkQ29sTmFtZSA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihjb2x1bW4pICsgKHRoaXMuZmlyc3REYXRhUm93KTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TWFwID0gdGhpcy5oaWVyYXJjaGljYWxEaW1lbnNpb25NYXAuZ2V0KEdSSURfUEFSRU5UKTtcblxuICAgICAgICBpZiAodGFyZ2V0TWFwLmdldChrZXkpLnN0YXJ0Q29vcmRpbmF0ZSAhPT0gZmlyc3REYXRhUmVjb3JkQ29sTmFtZSkge1xuICAgICAgICAgICAgdGFyZ2V0TWFwLmdldChrZXkpLnN0YXJ0Q29vcmRpbmF0ZSA9IGZpcnN0RGF0YVJlY29yZENvbE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByaW50SGVhZGVycyh3b3Jrc2hlZXREYXRhOiBXb3Jrc2hlZXREYXRhLCBoZWFkZXJzRm9yTGV2ZWw6IElDb2x1bW5JbmZvW10sIGk6IG51bWJlciwgaXNWZXJ0aWNhbDogYm9vbGVhbikge1xuICAgICAgICBsZXQgc3RhcnRWYWx1ZSA9IDA7XG4gICAgICAgIGxldCBzdHIgPSAnJztcblxuICAgICAgICBjb25zdCBpc0hpZXJhcmNoaWNhbEdyaWQgPSB3b3Jrc2hlZXREYXRhLmlzSGllcmFyY2hpY2FsO1xuICAgICAgICBsZXQgcm93U3R5bGUgPSBpc0hpZXJhcmNoaWNhbEdyaWQgPyAnIHM9XCIzXCInIDogJyc7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB3b3Jrc2hlZXREYXRhLmRhdGFEaWN0aW9uYXJ5O1xuICAgICAgICBjb25zdCBvd25lciA9IHdvcmtzaGVldERhdGEub3duZXI7XG4gICAgICAgIGNvbnN0IG1heExldmVsID0gaXNWZXJ0aWNhbFxuICAgICAgICAgICAgPyBvd25lci5tYXhSb3dMZXZlbFxuICAgICAgICAgICAgOiBvd25lci5tYXhMZXZlbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb2wgb2YgaGVhZGVyc0ZvckxldmVsKSB7XG4gICAgICAgICAgICBjb25zdCBzcGFuTGVuZ3RoID0gaXNWZXJ0aWNhbCA/IGN1cnJlbnRDb2wucm93U3BhbiA6IGN1cnJlbnRDb2wuY29sdW1uU3BhbjtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2wubGV2ZWwgPT09IGkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uQ29vcmRpbmF0ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yb3dJbmRleFxuICAgICAgICAgICAgICAgICAgICA6IHN0YXJ0VmFsdWUgKyAob3duZXIubWF4Um93TGV2ZWwgPz8gMClcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0Nvb3JkaW5hdGUgPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgID8gc3RhcnRWYWx1ZSArIG93bmVyLm1heExldmVsICsgMlxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMucm93SW5kZXhcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gZGljdGlvbmFyeS5zYXZlVmFsdWUoY3VycmVudENvbC5oZWFkZXIsIHRydWUsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGNvbHVtbkNvb3JkaW5hdGUgPSAoY3VycmVudENvbC5maWVsZCA9PT0gR1JJRF9MRVZFTF9DT0xcbiAgICAgICAgICAgICAgICAgICAgPyBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4od29ya3NoZWV0RGF0YS5jb2x1bW5Db3VudCArIDEpXG4gICAgICAgICAgICAgICAgICAgIDogRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKGNvbHVtbikpICsgcm93Q29vcmRpbmF0ZTtcblxuICAgICAgICAgICAgICAgIHJvd1N0eWxlID0gaXNWZXJ0aWNhbCAmJiBjdXJyZW50Q29sLnJvd1NwYW4gPiAxID8gJyBzPVwiNFwiJyA6IHJvd1N0eWxlO1xuICAgICAgICAgICAgICAgIHN0ciA9IGA8YyByPVwiJHtjb2x1bW5Db29yZGluYXRlfVwiJHtyb3dTdHlsZX0gdD1cInNcIj48dj4ke2NvbHVtblZhbHVlfTwvdj48L2M+YDtcblxuICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpdm90R3JpZFJvd0hlYWRlcnNNYXAuaGFzKHJvd0Nvb3JkaW5hdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpdm90R3JpZFJvd0hlYWRlcnNNYXAuc2V0KHJvd0Nvb3JkaW5hdGUsIHRoaXMucGl2b3RHcmlkUm93SGVhZGVyc01hcC5nZXQocm93Q29vcmRpbmF0ZSkgKyBzdHIpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpdm90R3JpZFJvd0hlYWRlcnNNYXAuc2V0KHJvd0Nvb3JkaW5hdGUsIHN0cilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlZXREYXRhICs9IHN0cjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gbWF4TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNlbGxzQ291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2VsbFN0ciArPSBgIDxtZXJnZUNlbGwgcmVmPVwiJHtjb2x1bW5Db29yZGluYXRlfTpgO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29sLmhlYWRlclR5cGUgPT09IEV4cG9ydEhlYWRlclR5cGUuQ29sdW1uSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSBpc1ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXhMZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhcnRWYWx1ZSArIChvd25lci5tYXhSb3dMZXZlbCA/PyAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gaXNWZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm93Q29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3duZXIubWF4TGV2ZWwgKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db29yZGluYXRlID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKGNvbCkgKyByb3c7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMTsgayA8IHNwYW5MZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IGlzVmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2x1bW4gKyBrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gaXNWZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJvd0Nvb3JkaW5hdGUgKyBrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5yb3dJbmRleDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvb3JkaW5hdGUgPSBFeGNlbFN0cmluZ3MuZ2V0RXhjZWxDb2x1bW4oY29sKSArIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBgPGMgcj1cIiR7Y29sdW1uQ29vcmRpbmF0ZX1cIiR7cm93U3R5bGV9IC8+YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBpdm90R3JpZFJvd0hlYWRlcnNNYXAuc2V0KHJvdywgc3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2hlZXREYXRhICs9IHN0clxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNlbGxTdHIgKz0gYCR7Y29sdW1uQ29vcmRpbmF0ZX1cIiAvPmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGFydFZhbHVlICs9IHNwYW5MZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgU3R5bGVGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCkge1xuICAgICAgICBmb2xkZXJbJ3N0eWxlcy54bWwnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldFN0eWxlcygpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICBmb2xkZXJbJ3dvcmtib29rLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0V29ya2Jvb2sod29ya3NoZWV0RGF0YS5vcHRpb25zLndvcmtzaGVldE5hbWUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgQ29udGVudFR5cGVzRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QsIHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzU2hhcmVkU3RyaW5ncyA9ICF3b3Jrc2hlZXREYXRhLmlzRW1wdHkgfHwgd29ya3NoZWV0RGF0YS5vcHRpb25zLmFsd2F5c0V4cG9ydEhlYWRlcnM7XG4gICAgICAgIGZvbGRlclsnW0NvbnRlbnRfVHlwZXNdLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0Q29udGVudFR5cGVzWE1MKGhhc1NoYXJlZFN0cmluZ3MsIHdvcmtzaGVldERhdGEub3B0aW9ucy5leHBvcnRBc1RhYmxlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZFN0cmluZ3NGaWxlIGltcGxlbWVudHMgSUV4Y2VsRmlsZSB7XG4gICAgcHVibGljIHdyaXRlRWxlbWVudChmb2xkZXI6IE9iamVjdCwgd29ya3NoZWV0RGF0YTogV29ya3NoZWV0RGF0YSkge1xuICAgICAgICBjb25zdCBkaWN0ID0gd29ya3NoZWV0RGF0YS5kYXRhRGljdGlvbmFyeTtcbiAgICAgICAgY29uc3Qgc29ydGVkVmFsdWVzID0gZGljdC5nZXRLZXlzKCk7XG4gICAgICAgIGNvbnN0IHNoYXJlZFN0cmluZ3MgPSBuZXcgQXJyYXk8c3RyaW5nPihzb3J0ZWRWYWx1ZXMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvcnRlZFZhbHVlcykge1xuICAgICAgICAgICAgc2hhcmVkU3RyaW5nc1tkaWN0LmdldFNhbml0aXplZFZhbHVlKHZhbHVlKV0gPSAnPHNpPjx0PicgKyB2YWx1ZSArICc8L3Q+PC9zaT4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9sZGVyWydzaGFyZWRTdHJpbmdzLnhtbCddID0gc3RyVG9VOChFeGNlbFN0cmluZ3MuZ2V0U2hhcmVkU3RyaW5nWE1MKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGljdC5zdHJpbmdzQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRWYWx1ZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyaW5ncy5qb2luKCcnKSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgVGFibGVzRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QsIHdvcmtzaGVldERhdGE6IFdvcmtzaGVldERhdGEpIHtcbiAgICAgICAgY29uc3QgY29sdW1uQ291bnQgPSB3b3Jrc2hlZXREYXRhLmNvbHVtbkNvdW50O1xuICAgICAgICBjb25zdCBsYXN0Q29sdW1uID0gRXhjZWxTdHJpbmdzLmdldEV4Y2VsQ29sdW1uKGNvbHVtbkNvdW50IC0gMSkgKyB3b3Jrc2hlZXREYXRhLnJvd0NvdW50O1xuICAgICAgICBjb25zdCBhdXRvRmlsdGVyRGltZW5zaW9uID0gJ0ExOicgKyBsYXN0Q29sdW1uO1xuICAgICAgICBjb25zdCB0YWJsZURpbWVuc2lvbiA9IHdvcmtzaGVldERhdGEuaXNFbXB0eVxuICAgICAgICAgICAgPyAnQTE6JyArIEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbihjb2x1bW5Db3VudCAtIDEpICsgKHdvcmtzaGVldERhdGEucm93Q291bnQgKyAxKVxuICAgICAgICAgICAgOiBhdXRvRmlsdGVyRGltZW5zaW9uO1xuICAgICAgICBjb25zdCBoYXNVc2VyU2V0SW5kZXggPSB3b3Jrc2hlZXREYXRhLm93bmVyLmNvbHVtbnMuc29tZShjID0+IGMuZXhwb3J0SW5kZXggIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGhhc1VzZXJTZXRJbmRleFxuICAgICAgICAgICAgPyB3b3Jrc2hlZXREYXRhLnJvb3RLZXlzXG4gICAgICAgICAgICA6IHdvcmtzaGVldERhdGEub3duZXIuY29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhYy5za2lwKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0SW5kZXggLSBiLnN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucGlubmVkSW5kZXggLSBiLnBpbm5lZEluZGV4KVxuICAgICAgICAgICAgICAgIC5tYXAoYyA9PiBjLmhlYWRlcik7XG5cbiAgICAgICAgbGV0IHNvcnRTdHJpbmcgPSAnJztcblxuICAgICAgICBsZXQgdGFibGVDb2x1bW5zID0gJzx0YWJsZUNvbHVtbnMgY291bnQ9XCInICsgY29sdW1uQ291bnQgKyAnXCI+JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICB2YWx1ZXNbaV07XG4gICAgICAgICAgICB0YWJsZUNvbHVtbnMgKz0gJzx0YWJsZUNvbHVtbiBpZD1cIicgKyAoaSArIDEpICsgJ1wiIG5hbWU9XCInICsgdmFsdWUgKyAnXCIvPic7XG4gICAgICAgIH1cblxuICAgICAgICB0YWJsZUNvbHVtbnMgKz0gJzwvdGFibGVDb2x1bW5zPic7XG5cbiAgICAgICAgaWYgKHdvcmtzaGVldERhdGEuc29ydCkge1xuICAgICAgICAgICAgY29uc3Qgc29ydGluZ0V4cHJlc3Npb24gPSB3b3Jrc2hlZXREYXRhLnNvcnQ7XG4gICAgICAgICAgICBjb25zdCBzYyA9IEV4Y2VsU3RyaW5ncy5nZXRFeGNlbENvbHVtbih2YWx1ZXMuaW5kZXhPZihzb3J0aW5nRXhwcmVzc2lvbi5maWVsZE5hbWUpKTtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHNvcnRpbmdFeHByZXNzaW9uLmRpciAtIDE7XG4gICAgICAgICAgICBzb3J0U3RyaW5nID0gYDxzb3J0U3RhdGUgcmVmPVwiQTI6JHtsYXN0Q29sdW1ufVwiPjxzb3J0Q29uZGl0aW9uIGRlc2NlbmRpbmc9XCIke2Rpcn1cIiByZWY9XCIke3NjfTE6JHtzY30xNVwiLz48L3NvcnRTdGF0ZT5gO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9sZGVyWyd0YWJsZTEueG1sJ10gPSBzdHJUb1U4KEV4Y2VsU3RyaW5ncy5nZXRUYWJsZXNYTUwoYXV0b0ZpbHRlckRpbWVuc2lvbiwgdGFibGVEaW1lbnNpb24sIHRhYmxlQ29sdW1ucywgc29ydFN0cmluZykpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRSZWxzRmlsZSBpbXBsZW1lbnRzIElFeGNlbEZpbGUge1xuICAgIHB1YmxpYyB3cml0ZUVsZW1lbnQoZm9sZGVyOiBPYmplY3QpIHtcbiAgICAgICAgZm9sZGVyWydzaGVldDEueG1sLnJlbHMnXSA9IHN0clRvVTgoRXhjZWxTdHJpbmdzLmdldFdvcmtzaGVldFJlbHMoKSk7XG4gICAgfVxufVxuIl19
|