@tetacom/ng-components 1.4.22 → 1.5.1
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/.eslintrc.json +3 -5
- package/component/dropdown/dropdown-base.d.ts +1 -1
- package/directive/dynamic-content-base.directive.d.ts +1 -1
- package/directive/only-number/only-number.directive.d.ts +1 -0
- package/fesm2022/tetacom-ng-components.mjs +533 -497
- package/fesm2022/tetacom-ng-components.mjs.map +1 -1
- package/package.json +3 -5
- package/pipe/prepend-zero/prepend-zero.pipe.d.ts +7 -0
- package/pipe/prepend-zero/public-api.d.ts +1 -0
- package/pipe/public-api.d.ts +1 -0
- package/style/badge.scss +6 -4
- package/style/checkbox.scss +3 -1
- package/style/chips.scss +3 -1
- package/style/icon.scss +3 -1
- package/style/message.scss +3 -1
- package/style/navigation.scss +3 -1
- package/style/presets/view-types.scss +3 -1
- package/style/toggle.scss +3 -1
- package/style/toolbar.scss +3 -1
- package/esm2022/common/contract/auto-close-ignore-case.mjs +0 -2
- package/esm2022/common/contract/constructor-type.mjs +0 -2
- package/esm2022/common/contract/dynamic-data.mjs +0 -10
- package/esm2022/common/contract/i-dictionary.mjs +0 -2
- package/esm2022/common/contract/i-id-name.mjs +0 -2
- package/esm2022/common/contract/i-id.mjs +0 -2
- package/esm2022/common/contract/i-rect.mjs +0 -2
- package/esm2022/common/contract/i-tree-data.mjs +0 -2
- package/esm2022/common/contract/public-api.mjs +0 -10
- package/esm2022/common/contract/teta-content-ref.mjs +0 -8
- package/esm2022/common/enum/align.enum.mjs +0 -13
- package/esm2022/common/enum/public-api.mjs +0 -4
- package/esm2022/common/enum/teta-size.enum.mjs +0 -9
- package/esm2022/common/enum/vertical-align.enum.mjs +0 -11
- package/esm2022/common/model/public-api.mjs +0 -2
- package/esm2022/common/model/view-type.model.mjs +0 -2
- package/esm2022/common/public-api.mjs +0 -6
- package/esm2022/common/service/click.service.mjs +0 -23
- package/esm2022/common/service/dynamic-component.service.mjs +0 -93
- package/esm2022/common/service/overlay-container.service.mjs +0 -41
- package/esm2022/common/service/public-api.mjs +0 -4
- package/esm2022/common/util/array-util.mjs +0 -121
- package/esm2022/common/util/dom-util.mjs +0 -19
- package/esm2022/common/util/position-util.mjs +0 -136
- package/esm2022/common/util/public-api.mjs +0 -4
- package/esm2022/component/accordion/accordion/accordion.component.mjs +0 -17
- package/esm2022/component/accordion/accordion-content.directive.mjs +0 -17
- package/esm2022/component/accordion/accordion-head/accordion-head.component.mjs +0 -51
- package/esm2022/component/accordion/accordion-item/accordion-item.component.mjs +0 -62
- package/esm2022/component/accordion/public-api.mjs +0 -5
- package/esm2022/component/autocomplete/autocomplete/autocomplete.component.mjs +0 -13
- package/esm2022/component/autocomplete/public-api.mjs +0 -2
- package/esm2022/component/avatar/avatar/avatar.component.mjs +0 -55
- package/esm2022/component/avatar/model/avatar-color.enum.mjs +0 -22
- package/esm2022/component/avatar/public-api.mjs +0 -2
- package/esm2022/component/button/button/button.component.mjs +0 -67
- package/esm2022/component/button/public-api.mjs +0 -2
- package/esm2022/component/chart-3d/chart3d/chart3d.component.mjs +0 -241
- package/esm2022/component/chart-3d/model/base-3d-point.mjs +0 -2
- package/esm2022/component/chart-3d/model/chart-3d-options.mjs +0 -7
- package/esm2022/component/chart-3d/model/public-api.mjs +0 -3
- package/esm2022/component/chart-3d/model/series-3d.mjs +0 -7
- package/esm2022/component/chart-3d/public-api.mjs +0 -3
- package/esm2022/component/checkbox/checkbox/checkbox.component.mjs +0 -137
- package/esm2022/component/checkbox/public-api.mjs +0 -2
- package/esm2022/component/date-picker/base-calendar.mjs +0 -121
- package/esm2022/component/date-picker/base-picker.mjs +0 -109
- package/esm2022/component/date-picker/date-picker/date-calendar/date-calendar.component.mjs +0 -50
- package/esm2022/component/date-picker/date-picker/date-picker.component.mjs +0 -228
- package/esm2022/component/date-picker/date-range/date-range.component.mjs +0 -233
- package/esm2022/component/date-picker/date-range/range-calendar/range-calendar.component.mjs +0 -118
- package/esm2022/component/date-picker/day-picker/day-item/day-item.component.mjs +0 -15
- package/esm2022/component/date-picker/day-picker/day-picker.component.mjs +0 -118
- package/esm2022/component/date-picker/model/date-period.mjs +0 -7
- package/esm2022/component/date-picker/model/date-picker-mode.enum.mjs +0 -7
- package/esm2022/component/date-picker/model/day-model.mjs +0 -13
- package/esm2022/component/date-picker/model/from-to.model.mjs +0 -2
- package/esm2022/component/date-picker/model/min-max-date.model.mjs +0 -2
- package/esm2022/component/date-picker/model/public-api.mjs +0 -6
- package/esm2022/component/date-picker/month-picker/month-picker.component.mjs +0 -47
- package/esm2022/component/date-picker/public-api.mjs +0 -6
- package/esm2022/component/date-picker/year-picker/scroll-to-selected-year.directive.mjs +0 -27
- package/esm2022/component/date-picker/year-picker/year-picker.component.mjs +0 -48
- package/esm2022/component/delimiter/delimiter/delimiter.component.mjs +0 -63
- package/esm2022/component/delimiter/public-api.mjs +0 -2
- package/esm2022/component/divider/divider/divider.component.mjs +0 -18
- package/esm2022/component/divider/public-api.mjs +0 -2
- package/esm2022/component/dropdown/dropdown/dropdown.component.mjs +0 -30
- package/esm2022/component/dropdown/dropdown-base.mjs +0 -224
- package/esm2022/component/dropdown/dropdown-content.directive.mjs +0 -18
- package/esm2022/component/dropdown/dropdown-head.directive.mjs +0 -19
- package/esm2022/component/dropdown/dropdown.directive.mjs +0 -38
- package/esm2022/component/dropdown/public-api.mjs +0 -5
- package/esm2022/component/dynamic-component/popup-content/popup-content.component.mjs +0 -53
- package/esm2022/component/dynamic-component/public-api.mjs +0 -2
- package/esm2022/component/expand-card/expand-card/expand-card.component.mjs +0 -34
- package/esm2022/component/expand-card/expand-item/expand-item.component.mjs +0 -25
- package/esm2022/component/expand-card/public-api.mjs +0 -3
- package/esm2022/component/expand-panel/expand-panel/expand-panel.component.mjs +0 -65
- package/esm2022/component/expand-panel/expand-panel-content.directive.mjs +0 -17
- package/esm2022/component/expand-panel/expand-panel-head.directive.mjs +0 -17
- package/esm2022/component/expand-panel/public-api.mjs +0 -4
- package/esm2022/component/file-upload/file-item/file-item.component.mjs +0 -13
- package/esm2022/component/file-upload/file-upload-area/file-upload-area.component.mjs +0 -87
- package/esm2022/component/file-upload/public-api.mjs +0 -3
- package/esm2022/component/filter/base/filter-base.mjs +0 -10
- package/esm2022/component/filter/base/filter-component-base.mjs +0 -3
- package/esm2022/component/filter/boolean-filter/boolean-filter.component.mjs +0 -63
- package/esm2022/component/filter/contarct/boolean-filter.mjs +0 -8
- package/esm2022/component/filter/contarct/date-filter-value.mjs +0 -9
- package/esm2022/component/filter/contarct/date-filter.mjs +0 -11
- package/esm2022/component/filter/contarct/filter-component-map.mjs +0 -15
- package/esm2022/component/filter/contarct/filter-item.mjs +0 -34
- package/esm2022/component/filter/contarct/filter-state.mjs +0 -145
- package/esm2022/component/filter/contarct/i-filter.mjs +0 -2
- package/esm2022/component/filter/contarct/list-filter.mjs +0 -12
- package/esm2022/component/filter/contarct/numeric-filter-value.mjs +0 -10
- package/esm2022/component/filter/contarct/numeric-filter.mjs +0 -9
- package/esm2022/component/filter/contarct/sort-param.mjs +0 -14
- package/esm2022/component/filter/contarct/string-filter.mjs +0 -12
- package/esm2022/component/filter/date-filter/date-filter.component.mjs +0 -64
- package/esm2022/component/filter/enum/filter-type.enum.mjs +0 -10
- package/esm2022/component/filter/enum/list-filter-type.enum.mjs +0 -6
- package/esm2022/component/filter/enum/string-filter-type.enum.mjs +0 -20
- package/esm2022/component/filter/filter-host/filter-host.component.mjs +0 -79
- package/esm2022/component/filter/list-filter/list-filter.component.mjs +0 -96
- package/esm2022/component/filter/numeric-filter/numeric-filter.component.mjs +0 -64
- package/esm2022/component/filter/public-api.mjs +0 -23
- package/esm2022/component/filter/string-filter/string-filter.component.mjs +0 -64
- package/esm2022/component/icon/icon/icon.component.mjs +0 -54
- package/esm2022/component/icon/icon-file/icon-file.component.mjs +0 -27
- package/esm2022/component/icon/icon-sprite.directive.mjs +0 -34
- package/esm2022/component/icon/icon.service.mjs +0 -58
- package/esm2022/component/icon/public-api.mjs +0 -5
- package/esm2022/component/input/color-input/color-input.component.mjs +0 -71
- package/esm2022/component/input/form-group-title/form-group-title.component.mjs +0 -18
- package/esm2022/component/input/input/input.component.mjs +0 -38
- package/esm2022/component/input/public-api.mjs +0 -6
- package/esm2022/component/input/text-field/text-field.component.mjs +0 -94
- package/esm2022/component/message/message/message.component.mjs +0 -76
- package/esm2022/component/message/message-host/message-host.component.mjs +0 -84
- package/esm2022/component/message/message.service.mjs +0 -35
- package/esm2022/component/message/model/message.mjs +0 -23
- package/esm2022/component/message/public-api.mjs +0 -5
- package/esm2022/component/modal/dialog/dialog.component.mjs +0 -46
- package/esm2022/component/modal/dialog.service.mjs +0 -40
- package/esm2022/component/modal/modal-container/modal-container.component.mjs +0 -77
- package/esm2022/component/modal/modal.module.mjs +0 -32
- package/esm2022/component/modal/modal.service.mjs +0 -122
- package/esm2022/component/modal/model/current-modal.mjs +0 -3
- package/esm2022/component/modal/model/i-modal-config.mjs +0 -2
- package/esm2022/component/modal/model/i-modal-result.mjs +0 -2
- package/esm2022/component/modal/model/modal-close-reason.enum.mjs +0 -8
- package/esm2022/component/modal/model/modal-instance.mjs +0 -34
- package/esm2022/component/modal/public-api.mjs +0 -11
- package/esm2022/component/pager/model/pager-state.mjs +0 -51
- package/esm2022/component/pager/pager/pager.component.mjs +0 -13
- package/esm2022/component/pager/public-api.mjs +0 -4
- package/esm2022/component/pager/util/pager-util.mjs +0 -6
- package/esm2022/component/panel/panel/panel.component.mjs +0 -45
- package/esm2022/component/panel/public-api.mjs +0 -2
- package/esm2022/component/progress-bar/progress-bar/progress-bar.component.mjs +0 -130
- package/esm2022/component/progress-bar/public-api.mjs +0 -2
- package/esm2022/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +0 -24
- package/esm2022/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +0 -133
- package/esm2022/component/property-grid/property-grid/property-grid-item-description.directive.mjs +0 -20
- package/esm2022/component/property-grid/property-grid/property-grid.component.mjs +0 -97
- package/esm2022/component/property-grid/public-api.mjs +0 -4
- package/esm2022/component/public-api.mjs +0 -72
- package/esm2022/component/radio/public-api.mjs +0 -3
- package/esm2022/component/radio/radio/radio.component.mjs +0 -240
- package/esm2022/component/radio/radio-button/radio-button.component.mjs +0 -63
- package/esm2022/component/resize-panel/public-api.mjs +0 -2
- package/esm2022/component/resize-panel/resize-panel/resize-panel.component.mjs +0 -166
- package/esm2022/component/select/public-api.mjs +0 -4
- package/esm2022/component/select/select/select.component.mjs +0 -272
- package/esm2022/component/select/select-option.directive.mjs +0 -17
- package/esm2022/component/select/select-value.directive.mjs +0 -17
- package/esm2022/component/sidebar/public-api.mjs +0 -3
- package/esm2022/component/sidebar/sidebar/sidebar.component.mjs +0 -48
- package/esm2022/component/sidebar/sidebar-position.enum.mjs +0 -8
- package/esm2022/component/stepper/public-api.mjs +0 -2
- package/esm2022/component/stepper/stepper/stepper.component.mjs +0 -16
- package/esm2022/component/switch/public-api.mjs +0 -3
- package/esm2022/component/switch/switch/switch.component.mjs +0 -61
- package/esm2022/component/switch/switch-button/switch-button.component.mjs +0 -47
- package/esm2022/component/switch/switch.service.mjs +0 -21
- package/esm2022/component/table/base/cell-component-base.mjs +0 -158
- package/esm2022/component/table/base/detail-component-base.mjs +0 -3
- package/esm2022/component/table/base/head-cell-component-base.mjs +0 -18
- package/esm2022/component/table/cell/cell.component.mjs +0 -28
- package/esm2022/component/table/cell-host/cell-host.component.mjs +0 -56
- package/esm2022/component/table/contract/cell-components-map.mjs +0 -15
- package/esm2022/component/table/contract/column-reorder-event.mjs +0 -7
- package/esm2022/component/table/contract/column-resize-event.mjs +0 -7
- package/esm2022/component/table/contract/head-dropdown-tab.mjs +0 -2
- package/esm2022/component/table/contract/i-cell-coordinates.mjs +0 -2
- package/esm2022/component/table/contract/i-cell-event.mjs +0 -2
- package/esm2022/component/table/contract/i-cell-instance.mjs +0 -2
- package/esm2022/component/table/contract/i-cell-value.mjs +0 -2
- package/esm2022/component/table/contract/public-api.mjs +0 -13
- package/esm2022/component/table/contract/sort-event.mjs +0 -7
- package/esm2022/component/table/contract/table-column-store.mjs +0 -12
- package/esm2022/component/table/contract/table-column.mjs +0 -44
- package/esm2022/component/table/contract/table-row.mjs +0 -7
- package/esm2022/component/table/default/boolean-cell/boolean-cell.component.mjs +0 -39
- package/esm2022/component/table/default/date-cell/date-cell.component.mjs +0 -40
- package/esm2022/component/table/default/date-time-cell/date-time-cell.component.mjs +0 -40
- package/esm2022/component/table/default/default-head-cell/default-head-cell.component.mjs +0 -49
- package/esm2022/component/table/default/list-cell/list-cell.component.mjs +0 -60
- package/esm2022/component/table/default/numeric-cell/numeric-cell.component.mjs +0 -39
- package/esm2022/component/table/default/string-cell/string-cell.component.mjs +0 -40
- package/esm2022/component/table/enum/aggregation-type.enum.mjs +0 -9
- package/esm2022/component/table/enum/edit-event.enum.mjs +0 -7
- package/esm2022/component/table/enum/edit-type.enum.mjs +0 -7
- package/esm2022/component/table/enum/public-api.mjs +0 -5
- package/esm2022/component/table/enum/select-type.enum.mjs +0 -7
- package/esm2022/component/table/head-cell/head-cell.component.mjs +0 -204
- package/esm2022/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +0 -50
- package/esm2022/component/table/head-cell-host/head-cell-host.component.mjs +0 -60
- package/esm2022/component/table/public-api.mjs +0 -42
- package/esm2022/component/table/selection-cell/selection-cell.component.mjs +0 -46
- package/esm2022/component/table/selection-head-cell/selection-head-cell.component.mjs +0 -45
- package/esm2022/component/table/service/table.service.mjs +0 -650
- package/esm2022/component/table/table/table.component.mjs +0 -470
- package/esm2022/component/table/table-body/table-body.component.mjs +0 -210
- package/esm2022/component/table/table-head/filter-dropdown-tab/filter-dropdown-tab.component.mjs +0 -57
- package/esm2022/component/table/table-head/main-dropdown-tab/main-dropdown-tab.component.mjs +0 -89
- package/esm2022/component/table/table-head/table-head.component.mjs +0 -76
- package/esm2022/component/table/table-head/visibility-dropdown-tab/visibility-dropdown-tab.component.mjs +0 -154
- package/esm2022/component/table/table-head-group/table-head-group.component.mjs +0 -72
- package/esm2022/component/table/table-row/table-row.component.mjs +0 -42
- package/esm2022/component/table/util/public-api.mjs +0 -3
- package/esm2022/component/table/util/state-util.mjs +0 -146
- package/esm2022/component/table/util/table-util.mjs +0 -133
- package/esm2022/component/tabs/public-api.mjs +0 -11
- package/esm2022/component/tabs/tab/tab.component.mjs +0 -42
- package/esm2022/component/tabs/tab-content.directive.mjs +0 -17
- package/esm2022/component/tabs/tab-title.directive.mjs +0 -17
- package/esm2022/component/tabs/tabs/tabs.component.mjs +0 -82
- package/esm2022/component/theme-switch/public-api.mjs +0 -3
- package/esm2022/component/theme-switch/theme-switch/theme-switch.component.mjs +0 -30
- package/esm2022/component/theme-switch/theme-switch.service.mjs +0 -34
- package/esm2022/component/toggle/public-api.mjs +0 -2
- package/esm2022/component/toggle/toggle/toggle.component.mjs +0 -79
- package/esm2022/component/toolbar/public-api.mjs +0 -5
- package/esm2022/component/toolbar/toolbar/toolbar.component.mjs +0 -26
- package/esm2022/component/tree/public-api.mjs +0 -4
- package/esm2022/component/tree/tree/tree.component.mjs +0 -143
- package/esm2022/component/tree/tree-item/tree-item.component.mjs +0 -75
- package/esm2022/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +0 -28
- package/esm2022/component/tree/tree.service.mjs +0 -40
- package/esm2022/directive/auto-position/auto-position.directive.mjs +0 -71
- package/esm2022/directive/auto-position/public-api.mjs +0 -2
- package/esm2022/directive/click-outside/click-outside.directive.mjs +0 -66
- package/esm2022/directive/click-outside/public-api.mjs +0 -2
- package/esm2022/directive/context-menu/context-menu.directive.mjs +0 -119
- package/esm2022/directive/context-menu/public-api.mjs +0 -2
- package/esm2022/directive/disable-control/disable-control.directive.mjs +0 -35
- package/esm2022/directive/disable-control/public-api.mjs +0 -2
- package/esm2022/directive/drag-drop/drag-container.directive.mjs +0 -92
- package/esm2022/directive/drag-drop/drag-drop.service.mjs +0 -145
- package/esm2022/directive/drag-drop/drag-placeholder.directive.mjs +0 -15
- package/esm2022/directive/drag-drop/drag-preview.directive.mjs +0 -17
- package/esm2022/directive/drag-drop/drag.directive.mjs +0 -138
- package/esm2022/directive/drag-drop/model/drag-container-instance.mjs +0 -8
- package/esm2022/directive/drag-drop/model/drag-instance.mjs +0 -7
- package/esm2022/directive/drag-drop/model/drag-process.mjs +0 -2
- package/esm2022/directive/drag-drop/model/drag-selection.mjs +0 -2
- package/esm2022/directive/drag-drop/model/drop-event.mjs +0 -2
- package/esm2022/directive/drag-drop/model/drop-target.mjs +0 -2
- package/esm2022/directive/drag-drop/model/point.mjs +0 -2
- package/esm2022/directive/drag-drop/model/public-api.mjs +0 -8
- package/esm2022/directive/drag-drop/public-api.mjs +0 -7
- package/esm2022/directive/drag-sort/drag-sort-container.directive.mjs +0 -65
- package/esm2022/directive/drag-sort/drag-sort-event.mjs +0 -2
- package/esm2022/directive/drag-sort/drag-sort-item.directive.mjs +0 -111
- package/esm2022/directive/drag-sort/public-api.mjs +0 -4
- package/esm2022/directive/dynamic-content-base.directive.mjs +0 -80
- package/esm2022/directive/highlight/highlight.directive.mjs +0 -72
- package/esm2022/directive/highlight/public-api.mjs +0 -2
- package/esm2022/directive/hint/hint.directive.mjs +0 -102
- package/esm2022/directive/hint/public-api.mjs +0 -2
- package/esm2022/directive/let/let.directive.mjs +0 -39
- package/esm2022/directive/let/public-api.mjs +0 -2
- package/esm2022/directive/loader/loader.directive.mjs +0 -85
- package/esm2022/directive/loader/public-api.mjs +0 -2
- package/esm2022/directive/no-autofill/no-autofill.directive.mjs +0 -31
- package/esm2022/directive/no-autofill/public-api.mjs +0 -2
- package/esm2022/directive/only-number/only-number.directive.mjs +0 -184
- package/esm2022/directive/only-number/public-api.mjs +0 -2
- package/esm2022/directive/public-api.mjs +0 -19
- package/esm2022/directive/resize-drag/public-api.mjs +0 -2
- package/esm2022/directive/resize-drag/resize-drag.directive.mjs +0 -72
- package/esm2022/directive/scroll-into-view/public-api.mjs +0 -2
- package/esm2022/directive/scroll-into-view/scroll-into-view.directive.mjs +0 -41
- package/esm2022/directive/scrollable/public-api.mjs +0 -3
- package/esm2022/directive/scrollable/scrollable/scrollable.component.mjs +0 -98
- package/esm2022/directive/scrollable/scrollable.directive.mjs +0 -20
- package/esm2022/directive/teta-template/public-api.mjs +0 -2
- package/esm2022/directive/teta-template/teta-template.directive.mjs +0 -23
- package/esm2022/directive/tooltip/public-api.mjs +0 -2
- package/esm2022/directive/tooltip/tooltip.directive.mjs +0 -81
- package/esm2022/index.mjs +0 -22
- package/esm2022/locale/en.mjs +0 -50
- package/esm2022/locale/public-api.mjs +0 -5
- package/esm2022/locale/ru.mjs +0 -50
- package/esm2022/locale/teta-config.service.mjs +0 -28
- package/esm2022/locale/teta-localisation.mjs +0 -2
- package/esm2022/observable/animation-frame.mjs +0 -30
- package/esm2022/observable/public-api.mjs +0 -3
- package/esm2022/observable/zone-observable.mjs +0 -15
- package/esm2022/pipe/date-pipe/public-api.mjs +0 -2
- package/esm2022/pipe/date-pipe/teta-date.pipe.mjs +0 -43
- package/esm2022/pipe/number-pipe/number.pipe.mjs +0 -28
- package/esm2022/pipe/number-pipe/public-api.mjs +0 -2
- package/esm2022/pipe/public-api.mjs +0 -4
- package/esm2022/pipe/util/number-helper.mjs +0 -25
- package/esm2022/tetacom-ng-components.mjs +0 -5
- package/esm2022/util/bool-or-func.mjs +0 -13
- package/esm2022/util/date-util.mjs +0 -231
- package/esm2022/util/export-dom-image.mjs +0 -22
- package/esm2022/util/forms-util.mjs +0 -85
- package/esm2022/util/is-function.mjs +0 -4
- package/esm2022/util/public-api.mjs +0 -7
- package/esm2022/util/string-util.mjs +0 -9
|
@@ -1,650 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import objectHash from 'object-hash';
|
|
3
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
4
|
-
import { ArrayUtil } from '../../../common/util/array-util';
|
|
5
|
-
import { boolOrFuncCallback } from '../../../util/bool-or-func';
|
|
6
|
-
import { DateUtil } from '../../../util/date-util';
|
|
7
|
-
import { DateFilter } from '../../filter/contarct/date-filter';
|
|
8
|
-
import { DateFilterValue } from '../../filter/contarct/date-filter-value';
|
|
9
|
-
import { FilterState } from '../../filter/contarct/filter-state';
|
|
10
|
-
import { ListFilter } from '../../filter/contarct/list-filter';
|
|
11
|
-
import { NumericFilter } from '../../filter/contarct/numeric-filter';
|
|
12
|
-
import { NumericFilterValue } from '../../filter/contarct/numeric-filter-value';
|
|
13
|
-
import { StringFilter } from '../../filter/contarct/string-filter';
|
|
14
|
-
import { FilterType } from '../../filter/enum/filter-type.enum';
|
|
15
|
-
import { ListFilterType } from '../../filter/enum/list-filter-type.enum';
|
|
16
|
-
import { ColumnReorderEvent } from '../contract/column-reorder-event';
|
|
17
|
-
import { TableColumn } from '../contract/table-column';
|
|
18
|
-
import { TableColumnStore } from '../contract/table-column-store';
|
|
19
|
-
import { TableRow } from '../contract/table-row';
|
|
20
|
-
import { EditEvent } from '../enum/edit-event.enum';
|
|
21
|
-
import { EditType } from '../enum/edit-type.enum';
|
|
22
|
-
import { SelectType } from '../enum/select-type.enum';
|
|
23
|
-
import { StateUtil } from '../util/state-util';
|
|
24
|
-
import * as i0 from "@angular/core";
|
|
25
|
-
export class TableService {
|
|
26
|
-
get dragSource() {
|
|
27
|
-
return this._dragSource;
|
|
28
|
-
}
|
|
29
|
-
get currentEditCell() {
|
|
30
|
-
return this._currentEditCell;
|
|
31
|
-
}
|
|
32
|
-
constructor() {
|
|
33
|
-
this.selectType = SelectType.mouse;
|
|
34
|
-
this.editType = EditType.cell;
|
|
35
|
-
this.editEvent = EditEvent.doubleClick;
|
|
36
|
-
this.trackRow = (index, row) => {
|
|
37
|
-
const rowId = row['id'];
|
|
38
|
-
if (rowId) {
|
|
39
|
-
return rowId;
|
|
40
|
-
}
|
|
41
|
-
return index;
|
|
42
|
-
};
|
|
43
|
-
this.initialColumnsHash = '';
|
|
44
|
-
this.initialColumns = [];
|
|
45
|
-
this.displayColumns = [];
|
|
46
|
-
this._columns = new BehaviorSubject([]);
|
|
47
|
-
this._hiddenColumns = new BehaviorSubject([]);
|
|
48
|
-
this._displayData = new BehaviorSubject([]);
|
|
49
|
-
this._dict = new BehaviorSubject({});
|
|
50
|
-
this._filterOptions = new BehaviorSubject({});
|
|
51
|
-
this._state = new BehaviorSubject(new FilterState());
|
|
52
|
-
this._editRowStart = new Subject();
|
|
53
|
-
this._editRowStop = new Subject();
|
|
54
|
-
this._editCellStart = new Subject();
|
|
55
|
-
this._editCellStop = new Subject();
|
|
56
|
-
this._valueChanged = new Subject();
|
|
57
|
-
this._valueSet = new Subject();
|
|
58
|
-
this._stateChanged = new Subject();
|
|
59
|
-
this._filterClear = new Subject();
|
|
60
|
-
this._selectedRows = new BehaviorSubject([]);
|
|
61
|
-
this._activeRow = new BehaviorSubject(null);
|
|
62
|
-
this._scrollIndex = new Subject();
|
|
63
|
-
this.columns = this._columns.asObservable();
|
|
64
|
-
this.displayData = this._displayData.asObservable();
|
|
65
|
-
this.dict = this._dict.asObservable();
|
|
66
|
-
this.filterOptions = this._filterOptions.asObservable();
|
|
67
|
-
this.state = this._state.asObservable();
|
|
68
|
-
this.editRowStart = this._editRowStart.asObservable();
|
|
69
|
-
this.editRowStop = this._editRowStop.asObservable();
|
|
70
|
-
this.editCellStart = this._editCellStart.asObservable();
|
|
71
|
-
this.editCellStop = this._editCellStop.asObservable();
|
|
72
|
-
this.valueChanged = this._valueChanged.asObservable();
|
|
73
|
-
this.valueSet = this._valueSet.asObservable();
|
|
74
|
-
this.stateChanged = this._stateChanged.asObservable();
|
|
75
|
-
this.filterClear = this._filterClear.asObservable();
|
|
76
|
-
this.selectedRows = this._selectedRows.asObservable();
|
|
77
|
-
this.activeRow = this._activeRow.asObservable();
|
|
78
|
-
this.hiddenColumns = this._hiddenColumns.asObservable();
|
|
79
|
-
this.scrollIndex = this._scrollIndex.asObservable();
|
|
80
|
-
}
|
|
81
|
-
setData(data) {
|
|
82
|
-
this._displayData.next(data?.map((item) => new TableRow({
|
|
83
|
-
data: item,
|
|
84
|
-
})) ?? []);
|
|
85
|
-
}
|
|
86
|
-
setDict(dict) {
|
|
87
|
-
this._dict.next(dict);
|
|
88
|
-
}
|
|
89
|
-
setFilterOptions(filterOptions) {
|
|
90
|
-
this._filterOptions.next(filterOptions);
|
|
91
|
-
}
|
|
92
|
-
setColumns(columns) {
|
|
93
|
-
this.initialColumns = columns ? columns.map((_) => new TableColumn(_)) : [];
|
|
94
|
-
const excludeKeys = ['editable', 'cellComponent', 'headCellComponent', 'headDropdownConfig'];
|
|
95
|
-
this.initialColumnsHash = objectHash(this.initialColumns, {
|
|
96
|
-
algorithm: 'sha1',
|
|
97
|
-
ignoreUnknown: true,
|
|
98
|
-
excludeKeys: (key) => {
|
|
99
|
-
return excludeKeys.indexOf(key) >= 0;
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
const restored = this.restoreColumns();
|
|
103
|
-
if (restored) {
|
|
104
|
-
this.setDisplayColumns(restored);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.setDisplayColumns(this.initialColumns);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
restoreDefaultColumns() {
|
|
111
|
-
this.setDisplayColumns(this.initialColumns);
|
|
112
|
-
this.clearColumnsState();
|
|
113
|
-
}
|
|
114
|
-
updateColumns(columns) {
|
|
115
|
-
this.setDisplayColumns(columns);
|
|
116
|
-
this.saveColumnsState();
|
|
117
|
-
}
|
|
118
|
-
saveColumnsState() {
|
|
119
|
-
if (this._columnsCookieName) {
|
|
120
|
-
localStorage.setItem(this._columnsCookieName, JSON.stringify({
|
|
121
|
-
hash: this.initialColumnsHash,
|
|
122
|
-
columns: this.displayColumns.map((_) => new TableColumnStore(_)),
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
clearColumnsState() {
|
|
127
|
-
if (this._columnsCookieName) {
|
|
128
|
-
localStorage.removeItem(this._columnsCookieName);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
setDisplayColumns(columns) {
|
|
132
|
-
this.displayColumns = columns ? columns.map((_) => new TableColumn(_)) : [];
|
|
133
|
-
this._columns.next(this.displayColumns);
|
|
134
|
-
}
|
|
135
|
-
restoreColumns() {
|
|
136
|
-
if (this._columnsCookieName) {
|
|
137
|
-
const savedColumns = JSON.parse(localStorage.getItem(this._columnsCookieName));
|
|
138
|
-
if (savedColumns && savedColumns.hash === this.initialColumnsHash) {
|
|
139
|
-
return this.restoreColumnsState(savedColumns.columns);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
restoreColumnsState(columns) {
|
|
145
|
-
return columns.map((column) => {
|
|
146
|
-
const found = ArrayUtil.findRecursive(this.initialColumns, (item) => item.name === column.name, 'columns');
|
|
147
|
-
const resultColumn = new TableColumn(found);
|
|
148
|
-
resultColumn.width = column.width;
|
|
149
|
-
resultColumn.flex = column.flex;
|
|
150
|
-
resultColumn.locked = column.locked;
|
|
151
|
-
if (column.columns?.length > 0) {
|
|
152
|
-
resultColumn.columns = this.restoreColumnsState(column.columns);
|
|
153
|
-
}
|
|
154
|
-
return resultColumn;
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
setState(state) {
|
|
158
|
-
if (this._cookieName) {
|
|
159
|
-
state.save(this._cookieName);
|
|
160
|
-
}
|
|
161
|
-
this._state.next(state);
|
|
162
|
-
}
|
|
163
|
-
setCookieName(name) {
|
|
164
|
-
this._cookieName = name;
|
|
165
|
-
this._hiddenCookieName = `${this._cookieName}_hidden_columns`;
|
|
166
|
-
this._columnsCookieName = `${this._cookieName}_columns`;
|
|
167
|
-
}
|
|
168
|
-
restoreState() {
|
|
169
|
-
let state;
|
|
170
|
-
if (this._cookieName && this._cookieName?.length > 0 && FilterState.restore(this._cookieName)) {
|
|
171
|
-
let newState = Object.assign(this._state.value, FilterState.restore(this._cookieName));
|
|
172
|
-
newState = DateUtil.convertDateStringsToDates(newState);
|
|
173
|
-
state = new FilterState(newState);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
state = new FilterState();
|
|
177
|
-
}
|
|
178
|
-
this.setState(state);
|
|
179
|
-
}
|
|
180
|
-
saveHiddenColumns(hiddenColumns) {
|
|
181
|
-
if (this._hiddenCookieName) {
|
|
182
|
-
localStorage.setItem(this._hiddenCookieName, JSON.stringify(hiddenColumns));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
restoreHiddenColumns() {
|
|
186
|
-
const hiddenColumns = localStorage.getItem(this._hiddenCookieName ?? '') || '[]';
|
|
187
|
-
this._hiddenColumns.next(JSON.parse(hiddenColumns));
|
|
188
|
-
}
|
|
189
|
-
sortAsc(sortEvent) {
|
|
190
|
-
if (sortEvent.column.sortable) {
|
|
191
|
-
this.setState(StateUtil.sortAsc(sortEvent, this._state.value));
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
sortDesc(sortEvent) {
|
|
195
|
-
if (sortEvent.column.sortable) {
|
|
196
|
-
this.setState(StateUtil.sortDesc(sortEvent, this._state.value));
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
clearSort(column) {
|
|
200
|
-
this.setState(StateUtil.clearSort(column, this._state.value));
|
|
201
|
-
}
|
|
202
|
-
clearAllSort() {
|
|
203
|
-
this.setState(StateUtil.clearAllSort(this._state.value));
|
|
204
|
-
}
|
|
205
|
-
clearFilter(column) {
|
|
206
|
-
const state = this._state.value;
|
|
207
|
-
if (column !== null && column !== undefined && column.filterable) {
|
|
208
|
-
switch (column.filterType) {
|
|
209
|
-
case FilterType.date:
|
|
210
|
-
state.addDateFilter(new DateFilter({
|
|
211
|
-
name: column.name,
|
|
212
|
-
field: column.filterField,
|
|
213
|
-
value: new DateFilterValue(),
|
|
214
|
-
}));
|
|
215
|
-
break;
|
|
216
|
-
case FilterType.string:
|
|
217
|
-
state.addStringFilter(new StringFilter({
|
|
218
|
-
name: column.name,
|
|
219
|
-
field: column.filterField,
|
|
220
|
-
value: '',
|
|
221
|
-
}));
|
|
222
|
-
break;
|
|
223
|
-
case FilterType.number:
|
|
224
|
-
state.addNumericFilter(new NumericFilter({
|
|
225
|
-
name: column.name,
|
|
226
|
-
field: column.filterField,
|
|
227
|
-
value: new NumericFilterValue(),
|
|
228
|
-
}));
|
|
229
|
-
break;
|
|
230
|
-
case FilterType.list:
|
|
231
|
-
state.addListFilter(new ListFilter({
|
|
232
|
-
name: column.name,
|
|
233
|
-
field: column.filterField,
|
|
234
|
-
value: [],
|
|
235
|
-
type: ListFilterType.None,
|
|
236
|
-
}));
|
|
237
|
-
break;
|
|
238
|
-
}
|
|
239
|
-
this.setState(new FilterState(state));
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
clearAllFilters() {
|
|
243
|
-
const state = this._state.value;
|
|
244
|
-
state.stringFilters = [];
|
|
245
|
-
state.listFilters = [];
|
|
246
|
-
state.numericFilters = [];
|
|
247
|
-
state.dateFilters = [];
|
|
248
|
-
this.setState(new FilterState(state));
|
|
249
|
-
}
|
|
250
|
-
pinColumn(column) {
|
|
251
|
-
this.displayColumns.forEach((col) => {
|
|
252
|
-
if (col.name === column.name) {
|
|
253
|
-
col.locked = !col.locked;
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
this.updateColumns(this.displayColumns);
|
|
257
|
-
}
|
|
258
|
-
dragStart(column) {
|
|
259
|
-
this._dragSource = column;
|
|
260
|
-
}
|
|
261
|
-
lockPreviousColumns(column, element) {
|
|
262
|
-
const flat = ArrayUtil.flatten(this.displayColumns, 'columns', true).sort((a, b) => Number(b.locked) - Number(a.locked));
|
|
263
|
-
const index = flat.indexOf(column);
|
|
264
|
-
const previous = flat.slice(0, index).filter((_) => _.flex > 0);
|
|
265
|
-
if (previous?.length > 0) {
|
|
266
|
-
const tableElement = this.getTableElement(element);
|
|
267
|
-
previous.forEach((item) => {
|
|
268
|
-
const itemCol = tableElement?.querySelector(`teta-head-cell[data-column="${item.name}"]`);
|
|
269
|
-
if (itemCol) {
|
|
270
|
-
item.flex = 0;
|
|
271
|
-
item.width = itemCol.clientWidth;
|
|
272
|
-
}
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
resizeColumn(event) {
|
|
277
|
-
if (event.column !== null && event.column !== undefined) {
|
|
278
|
-
event.column.width = event.newWidth < 50 ? 50 : event.newWidth;
|
|
279
|
-
event.column.flex = 0;
|
|
280
|
-
}
|
|
281
|
-
this._columns.next(this.displayColumns);
|
|
282
|
-
this.saveColumnsState();
|
|
283
|
-
}
|
|
284
|
-
autosizeColumn(column, target) {
|
|
285
|
-
const tableElement = this.getTableElement(target);
|
|
286
|
-
this.setColumnAutoWidth(column, tableElement);
|
|
287
|
-
this._columns.next(this.displayColumns);
|
|
288
|
-
this.saveColumnsState();
|
|
289
|
-
}
|
|
290
|
-
autosizeAllColumns(target) {
|
|
291
|
-
const tableElement = this.getTableElement(target);
|
|
292
|
-
const flat = ArrayUtil.flatten(this.displayColumns, 'columns', true);
|
|
293
|
-
flat.forEach((col) => this.setColumnAutoWidth(col, tableElement));
|
|
294
|
-
this._columns.next(this.displayColumns);
|
|
295
|
-
this.saveColumnsState();
|
|
296
|
-
}
|
|
297
|
-
reorderColumn(column, insertBefore) {
|
|
298
|
-
if (!this._dragSource) {
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
const event = new ColumnReorderEvent(this._dragSource, column);
|
|
302
|
-
if (event.source !== event.target) {
|
|
303
|
-
const sourceParent = this.findParent(event.source, this.displayColumns);
|
|
304
|
-
const targetParent = this.findParent(event.target, this.displayColumns);
|
|
305
|
-
if (sourceParent && targetParent) {
|
|
306
|
-
const sourceIndex = sourceParent.indexOf(event.source);
|
|
307
|
-
sourceParent.splice(sourceIndex, 1);
|
|
308
|
-
let targetIndex = targetParent.indexOf(event.target);
|
|
309
|
-
if (!insertBefore) {
|
|
310
|
-
targetIndex = targetIndex + 1;
|
|
311
|
-
}
|
|
312
|
-
targetParent.splice(targetIndex, 0, event.source);
|
|
313
|
-
event.source.locked = event.target.locked;
|
|
314
|
-
this.updateColumns(this.displayColumns);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
getColumnParent(column) {
|
|
319
|
-
return this.findParentColumn(column, this.displayColumns);
|
|
320
|
-
}
|
|
321
|
-
startEditRow(cellEvent) {
|
|
322
|
-
if (this._currentEditCell?.row !== cellEvent?.row) {
|
|
323
|
-
if (this._currentEditCell != null) {
|
|
324
|
-
this._editRowStop.next(this._currentEditCell);
|
|
325
|
-
}
|
|
326
|
-
if (cellEvent === null) {
|
|
327
|
-
this._editRowStart.next(cellEvent);
|
|
328
|
-
this._currentEditCell = cellEvent;
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
if (boolOrFuncCallback(this.rowEditable)(this.getRowByIndex(cellEvent?.row)?.data)) {
|
|
332
|
-
this._editRowStart.next(cellEvent);
|
|
333
|
-
this._currentEditCell = cellEvent;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
startEditCell(cellEvent) {
|
|
339
|
-
if (this._currentEditCell?.column !== cellEvent?.column || this._currentEditCell?.row !== cellEvent?.row) {
|
|
340
|
-
if (this._currentEditCell != null) {
|
|
341
|
-
this._editCellStop.next(this._currentEditCell);
|
|
342
|
-
}
|
|
343
|
-
const column = this.getColumnByName(cellEvent?.column);
|
|
344
|
-
if (boolOrFuncCallback(this.rowEditable)(this.getRowByIndex(cellEvent?.row)?.data) &&
|
|
345
|
-
boolOrFuncCallback(column?.editable)({
|
|
346
|
-
row: this.getRowByIndex(cellEvent?.row)?.data,
|
|
347
|
-
column: column,
|
|
348
|
-
})) {
|
|
349
|
-
this._editCellStart.next(cellEvent);
|
|
350
|
-
this._currentEditCell = cellEvent;
|
|
351
|
-
const key = cellEvent?.event?.key;
|
|
352
|
-
if (key && (key.length === 1 || (key === 'Delete' && !column.required))) {
|
|
353
|
-
this.clearValue(cellEvent);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
setActiveRow(row) {
|
|
359
|
-
this._activeRow.next(row);
|
|
360
|
-
}
|
|
361
|
-
selectRows(rows) {
|
|
362
|
-
this._selectedRows.next(rows);
|
|
363
|
-
}
|
|
364
|
-
selectOrDeselectRow(row) {
|
|
365
|
-
if (this._selectedRows.value.indexOf(row) >= 0) {
|
|
366
|
-
this._selectedRows.next(this._selectedRows.value.filter((_) => _ !== row));
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
this._selectedRows.next([...this._selectedRows.value, row]);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
selectRange(row) {
|
|
373
|
-
const index = this._displayData.value.findIndex((_) => _.data === row);
|
|
374
|
-
let minIndex = this._selectedRows.value.reduce((prev, curr) => {
|
|
375
|
-
const newIndex = this._displayData.value.findIndex((_) => _.data === curr);
|
|
376
|
-
if (newIndex < prev) {
|
|
377
|
-
return newIndex;
|
|
378
|
-
}
|
|
379
|
-
return prev;
|
|
380
|
-
}, this._displayData.value.length);
|
|
381
|
-
let maxIndex = this._selectedRows.value.reduce((prev, curr) => {
|
|
382
|
-
const newIndex = this._displayData.value.findIndex((_) => _.data === curr);
|
|
383
|
-
if (newIndex > prev) {
|
|
384
|
-
return newIndex;
|
|
385
|
-
}
|
|
386
|
-
return prev;
|
|
387
|
-
}, 0);
|
|
388
|
-
if (index > maxIndex) {
|
|
389
|
-
maxIndex = index;
|
|
390
|
-
}
|
|
391
|
-
if (index < minIndex) {
|
|
392
|
-
minIndex = index;
|
|
393
|
-
}
|
|
394
|
-
if (minIndex < index && index < maxIndex) {
|
|
395
|
-
maxIndex = index;
|
|
396
|
-
}
|
|
397
|
-
this._selectedRows.next([...this._displayData.value.slice(minIndex, maxIndex + 1).map((_) => _.data)]);
|
|
398
|
-
}
|
|
399
|
-
selectRow(row) {
|
|
400
|
-
if (this.selectType === SelectType.none) {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
this._selectedRows.next([...this._selectedRows.value, row]);
|
|
404
|
-
}
|
|
405
|
-
deselectRow(row) {
|
|
406
|
-
if (this.selectType === SelectType.none) {
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
this._selectedRows.next(this._selectedRows.value.filter((_) => _ !== row));
|
|
410
|
-
}
|
|
411
|
-
selectAll() {
|
|
412
|
-
this._selectedRows.next(this._displayData.value.map((_) => _.data));
|
|
413
|
-
}
|
|
414
|
-
deselectAll() {
|
|
415
|
-
this._selectedRows.next([]);
|
|
416
|
-
}
|
|
417
|
-
allRowsSelected() {
|
|
418
|
-
if (this._displayData.value?.length &&
|
|
419
|
-
this._selectedRows.value?.length &&
|
|
420
|
-
this._displayData.value.every((_) => this._selectedRows.value.findIndex((selected) => selected === _.data) >= 0)) {
|
|
421
|
-
return true;
|
|
422
|
-
}
|
|
423
|
-
else if (this._selectedRows.value == null || this._selectedRows.value.length === 0) {
|
|
424
|
-
return false;
|
|
425
|
-
}
|
|
426
|
-
return null;
|
|
427
|
-
}
|
|
428
|
-
setHiddenColumns(value) {
|
|
429
|
-
this.saveHiddenColumns(value);
|
|
430
|
-
this._hiddenColumns.next(value);
|
|
431
|
-
}
|
|
432
|
-
columnIsHidden(column) {
|
|
433
|
-
return this._hiddenColumns.value.indexOf(column.name) >= 0;
|
|
434
|
-
}
|
|
435
|
-
changeValue(coordinates) {
|
|
436
|
-
this._valueChanged.next(coordinates);
|
|
437
|
-
}
|
|
438
|
-
setValue(cellValue) {
|
|
439
|
-
let value;
|
|
440
|
-
if (typeof cellValue.row === 'object' && typeof cellValue.column === 'object') {
|
|
441
|
-
value = {
|
|
442
|
-
row: this.getRowIndex(cellValue.row.data),
|
|
443
|
-
column: cellValue.column.name,
|
|
444
|
-
value: cellValue.value,
|
|
445
|
-
};
|
|
446
|
-
}
|
|
447
|
-
else {
|
|
448
|
-
value = cellValue;
|
|
449
|
-
}
|
|
450
|
-
this._valueSet.next(value);
|
|
451
|
-
}
|
|
452
|
-
getRowByIndex(rowIndex) {
|
|
453
|
-
if (rowIndex !== null && rowIndex !== undefined) {
|
|
454
|
-
return this._displayData?.value[rowIndex];
|
|
455
|
-
}
|
|
456
|
-
return undefined;
|
|
457
|
-
}
|
|
458
|
-
getRowIndex(row) {
|
|
459
|
-
return this._displayData.value.findIndex((_) => _.data === row);
|
|
460
|
-
}
|
|
461
|
-
getEventCell(event) {
|
|
462
|
-
return event.composedPath().find((target) => {
|
|
463
|
-
return target.tagName?.toLowerCase() === 'teta-cell';
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
getEventRow(event) {
|
|
467
|
-
return event.composedPath().find((target) => {
|
|
468
|
-
return target?.getAttribute && target?.getAttribute('data-row');
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
getNextEditableCell(coords) {
|
|
472
|
-
const nextCell = this.getNextCell(coords);
|
|
473
|
-
if (!nextCell) {
|
|
474
|
-
return null;
|
|
475
|
-
}
|
|
476
|
-
const column = this.getColumnByName(nextCell?.column);
|
|
477
|
-
if (boolOrFuncCallback(column.editable)({
|
|
478
|
-
row: this.getRowByIndex(nextCell.row),
|
|
479
|
-
column,
|
|
480
|
-
})) {
|
|
481
|
-
return nextCell;
|
|
482
|
-
}
|
|
483
|
-
return this.getNextEditableCell(nextCell);
|
|
484
|
-
}
|
|
485
|
-
getPreviousEditableCell(coords) {
|
|
486
|
-
const prevCell = this.getPreviousCell(coords);
|
|
487
|
-
if (!prevCell) {
|
|
488
|
-
return null;
|
|
489
|
-
}
|
|
490
|
-
const column = this.getColumnByName(prevCell?.column);
|
|
491
|
-
if (boolOrFuncCallback(column.editable)({
|
|
492
|
-
row: this.getRowByIndex(prevCell.row),
|
|
493
|
-
column,
|
|
494
|
-
})) {
|
|
495
|
-
return prevCell;
|
|
496
|
-
}
|
|
497
|
-
return this.getPreviousEditableCell(prevCell);
|
|
498
|
-
}
|
|
499
|
-
getNextCell(coords) {
|
|
500
|
-
const columns = this.getFlatColumns();
|
|
501
|
-
let colIndex = columns.findIndex((col) => col.name === coords?.column);
|
|
502
|
-
let rowIndex = coords?.row;
|
|
503
|
-
if (colIndex >= 0 && rowIndex >= 0) {
|
|
504
|
-
if (colIndex === columns.length - 1) {
|
|
505
|
-
colIndex = 0;
|
|
506
|
-
rowIndex = rowIndex + 1;
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
colIndex = colIndex + 1;
|
|
510
|
-
}
|
|
511
|
-
return {
|
|
512
|
-
column: columns[colIndex]?.name,
|
|
513
|
-
row: rowIndex,
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
return null;
|
|
517
|
-
}
|
|
518
|
-
getPreviousCell(coords) {
|
|
519
|
-
const columns = this.getFlatColumns();
|
|
520
|
-
let colIndex = columns.findIndex((col) => col.name === coords?.column);
|
|
521
|
-
let rowIndex = coords?.row;
|
|
522
|
-
if (colIndex >= 0 && rowIndex >= 0) {
|
|
523
|
-
if (colIndex === 0) {
|
|
524
|
-
colIndex = columns.length - 1;
|
|
525
|
-
rowIndex = rowIndex - 1;
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
colIndex = colIndex - 1;
|
|
529
|
-
}
|
|
530
|
-
return {
|
|
531
|
-
column: columns[colIndex]?.name,
|
|
532
|
-
row: rowIndex,
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
return null;
|
|
536
|
-
}
|
|
537
|
-
getNextRowCell(coords) {
|
|
538
|
-
const columns = this.getFlatColumns();
|
|
539
|
-
const colIndex = columns.findIndex((col) => col.name === coords?.column);
|
|
540
|
-
const rowIndex = coords?.row;
|
|
541
|
-
if (colIndex >= 0 && rowIndex >= 0 && rowIndex < this._displayData.value.length - 1) {
|
|
542
|
-
return {
|
|
543
|
-
column: columns[colIndex]?.name,
|
|
544
|
-
row: rowIndex + 1,
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
return null;
|
|
548
|
-
}
|
|
549
|
-
getPreviousRowCell(coords) {
|
|
550
|
-
const columns = this.getFlatColumns();
|
|
551
|
-
const colIndex = columns.findIndex((col) => col.name === coords?.column);
|
|
552
|
-
const rowIndex = coords?.row;
|
|
553
|
-
if (colIndex >= 0 && rowIndex > 1) {
|
|
554
|
-
return {
|
|
555
|
-
column: columns[colIndex]?.name,
|
|
556
|
-
row: rowIndex - 1,
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
return null;
|
|
560
|
-
}
|
|
561
|
-
getColumnByName(columnName) {
|
|
562
|
-
return ArrayUtil.findRecursive(this.displayColumns, (iterableNode) => columnName === iterableNode.name, 'columns');
|
|
563
|
-
}
|
|
564
|
-
scrollToIndex(index) {
|
|
565
|
-
this._scrollIndex.next(null);
|
|
566
|
-
this._scrollIndex.next(index);
|
|
567
|
-
}
|
|
568
|
-
getVisibleColumns() {
|
|
569
|
-
const visible = ArrayUtil.flatten(this._columns.value, 'columns', true).filter((_) => this._hiddenColumns.value.indexOf(_.name) < 0);
|
|
570
|
-
return visible.sort((a, b) => Number(b.locked) - Number(a.locked));
|
|
571
|
-
}
|
|
572
|
-
getCellInstance(coords) {
|
|
573
|
-
return coords
|
|
574
|
-
? {
|
|
575
|
-
row: this.getRowByIndex(coords.row),
|
|
576
|
-
column: this.getColumnByName(coords.column),
|
|
577
|
-
}
|
|
578
|
-
: null;
|
|
579
|
-
}
|
|
580
|
-
getFlatColumns() {
|
|
581
|
-
return ArrayUtil.flatten(this.displayColumns, 'columns', true).sort((a, b) => Number(b.locked) - Number(a.locked));
|
|
582
|
-
}
|
|
583
|
-
findParent(column, columns) {
|
|
584
|
-
const found = columns.find((x) => x.name === column.name);
|
|
585
|
-
if (found !== null && found !== undefined) {
|
|
586
|
-
return columns;
|
|
587
|
-
}
|
|
588
|
-
for (let i = 0, l = columns.length; i < l; i++) {
|
|
589
|
-
const col = columns[i];
|
|
590
|
-
if (col.columns && col.columns.length) {
|
|
591
|
-
const result = this.findParent(column, col.columns);
|
|
592
|
-
if (result !== null && result !== undefined) {
|
|
593
|
-
return result;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
return null;
|
|
598
|
-
}
|
|
599
|
-
findParentColumn(column, columns) {
|
|
600
|
-
const found = columns.find((x) => x.columns.indexOf(column) >= 0);
|
|
601
|
-
if (found !== null && found !== undefined) {
|
|
602
|
-
return found;
|
|
603
|
-
}
|
|
604
|
-
for (let i = 0, l = columns.length; i < l; i++) {
|
|
605
|
-
const col = columns[i];
|
|
606
|
-
if (col.columns && col.columns.length) {
|
|
607
|
-
const result = this.findParentColumn(column, col.columns);
|
|
608
|
-
if (result !== null && result !== undefined) {
|
|
609
|
-
return result;
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
return null;
|
|
614
|
-
}
|
|
615
|
-
getTableElement(element) {
|
|
616
|
-
return element.closest('teta-table');
|
|
617
|
-
}
|
|
618
|
-
setColumnAutoWidth(column, table) {
|
|
619
|
-
const cells = table.querySelectorAll(`teta-cell[data-column="${column.name}"] .cell-text`);
|
|
620
|
-
let maxWidth = 0;
|
|
621
|
-
cells.forEach((cell) => {
|
|
622
|
-
if (cell.scrollWidth > maxWidth) {
|
|
623
|
-
maxWidth = cell.scrollWidth;
|
|
624
|
-
}
|
|
625
|
-
});
|
|
626
|
-
const aggCells = table.querySelectorAll(`.aggregate-cell[data-column="${column.name}"] .cell-text`);
|
|
627
|
-
aggCells?.forEach((cell) => {
|
|
628
|
-
if (cell.scrollWidth > maxWidth) {
|
|
629
|
-
maxWidth = cell.scrollWidth;
|
|
630
|
-
}
|
|
631
|
-
});
|
|
632
|
-
column.flex = 0;
|
|
633
|
-
column.width = maxWidth + 20;
|
|
634
|
-
}
|
|
635
|
-
clearValue(event) {
|
|
636
|
-
this.setValue({
|
|
637
|
-
...event,
|
|
638
|
-
value: null,
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
642
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, providedIn: 'root' }); }
|
|
643
|
-
}
|
|
644
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, decorators: [{
|
|
645
|
-
type: Injectable,
|
|
646
|
-
args: [{
|
|
647
|
-
providedIn: 'root',
|
|
648
|
-
}]
|
|
649
|
-
}], ctorParameters: () => [] });
|
|
650
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnQvdGFibGUvc2VydmljZS90YWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU90RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdC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QUFnQixDQUFDLGdDQUFnQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQztRQUNwRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFpQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osR0FBRyxLQUFLO1lBQ1IsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQWh1QlUsWUFBWTtrSEFBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgb2JqZWN0SGFzaCBmcm9tICdvYmplY3QtaGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSURpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1kaWN0aW9uYXJ5JztcbmltcG9ydCB7IElJZE5hbWUgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1pZC1uYW1lJztcbmltcG9ydCB7IEFycmF5VXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlsL2FycmF5LXV0aWwnO1xuaW1wb3J0IHsgYm9vbE9yRnVuY0NhbGxiYWNrIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9ib29sLW9yLWZ1bmMnO1xuaW1wb3J0IHsgRGF0ZVV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlsL2RhdGUtdXRpbCc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2NvbnRhcmN0L2RhdGUtZmlsdGVyJztcbmltcG9ydCB7IERhdGVGaWx0ZXJWYWx1ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9kYXRlLWZpbHRlci12YWx1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJTdGF0ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9maWx0ZXItc3RhdGUnO1xuaW1wb3J0IHsgTGlzdEZpbHRlciB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9saXN0LWZpbHRlcic7XG5pbXBvcnQgeyBOdW1lcmljRmlsdGVyIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2NvbnRhcmN0L251bWVyaWMtZmlsdGVyJztcbmltcG9ydCB7IE51bWVyaWNGaWx0ZXJWYWx1ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9udW1lcmljLWZpbHRlci12YWx1ZSc7XG5pbXBvcnQgeyBTdHJpbmdGaWx0ZXIgfSBmcm9tICcuLi8uLi9maWx0ZXIvY29udGFyY3Qvc3RyaW5nLWZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2VudW0vZmlsdGVyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBMaXN0RmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9lbnVtL2xpc3QtZmlsdGVyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBDb2x1bW5SZW9yZGVyRXZlbnQgfSBmcm9tICcuLi9jb250cmFjdC9jb2x1bW4tcmVvcmRlci1ldmVudCc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVFdmVudCB9IGZyb20gJy4uL2NvbnRyYWN0L2NvbHVtbi1yZXNpemUtZXZlbnQnO1xuaW1wb3J0IHsgSUNlbGxDb29yZGluYXRlcyB9IGZyb20gJy4uL2NvbnRyYWN0L2ktY2VsbC1jb29yZGluYXRlcyc7XG5pbXBvcnQgeyBJQ2VsbEV2ZW50IH0gZnJvbSAnLi4vY29udHJhY3QvaS1jZWxsLWV2ZW50JztcbmltcG9ydCB7IElDZWxsSW5zdGFuY2UsIElDZWxsSW5zdGFuY2VWYWx1ZSwgSUNvbHVtblJvdyB9IGZyb20gJy4uL2NvbnRyYWN0L2ktY2VsbC1pbnN0YW5jZSc7XG5pbXBvcnQgeyBJQ2VsbFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3QvaS1jZWxsLXZhbHVlJztcbmltcG9ydCB7IFNvcnRFdmVudCB9IGZyb20gJy4uL2NvbnRyYWN0L3NvcnQtZXZlbnQnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi9jb250cmFjdC90YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5TdG9yZSB9IGZyb20gJy4uL2NvbnRyYWN0L3RhYmxlLWNvbHVtbi1zdG9yZSc7XG5pbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJy4uL2NvbnRyYWN0L3RhYmxlLXJvdyc7XG5pbXBvcnQgeyBFZGl0RXZlbnQgfSBmcm9tICcuLi9lbnVtL2VkaXQtZXZlbnQuZW51bSc7XG5pbXBvcnQgeyBFZGl0VHlwZSB9IGZyb20gJy4uL2VudW0vZWRpdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgU2VsZWN0VHlwZSB9IGZyb20gJy4uL2VudW0vc2VsZWN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBTdGF0ZVV0aWwgfSBmcm9tICcuLi91dGlsL3N0YXRlLXV0aWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVTZXJ2aWNlPFQ+IHtcbiAgY29sdW1uczogT2JzZXJ2YWJsZTxUYWJsZUNvbHVtbltdPjtcbiAgZGlzcGxheURhdGE6IE9ic2VydmFibGU8VGFibGVSb3c8VD5bXT47XG4gIGRpY3Q6IE9ic2VydmFibGU8SURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+PjtcbiAgZmlsdGVyT3B0aW9uczogT2JzZXJ2YWJsZTxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+O1xuICBzdGF0ZTogT2JzZXJ2YWJsZTxGaWx0ZXJTdGF0ZT47XG4gIHNlbGVjdFR5cGU6IFNlbGVjdFR5cGUgPSBTZWxlY3RUeXBlLm1vdXNlO1xuICBlZGl0Um93U3RhcnQ6IE9ic2VydmFibGU8SUNlbGxFdmVudCB8IG51bGw+O1xuICBlZGl0Um93U3RvcDogT2JzZXJ2YWJsZTxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD47XG4gIGVkaXRDZWxsU3RhcnQ6IE9ic2VydmFibGU8SUNlbGxFdmVudCB8IG51bGw+O1xuICBlZGl0Q2VsbFN0b3A6IE9ic2VydmFibGU8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+O1xuICB2YWx1ZUNoYW5nZWQ6IE9ic2VydmFibGU8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+O1xuICB2YWx1ZVNldDogT2JzZXJ2YWJsZTxJQ2VsbFZhbHVlPjtcbiAgc3RhdGVDaGFuZ2VkOiBPYnNlcnZhYmxlPEZpbHRlclN0YXRlPjtcbiAgZmlsdGVyQ2xlYXI6IE9ic2VydmFibGU8VGFibGVDb2x1bW4+O1xuICBzZWxlY3RlZFJvd3M6IE9ic2VydmFibGU8VFtdPjtcbiAgYWN0aXZlUm93OiBPYnNlcnZhYmxlPFQgfCBudWxsPjtcbiAgaGlkZGVuQ29sdW1uczogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHNjcm9sbEluZGV4OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgZWRpdFR5cGU6IEVkaXRUeXBlID0gRWRpdFR5cGUuY2VsbDtcbiAgZWRpdEV2ZW50OiBFZGl0RXZlbnQgPSBFZGl0RXZlbnQuZG91YmxlQ2xpY2s7XG4gIHJvd0VkaXRhYmxlPzogYm9vbGVhbiB8ICgocm93OiBUKSA9PiBib29sZWFuKTtcbiAgdHJhY2tSb3c6IChpbmRleDogbnVtYmVyLCByb3c6IFQpID0+IGFueSA9IChpbmRleDogbnVtYmVyLCByb3c6IFQpID0+IHtcbiAgICBjb25zdCByb3dJZCA9IChyb3cgYXMgYW55KVsnaWQnXTtcbiAgICBpZiAocm93SWQpIHtcbiAgICAgIHJldHVybiByb3dJZDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIGdldCBkcmFnU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9kcmFnU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsQ29sdW1uc0hhc2ggPSAnJztcbiAgcHJpdmF0ZSBpbml0aWFsQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xuICBwcml2YXRlIGRpc3BsYXlDb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XG4gIHByaXZhdGUgX2NvbHVtbnM6IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVDb2x1bW5bXT4oW10pO1xuICBwcml2YXRlIF9oaWRkZW5Db2x1bW5zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICBwcml2YXRlIF9kaXNwbGF5RGF0YTogQmVoYXZpb3JTdWJqZWN0PFRhYmxlUm93PFQ+W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvdzxUPltdPihbXSk7XG4gIHByaXZhdGUgX2RpY3Q6IEJlaGF2aW9yU3ViamVjdDxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+KHt9KTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9uczogQmVoYXZpb3JTdWJqZWN0PElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPlxuICA+KHt9KTtcbiAgcHJpdmF0ZSBfc3RhdGU6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJTdGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlclN0YXRlPihuZXcgRmlsdGVyU3RhdGUoKSk7XG4gIHByaXZhdGUgX2Nvb2tpZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2hpZGRlbkNvb2tpZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbHVtbnNDb29raWVOYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIF9lZGl0Um93U3RhcnQgPSBuZXcgU3ViamVjdDxJQ2VsbEV2ZW50IHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfZWRpdFJvd1N0b3AgPSBuZXcgU3ViamVjdDxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfZWRpdENlbGxTdGFydCA9IG5ldyBTdWJqZWN0PElDZWxsRXZlbnQgfCBudWxsPigpO1xuICBwcml2YXRlIF9lZGl0Q2VsbFN0b3AgPSBuZXcgU3ViamVjdDxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+KCk7XG4gIHByaXZhdGUgX3ZhbHVlU2V0ID0gbmV3IFN1YmplY3Q8SUNlbGxWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8RmlsdGVyU3RhdGU+KCk7XG4gIHByaXZhdGUgX2ZpbHRlckNsZWFyID0gbmV3IFN1YmplY3Q8VGFibGVDb2x1bW4+KCk7XG4gIHByaXZhdGUgX2RyYWdTb3VyY2U/OiBUYWJsZUNvbHVtbjtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcbiAgcHJpdmF0ZSBfYWN0aXZlUm93ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3Njcm9sbEluZGV4ID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIF9jdXJyZW50RWRpdENlbGw/OiBJQ2VsbENvb3JkaW5hdGVzO1xuXG4gIGdldCBjdXJyZW50RWRpdENlbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRFZGl0Q2VsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5kaXNwbGF5RGF0YSA9IHRoaXMuX2Rpc3BsYXlEYXRhLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZGljdCA9IHRoaXMuX2RpY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zID0gdGhpcy5fZmlsdGVyT3B0aW9ucy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5fc3RhdGUuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Um93U3RhcnQgPSB0aGlzLl9lZGl0Um93U3RhcnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Um93U3RvcCA9IHRoaXMuX2VkaXRSb3dTdG9wLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZWRpdENlbGxTdGFydCA9IHRoaXMuX2VkaXRDZWxsU3RhcnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Q2VsbFN0b3AgPSB0aGlzLl9lZGl0Q2VsbFN0b3AuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB0aGlzLl92YWx1ZUNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy52YWx1ZVNldCA9IHRoaXMuX3ZhbHVlU2V0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdGhpcy5fc3RhdGVDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZmlsdGVyQ2xlYXIgPSB0aGlzLl9maWx0ZXJDbGVhci5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuX3NlbGVjdGVkUm93cy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZVJvdyA9IHRoaXMuX2FjdGl2ZVJvdy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSB0aGlzLl9oaWRkZW5Db2x1bW5zLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuc2Nyb2xsSW5kZXggPSB0aGlzLl9zY3JvbGxJbmRleC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldERhdGEoZGF0YTogVFtdKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzcGxheURhdGEubmV4dChcbiAgICAgIGRhdGE/Lm1hcChcbiAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgbmV3IFRhYmxlUm93PFQ+KHtcbiAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgfSksXG4gICAgICApID8/IFtdLFxuICAgICk7XG4gIH1cblxuICBzZXREaWN0KGRpY3Q6IElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPik6IHZvaWQge1xuICAgIHRoaXMuX2RpY3QubmV4dChkaWN0KTtcbiAgfVxuXG4gIHNldEZpbHRlck9wdGlvbnMoZmlsdGVyT3B0aW9uczogSURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+KTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyT3B0aW9ucy5uZXh0KGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgc2V0Q29sdW1ucyhjb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsQ29sdW1ucyA9IGNvbHVtbnMgPyBjb2x1bW5zLm1hcCgoXykgPT4gbmV3IFRhYmxlQ29sdW1uKF8pKSA6IFtdO1xuICAgIGNvbnN0IGV4Y2x1ZGVLZXlzID0gWydlZGl0YWJsZScsICdjZWxsQ29tcG9uZW50JywgJ2hlYWRDZWxsQ29tcG9uZW50JywgJ2hlYWREcm9wZG93bkNvbmZpZyddO1xuICAgIHRoaXMuaW5pdGlhbENvbHVtbnNIYXNoID0gb2JqZWN0SGFzaCh0aGlzLmluaXRpYWxDb2x1bW5zLCB7XG4gICAgICBhbGdvcml0aG06ICdzaGExJyxcbiAgICAgIGlnbm9yZVVua25vd246IHRydWUsXG4gICAgICBleGNsdWRlS2V5czogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBleGNsdWRlS2V5cy5pbmRleE9mKGtleSkgPj0gMDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSB0aGlzLnJlc3RvcmVDb2x1bW5zKCk7XG5cbiAgICBpZiAocmVzdG9yZWQpIHtcbiAgICAgIHRoaXMuc2V0RGlzcGxheUNvbHVtbnMocmVzdG9yZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERpc3BsYXlDb2x1bW5zKHRoaXMuaW5pdGlhbENvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVEZWZhdWx0Q29sdW1ucygpIHtcbiAgICB0aGlzLnNldERpc3BsYXlDb2x1bW5zKHRoaXMuaW5pdGlhbENvbHVtbnMpO1xuICAgIHRoaXMuY2xlYXJDb2x1bW5zU3RhdGUoKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGlzcGxheUNvbHVtbnMoY29sdW1ucyk7XG4gICAgdGhpcy5zYXZlQ29sdW1uc1N0YXRlKCk7XG4gIH1cblxuICBzYXZlQ29sdW1uc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLl9jb2x1bW5zQ29va2llTmFtZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIHRoaXMuX2NvbHVtbnNDb29raWVOYW1lLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGFzaDogdGhpcy5pbml0aWFsQ29sdW1uc0hhc2gsXG4gICAgICAgICAgY29sdW1uczogdGhpcy5kaXNwbGF5Q29sdW1ucy5tYXAoKF8pID0+IG5ldyBUYWJsZUNvbHVtblN0b3JlKF8pKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29sdW1uc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLl9jb2x1bW5zQ29va2llTmFtZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fY29sdW1uc0Nvb2tpZU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc3BsYXlDb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zID0gY29sdW1ucyA/IGNvbHVtbnMubWFwKChfKSA9PiBuZXcgVGFibGVDb2x1bW4oXykpIDogW107XG4gICAgdGhpcy5fY29sdW1ucy5uZXh0KHRoaXMuZGlzcGxheUNvbHVtbnMpO1xuICB9XG5cbiAgcmVzdG9yZUNvbHVtbnMoKSB7XG4gICAgaWYgKHRoaXMuX2NvbHVtbnNDb29raWVOYW1lKSB7XG4gICAgICBjb25zdCBzYXZlZENvbHVtbnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX2NvbHVtbnNDb29raWVOYW1lKSk7XG4gICAgICBpZiAoc2F2ZWRDb2x1bW5zICYmIHNhdmVkQ29sdW1ucy5oYXNoID09PSB0aGlzLmluaXRpYWxDb2x1bW5zSGFzaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0b3JlQ29sdW1uc1N0YXRlKHNhdmVkQ29sdW1ucy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXN0b3JlQ29sdW1uc1N0YXRlKGNvbHVtbnM6IFRhYmxlQ29sdW1uU3RvcmVbXSkge1xuICAgIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uOiBUYWJsZUNvbHVtblN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZCA9IEFycmF5VXRpbC5maW5kUmVjdXJzaXZlKHRoaXMuaW5pdGlhbENvbHVtbnMsIChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGNvbHVtbi5uYW1lLCAnY29sdW1ucycpO1xuICAgICAgY29uc3QgcmVzdWx0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZvdW5kKTtcbiAgICAgIHJlc3VsdENvbHVtbi53aWR0aCA9IGNvbHVtbi53aWR0aDtcbiAgICAgIHJlc3VsdENvbHVtbi5mbGV4ID0gY29sdW1uLmZsZXg7XG4gICAgICByZXN1bHRDb2x1bW4ubG9ja2VkID0gY29sdW1uLmxvY2tlZDtcbiAgICAgIGlmIChjb2x1bW4uY29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRDb2x1bW4uY29sdW1ucyA9IHRoaXMucmVzdG9yZUNvbHVtbnNTdGF0ZShjb2x1bW4uY29sdW1ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0Q29sdW1uO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3RhdGUoc3RhdGU6IEZpbHRlclN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Nvb2tpZU5hbWUpIHtcbiAgICAgIHN0YXRlLnNhdmUodGhpcy5fY29va2llTmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlLm5leHQoc3RhdGUpO1xuICB9XG5cbiAgc2V0Q29va2llTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb29raWVOYW1lID0gbmFtZTtcbiAgICB0aGlzLl9oaWRkZW5Db29raWVOYW1lID0gYCR7dGhpcy5fY29va2llTmFtZX1faGlkZGVuX2NvbHVtbnNgO1xuICAgIHRoaXMuX2NvbHVtbnNDb29raWVOYW1lID0gYCR7dGhpcy5fY29va2llTmFtZX1fY29sdW1uc2A7XG4gIH1cblxuICByZXN0b3JlU3RhdGUoKTogdm9pZCB7XG4gICAgbGV0IHN0YXRlOiBGaWx0ZXJTdGF0ZTtcbiAgICBpZiAodGhpcy5fY29va2llTmFtZSAmJiB0aGlzLl9jb29raWVOYW1lPy5sZW5ndGggPiAwICYmIEZpbHRlclN0YXRlLnJlc3RvcmUodGhpcy5fY29va2llTmFtZSkpIHtcbiAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fc3RhdGUudmFsdWUsIEZpbHRlclN0YXRlLnJlc3RvcmUodGhpcy5fY29va2llTmFtZSkpO1xuICAgICAgbmV3U3RhdGUgPSBEYXRlVXRpbC5jb252ZXJ0RGF0ZVN0cmluZ3NUb0RhdGVzKG5ld1N0YXRlKTtcbiAgICAgIHN0YXRlID0gbmV3IEZpbHRlclN0YXRlKG5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUgPSBuZXcgRmlsdGVyU3RhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gIH1cblxuICBzYXZlSGlkZGVuQ29sdW1ucyhoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oaWRkZW5Db29raWVOYW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9oaWRkZW5Db29raWVOYW1lLCBKU09OLnN0cmluZ2lmeShoaWRkZW5Db2x1bW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZUhpZGRlbkNvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX2hpZGRlbkNvb2tpZU5hbWUgPz8gJycpIHx8ICdbXSc7XG4gICAgdGhpcy5faGlkZGVuQ29sdW1ucy5uZXh0KEpTT04ucGFyc2UoaGlkZGVuQ29sdW1ucykpO1xuICB9XG5cbiAgc29ydEFzYyhzb3J0RXZlbnQ6IFNvcnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzb3J0RXZlbnQuY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5zb3J0QXNjKHNvcnRFdmVudCwgdGhpcy5fc3RhdGUudmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBzb3J0RGVzYyhzb3J0RXZlbnQ6IFNvcnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzb3J0RXZlbnQuY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5zb3J0RGVzYyhzb3J0RXZlbnQsIHRoaXMuX3N0YXRlLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTb3J0KGNvbHVtbjogVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5jbGVhclNvcnQoY29sdW1uLCB0aGlzLl9zdGF0ZS52YWx1ZSkpO1xuICB9XG5cbiAgY2xlYXJBbGxTb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhdGUoU3RhdGVVdGlsLmNsZWFyQWxsU29ydCh0aGlzLl9zdGF0ZS52YWx1ZSkpO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXIoY29sdW1uOiBUYWJsZUNvbHVtbikge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGUudmFsdWU7XG4gICAgaWYgKGNvbHVtbiAhPT0gbnVsbCAmJiBjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZmlsdGVyYWJsZSkge1xuICAgICAgc3dpdGNoIChjb2x1bW4uZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuZGF0ZTpcbiAgICAgICAgICBzdGF0ZS5hZGREYXRlRmlsdGVyKFxuICAgICAgICAgICAgbmV3IERhdGVGaWx0ZXIoe1xuICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5maWx0ZXJGaWVsZCxcbiAgICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlRmlsdGVyVmFsdWUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5zdHJpbmc6XG4gICAgICAgICAgc3RhdGUuYWRkU3RyaW5nRmlsdGVyKFxuICAgICAgICAgICAgbmV3IFN0cmluZ0ZpbHRlcih7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmZpbHRlckZpZWxkLFxuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUubnVtYmVyOlxuICAgICAgICAgIHN0YXRlLmFkZE51bWVyaWNGaWx0ZXIoXG4gICAgICAgICAgICBuZXcgTnVtZXJpY0ZpbHRlcih7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmZpbHRlckZpZWxkLFxuICAgICAgICAgICAgICB2YWx1ZTogbmV3IE51bWVyaWNGaWx0ZXJWYWx1ZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLmxpc3Q6XG4gICAgICAgICAgc3RhdGUuYWRkTGlzdEZpbHRlcihcbiAgICAgICAgICAgIG5ldyBMaXN0RmlsdGVyKHtcbiAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmlsdGVyRmllbGQsXG4gICAgICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICAgICAgdHlwZTogTGlzdEZpbHRlclR5cGUuTm9uZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKG5ldyBGaWx0ZXJTdGF0ZShzdGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlLnZhbHVlO1xuICAgIHN0YXRlLnN0cmluZ0ZpbHRlcnMgPSBbXTtcbiAgICBzdGF0ZS5saXN0RmlsdGVycyA9IFtdO1xuICAgIHN0YXRlLm51bWVyaWNGaWx0ZXJzID0gW107XG4gICAgc3RhdGUuZGF0ZUZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLnNldFN0YXRlKG5ldyBGaWx0ZXJTdGF0ZShzdGF0ZSkpO1xuICB9XG5cbiAgcGluQ29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zLmZvckVhY2goKGNvbDogVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gY29sdW1uLm5hbWUpIHtcbiAgICAgICAgY29sLmxvY2tlZCA9ICFjb2wubG9ja2VkO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQ29sdW1ucyh0aGlzLmRpc3BsYXlDb2x1bW5zKTtcbiAgfVxuXG4gIGRyYWdTdGFydChjb2x1bW46IFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ1NvdXJjZSA9IGNvbHVtbjtcbiAgfVxuXG4gIGxvY2tQcmV2aW91c0NvbHVtbnMoY29sdW1uOiBUYWJsZUNvbHVtbiwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBmbGF0ID0gQXJyYXlVdGlsLmZsYXR0ZW4odGhpcy5kaXNwbGF5Q29sdW1ucywgJ2NvbHVtbnMnLCB0cnVlKS5zb3J0KFxuICAgICAgKGEsIGIpID0+IE51bWJlcihiLmxvY2tlZCkgLSBOdW1iZXIoYS5sb2NrZWQpLFxuICAgICk7XG4gICAgY29uc3QgaW5kZXggPSBmbGF0LmluZGV4T2YoY29sdW1uKTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGZsYXQuc2xpY2UoMCwgaW5kZXgpLmZpbHRlcigoXykgPT4gXy5mbGV4ID4gMCk7XG4gICAgaWYgKHByZXZpb3VzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFRhYmxlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIHByZXZpb3VzLmZvckVhY2goKGl0ZW06IFRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1Db2wgPSB0YWJsZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoYHRldGEtaGVhZC1jZWxsW2RhdGEtY29sdW1uPVwiJHtpdGVtLm5hbWV9XCJdYCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChpdGVtQ29sKSB7XG4gICAgICAgICAgaXRlbS5mbGV4ID0gMDtcbiAgICAgICAgICBpdGVtLndpZHRoID0gaXRlbUNvbC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzaXplQ29sdW1uKGV2ZW50OiBDb2x1bW5SZXNpemVFdmVudCkge1xuICAgIGlmIChldmVudC5jb2x1bW4gIT09IG51bGwgJiYgZXZlbnQuY29sdW1uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50LmNvbHVtbi53aWR0aCA9IGV2ZW50Lm5ld1dpZHRoIDwgNTAgPyA1MCA6IGV2ZW50Lm5ld1dpZHRoO1xuICAgICAgZXZlbnQuY29sdW1uLmZsZXggPSAwO1xuICAgIH1cbiAgICB0aGlzLl9jb2x1bW5zLm5leHQodGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgdGhpcy5zYXZlQ29sdW1uc1N0YXRlKCk7XG4gIH1cblxuICBhdXRvc2l6ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uLCB0YXJnZXQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgdGFibGVFbGVtZW50ID0gdGhpcy5nZXRUYWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICB0aGlzLnNldENvbHVtbkF1dG9XaWR0aChjb2x1bW4sIHRhYmxlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fY29sdW1ucy5uZXh0KHRoaXMuZGlzcGxheUNvbHVtbnMpO1xuICAgIHRoaXMuc2F2ZUNvbHVtbnNTdGF0ZSgpO1xuICB9XG5cbiAgYXV0b3NpemVBbGxDb2x1bW5zKHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFRhYmxlRWxlbWVudCh0YXJnZXQpO1xuICAgIGNvbnN0IGZsYXQgPSBBcnJheVV0aWwuZmxhdHRlbih0aGlzLmRpc3BsYXlDb2x1bW5zLCAnY29sdW1ucycsIHRydWUpO1xuICAgIGZsYXQuZm9yRWFjaCgoY29sKSA9PiB0aGlzLnNldENvbHVtbkF1dG9XaWR0aChjb2wsIHRhYmxlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkpO1xuICAgIHRoaXMuX2NvbHVtbnMubmV4dCh0aGlzLmRpc3BsYXlDb2x1bW5zKTtcbiAgICB0aGlzLnNhdmVDb2x1bW5zU3RhdGUoKTtcbiAgfVxuXG4gIHJlb3JkZXJDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtbiwgaW5zZXJ0QmVmb3JlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kcmFnU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IENvbHVtblJlb3JkZXJFdmVudCh0aGlzLl9kcmFnU291cmNlLCBjb2x1bW4pO1xuICAgIGlmIChldmVudC5zb3VyY2UgIT09IGV2ZW50LnRhcmdldCkge1xuICAgICAgY29uc3Qgc291cmNlUGFyZW50ID0gdGhpcy5maW5kUGFyZW50KGV2ZW50LnNvdXJjZSwgdGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgICBjb25zdCB0YXJnZXRQYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnQoZXZlbnQudGFyZ2V0LCB0aGlzLmRpc3BsYXlDb2x1bW5zKTtcblxuICAgICAgaWYgKHNvdXJjZVBhcmVudCAmJiB0YXJnZXRQYXJlbnQpIHtcbiAgICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2VQYXJlbnQuaW5kZXhPZihldmVudC5zb3VyY2UpO1xuICAgICAgICBzb3VyY2VQYXJlbnQuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gdGFyZ2V0UGFyZW50LmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFpbnNlcnRCZWZvcmUpIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IHRhcmdldEluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRQYXJlbnQuc3BsaWNlKHRhcmdldEluZGV4LCAwLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBldmVudC5zb3VyY2UubG9ja2VkID0gZXZlbnQudGFyZ2V0LmxvY2tlZDtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uUGFyZW50KGNvbHVtbjogVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyZW50Q29sdW1uKGNvbHVtbiwgdGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gIH1cblxuICBzdGFydEVkaXRSb3coY2VsbEV2ZW50OiBJQ2VsbEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbD8ucm93ICE9PSBjZWxsRXZlbnQ/LnJvdykge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRSb3dTdG9wLm5leHQodGhpcy5fY3VycmVudEVkaXRDZWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjZWxsRXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZWRpdFJvd1N0YXJ0Lm5leHQoY2VsbEV2ZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJvb2xPckZ1bmNDYWxsYmFjazxUPih0aGlzLnJvd0VkaXRhYmxlKSh0aGlzLmdldFJvd0J5SW5kZXgoY2VsbEV2ZW50Py5yb3cpPy5kYXRhKSkge1xuICAgICAgICAgIHRoaXMuX2VkaXRSb3dTdGFydC5uZXh0KGNlbGxFdmVudCk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhcnRFZGl0Q2VsbChjZWxsRXZlbnQ6IElDZWxsRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEVkaXRDZWxsPy5jb2x1bW4gIT09IGNlbGxFdmVudD8uY29sdW1uIHx8IHRoaXMuX2N1cnJlbnRFZGl0Q2VsbD8ucm93ICE9PSBjZWxsRXZlbnQ/LnJvdykge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRDZWxsU3RvcC5uZXh0KHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjZWxsRXZlbnQ/LmNvbHVtbik7XG4gICAgICBpZiAoXG4gICAgICAgIGJvb2xPckZ1bmNDYWxsYmFjazxUPih0aGlzLnJvd0VkaXRhYmxlKSh0aGlzLmdldFJvd0J5SW5kZXgoY2VsbEV2ZW50Py5yb3cpPy5kYXRhKSAmJlxuICAgICAgICBib29sT3JGdW5jQ2FsbGJhY2s8SUNvbHVtblJvdzxUPj4oY29sdW1uPy5lZGl0YWJsZSkoe1xuICAgICAgICAgIHJvdzogdGhpcy5nZXRSb3dCeUluZGV4KGNlbGxFdmVudD8ucm93KT8uZGF0YSxcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9lZGl0Q2VsbFN0YXJ0Lm5leHQoY2VsbEV2ZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgICBjb25zdCBrZXkgPSAoY2VsbEV2ZW50Py5ldmVudCBhcyBLZXlib2FyZEV2ZW50KT8ua2V5O1xuICAgICAgICBpZiAoa2V5ICYmIChrZXkubGVuZ3RoID09PSAxIHx8IChrZXkgPT09ICdEZWxldGUnICYmICFjb2x1bW4ucmVxdWlyZWQpKSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZShjZWxsRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlUm93KHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZVJvdy5uZXh0KHJvdyk7XG4gIH1cblxuICBzZWxlY3RSb3dzKHJvd3M6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHJvd3MpO1xuICB9XG5cbiAgc2VsZWN0T3JEZXNlbGVjdFJvdyhyb3c6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dzLnZhbHVlLmluZGV4T2Yocm93KSA+PSAwKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dCh0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUuZmlsdGVyKChfKSA9PiBfICE9PSByb3cpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLm5leHQoWy4uLnRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZSwgcm93XSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmFuZ2Uocm93OiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5maW5kSW5kZXgoKF8pID0+IF8uZGF0YSA9PT0gcm93KTtcbiAgICBsZXQgbWluSW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSBjdXJyKTtcbiAgICAgIGlmIChuZXdJbmRleCA8IHByZXYpIHtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwgdGhpcy5fZGlzcGxheURhdGEudmFsdWUubGVuZ3RoKTtcbiAgICBsZXQgbWF4SW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSBjdXJyKTtcbiAgICAgIGlmIChuZXdJbmRleCA+IHByZXYpIHtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwgMCk7XG4gICAgaWYgKGluZGV4ID4gbWF4SW5kZXgpIHtcbiAgICAgIG1heEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IG1pbkluZGV4KSB7XG4gICAgICBtaW5JbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBpZiAobWluSW5kZXggPCBpbmRleCAmJiBpbmRleCA8IG1heEluZGV4KSB7XG4gICAgICBtYXhJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dChbLi4udGhpcy5fZGlzcGxheURhdGEudmFsdWUuc2xpY2UobWluSW5kZXgsIG1heEluZGV4ICsgMSkubWFwKChfKSA9PiBfLmRhdGEpXSk7XG4gIH1cblxuICBzZWxlY3RSb3cocm93OiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0VHlwZSA9PT0gU2VsZWN0VHlwZS5ub25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KFsuLi50aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUsIHJvd10pO1xuICB9XG5cbiAgZGVzZWxlY3RSb3cocm93OiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0VHlwZSA9PT0gU2VsZWN0VHlwZS5ub25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZS5maWx0ZXIoKF8pID0+IF8gIT09IHJvdykpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLm1hcCgoXykgPT4gXy5kYXRhKSk7XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dChbXSk7XG4gIH1cblxuICBhbGxSb3dzU2VsZWN0ZWQoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlPy5sZW5ndGggJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZT8ubGVuZ3RoICYmXG4gICAgICB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5ldmVyeSgoXykgPT4gdGhpcy5fc2VsZWN0ZWRSb3dzLnZhbHVlLmZpbmRJbmRleCgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkID09PSBfLmRhdGEpID49IDApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZSA9PSBudWxsIHx8IHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZXRIaWRkZW5Db2x1bW5zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2F2ZUhpZGRlbkNvbHVtbnModmFsdWUpO1xuICAgIHRoaXMuX2hpZGRlbkNvbHVtbnMubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjb2x1bW5Jc0hpZGRlbihjb2x1bW46IFRhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlbkNvbHVtbnMudmFsdWUuaW5kZXhPZihjb2x1bW4ubmFtZSkgPj0gMDtcbiAgfVxuXG4gIGNoYW5nZVZhbHVlKGNvb3JkaW5hdGVzOiBJQ2VsbENvb3JkaW5hdGVzKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VkLm5leHQoY29vcmRpbmF0ZXMpO1xuICB9XG5cbiAgc2V0VmFsdWUoY2VsbFZhbHVlOiBJQ2VsbFZhbHVlKTogdm9pZDtcbiAgc2V0VmFsdWUoY2VsbFZhbHVlOiBJQ2VsbEluc3RhbmNlVmFsdWU8VD4pOiB2b2lkO1xuICBzZXRWYWx1ZShjZWxsVmFsdWU6IElDZWxsVmFsdWUgfCBJQ2VsbEluc3RhbmNlVmFsdWU8VD4pOiB2b2lkIHtcbiAgICBsZXQgdmFsdWU6IElDZWxsVmFsdWU7XG4gICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUucm93ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY2VsbFZhbHVlLmNvbHVtbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhbHVlID0ge1xuICAgICAgICByb3c6IHRoaXMuZ2V0Um93SW5kZXgoY2VsbFZhbHVlLnJvdy5kYXRhKSxcbiAgICAgICAgY29sdW1uOiBjZWxsVmFsdWUuY29sdW1uLm5hbWUsXG4gICAgICAgIHZhbHVlOiBjZWxsVmFsdWUudmFsdWUsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGNlbGxWYWx1ZSBhcyBJQ2VsbFZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZVNldC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldFJvd0J5SW5kZXgocm93SW5kZXg/OiBudW1iZXIpOiBUYWJsZVJvdzxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJvd0luZGV4ICE9PSBudWxsICYmIHJvd0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RGF0YT8udmFsdWVbcm93SW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Um93SW5kZXgocm93OiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSByb3cpO1xuICB9XG5cbiAgZ2V0RXZlbnRDZWxsKGV2ZW50OiBFdmVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIGV2ZW50LmNvbXBvc2VkUGF0aCgpLmZpbmQoKHRhcmdldDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICd0ZXRhLWNlbGwnO1xuICAgIH0pIGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgZ2V0RXZlbnRSb3coZXZlbnQ6IEV2ZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gZXZlbnQuY29tcG9zZWRQYXRoKCkuZmluZCgodGFyZ2V0OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0YXJnZXQ/LmdldEF0dHJpYnV0ZSAmJiB0YXJnZXQ/LmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICB9KSBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIGdldE5leHRFZGl0YWJsZUNlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IG5leHRDZWxsID0gdGhpcy5nZXROZXh0Q2VsbChjb29yZHMpO1xuICAgIGlmICghbmV4dENlbGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShuZXh0Q2VsbD8uY29sdW1uKTtcbiAgICBpZiAoXG4gICAgICBib29sT3JGdW5jQ2FsbGJhY2s8SUNlbGxJbnN0YW5jZTxUPj4oY29sdW1uLmVkaXRhYmxlKSh7XG4gICAgICAgIHJvdzogdGhpcy5nZXRSb3dCeUluZGV4KG5leHRDZWxsLnJvdyksXG4gICAgICAgIGNvbHVtbixcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV4dENlbGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldE5leHRFZGl0YWJsZUNlbGwobmV4dENlbGwpO1xuICB9XG5cbiAgZ2V0UHJldmlvdXNFZGl0YWJsZUNlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IHByZXZDZWxsID0gdGhpcy5nZXRQcmV2aW91c0NlbGwoY29vcmRzKTtcbiAgICBpZiAoIXByZXZDZWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUocHJldkNlbGw/LmNvbHVtbik7XG4gICAgaWYgKFxuICAgICAgYm9vbE9yRnVuY0NhbGxiYWNrPElDZWxsSW5zdGFuY2U8VD4+KGNvbHVtbi5lZGl0YWJsZSkoe1xuICAgICAgICByb3c6IHRoaXMuZ2V0Um93QnlJbmRleChwcmV2Q2VsbC5yb3cpLFxuICAgICAgICBjb2x1bW4sXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuIHByZXZDZWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQcmV2aW91c0VkaXRhYmxlQ2VsbChwcmV2Q2VsbCk7XG4gIH1cblxuICBnZXROZXh0Q2VsbChjb29yZHM6IElDZWxsQ29vcmRpbmF0ZXMpOiBJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0RmxhdENvbHVtbnMoKTtcbiAgICBsZXQgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBsZXQgcm93SW5kZXggPSBjb29yZHM/LnJvdztcbiAgICBpZiAoY29sSW5kZXggPj0gMCAmJiByb3dJbmRleCA+PSAwKSB7XG4gICAgICBpZiAoY29sSW5kZXggPT09IGNvbHVtbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb2xJbmRleCA9IDA7XG4gICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sSW5kZXggPSBjb2xJbmRleCArIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IGNvbHVtbnNbY29sSW5kZXhdPy5uYW1lLFxuICAgICAgICByb3c6IHJvd0luZGV4LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRQcmV2aW91c0NlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgbGV0IGNvbEluZGV4ID0gY29sdW1ucy5maW5kSW5kZXgoKGNvbDogVGFibGVDb2x1bW4pID0+IGNvbC5uYW1lID09PSBjb29yZHM/LmNvbHVtbik7XG4gICAgbGV0IHJvd0luZGV4ID0gY29vcmRzPy5yb3c7XG4gICAgaWYgKGNvbEluZGV4ID49IDAgJiYgcm93SW5kZXggPj0gMCkge1xuICAgICAgaWYgKGNvbEluZGV4ID09PSAwKSB7XG4gICAgICAgIGNvbEluZGV4ID0gY29sdW1ucy5sZW5ndGggLSAxO1xuICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4IC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEluZGV4ID0gY29sSW5kZXggLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW5zW2NvbEluZGV4XT8ubmFtZSxcbiAgICAgICAgcm93OiByb3dJbmRleCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0TmV4dFJvd0NlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBjb25zdCByb3dJbmRleCA9IGNvb3Jkcz8ucm93O1xuICAgIGlmIChjb2xJbmRleCA+PSAwICYmIHJvd0luZGV4ID49IDAgJiYgcm93SW5kZXggPCB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IGNvbHVtbnNbY29sSW5kZXhdPy5uYW1lLFxuICAgICAgICByb3c6IHJvd0luZGV4ICsgMSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0UHJldmlvdXNSb3dDZWxsKGNvb3JkczogSUNlbGxDb29yZGluYXRlcykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBjb25zdCByb3dJbmRleCA9IGNvb3Jkcz8ucm93O1xuICAgIGlmIChjb2xJbmRleCA+PSAwICYmIHJvd0luZGV4ID4gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW5zW2NvbEluZGV4XT8ubmFtZSxcbiAgICAgICAgcm93OiByb3dJbmRleCAtIDEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXlVdGlsLmZpbmRSZWN1cnNpdmUodGhpcy5kaXNwbGF5Q29sdW1ucywgKGl0ZXJhYmxlTm9kZSkgPT4gY29sdW1uTmFtZSA9PT0gaXRlcmFibGVOb2RlLm5hbWUsICdjb2x1bW5zJyk7XG4gIH1cblxuICBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zY3JvbGxJbmRleC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Njcm9sbEluZGV4Lm5leHQoaW5kZXgpO1xuICB9XG5cbiAgZ2V0VmlzaWJsZUNvbHVtbnMoKSB7XG4gICAgY29uc3QgdmlzaWJsZSA9IEFycmF5VXRpbC5mbGF0dGVuKHRoaXMuX2NvbHVtbnMudmFsdWUsICdjb2x1bW5zJywgdHJ1ZSkuZmlsdGVyKFxuICAgICAgKF8pID0+IHRoaXMuX2hpZGRlbkNvbHVtbnMudmFsdWUuaW5kZXhPZihfLm5hbWUpIDwgMCxcbiAgICApO1xuICAgIHJldHVybiB2aXNpYmxlLnNvcnQoKGEsIGIpID0+IE51bWJlcihiLmxvY2tlZCkgLSBOdW1iZXIoYS5sb2NrZWQpKTtcbiAgfVxuXG4gIGdldENlbGxJbnN0YW5jZShjb29yZHM6IElDZWxsQ29vcmRpbmF0ZXMpOiBJQ2VsbEluc3RhbmNlPFQ+IHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvb3Jkc1xuICAgICAgPyB7XG4gICAgICAgICAgcm93OiB0aGlzLmdldFJvd0J5SW5kZXgoY29vcmRzLnJvdyksXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb29yZHMuY29sdW1uKSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1ucygpIHtcbiAgICByZXR1cm4gQXJyYXlVdGlsLmZsYXR0ZW4odGhpcy5kaXNwbGF5Q29sdW1ucywgJ2NvbHVtbnMnLCB0cnVlKS5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYi5sb2NrZWQpIC0gTnVtYmVyKGEubG9ja2VkKSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnQoY29sdW1uOiBUYWJsZUNvbHVtbiwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uW10gfCBudWxsIHtcbiAgICBjb25zdCBmb3VuZCA9IGNvbHVtbnMuZmluZCgoeCkgPT4geC5uYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gICAgaWYgKGZvdW5kICE9PSBudWxsICYmIGZvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbHVtbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5jb2x1bW5zICYmIGNvbC5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRQYXJlbnQoY29sdW1uLCBjb2wuY29sdW1ucyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyZW50Q29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW4sIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IG51bGwge1xuICAgIGNvbnN0IGZvdW5kID0gY29sdW1ucy5maW5kKCh4KSA9PiB4LmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pID49IDApO1xuICAgIGlmIChmb3VuZCAhPT0gbnVsbCAmJiBmb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sdW1ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sLmNvbHVtbnMgJiYgY29sLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFBhcmVudENvbHVtbihjb2x1bW4sIGNvbC5jb2x1bW5zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRUYWJsZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbG9zZXN0KCd0ZXRhLXRhYmxlJyk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbHVtbkF1dG9XaWR0aChjb2x1bW46IFRhYmxlQ29sdW1uLCB0YWJsZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoYHRldGEtY2VsbFtkYXRhLWNvbHVtbj1cIiR7Y29sdW1uLm5hbWV9XCJdIC5jZWxsLXRleHRgKTtcbiAgICBsZXQgbWF4V2lkdGggPSAwO1xuICAgIGNlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLnNjcm9sbFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGggPSBjZWxsLnNjcm9sbFdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFnZ0NlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChgLmFnZ3JlZ2F0ZS1jZWxsW2RhdGEtY29sdW1uPVwiJHtjb2x1bW4ubmFtZX1cIl0gLmNlbGwtdGV4dGApO1xuICAgIGFnZ0NlbGxzPy5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5zY3JvbGxXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoID0gY2VsbC5zY3JvbGxXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb2x1bW4uZmxleCA9IDA7XG4gICAgY29sdW1uLndpZHRoID0gbWF4V2lkdGggKyAyMDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJWYWx1ZShldmVudDogSUNlbGxFdmVudCkge1xuICAgIHRoaXMuc2V0VmFsdWUoe1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|