@tetacom/ng-components 1.0.24 → 1.0.25
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/.browserslistrc +16 -0
- package/dist/README.md +24 -0
- package/dist/assets/color-icons.svg +339 -0
- package/dist/assets/icons.svg +669 -0
- package/dist/assets/intersect.svg +3 -0
- package/dist/assets/lithotype-icons.svg +429 -0
- package/{common → dist/common}/contract/auto-close-ignore-case.d.ts +0 -0
- package/{common → dist/common}/contract/constructor-type.d.ts +0 -0
- package/{common → dist/common}/contract/dynamic-data.d.ts +0 -0
- package/{common → dist/common}/contract/i-dictionary.d.ts +0 -0
- package/{common → dist/common}/contract/i-id-name.d.ts +0 -0
- package/{common → dist/common}/contract/i-rect.d.ts +0 -0
- package/{common → dist/common}/contract/i-tree-data.d.ts +0 -0
- package/{common → dist/common}/contract/public-api.d.ts +0 -0
- package/{common → dist/common}/contract/teta-content-ref.d.ts +0 -0
- package/{common → dist/common}/enum/align.enum.d.ts +0 -0
- package/{common → dist/common}/enum/public-api.d.ts +0 -0
- package/{common → dist/common}/enum/teta-size.enum.d.ts +0 -0
- package/{common → dist/common}/enum/vertical-align.enum.d.ts +0 -0
- package/{common → dist/common}/public-api.d.ts +0 -0
- package/{common → dist/common}/service/click.service.d.ts +0 -0
- package/{common → dist/common}/service/dynamic-component.service.d.ts +0 -0
- package/{common → dist/common}/service/overlay-container.service.d.ts +0 -0
- package/{common → dist/common}/service/public-api.d.ts +0 -0
- package/{common → dist/common}/util/array-util.d.ts +0 -0
- package/{common → dist/common}/util/dom-util.d.ts +0 -0
- package/{common → dist/common}/util/position-util.d.ts +0 -0
- package/{common → dist/common}/util/public-api.d.ts +0 -0
- package/{component → dist/component}/accordion/accordion/accordion.component.d.ts +0 -0
- package/{component → dist/component}/accordion/accordion-content.directive.d.ts +0 -0
- package/{component → dist/component}/accordion/accordion-head/accordion-head.component.d.ts +0 -0
- package/{component → dist/component}/accordion/accordion-item/accordion-item.component.d.ts +0 -0
- package/{component → dist/component}/accordion/accordion.module.d.ts +0 -0
- package/{component → dist/component}/accordion/public-api.d.ts +0 -0
- package/{component → dist/component}/button/button/button.component.d.ts +0 -0
- package/{component → dist/component}/button/button.module.d.ts +0 -0
- package/{component → dist/component}/button/public-api.d.ts +0 -0
- package/{component → dist/component}/chart/chart/chart.component.d.ts +0 -0
- package/{component → dist/component}/chart/chart.module.d.ts +0 -0
- package/dist/component/chart/core/axis-creator.d.ts +29 -0
- package/{component → dist/component}/chart/core/chart.d.ts +0 -0
- package/{component → dist/component}/chart/core/public-api.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/area-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/bar-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/contour-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/default-drawer-mapping.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/line-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/pie-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/public-api.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/scatter-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/drawer/spline-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/legend-drawer/default-drawer-legend-mapping.d.ts +0 -0
- package/{component → dist/component}/chart/legend-drawer/gradient-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/legend-drawer/swatch-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/model/annotation.d.ts +0 -0
- package/{component → dist/component}/chart/model/axis-options.d.ts +0 -0
- package/{component → dist/component}/chart/model/chart-bounds.d.ts +0 -0
- package/{component → dist/component}/chart/model/chart-options.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/axis-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/dispatch-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/drag-point-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/legend-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/public-api.d.ts +0 -0
- package/dist/component/chart/model/enum/scale-type.d.ts +7 -0
- package/{component → dist/component}/chart/model/enum/scale.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/series-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/enum/zoom-type.d.ts +0 -0
- package/{component → dist/component}/chart/model/i-drag-event.d.ts +0 -0
- package/{component → dist/component}/chart/model/i-drawer-legend.d.ts +0 -0
- package/{component → dist/component}/chart/model/i-drawer.d.ts +0 -0
- package/{component → dist/component}/chart/model/i-zoom-event.d.ts +0 -0
- package/{component → dist/component}/chart/model/plot-band.d.ts +0 -0
- package/{component → dist/component}/chart/model/plot-line.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/bar-point.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/base-point.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/contour-point.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/marker-options.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/public-api.d.ts +0 -0
- package/{component → dist/component}/chart/model/point/scatter-point.d.ts +0 -0
- package/{component → dist/component}/chart/model/public-api.d.ts +0 -0
- package/dist/component/chart/model/series.d.ts +62 -0
- package/{component → dist/component}/chart/model/tooltip-options.d.ts +0 -0
- package/{component → dist/component}/chart/public-api.d.ts +0 -0
- package/{component → dist/component}/chart-3d/chart-3d.module.d.ts +0 -0
- package/{component → dist/component}/chart-3d/chart3d/chart3d.component.d.ts +0 -0
- package/{component → dist/component}/chart-3d/model/base-3d-point.d.ts +0 -0
- package/{component → dist/component}/chart-3d/model/chart-3d-options.d.ts +0 -0
- package/{component → dist/component}/chart-3d/model/public-api.d.ts +0 -0
- package/{component → dist/component}/chart-3d/model/series-3d.d.ts +0 -0
- package/{component → dist/component}/chart-3d/public-api.d.ts +0 -0
- package/{component → dist/component}/checkbox/checkbox/checkbox.component.d.ts +0 -0
- package/{component → dist/component}/checkbox/checkbox.module.d.ts +0 -0
- package/{component → dist/component}/checkbox/public-api.d.ts +0 -0
- package/{component → dist/component}/date-picker/date-picker/date-picker.component.d.ts +0 -0
- package/{component → dist/component}/date-picker/date-picker.module.d.ts +0 -0
- package/{component → dist/component}/date-picker/day-select/day-select.component.d.ts +0 -0
- package/{component → dist/component}/date-picker/model/date-period.d.ts +0 -0
- package/{component → dist/component}/date-picker/model/date-picker-mode.enum.d.ts +0 -0
- package/{component → dist/component}/date-picker/model/day-model.d.ts +0 -0
- package/{component → dist/component}/date-picker/model/picker-locale-model.d.ts +0 -0
- package/{component → dist/component}/date-picker/month-picker/month-picker.component.d.ts +0 -0
- package/{component → dist/component}/date-picker/month-select/month-select.component.d.ts +0 -0
- package/{component → dist/component}/date-picker/public-api.d.ts +0 -0
- package/{component → dist/component}/date-picker/service/picker-locale.service.d.ts +0 -0
- package/{component → dist/component}/date-picker/service/picker-touch.service.d.ts +0 -0
- package/{component → dist/component}/date-picker/time-part-control/time-part-control.component.d.ts +0 -0
- package/{component → dist/component}/date-picker/util/date-picker-util.d.ts +0 -0
- package/{component → dist/component}/date-picker/year-select/year-select.component.d.ts +0 -0
- package/{component → dist/component}/delimiter/delimiter/delimiter.component.d.ts +0 -0
- package/{component → dist/component}/delimiter/delimiter.module.d.ts +0 -0
- package/{component → dist/component}/delimiter/public-api.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown/dropdown.component.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown-base.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown-content.directive.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown-head.directive.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown.directive.d.ts +0 -0
- package/{component → dist/component}/dropdown/dropdown.module.d.ts +0 -0
- package/{component → dist/component}/dropdown/public-api.d.ts +0 -0
- package/{component → dist/component}/dynamic-component/dynamic-component.module.d.ts +0 -0
- package/{component → dist/component}/dynamic-component/popup-content/popup-content.component.d.ts +0 -0
- package/{component → dist/component}/dynamic-component/public-api.d.ts +0 -0
- package/{component → dist/component}/expand-panel/expand-panel/expand-panel.component.d.ts +0 -0
- package/{component → dist/component}/expand-panel/expand-panel-content.directive.d.ts +0 -0
- package/{component → dist/component}/expand-panel/expand-panel-head.directive.d.ts +0 -0
- package/{component → dist/component}/expand-panel/expand-panel.module.d.ts +0 -0
- package/{component → dist/component}/expand-panel/public-api.d.ts +0 -0
- package/{component → dist/component}/file-upload/file-item/file-item.component.d.ts +0 -0
- package/{component → dist/component}/file-upload/file-upload-area/file-upload-area.component.d.ts +0 -0
- package/{component → dist/component}/file-upload/file-upload.module.d.ts +0 -0
- package/{component → dist/component}/file-upload/public-api.d.ts +0 -0
- package/{component → dist/component}/filter/base/filter-base.d.ts +0 -0
- package/{component → dist/component}/filter/base/filter-component-base.d.ts +0 -0
- package/{component → dist/component}/filter/boolean-filter/boolean-filter.component.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/boolean-filter.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/date-filter-value.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/date-filter.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/filter-component-map.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/filter-item.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/filter-state.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/i-filter.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/list-filter.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/numeric-filter-value.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/numeric-filter.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/sort-param.d.ts +0 -0
- package/{component → dist/component}/filter/contarct/string-filter.d.ts +0 -0
- package/{component → dist/component}/filter/date-filter/date-filter.component.d.ts +0 -0
- package/{component → dist/component}/filter/enum/filter-type.enum.d.ts +0 -0
- package/{component → dist/component}/filter/enum/list-filter-type.enum.d.ts +0 -0
- package/{component → dist/component}/filter/enum/string-filter-type.enum.d.ts +0 -0
- package/{component → dist/component}/filter/filter-host/filter-host.component.d.ts +0 -0
- package/{component → dist/component}/filter/filter-panel/filter-panel.component.d.ts +0 -0
- package/{component → dist/component}/filter/filter.module.d.ts +0 -0
- package/{component → dist/component}/filter/list-filter/list-filter.component.d.ts +0 -0
- package/{component → dist/component}/filter/numeric-filter/numeric-filter.component.d.ts +0 -0
- package/{component → dist/component}/filter/public-api.d.ts +0 -0
- package/{component → dist/component}/filter/string-filter/string-filter.component.d.ts +0 -0
- package/{component → dist/component}/icon/icon/icon.component.d.ts +0 -0
- package/{component → dist/component}/icon/icon-sprite.directive.d.ts +0 -0
- package/{component → dist/component}/icon/icon.module.d.ts +0 -0
- package/{component → dist/component}/icon/icon.service.d.ts +0 -0
- package/{component → dist/component}/icon/public-api.d.ts +0 -0
- package/{component → dist/component}/input/form-group-title/form-group-title.component.d.ts +0 -0
- package/{component → dist/component}/input/input/input.component.d.ts +0 -0
- package/{component → dist/component}/input/input.module.d.ts +0 -0
- package/{component → dist/component}/input/public-api.d.ts +0 -0
- package/{component → dist/component}/input/text-field/text-field.component.d.ts +0 -0
- package/{component → dist/component}/message/message/message.component.d.ts +0 -0
- package/{component → dist/component}/message/message-host/message-host.component.d.ts +0 -0
- package/{component → dist/component}/message/message.module.d.ts +0 -0
- package/{component → dist/component}/message/message.service.d.ts +0 -0
- package/{component → dist/component}/message/model/message.d.ts +0 -0
- package/{component → dist/component}/message/public-api.d.ts +0 -0
- package/{component → dist/component}/modal/dialog/dialog.component.d.ts +0 -0
- package/{component → dist/component}/modal/dialog.service.d.ts +0 -0
- package/{component → dist/component}/modal/modal-container/modal-container.component.d.ts +0 -0
- package/{component → dist/component}/modal/modal.module.d.ts +0 -0
- package/{component → dist/component}/modal/modal.service.d.ts +0 -0
- package/{component → dist/component}/modal/model/current-modal.d.ts +0 -0
- package/{component → dist/component}/modal/model/i-modal-config.d.ts +0 -0
- package/{component → dist/component}/modal/model/i-modal-result.d.ts +0 -0
- package/{component → dist/component}/modal/model/modal-close-reason.enum.d.ts +0 -0
- package/{component → dist/component}/modal/model/modal-instance.d.ts +0 -0
- package/{component → dist/component}/modal/public-api.d.ts +0 -0
- package/{component → dist/component}/pager/model/pager-state.d.ts +0 -0
- package/{component → dist/component}/pager/pager/pager.component.d.ts +0 -0
- package/{component → dist/component}/pager/pager.module.d.ts +0 -0
- package/{component → dist/component}/pager/public-api.d.ts +0 -0
- package/{component → dist/component}/pager/util/pager-util.d.ts +0 -0
- package/{component → dist/component}/panel/panel/panel.component.d.ts +0 -0
- package/{component → dist/component}/panel/panel.module.d.ts +0 -0
- package/{component → dist/component}/panel/public-api.d.ts +0 -0
- package/{component → dist/component}/progress-bar/progress-bar/progress-bar.component.d.ts +0 -0
- package/{component → dist/component}/progress-bar/progress-bar.module.d.ts +0 -0
- package/{component → dist/component}/progress-bar/public-api.d.ts +0 -0
- package/{component → dist/component}/property-grid/default/date-item-default/date-item-default.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/default/list-item-default/list-item-default.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/default/numeric-item-default/numeric-item-default.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/default/string-item-default/string-item-default.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/property-grid/property-grid-group/property-grid-group.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/property-grid/property-grid-item/property-grid-item.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/property-grid/property-grid.component.d.ts +0 -0
- package/{component → dist/component}/property-grid/property-grid.module.d.ts +0 -0
- package/{component → dist/component}/property-grid/public-api.d.ts +0 -0
- package/{component → dist/component}/public-api.d.ts +0 -0
- package/{component → dist/component}/radio/public-api.d.ts +0 -0
- package/{component → dist/component}/radio/radio/radio.component.d.ts +0 -0
- package/{component → dist/component}/radio/radio-button/radio-button.component.d.ts +0 -0
- package/{component → dist/component}/radio/radio.module.d.ts +0 -0
- package/{component → dist/component}/resize-panel/public-api.d.ts +0 -0
- package/{component → dist/component}/resize-panel/resize-panel/resize-panel.component.d.ts +0 -0
- package/{component → dist/component}/resize-panel/resize-panel.module.d.ts +0 -0
- package/{component → dist/component}/select/public-api.d.ts +0 -0
- package/{component → dist/component}/select/select/select.component.d.ts +0 -0
- package/{component → dist/component}/select/select-option.directive.d.ts +0 -0
- package/{component → dist/component}/select/select-value.directive.d.ts +0 -0
- package/{component → dist/component}/select/select.module.d.ts +0 -0
- package/{component → dist/component}/sidebar/public-api.d.ts +0 -0
- package/{component → dist/component}/sidebar/sidebar/sidebar.component.d.ts +0 -0
- package/{component → dist/component}/sidebar/sidebar-position.enum.d.ts +0 -0
- package/{component → dist/component}/sidebar/sidebar.module.d.ts +0 -0
- package/{component → dist/component}/switch/public-api.d.ts +0 -0
- package/{component → dist/component}/switch/switch/switch.component.d.ts +0 -0
- package/{component → dist/component}/switch/switch-button/switch-button.component.d.ts +0 -0
- package/{component → dist/component}/switch/switch.module.d.ts +0 -0
- package/{component → dist/component}/switch/switch.service.d.ts +0 -0
- package/{component → dist/component}/table/base/cell-component-base.d.ts +0 -0
- package/{component → dist/component}/table/base/detail-component-base.d.ts +0 -0
- package/{component → dist/component}/table/base/group-row-component-base.d.ts +0 -0
- package/{component → dist/component}/table/base/head-cell-component-base.d.ts +0 -0
- package/{component → dist/component}/table/cell/cell.component.d.ts +0 -0
- package/{component → dist/component}/table/cell-host/cell-host.component.d.ts +0 -0
- package/{component → dist/component}/table/contract/cell-components-map.d.ts +0 -0
- package/{component → dist/component}/table/contract/column-reorder-event.d.ts +0 -0
- package/{component → dist/component}/table/contract/column-resize-event.d.ts +0 -0
- package/{component → dist/component}/table/contract/i-cell-coordinates.d.ts +0 -0
- package/{component → dist/component}/table/contract/i-cell-event.d.ts +0 -0
- package/{component → dist/component}/table/contract/i-cell-value.d.ts +0 -0
- package/{component → dist/component}/table/contract/public-api.d.ts +0 -0
- package/{component → dist/component}/table/contract/sort-event.d.ts +0 -0
- package/{component → dist/component}/table/contract/table-column-store.d.ts +0 -0
- package/dist/component/table/contract/table-column.d.ts +142 -0
- package/{component → dist/component}/table/contract/table-context-menu-config.d.ts +0 -0
- package/{component → dist/component}/table/contract/table-row.d.ts +0 -0
- package/{component → dist/component}/table/default/boolean-cell/boolean-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/date-cell/date-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/date-time-cell/date-time-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/default-head-cell/default-head-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/group-row/group-row.component.d.ts +0 -0
- package/{component → dist/component}/table/default/list-cell/list-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/numeric-cell/numeric-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/default/string-cell/string-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/enum/aggregation-type.enum.d.ts +0 -0
- package/{component → dist/component}/table/enum/edit-event.enum.d.ts +0 -0
- package/{component → dist/component}/table/enum/edit-type.enum.d.ts +0 -0
- package/{component → dist/component}/table/enum/public-api.d.ts +0 -0
- package/{component → dist/component}/table/enum/select-type.enum.d.ts +0 -0
- package/{component → dist/component}/table/head-cell/head-cell.component.d.ts +0 -0
- package/dist/component/table/head-cell-dropdown/head-cell-dropdown.component.d.ts +59 -0
- package/{component → dist/component}/table/head-cell-host/head-cell-host.component.d.ts +0 -0
- package/{component → dist/component}/table/public-api.d.ts +0 -0
- package/{component → dist/component}/table/selection-cell/selection-cell.component.d.ts +0 -0
- package/{component → dist/component}/table/selection-head-cell/selection-head-cell.component.d.ts +0 -0
- package/dist/component/table/service/table.service.d.ts +118 -0
- package/dist/component/table/table/table.component.d.ts +98 -0
- package/{component → dist/component}/table/table-body/table-body.component.d.ts +0 -0
- package/{component → dist/component}/table/table-head/table-head.component.d.ts +0 -0
- package/{component → dist/component}/table/table-head-group/table-head-group.component.d.ts +0 -0
- package/{component → dist/component}/table/table.module.d.ts +0 -0
- package/{component → dist/component}/table/util/public-api.d.ts +0 -0
- package/{component → dist/component}/table/util/state-util.d.ts +0 -0
- package/{component → dist/component}/table/util/table-util.d.ts +0 -0
- package/{component → dist/component}/tabs/public-api.d.ts +0 -0
- package/{component → dist/component}/tabs/tab/tab.component.d.ts +0 -0
- package/{component → dist/component}/tabs/tab-content.directive.d.ts +0 -0
- package/{component → dist/component}/tabs/tab-title.directive.d.ts +0 -0
- package/{component → dist/component}/tabs/tabs/tabs.component.d.ts +0 -0
- package/{component → dist/component}/tabs/tabs.module.d.ts +0 -0
- package/{component → dist/component}/theme-switch/public-api.d.ts +0 -0
- package/{component → dist/component}/theme-switch/theme-switch/theme-switch.component.d.ts +0 -0
- package/{component → dist/component}/theme-switch/theme-switch.module.d.ts +0 -0
- package/{component → dist/component}/theme-switch/theme-switch.service.d.ts +0 -0
- package/{component → dist/component}/toggle/public-api.d.ts +0 -0
- package/{component → dist/component}/toggle/toggle/toggle.component.d.ts +0 -0
- package/{component → dist/component}/toggle/toggle.module.d.ts +0 -0
- package/{component → dist/component}/toolbar/public-api.d.ts +0 -0
- package/{component → dist/component}/toolbar/toolbar/toolbar.component.d.ts +0 -0
- package/{component → dist/component}/toolbar/toolbar.module.d.ts +0 -0
- package/{component → dist/component}/tree/public-api.d.ts +0 -0
- package/{component → dist/component}/tree/tree/tree.component.d.ts +0 -0
- package/{component → dist/component}/tree/tree-item/tree-item.component.d.ts +0 -0
- package/{component → dist/component}/tree/tree-item-toggle/tree-item-toggle.component.d.ts +0 -0
- package/{component → dist/component}/tree/tree.module.d.ts +0 -0
- package/{component → dist/component}/tree/tree.service.d.ts +0 -0
- package/{directive → dist/directive}/click-outside/click-outside.directive.d.ts +0 -0
- package/{directive → dist/directive}/click-outside/click-outside.module.d.ts +0 -0
- package/{directive → dist/directive}/click-outside/public-api.d.ts +0 -0
- package/{directive → dist/directive}/context-menu/context-menu.directive.d.ts +0 -0
- package/{directive → dist/directive}/context-menu/context-menu.module.d.ts +0 -0
- package/{directive → dist/directive}/context-menu/public-api.d.ts +0 -0
- package/{directive → dist/directive}/disable-control/disable-control.directive.d.ts +0 -0
- package/{directive → dist/directive}/disable-control/disable-control.module.d.ts +0 -0
- package/{directive → dist/directive}/disable-control/public-api.d.ts +0 -0
- package/{directive → dist/directive}/drag-sort/drag-sort-container.directive.d.ts +0 -0
- package/{directive → dist/directive}/drag-sort/drag-sort-event.d.ts +0 -0
- package/{directive → dist/directive}/drag-sort/drag-sort-item.directive.d.ts +0 -0
- package/{directive → dist/directive}/drag-sort/drag-sort.module.d.ts +0 -0
- package/{directive → dist/directive}/drag-sort/public-api.d.ts +0 -0
- package/{directive → dist/directive}/dynamic-content-base.directive.d.ts +0 -0
- package/{directive → dist/directive}/highlight/highlight.directive.d.ts +0 -0
- package/{directive → dist/directive}/highlight/highlight.module.d.ts +0 -0
- package/{directive → dist/directive}/highlight/public-api.d.ts +0 -0
- package/{directive → dist/directive}/hint/hint.directive.d.ts +0 -0
- package/{directive → dist/directive}/hint/hint.module.d.ts +0 -0
- package/{directive → dist/directive}/hint/public-api.d.ts +0 -0
- package/{directive → dist/directive}/loader/loader.directive.d.ts +0 -0
- package/{directive → dist/directive}/loader/loader.module.d.ts +0 -0
- package/{directive → dist/directive}/loader/public-api.d.ts +0 -0
- package/{directive → dist/directive}/no-autofill/no-autofill.directive.d.ts +0 -0
- package/{directive → dist/directive}/no-autofill/no-autofill.module.d.ts +0 -0
- package/{directive → dist/directive}/no-autofill/public-api.d.ts +0 -0
- package/{directive → dist/directive}/only-number/only-number.directive.d.ts +0 -0
- package/{directive → dist/directive}/only-number/only-number.module.d.ts +0 -0
- package/{directive → dist/directive}/only-number/public-api.d.ts +0 -0
- package/{directive → dist/directive}/public-api.d.ts +0 -0
- package/{directive → dist/directive}/resize-drag/public-api.d.ts +0 -0
- package/{directive → dist/directive}/resize-drag/resize-drag.directive.d.ts +0 -0
- package/{directive → dist/directive}/resize-drag/resize-drag.module.d.ts +0 -0
- package/{directive → dist/directive}/teta-template/public-api.d.ts +0 -0
- package/{directive → dist/directive}/teta-template/teta-template.directive.d.ts +0 -0
- package/{directive → dist/directive}/teta-template/teta-template.module.d.ts +0 -0
- package/{directive → dist/directive}/tooltip/public-api.d.ts +0 -0
- package/{directive → dist/directive}/tooltip/tooltip.directive.d.ts +0 -0
- package/{directive → dist/directive}/tooltip/tooltip.module.d.ts +0 -0
- package/dist/esm2020/common/contract/auto-close-ignore-case.mjs +2 -0
- package/dist/esm2020/common/contract/constructor-type.mjs +2 -0
- package/dist/esm2020/common/contract/dynamic-data.mjs +10 -0
- package/dist/esm2020/common/contract/i-dictionary.mjs +2 -0
- package/dist/esm2020/common/contract/i-id-name.mjs +2 -0
- package/dist/esm2020/common/contract/i-rect.mjs +2 -0
- package/dist/esm2020/common/contract/i-tree-data.mjs +2 -0
- package/dist/esm2020/common/contract/public-api.mjs +9 -0
- package/dist/esm2020/common/contract/teta-content-ref.mjs +8 -0
- package/dist/esm2020/common/enum/align.enum.mjs +10 -0
- package/dist/esm2020/common/enum/public-api.mjs +4 -0
- package/dist/esm2020/common/enum/teta-size.enum.mjs +9 -0
- package/dist/esm2020/common/enum/vertical-align.enum.mjs +8 -0
- package/dist/esm2020/common/public-api.mjs +5 -0
- package/dist/esm2020/common/service/click.service.mjs +23 -0
- package/dist/esm2020/common/service/dynamic-component.service.mjs +93 -0
- package/dist/esm2020/common/service/overlay-container.service.mjs +41 -0
- package/dist/esm2020/common/service/public-api.mjs +4 -0
- package/dist/esm2020/common/util/array-util.mjs +119 -0
- package/dist/esm2020/common/util/dom-util.mjs +16 -0
- package/dist/esm2020/common/util/position-util.mjs +96 -0
- package/dist/esm2020/common/util/public-api.mjs +4 -0
- package/dist/esm2020/component/accordion/accordion/accordion.component.mjs +18 -0
- package/dist/esm2020/component/accordion/accordion-content.directive.mjs +16 -0
- package/dist/esm2020/component/accordion/accordion-head/accordion-head.component.mjs +52 -0
- package/dist/esm2020/component/accordion/accordion-item/accordion-item.component.mjs +43 -0
- package/dist/esm2020/component/accordion/accordion.module.mjs +29 -0
- package/dist/esm2020/component/accordion/public-api.mjs +6 -0
- package/dist/esm2020/component/button/button/button.component.mjs +40 -0
- package/dist/esm2020/component/button/button.module.mjs +24 -0
- package/dist/esm2020/component/button/public-api.mjs +3 -0
- package/dist/esm2020/component/chart/chart/chart.component.mjs +164 -0
- package/dist/esm2020/component/chart/chart.module.mjs +18 -0
- package/dist/esm2020/component/chart/core/axis-creator.mjs +82 -0
- package/dist/esm2020/component/chart/core/chart.mjs +1339 -0
- package/dist/esm2020/component/chart/core/public-api.mjs +3 -0
- package/dist/esm2020/component/chart/drawer/area-drawer.mjs +20 -0
- package/dist/esm2020/component/chart/drawer/bar-drawer.mjs +23 -0
- package/dist/esm2020/component/chart/drawer/contour-drawer.mjs +29 -0
- package/dist/esm2020/component/chart/drawer/default-drawer-mapping.mjs +17 -0
- package/dist/esm2020/component/chart/drawer/line-drawer.mjs +152 -0
- package/dist/esm2020/component/chart/drawer/pie-drawer.mjs +4 -0
- package/dist/esm2020/component/chart/drawer/public-api.mjs +7 -0
- package/dist/esm2020/component/chart/drawer/scatter-drawer.mjs +93 -0
- package/dist/esm2020/component/chart/drawer/spline-drawer.mjs +23 -0
- package/dist/esm2020/component/chart/legend-drawer/default-drawer-legend-mapping.mjs +7 -0
- package/dist/esm2020/component/chart/legend-drawer/gradient-drawer.mjs +45 -0
- package/dist/esm2020/component/chart/legend-drawer/swatch-drawer.mjs +62 -0
- package/dist/esm2020/component/chart/model/annotation.mjs +30 -0
- package/dist/esm2020/component/chart/model/axis-options.mjs +26 -0
- package/dist/esm2020/component/chart/model/chart-bounds.mjs +13 -0
- package/dist/esm2020/component/chart/model/chart-options.mjs +37 -0
- package/dist/esm2020/component/chart/model/enum/axis-type.mjs +6 -0
- package/dist/esm2020/component/chart/model/enum/dispatch-type.mjs +6 -0
- package/dist/esm2020/component/chart/model/enum/drag-point-type.mjs +7 -0
- package/dist/esm2020/component/chart/model/enum/legend-type.mjs +6 -0
- package/dist/esm2020/component/chart/model/enum/public-api.mjs +8 -0
- package/dist/esm2020/component/chart/model/enum/scale-type.mjs +9 -0
- package/dist/esm2020/component/chart/model/enum/scale.mjs +7 -0
- package/dist/esm2020/component/chart/model/enum/series-type.mjs +12 -0
- package/dist/esm2020/component/chart/model/enum/zoom-type.mjs +7 -0
- package/dist/esm2020/component/chart/model/i-drag-event.mjs +2 -0
- package/dist/esm2020/component/chart/model/i-drawer-legend.mjs +2 -0
- package/dist/esm2020/component/chart/model/i-drawer.mjs +2 -0
- package/dist/esm2020/component/chart/model/i-zoom-event.mjs +2 -0
- package/dist/esm2020/component/chart/model/plot-band.mjs +18 -0
- package/dist/esm2020/component/chart/model/plot-line.mjs +13 -0
- package/dist/esm2020/component/chart/model/point/bar-point.mjs +2 -0
- package/dist/esm2020/component/chart/model/point/base-point.mjs +2 -0
- package/dist/esm2020/component/chart/model/point/contour-point.mjs +2 -0
- package/dist/esm2020/component/chart/model/point/marker-options.mjs +2 -0
- package/dist/esm2020/component/chart/model/point/public-api.mjs +4 -0
- package/dist/esm2020/component/chart/model/point/scatter-point.mjs +2 -0
- package/dist/esm2020/component/chart/model/public-api.mjs +16 -0
- package/dist/esm2020/component/chart/model/series.mjs +27 -0
- package/dist/esm2020/component/chart/model/tooltip-options.mjs +19 -0
- package/dist/esm2020/component/chart/public-api.mjs +6 -0
- package/dist/esm2020/component/chart-3d/chart-3d.module.mjs +18 -0
- package/dist/esm2020/component/chart-3d/chart3d/chart3d.component.mjs +232 -0
- package/dist/esm2020/component/chart-3d/model/base-3d-point.mjs +2 -0
- package/dist/esm2020/component/chart-3d/model/chart-3d-options.mjs +7 -0
- package/dist/esm2020/component/chart-3d/model/public-api.mjs +3 -0
- package/dist/esm2020/component/chart-3d/model/series-3d.mjs +7 -0
- package/dist/esm2020/component/chart-3d/public-api.mjs +4 -0
- package/dist/esm2020/component/checkbox/checkbox/checkbox.component.mjs +134 -0
- package/dist/esm2020/component/checkbox/checkbox.module.mjs +28 -0
- package/dist/esm2020/component/checkbox/public-api.mjs +3 -0
- package/dist/esm2020/component/date-picker/date-picker/date-picker.component.mjs +279 -0
- package/dist/esm2020/component/date-picker/date-picker.module.mjs +67 -0
- package/dist/esm2020/component/date-picker/day-select/day-select.component.mjs +166 -0
- package/dist/esm2020/component/date-picker/model/date-period.mjs +7 -0
- package/dist/esm2020/component/date-picker/model/date-picker-mode.enum.mjs +7 -0
- package/dist/esm2020/component/date-picker/model/day-model.mjs +13 -0
- package/dist/esm2020/component/date-picker/model/picker-locale-model.mjs +13 -0
- package/dist/esm2020/component/date-picker/month-picker/month-picker.component.mjs +250 -0
- package/dist/esm2020/component/date-picker/month-select/month-select.component.mjs +147 -0
- package/dist/esm2020/component/date-picker/public-api.mjs +6 -0
- package/dist/esm2020/component/date-picker/service/picker-locale.service.mjs +30 -0
- package/dist/esm2020/component/date-picker/service/picker-touch.service.mjs +34 -0
- package/dist/esm2020/component/date-picker/time-part-control/time-part-control.component.mjs +73 -0
- package/dist/esm2020/component/date-picker/util/date-picker-util.mjs +142 -0
- package/dist/esm2020/component/date-picker/year-select/year-select.component.mjs +189 -0
- package/dist/esm2020/component/delimiter/delimiter/delimiter.component.mjs +63 -0
- package/dist/esm2020/component/delimiter/delimiter.module.mjs +22 -0
- package/dist/esm2020/component/delimiter/public-api.mjs +3 -0
- package/dist/esm2020/component/dropdown/dropdown/dropdown.component.mjs +29 -0
- package/dist/esm2020/component/dropdown/dropdown-base.mjs +204 -0
- package/dist/esm2020/component/dropdown/dropdown-content.directive.mjs +17 -0
- package/dist/esm2020/component/dropdown/dropdown-head.directive.mjs +18 -0
- package/dist/esm2020/component/dropdown/dropdown.directive.mjs +37 -0
- package/dist/esm2020/component/dropdown/dropdown.module.mjs +41 -0
- package/dist/esm2020/component/dropdown/public-api.mjs +6 -0
- package/dist/esm2020/component/dynamic-component/dynamic-component.module.mjs +22 -0
- package/dist/esm2020/component/dynamic-component/popup-content/popup-content.component.mjs +59 -0
- package/dist/esm2020/component/dynamic-component/public-api.mjs +3 -0
- package/dist/esm2020/component/expand-panel/expand-panel/expand-panel.component.mjs +65 -0
- package/dist/esm2020/component/expand-panel/expand-panel-content.directive.mjs +16 -0
- package/dist/esm2020/component/expand-panel/expand-panel-head.directive.mjs +16 -0
- package/dist/esm2020/component/expand-panel/expand-panel.module.mjs +52 -0
- package/dist/esm2020/component/expand-panel/public-api.mjs +5 -0
- package/dist/esm2020/component/file-upload/file-item/file-item.component.mjs +13 -0
- package/dist/esm2020/component/file-upload/file-upload-area/file-upload-area.component.mjs +77 -0
- package/dist/esm2020/component/file-upload/file-upload.module.mjs +21 -0
- package/dist/esm2020/component/file-upload/public-api.mjs +4 -0
- package/dist/esm2020/component/filter/base/filter-base.mjs +9 -0
- package/dist/esm2020/component/filter/base/filter-component-base.mjs +3 -0
- package/dist/esm2020/component/filter/boolean-filter/boolean-filter.component.mjs +53 -0
- package/dist/esm2020/component/filter/contarct/boolean-filter.mjs +10 -0
- package/dist/esm2020/component/filter/contarct/date-filter-value.mjs +9 -0
- package/dist/esm2020/component/filter/contarct/date-filter.mjs +11 -0
- package/dist/esm2020/component/filter/contarct/filter-component-map.mjs +17 -0
- package/dist/esm2020/component/filter/contarct/filter-item.mjs +33 -0
- package/dist/esm2020/component/filter/contarct/filter-state.mjs +145 -0
- package/dist/esm2020/component/filter/contarct/i-filter.mjs +2 -0
- package/dist/esm2020/component/filter/contarct/list-filter.mjs +12 -0
- package/dist/esm2020/component/filter/contarct/numeric-filter-value.mjs +10 -0
- package/dist/esm2020/component/filter/contarct/numeric-filter.mjs +11 -0
- package/dist/esm2020/component/filter/contarct/sort-param.mjs +13 -0
- package/dist/esm2020/component/filter/contarct/string-filter.mjs +12 -0
- package/dist/esm2020/component/filter/date-filter/date-filter.component.mjs +54 -0
- package/dist/esm2020/component/filter/enum/filter-type.enum.mjs +10 -0
- package/dist/esm2020/component/filter/enum/list-filter-type.enum.mjs +6 -0
- package/dist/esm2020/component/filter/enum/string-filter-type.enum.mjs +20 -0
- package/dist/esm2020/component/filter/filter-host/filter-host.component.mjs +73 -0
- package/dist/esm2020/component/filter/filter-panel/filter-panel.component.mjs +13 -0
- package/dist/esm2020/component/filter/filter.module.mjs +80 -0
- package/dist/esm2020/component/filter/list-filter/list-filter.component.mjs +86 -0
- package/dist/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +53 -0
- package/dist/esm2020/component/filter/public-api.mjs +25 -0
- package/dist/esm2020/component/filter/string-filter/string-filter.component.mjs +54 -0
- package/dist/esm2020/component/icon/icon/icon.component.mjs +37 -0
- package/dist/esm2020/component/icon/icon-sprite.directive.mjs +32 -0
- package/dist/esm2020/component/icon/icon.module.mjs +35 -0
- package/dist/esm2020/component/icon/icon.service.mjs +59 -0
- package/dist/esm2020/component/icon/public-api.mjs +5 -0
- package/dist/esm2020/component/input/form-group-title/form-group-title.component.mjs +18 -0
- package/dist/esm2020/component/input/input/input.component.mjs +31 -0
- package/dist/esm2020/component/input/input.module.mjs +23 -0
- package/dist/esm2020/component/input/public-api.mjs +5 -0
- package/dist/esm2020/component/input/text-field/text-field.component.mjs +94 -0
- package/dist/esm2020/component/message/message/message.component.mjs +74 -0
- package/dist/esm2020/component/message/message-host/message-host.component.mjs +88 -0
- package/dist/esm2020/component/message/message.module.mjs +31 -0
- package/dist/esm2020/component/message/message.service.mjs +35 -0
- package/dist/esm2020/component/message/model/message.mjs +21 -0
- package/dist/esm2020/component/message/public-api.mjs +6 -0
- package/dist/esm2020/component/modal/dialog/dialog.component.mjs +44 -0
- package/dist/esm2020/component/modal/dialog.service.mjs +39 -0
- package/dist/esm2020/component/modal/modal-container/modal-container.component.mjs +84 -0
- package/dist/esm2020/component/modal/modal.module.mjs +52 -0
- package/dist/esm2020/component/modal/modal.service.mjs +121 -0
- package/dist/esm2020/component/modal/model/current-modal.mjs +3 -0
- package/dist/esm2020/component/modal/model/i-modal-config.mjs +2 -0
- package/dist/esm2020/component/modal/model/i-modal-result.mjs +2 -0
- package/dist/esm2020/component/modal/model/modal-close-reason.enum.mjs +8 -0
- package/dist/esm2020/component/modal/model/modal-instance.mjs +32 -0
- package/dist/esm2020/component/modal/public-api.mjs +11 -0
- package/dist/esm2020/component/pager/model/pager-state.mjs +50 -0
- package/dist/esm2020/component/pager/pager/pager.component.mjs +13 -0
- package/dist/esm2020/component/pager/pager.module.mjs +26 -0
- package/dist/esm2020/component/pager/public-api.mjs +5 -0
- package/dist/esm2020/component/pager/util/pager-util.mjs +6 -0
- package/dist/esm2020/component/panel/panel/panel.component.mjs +51 -0
- package/dist/esm2020/component/panel/panel.module.mjs +22 -0
- package/dist/esm2020/component/panel/public-api.mjs +3 -0
- package/dist/esm2020/component/progress-bar/progress-bar/progress-bar.component.mjs +131 -0
- package/dist/esm2020/component/progress-bar/progress-bar.module.mjs +22 -0
- package/dist/esm2020/component/progress-bar/public-api.mjs +3 -0
- package/dist/esm2020/component/property-grid/default/date-item-default/date-item-default.component.mjs +13 -0
- package/dist/esm2020/component/property-grid/default/list-item-default/list-item-default.component.mjs +13 -0
- package/dist/esm2020/component/property-grid/default/numeric-item-default/numeric-item-default.component.mjs +13 -0
- package/dist/esm2020/component/property-grid/default/string-item-default/string-item-default.component.mjs +13 -0
- package/dist/esm2020/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +34 -0
- package/dist/esm2020/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +103 -0
- package/dist/esm2020/component/property-grid/property-grid/property-grid.component.mjs +59 -0
- package/dist/esm2020/component/property-grid/property-grid.module.mjs +94 -0
- package/dist/esm2020/component/property-grid/public-api.mjs +3 -0
- package/dist/esm2020/component/public-api.mjs +61 -0
- package/dist/esm2020/component/radio/public-api.mjs +4 -0
- package/dist/esm2020/component/radio/radio/radio.component.mjs +245 -0
- package/dist/esm2020/component/radio/radio-button/radio-button.component.mjs +63 -0
- package/dist/esm2020/component/radio/radio.module.mjs +20 -0
- package/dist/esm2020/component/resize-panel/public-api.mjs +3 -0
- package/dist/esm2020/component/resize-panel/resize-panel/resize-panel.component.mjs +162 -0
- package/dist/esm2020/component/resize-panel/resize-panel.module.mjs +20 -0
- package/dist/esm2020/component/select/public-api.mjs +5 -0
- package/dist/esm2020/component/select/select/select.component.mjs +234 -0
- package/dist/esm2020/component/select/select-option.directive.mjs +16 -0
- package/dist/esm2020/component/select/select-value.directive.mjs +16 -0
- package/dist/esm2020/component/select/select.module.mjs +48 -0
- package/dist/esm2020/component/sidebar/public-api.mjs +4 -0
- package/dist/esm2020/component/sidebar/sidebar/sidebar.component.mjs +54 -0
- package/dist/esm2020/component/sidebar/sidebar-position.enum.mjs +8 -0
- package/dist/esm2020/component/sidebar/sidebar.module.mjs +30 -0
- package/dist/esm2020/component/switch/public-api.mjs +4 -0
- package/dist/esm2020/component/switch/switch/switch.component.mjs +52 -0
- package/dist/esm2020/component/switch/switch-button/switch-button.component.mjs +47 -0
- package/dist/esm2020/component/switch/switch.module.mjs +23 -0
- package/dist/esm2020/component/switch/switch.service.mjs +21 -0
- package/dist/esm2020/component/table/base/cell-component-base.mjs +103 -0
- package/dist/esm2020/component/table/base/detail-component-base.mjs +3 -0
- package/dist/esm2020/component/table/base/group-row-component-base.mjs +3 -0
- package/dist/esm2020/component/table/base/head-cell-component-base.mjs +17 -0
- package/dist/esm2020/component/table/cell/cell.component.mjs +33 -0
- package/dist/esm2020/component/table/cell-host/cell-host.component.mjs +50 -0
- package/dist/esm2020/component/table/contract/cell-components-map.mjs +17 -0
- package/dist/esm2020/component/table/contract/column-reorder-event.mjs +7 -0
- package/dist/esm2020/component/table/contract/column-resize-event.mjs +7 -0
- package/dist/esm2020/component/table/contract/i-cell-coordinates.mjs +2 -0
- package/dist/esm2020/component/table/contract/i-cell-event.mjs +2 -0
- package/dist/esm2020/component/table/contract/i-cell-value.mjs +2 -0
- package/dist/esm2020/component/table/contract/public-api.mjs +12 -0
- package/dist/esm2020/component/table/contract/sort-event.mjs +7 -0
- package/dist/esm2020/component/table/contract/table-column-store.mjs +12 -0
- package/dist/esm2020/component/table/contract/table-column.mjs +43 -0
- package/dist/esm2020/component/table/contract/table-context-menu-config.mjs +17 -0
- package/dist/esm2020/component/table/contract/table-row.mjs +40 -0
- package/dist/esm2020/component/table/default/boolean-cell/boolean-cell.component.mjs +45 -0
- package/dist/esm2020/component/table/default/date-cell/date-cell.component.mjs +47 -0
- package/dist/esm2020/component/table/default/date-time-cell/date-time-cell.component.mjs +46 -0
- package/dist/esm2020/component/table/default/default-head-cell/default-head-cell.component.mjs +28 -0
- package/dist/esm2020/component/table/default/group-row/group-row.component.mjs +20 -0
- package/dist/esm2020/component/table/default/list-cell/list-cell.component.mjs +66 -0
- package/dist/esm2020/component/table/default/numeric-cell/numeric-cell.component.mjs +46 -0
- package/dist/esm2020/component/table/default/string-cell/string-cell.component.mjs +44 -0
- package/dist/esm2020/component/table/enum/aggregation-type.enum.mjs +9 -0
- package/dist/esm2020/component/table/enum/edit-event.enum.mjs +7 -0
- package/dist/esm2020/component/table/enum/edit-type.enum.mjs +6 -0
- package/dist/esm2020/component/table/enum/public-api.mjs +5 -0
- package/dist/esm2020/component/table/enum/select-type.enum.mjs +7 -0
- package/dist/esm2020/component/table/head-cell/head-cell.component.mjs +136 -0
- package/dist/esm2020/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +198 -0
- package/dist/esm2020/component/table/head-cell-host/head-cell-host.component.mjs +36 -0
- package/dist/esm2020/component/table/public-api.mjs +43 -0
- package/dist/esm2020/component/table/selection-cell/selection-cell.component.mjs +46 -0
- package/dist/esm2020/component/table/selection-head-cell/selection-head-cell.component.mjs +45 -0
- package/dist/esm2020/component/table/service/table.service.mjs +434 -0
- package/dist/esm2020/component/table/table/table.component.mjs +422 -0
- package/dist/esm2020/component/table/table-body/table-body.component.mjs +240 -0
- package/dist/esm2020/component/table/table-head/table-head.component.mjs +98 -0
- package/dist/esm2020/component/table/table-head-group/table-head-group.component.mjs +59 -0
- package/dist/esm2020/component/table/table.module.mjs +176 -0
- package/dist/esm2020/component/table/util/public-api.mjs +3 -0
- package/dist/esm2020/component/table/util/state-util.mjs +139 -0
- package/dist/esm2020/component/table/util/table-util.mjs +131 -0
- package/dist/esm2020/component/tabs/public-api.mjs +12 -0
- package/dist/esm2020/component/tabs/tab/tab.component.mjs +42 -0
- package/dist/esm2020/component/tabs/tab-content.directive.mjs +16 -0
- package/dist/esm2020/component/tabs/tab-title.directive.mjs +16 -0
- package/dist/esm2020/component/tabs/tabs/tabs.component.mjs +70 -0
- package/dist/esm2020/component/tabs/tabs.module.mjs +41 -0
- package/dist/esm2020/component/theme-switch/public-api.mjs +4 -0
- package/dist/esm2020/component/theme-switch/theme-switch/theme-switch.component.mjs +28 -0
- package/dist/esm2020/component/theme-switch/theme-switch.module.mjs +30 -0
- package/dist/esm2020/component/theme-switch/theme-switch.service.mjs +34 -0
- package/dist/esm2020/component/toggle/public-api.mjs +3 -0
- package/dist/esm2020/component/toggle/toggle/toggle.component.mjs +79 -0
- package/dist/esm2020/component/toggle/toggle.module.mjs +19 -0
- package/dist/esm2020/component/toolbar/public-api.mjs +6 -0
- package/dist/esm2020/component/toolbar/toolbar/toolbar.component.mjs +26 -0
- package/dist/esm2020/component/toolbar/toolbar.module.mjs +22 -0
- package/dist/esm2020/component/tree/public-api.mjs +5 -0
- package/dist/esm2020/component/tree/tree/tree.component.mjs +76 -0
- package/dist/esm2020/component/tree/tree-item/tree-item.component.mjs +80 -0
- package/dist/esm2020/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +28 -0
- package/dist/esm2020/component/tree/tree.module.mjs +22 -0
- package/dist/esm2020/component/tree/tree.service.mjs +35 -0
- package/dist/esm2020/directive/click-outside/click-outside.directive.mjs +60 -0
- package/dist/esm2020/directive/click-outside/click-outside.module.mjs +22 -0
- package/dist/esm2020/directive/click-outside/public-api.mjs +3 -0
- package/dist/esm2020/directive/context-menu/context-menu.directive.mjs +94 -0
- package/dist/esm2020/directive/context-menu/context-menu.module.mjs +26 -0
- package/dist/esm2020/directive/context-menu/public-api.mjs +3 -0
- package/dist/esm2020/directive/disable-control/disable-control.directive.mjs +29 -0
- package/dist/esm2020/directive/disable-control/disable-control.module.mjs +24 -0
- package/dist/esm2020/directive/disable-control/public-api.mjs +3 -0
- package/dist/esm2020/directive/drag-sort/drag-sort-container.directive.mjs +64 -0
- package/dist/esm2020/directive/drag-sort/drag-sort-event.mjs +2 -0
- package/dist/esm2020/directive/drag-sort/drag-sort-item.directive.mjs +115 -0
- package/dist/esm2020/directive/drag-sort/drag-sort.module.mjs +19 -0
- package/dist/esm2020/directive/drag-sort/public-api.mjs +5 -0
- package/dist/esm2020/directive/dynamic-content-base.directive.mjs +81 -0
- package/dist/esm2020/directive/highlight/highlight.directive.mjs +72 -0
- package/dist/esm2020/directive/highlight/highlight.module.mjs +22 -0
- package/dist/esm2020/directive/highlight/public-api.mjs +3 -0
- package/dist/esm2020/directive/hint/hint.directive.mjs +97 -0
- package/dist/esm2020/directive/hint/hint.module.mjs +26 -0
- package/dist/esm2020/directive/hint/public-api.mjs +3 -0
- package/dist/esm2020/directive/loader/loader.directive.mjs +63 -0
- package/dist/esm2020/directive/loader/loader.module.mjs +22 -0
- package/dist/esm2020/directive/loader/public-api.mjs +3 -0
- package/dist/esm2020/directive/no-autofill/no-autofill.directive.mjs +30 -0
- package/dist/esm2020/directive/no-autofill/no-autofill.module.mjs +18 -0
- package/dist/esm2020/directive/no-autofill/public-api.mjs +3 -0
- package/dist/esm2020/directive/only-number/only-number.directive.mjs +175 -0
- package/dist/esm2020/directive/only-number/only-number.module.mjs +18 -0
- package/dist/esm2020/directive/only-number/public-api.mjs +3 -0
- package/dist/esm2020/directive/public-api.mjs +15 -0
- package/dist/esm2020/directive/resize-drag/public-api.mjs +3 -0
- package/dist/esm2020/directive/resize-drag/resize-drag.directive.mjs +71 -0
- package/dist/esm2020/directive/resize-drag/resize-drag.module.mjs +18 -0
- package/dist/esm2020/directive/teta-template/public-api.mjs +3 -0
- package/dist/esm2020/directive/teta-template/teta-template.directive.mjs +22 -0
- package/dist/esm2020/directive/teta-template/teta-template.module.mjs +26 -0
- package/dist/esm2020/directive/tooltip/public-api.mjs +3 -0
- package/dist/esm2020/directive/tooltip/tooltip.directive.mjs +76 -0
- package/dist/esm2020/directive/tooltip/tooltip.module.mjs +20 -0
- package/dist/esm2020/pipe/number-pipe/number-pipe.module.mjs +24 -0
- package/dist/esm2020/pipe/number-pipe/number.pipe.mjs +24 -0
- package/dist/esm2020/pipe/number-pipe/public-api.mjs +3 -0
- package/dist/esm2020/pipe/prepend-zero/prepend-zero.module.mjs +18 -0
- package/dist/esm2020/pipe/prepend-zero/prepend-zero.pipe.mjs +21 -0
- package/dist/esm2020/pipe/public-api.mjs +2 -0
- package/dist/esm2020/pipe/util/number-helper.mjs +25 -0
- package/dist/esm2020/public-api.mjs +21 -0
- package/dist/esm2020/tetacom-ng-components.mjs +5 -0
- package/dist/esm2020/util/date-util.mjs +195 -0
- package/dist/esm2020/util/forms-util.mjs +61 -0
- package/dist/esm2020/util/public-api.mjs +4 -0
- package/dist/esm2020/util/string-util.mjs +7 -0
- package/dist/fesm2015/tetacom-ng-components.mjs +13342 -0
- package/dist/fesm2015/tetacom-ng-components.mjs.map +1 -0
- package/dist/fesm2020/tetacom-ng-components.mjs +13234 -0
- package/dist/fesm2020/tetacom-ng-components.mjs.map +1 -0
- package/dist/package.json +35 -0
- package/{pipe → dist/pipe}/number-pipe/number-pipe.module.d.ts +0 -0
- package/{pipe → dist/pipe}/number-pipe/number.pipe.d.ts +0 -0
- package/{pipe → dist/pipe}/number-pipe/public-api.d.ts +0 -0
- package/{pipe → dist/pipe}/prepend-zero/prepend-zero.module.d.ts +0 -0
- package/{pipe → dist/pipe}/prepend-zero/prepend-zero.pipe.d.ts +0 -0
- package/{pipe → dist/pipe}/public-api.d.ts +0 -0
- package/{pipe → dist/pipe}/util/number-helper.d.ts +0 -0
- package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
- package/dist/style/accordion.scss +47 -0
- package/dist/style/assembly-library.scss +36 -0
- package/dist/style/assembly-presets.scss +5 -0
- package/dist/style/assembly.scss +4 -0
- package/dist/style/border.scss +24 -0
- package/dist/style/button.scss +43 -0
- package/dist/style/checkbox.scss +31 -0
- package/dist/style/chips.scss +23 -0
- package/dist/style/color.scss +42 -0
- package/dist/style/common.scss +1 -0
- package/dist/style/datepicker.scss +106 -0
- package/dist/style/drag.scss +40 -0
- package/dist/style/dropdown.scss +30 -0
- package/dist/style/font.scss +7 -0
- package/dist/style/hint.scss +13 -0
- package/dist/style/icon.scss +12 -0
- package/dist/style/input.scss +162 -0
- package/dist/style/layout.scss +109 -0
- package/dist/style/library.scss +208 -0
- package/dist/style/list.scss +70 -0
- package/dist/style/loader.scss +40 -0
- package/dist/style/message.scss +51 -0
- package/dist/style/modal.scss +29 -0
- package/dist/style/navigation.scss +26 -0
- package/dist/style/presets/color-presets.scss +151 -0
- package/dist/style/presets/font-presets.scss +132 -0
- package/dist/style/presets/layout-presets.scss +1 -0
- package/dist/style/presets/shadow-presets.scss +16 -0
- package/dist/style/presets/spacing-presets.scss +2 -0
- package/dist/style/progress.scss +28 -0
- package/dist/style/radio.scss +56 -0
- package/dist/style/reset.scss +35 -0
- package/dist/style/resize-panel.scss +58 -0
- package/dist/style/scroll.scss +60 -0
- package/dist/style/select.scss +108 -0
- package/dist/style/shadow.scss +23 -0
- package/dist/style/sidebar.scss +40 -0
- package/dist/style/sizing.scss +12 -0
- package/dist/style/spacing.scss +45 -0
- package/dist/style/switch.scss +36 -0
- package/dist/style/table.scss +226 -0
- package/dist/style/tabs.scss +64 -0
- package/dist/style/toggle.scss +70 -0
- package/dist/style/toolbar.scss +23 -0
- package/dist/style/tooltip.scss +60 -0
- package/dist/style/tree.scss +60 -0
- package/dist/style/util/button-util.scss +58 -0
- package/dist/style/util/color-util.scss +3 -0
- package/dist/style/util/font-util.scss +11 -0
- package/dist/style/util/scroll-util.scss +4 -0
- package/dist/style/util/shadow-util.scss +3 -0
- package/{tetacom-ng-components.d.ts → dist/tetacom-ng-components.d.ts} +0 -0
- package/{util → dist/util}/date-util.d.ts +0 -0
- package/{util → dist/util}/forms-util.d.ts +0 -0
- package/{util → dist/util}/public-api.d.ts +0 -0
- package/{util → dist/util}/string-util.d.ts +0 -0
- package/karma.conf.js +44 -0
- package/ng-package.json +11 -0
- package/package.json +2 -22
- package/src/Introduction.stories.mdx +178 -0
- package/src/common/contract/auto-close-ignore-case.ts +1 -0
- package/src/common/contract/constructor-type.ts +1 -0
- package/src/common/contract/dynamic-data.ts +11 -0
- package/src/common/contract/i-dictionary.ts +3 -0
- package/src/common/contract/i-id-name.ts +6 -0
- package/src/common/contract/i-rect.ts +8 -0
- package/src/common/contract/i-tree-data.ts +4 -0
- package/src/common/contract/public-api.ts +8 -0
- package/src/common/contract/teta-content-ref.ts +6 -0
- package/src/common/enum/align.enum.ts +8 -0
- package/src/common/enum/public-api.ts +3 -0
- package/src/common/enum/teta-size.enum.ts +7 -0
- package/src/common/enum/vertical-align.enum.ts +6 -0
- package/src/common/public-api.ts +4 -0
- package/src/common/service/click.service.spec.ts +16 -0
- package/src/common/service/click.service.ts +16 -0
- package/src/common/service/dynamic-component.service.spec.ts +16 -0
- package/src/common/service/dynamic-component.service.ts +134 -0
- package/src/common/service/overlay-container.service.spec.ts +16 -0
- package/src/common/service/overlay-container.service.ts +37 -0
- package/src/common/service/public-api.ts +3 -0
- package/src/common/util/array-util.ts +140 -0
- package/src/common/util/dom-util.ts +16 -0
- package/src/common/util/position-util.ts +112 -0
- package/src/common/util/public-api.ts +3 -0
- package/src/component/accordion/Accordion.stories.ts +49 -0
- package/src/component/accordion/accordion/accordion.component.html +1 -0
- package/src/component/accordion/accordion/accordion.component.scss +0 -0
- package/src/component/accordion/accordion/accordion.component.spec.ts +25 -0
- package/src/component/accordion/accordion/accordion.component.ts +20 -0
- package/src/component/accordion/accordion-content.directive.spec.ts +8 -0
- package/src/component/accordion/accordion-content.directive.ts +9 -0
- package/src/component/accordion/accordion-head/accordion-head.component.html +6 -0
- package/src/component/accordion/accordion-head/accordion-head.component.scss +0 -0
- package/src/component/accordion/accordion-head/accordion-head.component.spec.ts +25 -0
- package/src/component/accordion/accordion-head/accordion-head.component.ts +54 -0
- package/src/component/accordion/accordion-item/accordion-item.component.html +4 -0
- package/src/component/accordion/accordion-item/accordion-item.component.scss +0 -0
- package/src/component/accordion/accordion-item/accordion-item.component.spec.ts +25 -0
- package/src/component/accordion/accordion-item/accordion-item.component.ts +48 -0
- package/src/component/accordion/accordion.module.ts +18 -0
- package/src/component/accordion/public-api.ts +5 -0
- package/src/component/button/Button.stories.ts +61 -0
- package/src/component/button/button/button.component.html +1 -0
- package/src/component/button/button/button.component.scss +0 -0
- package/src/component/button/button/button.component.spec.ts +25 -0
- package/src/component/button/button/button.component.ts +42 -0
- package/src/component/button/button.module.ts +16 -0
- package/src/component/button/public-api.ts +2 -0
- package/src/component/chart/Chart.stories.ts +97 -0
- package/src/component/chart/chart/chart.component.html +9 -0
- package/src/component/chart/chart/chart.component.scss +70 -0
- package/src/component/chart/chart/chart.component.spec.ts +25 -0
- package/src/component/chart/chart/chart.component.ts +241 -0
- package/src/component/chart/chart-data.ts +653 -0
- package/src/component/chart/chart.module.ts +10 -0
- package/src/component/chart/color-list.ts +22 -0
- package/src/component/chart/core/axis-creator.ts +130 -0
- package/src/component/chart/core/chart.ts +1831 -0
- package/src/component/chart/core/public-api.ts +2 -0
- package/src/component/chart/drawer/area-drawer.ts +30 -0
- package/src/component/chart/drawer/bar-drawer.ts +36 -0
- package/src/component/chart/drawer/contour-drawer.ts +47 -0
- package/src/component/chart/drawer/default-drawer-mapping.ts +19 -0
- package/src/component/chart/drawer/line-drawer.ts +203 -0
- package/src/component/chart/drawer/pie-drawer.ts +13 -0
- package/src/component/chart/drawer/public-api.ts +6 -0
- package/src/component/chart/drawer/scatter-drawer.ts +138 -0
- package/src/component/chart/drawer/spline-drawer.ts +33 -0
- package/src/component/chart/legend-drawer/default-drawer-legend-mapping.ts +8 -0
- package/src/component/chart/legend-drawer/gradient-drawer.ts +65 -0
- package/src/component/chart/legend-drawer/swatch-drawer.ts +81 -0
- package/src/component/chart/model/annotation.ts +96 -0
- package/src/component/chart/model/axis-options.ts +65 -0
- package/src/component/chart/model/chart-bounds.ts +18 -0
- package/src/component/chart/model/chart-options.ts +79 -0
- package/src/component/chart/model/enum/axis-type.ts +4 -0
- package/src/component/chart/model/enum/dispatch-type.ts +4 -0
- package/src/component/chart/model/enum/drag-point-type.ts +5 -0
- package/src/component/chart/model/enum/legend-type.ts +4 -0
- package/src/component/chart/model/enum/public-api.ts +7 -0
- package/src/component/chart/model/enum/scale-type.ts +7 -0
- package/src/component/chart/model/enum/scale.ts +5 -0
- package/src/component/chart/model/enum/series-type.ts +10 -0
- package/src/component/chart/model/enum/zoom-type.ts +5 -0
- package/src/component/chart/model/i-drag-event.ts +5 -0
- package/src/component/chart/model/i-drawer-legend.ts +14 -0
- package/src/component/chart/model/i-drawer.ts +19 -0
- package/src/component/chart/model/i-zoom-event.ts +9 -0
- package/src/component/chart/model/plot-band.ts +43 -0
- package/src/component/chart/model/plot-line.ts +30 -0
- package/src/component/chart/model/point/bar-point.ts +7 -0
- package/src/component/chart/model/point/base-point.ts +10 -0
- package/src/component/chart/model/point/contour-point.ts +5 -0
- package/src/component/chart/model/point/marker-options.ts +12 -0
- package/src/component/chart/model/point/public-api.ts +3 -0
- package/src/component/chart/model/point/scatter-point.ts +6 -0
- package/src/component/chart/model/public-api.ts +16 -0
- package/src/component/chart/model/series.ts +85 -0
- package/src/component/chart/model/tooltip-options.ts +35 -0
- package/src/component/chart/public-api.ts +6 -0
- package/src/component/chart-3d/chart-3d.module.ts +10 -0
- package/src/component/chart-3d/chart3d/chart3d.component.html +1 -0
- package/src/component/chart-3d/chart3d/chart3d.component.scss +5 -0
- package/src/component/chart-3d/chart3d/chart3d.component.spec.ts +25 -0
- package/src/component/chart-3d/chart3d/chart3d.component.ts +336 -0
- package/src/component/chart-3d/model/base-3d-point.ts +5 -0
- package/src/component/chart-3d/model/chart-3d-options.ts +15 -0
- package/src/component/chart-3d/model/public-api.ts +2 -0
- package/src/component/chart-3d/model/series-3d.ts +11 -0
- package/src/component/chart-3d/public-api.ts +3 -0
- package/src/component/checkbox/Checkbox.mdx +18 -0
- package/src/component/checkbox/Checkbox.stories.ts +92 -0
- package/src/component/checkbox/checkbox/checkbox.component.html +6 -0
- package/src/component/checkbox/checkbox/checkbox.component.scss +0 -0
- package/src/component/checkbox/checkbox/checkbox.component.spec.ts +25 -0
- package/src/component/checkbox/checkbox/checkbox.component.ts +149 -0
- package/src/component/checkbox/checkbox.module.ts +17 -0
- package/src/component/checkbox/public-api.ts +2 -0
- package/src/component/date-picker/DatePicker.stories.ts +51 -0
- package/src/component/date-picker/MonthPicker.stories.ts +32 -0
- package/src/component/date-picker/date-picker/date-picker.component.html +91 -0
- package/src/component/date-picker/date-picker/date-picker.component.scss +0 -0
- package/src/component/date-picker/date-picker/date-picker.component.spec.ts +25 -0
- package/src/component/date-picker/date-picker/date-picker.component.ts +305 -0
- package/src/component/date-picker/date-picker.module.ts +38 -0
- package/src/component/date-picker/day-select/day-select.component.html +23 -0
- package/src/component/date-picker/day-select/day-select.component.scss +0 -0
- package/src/component/date-picker/day-select/day-select.component.spec.ts +25 -0
- package/src/component/date-picker/day-select/day-select.component.ts +216 -0
- package/src/component/date-picker/model/date-period.ts +9 -0
- package/src/component/date-picker/model/date-picker-mode.enum.ts +5 -0
- package/src/component/date-picker/model/day-model.ts +26 -0
- package/src/component/date-picker/model/picker-locale-model.ts +26 -0
- package/src/component/date-picker/month-picker/month-picker.component.html +64 -0
- package/src/component/date-picker/month-picker/month-picker.component.scss +0 -0
- package/src/component/date-picker/month-picker/month-picker.component.spec.ts +25 -0
- package/src/component/date-picker/month-picker/month-picker.component.ts +278 -0
- package/src/component/date-picker/month-select/month-select.component.html +15 -0
- package/src/component/date-picker/month-select/month-select.component.scss +3 -0
- package/src/component/date-picker/month-select/month-select.component.spec.ts +25 -0
- package/src/component/date-picker/month-select/month-select.component.ts +193 -0
- package/src/component/date-picker/public-api.ts +5 -0
- package/src/component/date-picker/service/picker-locale.service.spec.ts +14 -0
- package/src/component/date-picker/service/picker-locale.service.ts +27 -0
- package/src/component/date-picker/service/picker-touch.service.spec.ts +16 -0
- package/src/component/date-picker/service/picker-touch.service.ts +38 -0
- package/src/component/date-picker/time-part-control/time-part-control.component.html +9 -0
- package/src/component/date-picker/time-part-control/time-part-control.component.scss +4 -0
- package/src/component/date-picker/time-part-control/time-part-control.component.spec.ts +25 -0
- package/src/component/date-picker/time-part-control/time-part-control.component.ts +86 -0
- package/src/component/date-picker/util/date-picker-util.spec.ts +7 -0
- package/src/component/date-picker/util/date-picker-util.ts +227 -0
- package/src/component/date-picker/year-select/year-select.component.html +11 -0
- package/src/component/date-picker/year-select/year-select.component.scss +3 -0
- package/src/component/date-picker/year-select/year-select.component.spec.ts +25 -0
- package/src/component/date-picker/year-select/year-select.component.ts +229 -0
- package/src/component/delimiter/Delimiter.stories.ts +54 -0
- package/src/component/delimiter/delimiter/delimiter.component.html +0 -0
- package/src/component/delimiter/delimiter/delimiter.component.scss +3 -0
- package/src/component/delimiter/delimiter/delimiter.component.spec.ts +25 -0
- package/src/component/delimiter/delimiter/delimiter.component.ts +56 -0
- package/src/component/delimiter/delimiter.module.ts +13 -0
- package/src/component/delimiter/public-api.ts +2 -0
- package/src/component/dropdown/Dropdown.stories.ts +167 -0
- package/src/component/dropdown/dropdown/dropdown.component.html +1 -0
- package/src/component/dropdown/dropdown/dropdown.component.scss +0 -0
- package/src/component/dropdown/dropdown/dropdown.component.spec.ts +25 -0
- package/src/component/dropdown/dropdown/dropdown.component.ts +41 -0
- package/src/component/dropdown/dropdown-base.spec.ts +7 -0
- package/src/component/dropdown/dropdown-base.ts +225 -0
- package/src/component/dropdown/dropdown-content.directive.spec.ts +8 -0
- package/src/component/dropdown/dropdown-content.directive.ts +12 -0
- package/src/component/dropdown/dropdown-head.directive.spec.ts +8 -0
- package/src/component/dropdown/dropdown-head.directive.ts +9 -0
- package/src/component/dropdown/dropdown.directive.spec.ts +8 -0
- package/src/component/dropdown/dropdown.directive.ts +39 -0
- package/src/component/dropdown/dropdown.module.ts +26 -0
- package/src/component/dropdown/public-api.ts +5 -0
- package/src/component/dynamic-component/dynamic-component.module.ts +13 -0
- package/src/component/dynamic-component/popup-content/popup-content.component.html +1 -0
- package/src/component/dynamic-component/popup-content/popup-content.component.scss +0 -0
- package/src/component/dynamic-component/popup-content/popup-content.component.spec.ts +25 -0
- package/src/component/dynamic-component/popup-content/popup-content.component.ts +56 -0
- package/src/component/dynamic-component/public-api.ts +2 -0
- package/src/component/expand-panel/ExpandPanel.stories.ts +22 -0
- package/src/component/expand-panel/expand-panel/expand-panel.component.html +36 -0
- package/src/component/expand-panel/expand-panel/expand-panel.component.scss +9 -0
- package/src/component/expand-panel/expand-panel/expand-panel.component.spec.ts +25 -0
- package/src/component/expand-panel/expand-panel/expand-panel.component.ts +65 -0
- package/src/component/expand-panel/expand-panel-content.directive.spec.ts +8 -0
- package/src/component/expand-panel/expand-panel-content.directive.ts +8 -0
- package/src/component/expand-panel/expand-panel-head.directive.spec.ts +8 -0
- package/src/component/expand-panel/expand-panel-head.directive.ts +8 -0
- package/src/component/expand-panel/expand-panel.module.ts +30 -0
- package/src/component/expand-panel/public-api.ts +4 -0
- package/src/component/file-upload/File.stories.ts +36 -0
- package/src/component/file-upload/file-item/file-item.component.html +1 -0
- package/src/component/file-upload/file-item/file-item.component.scss +0 -0
- package/src/component/file-upload/file-item/file-item.component.spec.ts +25 -0
- package/src/component/file-upload/file-item/file-item.component.ts +12 -0
- package/src/component/file-upload/file-upload-area/file-upload-area.component.html +16 -0
- package/src/component/file-upload/file-upload-area/file-upload-area.component.scss +3 -0
- package/src/component/file-upload/file-upload-area/file-upload-area.component.spec.ts +25 -0
- package/src/component/file-upload/file-upload-area/file-upload-area.component.ts +75 -0
- package/src/component/file-upload/file-upload.module.ts +13 -0
- package/src/component/file-upload/public-api.ts +3 -0
- package/src/component/filter/base/filter-base.spec.ts +7 -0
- package/src/component/filter/base/filter-base.ts +17 -0
- package/src/component/filter/base/filter-component-base.spec.ts +7 -0
- package/src/component/filter/base/filter-component-base.ts +13 -0
- package/src/component/filter/boolean-filter/boolean-filter.component.html +7 -0
- package/src/component/filter/boolean-filter/boolean-filter.component.scss +0 -0
- package/src/component/filter/boolean-filter/boolean-filter.component.spec.ts +25 -0
- package/src/component/filter/boolean-filter/boolean-filter.component.ts +71 -0
- package/src/component/filter/contarct/boolean-filter.ts +12 -0
- package/src/component/filter/contarct/date-filter-value.ts +20 -0
- package/src/component/filter/contarct/date-filter.ts +17 -0
- package/src/component/filter/contarct/filter-component-map.ts +24 -0
- package/src/component/filter/contarct/filter-item.ts +95 -0
- package/src/component/filter/contarct/filter-state.ts +172 -0
- package/src/component/filter/contarct/i-filter.ts +5 -0
- package/src/component/filter/contarct/list-filter.ts +20 -0
- package/src/component/filter/contarct/numeric-filter-value.ts +26 -0
- package/src/component/filter/contarct/numeric-filter.ts +20 -0
- package/src/component/filter/contarct/sort-param.ts +29 -0
- package/src/component/filter/contarct/string-filter.ts +21 -0
- package/src/component/filter/date-filter/date-filter.component.html +14 -0
- package/src/component/filter/date-filter/date-filter.component.scss +0 -0
- package/src/component/filter/date-filter/date-filter.component.spec.ts +25 -0
- package/src/component/filter/date-filter/date-filter.component.ts +68 -0
- package/src/component/filter/enum/filter-type.enum.ts +8 -0
- package/src/component/filter/enum/list-filter-type.enum.ts +4 -0
- package/src/component/filter/enum/string-filter-type.enum.ts +18 -0
- package/src/component/filter/filter-host/filter-host.component.html +1 -0
- package/src/component/filter/filter-host/filter-host.component.scss +0 -0
- package/src/component/filter/filter-host/filter-host.component.spec.ts +25 -0
- package/src/component/filter/filter-host/filter-host.component.ts +90 -0
- package/src/component/filter/filter-panel/filter-panel.component.html +1 -0
- package/src/component/filter/filter-panel/filter-panel.component.scss +0 -0
- package/src/component/filter/filter-panel/filter-panel.component.spec.ts +25 -0
- package/src/component/filter/filter-panel/filter-panel.component.ts +13 -0
- package/src/component/filter/filter.module.ts +46 -0
- package/src/component/filter/list-filter/list-filter.component.html +21 -0
- package/src/component/filter/list-filter/list-filter.component.scss +7 -0
- package/src/component/filter/list-filter/list-filter.component.spec.ts +25 -0
- package/src/component/filter/list-filter/list-filter.component.ts +109 -0
- package/src/component/filter/numeric-filter/numeric-filter.component.html +14 -0
- package/src/component/filter/numeric-filter/numeric-filter.component.scss +0 -0
- package/src/component/filter/numeric-filter/numeric-filter.component.spec.ts +25 -0
- package/src/component/filter/numeric-filter/numeric-filter.component.ts +72 -0
- package/src/component/filter/public-api.ts +27 -0
- package/src/component/filter/string-filter/string-filter.component.html +6 -0
- package/src/component/filter/string-filter/string-filter.component.scss +0 -0
- package/src/component/filter/string-filter/string-filter.component.spec.ts +25 -0
- package/src/component/filter/string-filter/string-filter.component.ts +73 -0
- package/src/component/icon/Icon.stories.ts +46 -0
- package/src/component/icon/icon/icon.component.html +3 -0
- package/src/component/icon/icon/icon.component.scss +0 -0
- package/src/component/icon/icon/icon.component.spec.ts +25 -0
- package/src/component/icon/icon/icon.component.ts +39 -0
- package/src/component/icon/icon-sprite.directive.spec.ts +8 -0
- package/src/component/icon/icon-sprite.directive.ts +24 -0
- package/src/component/icon/icon.module.ts +23 -0
- package/src/component/icon/icon.service.spec.ts +16 -0
- package/src/component/icon/icon.service.ts +57 -0
- package/src/component/icon/icons-list.ts +173 -0
- package/src/component/icon/public-api.ts +4 -0
- package/src/component/input/Input.stories.ts +142 -0
- package/src/component/input/form-group-title/form-group-title.component.html +4 -0
- package/src/component/input/form-group-title/form-group-title.component.scss +0 -0
- package/src/component/input/form-group-title/form-group-title.component.spec.ts +25 -0
- package/src/component/input/form-group-title/form-group-title.component.ts +20 -0
- package/src/component/input/input/input.component.html +12 -0
- package/src/component/input/input/input.component.scss +6 -0
- package/src/component/input/input/input.component.spec.ts +25 -0
- package/src/component/input/input/input.component.ts +33 -0
- package/src/component/input/input.module.ts +15 -0
- package/src/component/input/public-api.ts +4 -0
- package/src/component/input/sample-input/sample-input/sample-input.component.html +28 -0
- package/src/component/input/sample-input/sample-input/sample-input.component.scss +25 -0
- package/src/component/input/sample-input/sample-input/sample-input.component.spec.ts +25 -0
- package/src/component/input/sample-input/sample-input/sample-input.component.ts +38 -0
- package/src/component/input/sample-input/sample-input.module.ts +22 -0
- package/src/component/input/text-field/text-field.component.html +19 -0
- package/src/component/input/text-field/text-field.component.scss +0 -0
- package/src/component/input/text-field/text-field.component.spec.ts +25 -0
- package/src/component/input/text-field/text-field.component.ts +84 -0
- package/src/component/list/List.stories.ts +56 -0
- package/src/component/list/list.module.ts +12 -0
- package/src/component/message/Message.stories.ts +20 -0
- package/src/component/message/message/message.component.html +18 -0
- package/src/component/message/message/message.component.scss +0 -0
- package/src/component/message/message/message.component.spec.ts +25 -0
- package/src/component/message/message/message.component.ts +80 -0
- package/src/component/message/message-host/message-host.component.html +6 -0
- package/src/component/message/message-host/message-host.component.scss +0 -0
- package/src/component/message/message-host/message-host.component.spec.ts +25 -0
- package/src/component/message/message-host/message-host.component.ts +94 -0
- package/src/component/message/message-samples/message-sample/message-sample.component.html +31 -0
- package/src/component/message/message-samples/message-sample/message-sample.component.scss +0 -0
- package/src/component/message/message-samples/message-sample/message-sample.component.spec.ts +25 -0
- package/src/component/message/message-samples/message-sample/message-sample.component.ts +40 -0
- package/src/component/message/message-samples/message-samples.module.ts +19 -0
- package/src/component/message/message.module.ts +18 -0
- package/src/component/message/message.service.spec.ts +16 -0
- package/src/component/message/message.service.ts +38 -0
- package/src/component/message/model/message.spec.ts +7 -0
- package/src/component/message/model/message.ts +38 -0
- package/src/component/message/public-api.ts +5 -0
- package/src/component/modal/Modal.stories.ts +43 -0
- package/src/component/modal/dialog/dialog.component.html +20 -0
- package/src/component/modal/dialog/dialog.component.scss +5 -0
- package/src/component/modal/dialog/dialog.component.spec.ts +25 -0
- package/src/component/modal/dialog/dialog.component.ts +33 -0
- package/src/component/modal/dialog.service.spec.ts +16 -0
- package/src/component/modal/dialog.service.ts +59 -0
- package/src/component/modal/modal-container/modal-container.component.html +3 -0
- package/src/component/modal/modal-container/modal-container.component.scss +0 -0
- package/src/component/modal/modal-container/modal-container.component.spec.ts +25 -0
- package/src/component/modal/modal-container/modal-container.component.ts +76 -0
- package/src/component/modal/modal-samples/alert-sample/alert-sample.component.html +13 -0
- package/src/component/modal/modal-samples/alert-sample/alert-sample.component.scss +0 -0
- package/src/component/modal/modal-samples/alert-sample/alert-sample.component.spec.ts +25 -0
- package/src/component/modal/modal-samples/alert-sample/alert-sample.component.ts +31 -0
- package/src/component/modal/modal-samples/modal-example/modal-example.component.html +24 -0
- package/src/component/modal/modal-samples/modal-example/modal-example.component.scss +0 -0
- package/src/component/modal/modal-samples/modal-example/modal-example.component.spec.ts +25 -0
- package/src/component/modal/modal-samples/modal-example/modal-example.component.ts +18 -0
- package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.html +3 -0
- package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.scss +0 -0
- package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.spec.ts +25 -0
- package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.ts +31 -0
- package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.html +31 -0
- package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.scss +0 -0
- package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.spec.ts +25 -0
- package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.ts +34 -0
- package/src/component/modal/modal-samples/modal-samples.module.ts +43 -0
- package/src/component/modal/modal.module.ts +28 -0
- package/src/component/modal/modal.service.spec.ts +16 -0
- package/src/component/modal/modal.service.ts +153 -0
- package/src/component/modal/model/current-modal.ts +5 -0
- package/src/component/modal/model/i-modal-config.ts +12 -0
- package/src/component/modal/model/i-modal-result.ts +13 -0
- package/src/component/modal/model/modal-close-reason.enum.ts +6 -0
- package/src/component/modal/model/modal-instance.ts +44 -0
- package/src/component/modal/public-api.ts +11 -0
- package/src/component/pager/Pager.stories.ts +19 -0
- package/src/component/pager/model/pager-state.spec.ts +7 -0
- package/src/component/pager/model/pager-state.ts +80 -0
- package/src/component/pager/pager/pager.component.html +1 -0
- package/src/component/pager/pager/pager.component.scss +0 -0
- package/src/component/pager/pager/pager.component.spec.ts +25 -0
- package/src/component/pager/pager/pager.component.ts +13 -0
- package/src/component/pager/pager.module.ts +15 -0
- package/src/component/pager/public-api.ts +4 -0
- package/src/component/pager/util/pager-util.spec.ts +7 -0
- package/src/component/pager/util/pager-util.ts +7 -0
- package/src/component/panel/panel/panel.component.html +1 -0
- package/src/component/panel/panel/panel.component.scss +0 -0
- package/src/component/panel/panel/panel.component.spec.ts +25 -0
- package/src/component/panel/panel/panel.component.ts +42 -0
- package/src/component/panel/panel.module.ts +13 -0
- package/src/component/panel/public-api.ts +2 -0
- package/src/component/progress-bar/ProgressBar.stories.ts +29 -0
- package/src/component/progress-bar/progress-bar/progress-bar.component.html +7 -0
- package/src/component/progress-bar/progress-bar/progress-bar.component.scss +0 -0
- package/src/component/progress-bar/progress-bar/progress-bar.component.spec.ts +25 -0
- package/src/component/progress-bar/progress-bar/progress-bar.component.ts +158 -0
- package/src/component/progress-bar/progress-bar.module.ts +13 -0
- package/src/component/progress-bar/public-api.ts +2 -0
- package/src/component/property-grid/PropertyGrid.stories.ts +110 -0
- package/src/component/property-grid/default/date-item-default/date-item-default.component.html +1 -0
- package/src/component/property-grid/default/date-item-default/date-item-default.component.scss +0 -0
- package/src/component/property-grid/default/date-item-default/date-item-default.component.spec.ts +25 -0
- package/src/component/property-grid/default/date-item-default/date-item-default.component.ts +13 -0
- package/src/component/property-grid/default/list-item-default/list-item-default.component.html +1 -0
- package/src/component/property-grid/default/list-item-default/list-item-default.component.scss +0 -0
- package/src/component/property-grid/default/list-item-default/list-item-default.component.spec.ts +25 -0
- package/src/component/property-grid/default/list-item-default/list-item-default.component.ts +13 -0
- package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.html +1 -0
- package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.scss +0 -0
- package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.spec.ts +25 -0
- package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.ts +13 -0
- package/src/component/property-grid/default/string-item-default/string-item-default.component.html +1 -0
- package/src/component/property-grid/default/string-item-default/string-item-default.component.scss +0 -0
- package/src/component/property-grid/default/string-item-default/string-item-default.component.spec.ts +25 -0
- package/src/component/property-grid/default/string-item-default/string-item-default.component.ts +13 -0
- package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.html +20 -0
- package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.scss +0 -0
- package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.spec.ts +25 -0
- package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.ts +31 -0
- package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.html +39 -0
- package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.scss +0 -0
- package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.spec.ts +24 -0
- package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.ts +122 -0
- package/src/component/property-grid/property-grid/property-grid.component.html +18 -0
- package/src/component/property-grid/property-grid/property-grid.component.scss +3 -0
- package/src/component/property-grid/property-grid/property-grid.component.spec.ts +25 -0
- package/src/component/property-grid/property-grid/property-grid.component.ts +62 -0
- package/src/component/property-grid/property-grid.module.ts +53 -0
- package/src/component/property-grid/public-api.ts +2 -0
- package/src/component/public-api.ts +89 -0
- package/src/component/radio/Radio.stories.ts +28 -0
- package/src/component/radio/public-api.ts +3 -0
- package/src/component/radio/radio/radio.component.html +1 -0
- package/src/component/radio/radio/radio.component.scss +0 -0
- package/src/component/radio/radio/radio.component.spec.ts +26 -0
- package/src/component/radio/radio/radio.component.ts +264 -0
- package/src/component/radio/radio-button/radio-button.component.html +4 -0
- package/src/component/radio/radio-button/radio-button.component.scss +0 -0
- package/src/component/radio/radio-button/radio-button.component.spec.ts +26 -0
- package/src/component/radio/radio-button/radio-button.component.ts +71 -0
- package/src/component/radio/radio.module.ts +12 -0
- package/src/component/resize-panel/Resize.stories.ts +83 -0
- package/src/component/resize-panel/public-api.ts +2 -0
- package/src/component/resize-panel/resize-panel/resize-panel.component.html +9 -0
- package/src/component/resize-panel/resize-panel/resize-panel.component.scss +0 -0
- package/src/component/resize-panel/resize-panel/resize-panel.component.spec.ts +25 -0
- package/src/component/resize-panel/resize-panel/resize-panel.component.ts +210 -0
- package/src/component/resize-panel/resize-panel.module.ts +12 -0
- package/src/component/select/Select.stories.ts +254 -0
- package/src/component/select/public-api.ts +4 -0
- package/src/component/select/select/select.component.html +92 -0
- package/src/component/select/select/select.component.scss +0 -0
- package/src/component/select/select/select.component.spec.ts +25 -0
- package/src/component/select/select/select.component.ts +222 -0
- package/src/component/select/select-option.directive.spec.ts +8 -0
- package/src/component/select/select-option.directive.ts +9 -0
- package/src/component/select/select-value.directive.spec.ts +8 -0
- package/src/component/select/select-value.directive.ts +9 -0
- package/src/component/select/select.module.ts +26 -0
- package/src/component/sidebar/Sidebar.stories.ts +61 -0
- package/src/component/sidebar/public-api.ts +3 -0
- package/src/component/sidebar/sidebar/sidebar.component.html +14 -0
- package/src/component/sidebar/sidebar/sidebar.component.scss +0 -0
- package/src/component/sidebar/sidebar/sidebar.component.spec.ts +25 -0
- package/src/component/sidebar/sidebar/sidebar.component.ts +47 -0
- package/src/component/sidebar/sidebar-position.enum.ts +6 -0
- package/src/component/sidebar/sidebar.module.ts +16 -0
- package/src/component/switch/Switch.stories.ts +37 -0
- package/src/component/switch/public-api.ts +3 -0
- package/src/component/switch/switch/switch.component.html +1 -0
- package/src/component/switch/switch/switch.component.scss +0 -0
- package/src/component/switch/switch/switch.component.spec.ts +25 -0
- package/src/component/switch/switch/switch.component.ts +70 -0
- package/src/component/switch/switch-button/switch-button.component.html +1 -0
- package/src/component/switch/switch-button/switch-button.component.scss +0 -0
- package/src/component/switch/switch-button/switch-button.component.spec.ts +25 -0
- package/src/component/switch/switch-button/switch-button.component.ts +55 -0
- package/src/component/switch/switch.module.ts +15 -0
- package/src/component/switch/switch.service.spec.ts +16 -0
- package/src/component/switch/switch.service.ts +18 -0
- package/src/component/table/Table.stories.ts +102 -0
- package/src/component/table/base/cell-component-base.ts +146 -0
- package/src/component/table/base/detail-component-base.ts +13 -0
- package/src/component/table/base/group-row-component-base.ts +13 -0
- package/src/component/table/base/head-cell-component-base.ts +12 -0
- package/src/component/table/cell/cell.component.html +4 -0
- package/src/component/table/cell/cell.component.scss +0 -0
- package/src/component/table/cell/cell.component.spec.ts +25 -0
- package/src/component/table/cell/cell.component.ts +37 -0
- package/src/component/table/cell-host/cell-host.component.html +1 -0
- package/src/component/table/cell-host/cell-host.component.scss +0 -0
- package/src/component/table/cell-host/cell-host.component.spec.ts +25 -0
- package/src/component/table/cell-host/cell-host.component.ts +67 -0
- package/src/component/table/contract/cell-components-map.ts +24 -0
- package/src/component/table/contract/column-reorder-event.ts +11 -0
- package/src/component/table/contract/column-resize-event.ts +11 -0
- package/src/component/table/contract/i-cell-coordinates.ts +8 -0
- package/src/component/table/contract/i-cell-event.ts +5 -0
- package/src/component/table/contract/i-cell-value.ts +6 -0
- package/src/component/table/contract/public-api.ts +11 -0
- package/src/component/table/contract/sort-event.ts +11 -0
- package/src/component/table/contract/table-column-store.ts +24 -0
- package/src/component/table/contract/table-column.ts +172 -0
- package/src/component/table/contract/table-context-menu-config.ts +23 -0
- package/src/component/table/contract/table-row.ts +51 -0
- package/src/component/table/default/boolean-cell/boolean-cell.component.html +10 -0
- package/src/component/table/default/boolean-cell/boolean-cell.component.scss +0 -0
- package/src/component/table/default/boolean-cell/boolean-cell.component.spec.ts +25 -0
- package/src/component/table/default/boolean-cell/boolean-cell.component.ts +54 -0
- package/src/component/table/default/date-cell/date-cell.component.html +11 -0
- package/src/component/table/default/date-cell/date-cell.component.scss +0 -0
- package/src/component/table/default/date-cell/date-cell.component.spec.ts +25 -0
- package/src/component/table/default/date-cell/date-cell.component.ts +59 -0
- package/src/component/table/default/date-time-cell/date-time-cell.component.html +10 -0
- package/src/component/table/default/date-time-cell/date-time-cell.component.scss +0 -0
- package/src/component/table/default/date-time-cell/date-time-cell.component.spec.ts +25 -0
- package/src/component/table/default/date-time-cell/date-time-cell.component.ts +56 -0
- package/src/component/table/default/default-head-cell/default-head-cell.component.html +8 -0
- package/src/component/table/default/default-head-cell/default-head-cell.component.scss +6 -0
- package/src/component/table/default/default-head-cell/default-head-cell.component.spec.ts +25 -0
- package/src/component/table/default/default-head-cell/default-head-cell.component.ts +38 -0
- package/src/component/table/default/group-row/group-row.component.html +2 -0
- package/src/component/table/default/group-row/group-row.component.scss +0 -0
- package/src/component/table/default/group-row/group-row.component.spec.ts +25 -0
- package/src/component/table/default/group-row/group-row.component.ts +29 -0
- package/src/component/table/default/list-cell/list-cell.component.html +15 -0
- package/src/component/table/default/list-cell/list-cell.component.scss +0 -0
- package/src/component/table/default/list-cell/list-cell.component.spec.ts +25 -0
- package/src/component/table/default/list-cell/list-cell.component.ts +85 -0
- package/src/component/table/default/numeric-cell/numeric-cell.component.html +11 -0
- package/src/component/table/default/numeric-cell/numeric-cell.component.scss +3 -0
- package/src/component/table/default/numeric-cell/numeric-cell.component.spec.ts +25 -0
- package/src/component/table/default/numeric-cell/numeric-cell.component.ts +57 -0
- package/src/component/table/default/string-cell/string-cell.component.html +11 -0
- package/src/component/table/default/string-cell/string-cell.component.scss +0 -0
- package/src/component/table/default/string-cell/string-cell.component.spec.ts +25 -0
- package/src/component/table/default/string-cell/string-cell.component.ts +54 -0
- package/src/component/table/enum/aggregation-type.enum.ts +7 -0
- package/src/component/table/enum/edit-event.enum.ts +5 -0
- package/src/component/table/enum/edit-type.enum.ts +4 -0
- package/src/component/table/enum/public-api.ts +4 -0
- package/src/component/table/enum/select-type.enum.ts +5 -0
- package/src/component/table/head-cell/head-cell.component.html +45 -0
- package/src/component/table/head-cell/head-cell.component.scss +16 -0
- package/src/component/table/head-cell/head-cell.component.spec.ts +25 -0
- package/src/component/table/head-cell/head-cell.component.ts +150 -0
- package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.html +145 -0
- package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.scss +6 -0
- package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.spec.ts +25 -0
- package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.ts +240 -0
- package/src/component/table/head-cell-host/head-cell-host.component.html +1 -0
- package/src/component/table/head-cell-host/head-cell-host.component.scss +3 -0
- package/src/component/table/head-cell-host/head-cell-host.component.spec.ts +25 -0
- package/src/component/table/head-cell-host/head-cell-host.component.ts +50 -0
- package/src/component/table/public-api.ts +48 -0
- package/src/component/table/selection-cell/selection-cell.component.html +4 -0
- package/src/component/table/selection-cell/selection-cell.component.scss +5 -0
- package/src/component/table/selection-cell/selection-cell.component.spec.ts +25 -0
- package/src/component/table/selection-cell/selection-cell.component.ts +50 -0
- package/src/component/table/selection-head-cell/selection-head-cell.component.html +5 -0
- package/src/component/table/selection-head-cell/selection-head-cell.component.scss +5 -0
- package/src/component/table/selection-head-cell/selection-head-cell.component.spec.ts +25 -0
- package/src/component/table/selection-head-cell/selection-head-cell.component.ts +49 -0
- package/src/component/table/service/table.service.spec.ts +16 -0
- package/src/component/table/service/table.service.ts +570 -0
- package/src/component/table/table/table.component.html +68 -0
- package/src/component/table/table/table.component.scss +0 -0
- package/src/component/table/table/table.component.spec.ts +25 -0
- package/src/component/table/table/table.component.ts +444 -0
- package/src/component/table/table-body/table-body.component.html +121 -0
- package/src/component/table/table-body/table-body.component.scss +0 -0
- package/src/component/table/table-body/table-body.component.spec.ts +25 -0
- package/src/component/table/table-body/table-body.component.ts +280 -0
- package/src/component/table/table-demo/table-demo/table-demo.component.html +28 -0
- package/src/component/table/table-demo/table-demo/table-demo.component.scss +6 -0
- package/src/component/table/table-demo/table-demo/table-demo.component.spec.ts +25 -0
- package/src/component/table/table-demo/table-demo/table-demo.component.ts +136 -0
- package/src/component/table/table-demo/table-demo.module.ts +23 -0
- package/src/component/table/table-head/table-head.component.html +21 -0
- package/src/component/table/table-head/table-head.component.scss +0 -0
- package/src/component/table/table-head/table-head.component.spec.ts +25 -0
- package/src/component/table/table-head/table-head.component.ts +118 -0
- package/src/component/table/table-head-group/table-head-group.component.html +24 -0
- package/src/component/table/table-head-group/table-head-group.component.scss +0 -0
- package/src/component/table/table-head-group/table-head-group.component.spec.ts +25 -0
- package/src/component/table/table-head-group/table-head-group.component.ts +73 -0
- package/src/component/table/table.module.ts +100 -0
- package/src/component/table/util/public-api.ts +2 -0
- package/src/component/table/util/state-util.spec.ts +7 -0
- package/src/component/table/util/state-util.ts +182 -0
- package/src/component/table/util/table-util.spec.ts +7 -0
- package/src/component/table/util/table-util.ts +150 -0
- package/src/component/tabs/Tabs.stories.ts +55 -0
- package/src/component/tabs/public-api.ts +13 -0
- package/src/component/tabs/tab/tab.component.html +1 -0
- package/src/component/tabs/tab/tab.component.scss +0 -0
- package/src/component/tabs/tab/tab.component.spec.ts +25 -0
- package/src/component/tabs/tab/tab.component.ts +46 -0
- package/src/component/tabs/tab-content.directive.spec.ts +8 -0
- package/src/component/tabs/tab-content.directive.ts +9 -0
- package/src/component/tabs/tab-title.directive.spec.ts +8 -0
- package/src/component/tabs/tab-title.directive.ts +9 -0
- package/src/component/tabs/tabs/tabs.component.html +24 -0
- package/src/component/tabs/tabs/tabs.component.scss +0 -0
- package/src/component/tabs/tabs/tabs.component.spec.ts +25 -0
- package/src/component/tabs/tabs/tabs.component.ts +85 -0
- package/src/component/tabs/tabs.module.ts +26 -0
- package/src/component/theme-switch/public-api.ts +3 -0
- package/src/component/theme-switch/theme-switch/theme-switch.component.html +3 -0
- package/src/component/theme-switch/theme-switch/theme-switch.component.scss +4 -0
- package/src/component/theme-switch/theme-switch/theme-switch.component.spec.ts +25 -0
- package/src/component/theme-switch/theme-switch/theme-switch.component.ts +31 -0
- package/src/component/theme-switch/theme-switch.module.ts +17 -0
- package/src/component/theme-switch/theme-switch.service.spec.ts +16 -0
- package/src/component/theme-switch/theme-switch.service.ts +34 -0
- package/src/component/toggle/Toggle.stories.ts +34 -0
- package/src/component/toggle/public-api.ts +2 -0
- package/src/component/toggle/toggle/toggle.component.html +6 -0
- package/src/component/toggle/toggle/toggle.component.scss +0 -0
- package/src/component/toggle/toggle/toggle.component.spec.ts +25 -0
- package/src/component/toggle/toggle/toggle.component.ts +95 -0
- package/src/component/toggle/toggle.module.ts +11 -0
- package/src/component/toolbar/Toolbar.stories.ts +110 -0
- package/src/component/toolbar/public-api.ts +6 -0
- package/src/component/toolbar/toolbar/toolbar.component.html +1 -0
- package/src/component/toolbar/toolbar/toolbar.component.scss +0 -0
- package/src/component/toolbar/toolbar/toolbar.component.spec.ts +25 -0
- package/src/component/toolbar/toolbar/toolbar.component.ts +29 -0
- package/src/component/toolbar/toolbar.module.ts +13 -0
- package/src/component/tree/Tree.stories.ts +93 -0
- package/src/component/tree/public-api.ts +4 -0
- package/src/component/tree/tree/tree.component.html +8 -0
- package/src/component/tree/tree/tree.component.scss +0 -0
- package/src/component/tree/tree/tree.component.spec.ts +25 -0
- package/src/component/tree/tree/tree.component.ts +92 -0
- package/src/component/tree/tree-item/tree-item.component.html +12 -0
- package/src/component/tree/tree-item/tree-item.component.scss +0 -0
- package/src/component/tree/tree-item/tree-item.component.spec.ts +25 -0
- package/src/component/tree/tree-item/tree-item.component.ts +84 -0
- package/src/component/tree/tree-item-toggle/tree-item-toggle.component.html +2 -0
- package/src/component/tree/tree-item-toggle/tree-item-toggle.component.scss +4 -0
- package/src/component/tree/tree-item-toggle/tree-item-toggle.component.spec.ts +25 -0
- package/src/component/tree/tree-item-toggle/tree-item-toggle.component.ts +37 -0
- package/src/component/tree/tree.module.ts +14 -0
- package/src/component/tree/tree.service.spec.ts +16 -0
- package/src/component/tree/tree.service.ts +41 -0
- package/src/directive/click-outside/click-outside.directive.spec.ts +8 -0
- package/src/directive/click-outside/click-outside.directive.ts +64 -0
- package/src/directive/click-outside/click-outside.module.ts +13 -0
- package/src/directive/click-outside/public-api.ts +2 -0
- package/src/directive/context-menu/ContextMenu.stories.ts +65 -0
- package/src/directive/context-menu/context-menu.directive.spec.ts +8 -0
- package/src/directive/context-menu/context-menu.directive.ts +136 -0
- package/src/directive/context-menu/context-menu.module.ts +15 -0
- package/src/directive/context-menu/public-api.ts +2 -0
- package/src/directive/disable-control/disable-control.directive.spec.ts +8 -0
- package/src/directive/disable-control/disable-control.directive.ts +20 -0
- package/src/directive/disable-control/disable-control.module.ts +16 -0
- package/src/directive/disable-control/public-api.ts +2 -0
- package/src/directive/drag-sort/DragSort.stories.ts +60 -0
- package/src/directive/drag-sort/drag-sort-container.directive.spec.ts +8 -0
- package/src/directive/drag-sort/drag-sort-container.directive.ts +71 -0
- package/src/directive/drag-sort/drag-sort-event.spec.ts +7 -0
- package/src/directive/drag-sort/drag-sort-event.ts +7 -0
- package/src/directive/drag-sort/drag-sort-item.directive.spec.ts +8 -0
- package/src/directive/drag-sort/drag-sort-item.directive.ts +119 -0
- package/src/directive/drag-sort/drag-sort.module.ts +11 -0
- package/src/directive/drag-sort/public-api.ts +4 -0
- package/src/directive/dynamic-content-base.directive.ts +113 -0
- package/src/directive/highlight/highlight.directive.spec.ts +8 -0
- package/src/directive/highlight/highlight.directive.ts +68 -0
- package/src/directive/highlight/highlight.module.ts +13 -0
- package/src/directive/highlight/public-api.ts +2 -0
- package/src/directive/hint/Hint.stories.ts +111 -0
- package/src/directive/hint/hint.directive.spec.ts +8 -0
- package/src/directive/hint/hint.directive.ts +117 -0
- package/src/directive/hint/hint.module.ts +15 -0
- package/src/directive/hint/public-api.ts +2 -0
- package/src/directive/loader/Loader.stories.ts +21 -0
- package/src/directive/loader/loader.directive.spec.ts +8 -0
- package/src/directive/loader/loader.directive.ts +80 -0
- package/src/directive/loader/loader.module.ts +13 -0
- package/src/directive/loader/public-api.ts +2 -0
- package/src/directive/no-autofill/no-autofill.directive.spec.ts +8 -0
- package/src/directive/no-autofill/no-autofill.directive.ts +28 -0
- package/src/directive/no-autofill/no-autofill.module.ts +10 -0
- package/src/directive/no-autofill/public-api.ts +2 -0
- package/src/directive/only-number/OnlyNumber.stories.ts +29 -0
- package/src/directive/only-number/only-number.directive.spec.ts +8 -0
- package/src/directive/only-number/only-number.directive.ts +174 -0
- package/src/directive/only-number/only-number.module.ts +10 -0
- package/src/directive/only-number/public-api.ts +2 -0
- package/src/directive/public-api.ts +14 -0
- package/src/directive/resize-drag/public-api.ts +2 -0
- package/src/directive/resize-drag/resize-drag.directive.spec.ts +8 -0
- package/src/directive/resize-drag/resize-drag.directive.ts +62 -0
- package/src/directive/resize-drag/resize-drag.module.ts +10 -0
- package/src/directive/teta-template/public-api.ts +2 -0
- package/src/directive/teta-template/teta-template.directive.spec.ts +8 -0
- package/src/directive/teta-template/teta-template.directive.ts +15 -0
- package/src/directive/teta-template/teta-template.module.ts +18 -0
- package/src/directive/tooltip/Tooltip.stories.ts +96 -0
- package/src/directive/tooltip/public-api.ts +2 -0
- package/src/directive/tooltip/tooltip.directive.spec.ts +8 -0
- package/src/directive/tooltip/tooltip.directive.ts +116 -0
- package/src/directive/tooltip/tooltip.module.ts +12 -0
- package/src/pipe/number-pipe/number-pipe.module.ts +15 -0
- package/src/pipe/number-pipe/number.pipe.spec.ts +8 -0
- package/src/pipe/number-pipe/number.pipe.ts +26 -0
- package/src/pipe/number-pipe/public-api.ts +2 -0
- package/src/pipe/prepend-zero/prepend-zero.module.ts +10 -0
- package/src/pipe/prepend-zero/prepend-zero.pipe.spec.ts +8 -0
- package/src/pipe/prepend-zero/prepend-zero.pipe.ts +15 -0
- package/src/pipe/prepend-zero/public-api.ts +2 -0
- package/src/pipe/public-api.ts +1 -0
- package/src/pipe/util/number-helper.ts +37 -0
- package/src/public-api.ts +25 -0
- package/src/test.ts +26 -0
- package/src/util/date-util.ts +247 -0
- package/src/util/forms-util.ts +83 -0
- package/src/util/public-api.ts +3 -0
- package/src/util/string-util.ts +5 -0
- package/style/tabs.scss +1 -1
- package/tsconfig.lib.json +18 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/component/chart/core/axis-creator.d.ts +0 -28
- package/component/chart/model/enum/scale-type.d.ts +0 -6
- package/component/chart/model/series.d.ts +0 -62
- package/component/table/contract/table-column.d.ts +0 -141
- package/component/table/head-cell-dropdown/head-cell-dropdown.component.d.ts +0 -58
- package/component/table/service/table.service.d.ts +0 -119
- package/component/table/table/table.component.d.ts +0 -99
- package/esm2020/common/contract/auto-close-ignore-case.mjs +0 -2
- package/esm2020/common/contract/constructor-type.mjs +0 -2
- package/esm2020/common/contract/dynamic-data.mjs +0 -10
- package/esm2020/common/contract/i-dictionary.mjs +0 -2
- package/esm2020/common/contract/i-id-name.mjs +0 -2
- package/esm2020/common/contract/i-rect.mjs +0 -2
- package/esm2020/common/contract/i-tree-data.mjs +0 -2
- package/esm2020/common/contract/public-api.mjs +0 -9
- package/esm2020/common/contract/teta-content-ref.mjs +0 -8
- package/esm2020/common/enum/align.enum.mjs +0 -10
- package/esm2020/common/enum/public-api.mjs +0 -4
- package/esm2020/common/enum/teta-size.enum.mjs +0 -9
- package/esm2020/common/enum/vertical-align.enum.mjs +0 -8
- package/esm2020/common/public-api.mjs +0 -5
- package/esm2020/common/service/click.service.mjs +0 -23
- package/esm2020/common/service/dynamic-component.service.mjs +0 -93
- package/esm2020/common/service/overlay-container.service.mjs +0 -41
- package/esm2020/common/service/public-api.mjs +0 -4
- package/esm2020/common/util/array-util.mjs +0 -119
- package/esm2020/common/util/dom-util.mjs +0 -16
- package/esm2020/common/util/position-util.mjs +0 -96
- package/esm2020/common/util/public-api.mjs +0 -4
- package/esm2020/component/accordion/accordion/accordion.component.mjs +0 -18
- package/esm2020/component/accordion/accordion-content.directive.mjs +0 -16
- package/esm2020/component/accordion/accordion-head/accordion-head.component.mjs +0 -52
- package/esm2020/component/accordion/accordion-item/accordion-item.component.mjs +0 -43
- package/esm2020/component/accordion/accordion.module.mjs +0 -29
- package/esm2020/component/accordion/public-api.mjs +0 -6
- package/esm2020/component/button/button/button.component.mjs +0 -40
- package/esm2020/component/button/button.module.mjs +0 -24
- package/esm2020/component/button/public-api.mjs +0 -3
- package/esm2020/component/chart/chart/chart.component.mjs +0 -164
- package/esm2020/component/chart/chart.module.mjs +0 -18
- package/esm2020/component/chart/core/axis-creator.mjs +0 -82
- package/esm2020/component/chart/core/chart.mjs +0 -1339
- package/esm2020/component/chart/core/public-api.mjs +0 -3
- package/esm2020/component/chart/drawer/area-drawer.mjs +0 -20
- package/esm2020/component/chart/drawer/bar-drawer.mjs +0 -23
- package/esm2020/component/chart/drawer/contour-drawer.mjs +0 -29
- package/esm2020/component/chart/drawer/default-drawer-mapping.mjs +0 -17
- package/esm2020/component/chart/drawer/line-drawer.mjs +0 -152
- package/esm2020/component/chart/drawer/pie-drawer.mjs +0 -4
- package/esm2020/component/chart/drawer/public-api.mjs +0 -7
- package/esm2020/component/chart/drawer/scatter-drawer.mjs +0 -93
- package/esm2020/component/chart/drawer/spline-drawer.mjs +0 -23
- package/esm2020/component/chart/legend-drawer/default-drawer-legend-mapping.mjs +0 -7
- package/esm2020/component/chart/legend-drawer/gradient-drawer.mjs +0 -45
- package/esm2020/component/chart/legend-drawer/swatch-drawer.mjs +0 -62
- package/esm2020/component/chart/model/annotation.mjs +0 -30
- package/esm2020/component/chart/model/axis-options.mjs +0 -26
- package/esm2020/component/chart/model/chart-bounds.mjs +0 -13
- package/esm2020/component/chart/model/chart-options.mjs +0 -37
- package/esm2020/component/chart/model/enum/axis-type.mjs +0 -6
- package/esm2020/component/chart/model/enum/dispatch-type.mjs +0 -6
- package/esm2020/component/chart/model/enum/drag-point-type.mjs +0 -7
- package/esm2020/component/chart/model/enum/legend-type.mjs +0 -6
- package/esm2020/component/chart/model/enum/public-api.mjs +0 -8
- package/esm2020/component/chart/model/enum/scale-type.mjs +0 -8
- package/esm2020/component/chart/model/enum/scale.mjs +0 -7
- package/esm2020/component/chart/model/enum/series-type.mjs +0 -12
- package/esm2020/component/chart/model/enum/zoom-type.mjs +0 -7
- package/esm2020/component/chart/model/i-drag-event.mjs +0 -2
- package/esm2020/component/chart/model/i-drawer-legend.mjs +0 -2
- package/esm2020/component/chart/model/i-drawer.mjs +0 -2
- package/esm2020/component/chart/model/i-zoom-event.mjs +0 -2
- package/esm2020/component/chart/model/plot-band.mjs +0 -18
- package/esm2020/component/chart/model/plot-line.mjs +0 -13
- package/esm2020/component/chart/model/point/bar-point.mjs +0 -2
- package/esm2020/component/chart/model/point/base-point.mjs +0 -2
- package/esm2020/component/chart/model/point/contour-point.mjs +0 -2
- package/esm2020/component/chart/model/point/marker-options.mjs +0 -2
- package/esm2020/component/chart/model/point/public-api.mjs +0 -4
- package/esm2020/component/chart/model/point/scatter-point.mjs +0 -2
- package/esm2020/component/chart/model/public-api.mjs +0 -16
- package/esm2020/component/chart/model/series.mjs +0 -27
- package/esm2020/component/chart/model/tooltip-options.mjs +0 -19
- package/esm2020/component/chart/public-api.mjs +0 -6
- package/esm2020/component/chart-3d/chart-3d.module.mjs +0 -18
- package/esm2020/component/chart-3d/chart3d/chart3d.component.mjs +0 -232
- package/esm2020/component/chart-3d/model/base-3d-point.mjs +0 -2
- package/esm2020/component/chart-3d/model/chart-3d-options.mjs +0 -7
- package/esm2020/component/chart-3d/model/public-api.mjs +0 -3
- package/esm2020/component/chart-3d/model/series-3d.mjs +0 -7
- package/esm2020/component/chart-3d/public-api.mjs +0 -4
- package/esm2020/component/checkbox/checkbox/checkbox.component.mjs +0 -134
- package/esm2020/component/checkbox/checkbox.module.mjs +0 -28
- package/esm2020/component/checkbox/public-api.mjs +0 -3
- package/esm2020/component/date-picker/date-picker/date-picker.component.mjs +0 -279
- package/esm2020/component/date-picker/date-picker.module.mjs +0 -67
- package/esm2020/component/date-picker/day-select/day-select.component.mjs +0 -166
- package/esm2020/component/date-picker/model/date-period.mjs +0 -7
- package/esm2020/component/date-picker/model/date-picker-mode.enum.mjs +0 -7
- package/esm2020/component/date-picker/model/day-model.mjs +0 -13
- package/esm2020/component/date-picker/model/picker-locale-model.mjs +0 -13
- package/esm2020/component/date-picker/month-picker/month-picker.component.mjs +0 -250
- package/esm2020/component/date-picker/month-select/month-select.component.mjs +0 -147
- package/esm2020/component/date-picker/public-api.mjs +0 -6
- package/esm2020/component/date-picker/service/picker-locale.service.mjs +0 -30
- package/esm2020/component/date-picker/service/picker-touch.service.mjs +0 -34
- package/esm2020/component/date-picker/time-part-control/time-part-control.component.mjs +0 -73
- package/esm2020/component/date-picker/util/date-picker-util.mjs +0 -142
- package/esm2020/component/date-picker/year-select/year-select.component.mjs +0 -189
- package/esm2020/component/delimiter/delimiter/delimiter.component.mjs +0 -63
- package/esm2020/component/delimiter/delimiter.module.mjs +0 -22
- package/esm2020/component/delimiter/public-api.mjs +0 -3
- package/esm2020/component/dropdown/dropdown/dropdown.component.mjs +0 -29
- package/esm2020/component/dropdown/dropdown-base.mjs +0 -204
- package/esm2020/component/dropdown/dropdown-content.directive.mjs +0 -17
- package/esm2020/component/dropdown/dropdown-head.directive.mjs +0 -18
- package/esm2020/component/dropdown/dropdown.directive.mjs +0 -37
- package/esm2020/component/dropdown/dropdown.module.mjs +0 -41
- package/esm2020/component/dropdown/public-api.mjs +0 -6
- package/esm2020/component/dynamic-component/dynamic-component.module.mjs +0 -22
- package/esm2020/component/dynamic-component/popup-content/popup-content.component.mjs +0 -59
- package/esm2020/component/dynamic-component/public-api.mjs +0 -3
- package/esm2020/component/expand-panel/expand-panel/expand-panel.component.mjs +0 -65
- package/esm2020/component/expand-panel/expand-panel-content.directive.mjs +0 -16
- package/esm2020/component/expand-panel/expand-panel-head.directive.mjs +0 -16
- package/esm2020/component/expand-panel/expand-panel.module.mjs +0 -52
- package/esm2020/component/expand-panel/public-api.mjs +0 -5
- package/esm2020/component/file-upload/file-item/file-item.component.mjs +0 -13
- package/esm2020/component/file-upload/file-upload-area/file-upload-area.component.mjs +0 -77
- package/esm2020/component/file-upload/file-upload.module.mjs +0 -21
- package/esm2020/component/file-upload/public-api.mjs +0 -4
- package/esm2020/component/filter/base/filter-base.mjs +0 -9
- package/esm2020/component/filter/base/filter-component-base.mjs +0 -3
- package/esm2020/component/filter/boolean-filter/boolean-filter.component.mjs +0 -53
- package/esm2020/component/filter/contarct/boolean-filter.mjs +0 -10
- package/esm2020/component/filter/contarct/date-filter-value.mjs +0 -9
- package/esm2020/component/filter/contarct/date-filter.mjs +0 -11
- package/esm2020/component/filter/contarct/filter-component-map.mjs +0 -17
- package/esm2020/component/filter/contarct/filter-item.mjs +0 -33
- package/esm2020/component/filter/contarct/filter-state.mjs +0 -145
- package/esm2020/component/filter/contarct/i-filter.mjs +0 -2
- package/esm2020/component/filter/contarct/list-filter.mjs +0 -12
- package/esm2020/component/filter/contarct/numeric-filter-value.mjs +0 -10
- package/esm2020/component/filter/contarct/numeric-filter.mjs +0 -11
- package/esm2020/component/filter/contarct/sort-param.mjs +0 -13
- package/esm2020/component/filter/contarct/string-filter.mjs +0 -12
- package/esm2020/component/filter/date-filter/date-filter.component.mjs +0 -54
- package/esm2020/component/filter/enum/filter-type.enum.mjs +0 -10
- package/esm2020/component/filter/enum/list-filter-type.enum.mjs +0 -6
- package/esm2020/component/filter/enum/string-filter-type.enum.mjs +0 -20
- package/esm2020/component/filter/filter-host/filter-host.component.mjs +0 -73
- package/esm2020/component/filter/filter-panel/filter-panel.component.mjs +0 -13
- package/esm2020/component/filter/filter.module.mjs +0 -80
- package/esm2020/component/filter/list-filter/list-filter.component.mjs +0 -86
- package/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +0 -53
- package/esm2020/component/filter/public-api.mjs +0 -25
- package/esm2020/component/filter/string-filter/string-filter.component.mjs +0 -54
- package/esm2020/component/icon/icon/icon.component.mjs +0 -37
- package/esm2020/component/icon/icon-sprite.directive.mjs +0 -32
- package/esm2020/component/icon/icon.module.mjs +0 -35
- package/esm2020/component/icon/icon.service.mjs +0 -59
- package/esm2020/component/icon/public-api.mjs +0 -5
- package/esm2020/component/input/form-group-title/form-group-title.component.mjs +0 -18
- package/esm2020/component/input/input/input.component.mjs +0 -31
- package/esm2020/component/input/input.module.mjs +0 -23
- package/esm2020/component/input/public-api.mjs +0 -5
- package/esm2020/component/input/text-field/text-field.component.mjs +0 -94
- package/esm2020/component/message/message/message.component.mjs +0 -74
- package/esm2020/component/message/message-host/message-host.component.mjs +0 -88
- package/esm2020/component/message/message.module.mjs +0 -31
- package/esm2020/component/message/message.service.mjs +0 -35
- package/esm2020/component/message/model/message.mjs +0 -21
- package/esm2020/component/message/public-api.mjs +0 -6
- package/esm2020/component/modal/dialog/dialog.component.mjs +0 -44
- package/esm2020/component/modal/dialog.service.mjs +0 -39
- package/esm2020/component/modal/modal-container/modal-container.component.mjs +0 -84
- package/esm2020/component/modal/modal.module.mjs +0 -52
- package/esm2020/component/modal/modal.service.mjs +0 -121
- package/esm2020/component/modal/model/current-modal.mjs +0 -3
- package/esm2020/component/modal/model/i-modal-config.mjs +0 -2
- package/esm2020/component/modal/model/i-modal-result.mjs +0 -2
- package/esm2020/component/modal/model/modal-close-reason.enum.mjs +0 -8
- package/esm2020/component/modal/model/modal-instance.mjs +0 -32
- package/esm2020/component/modal/public-api.mjs +0 -11
- package/esm2020/component/pager/model/pager-state.mjs +0 -50
- package/esm2020/component/pager/pager/pager.component.mjs +0 -13
- package/esm2020/component/pager/pager.module.mjs +0 -26
- package/esm2020/component/pager/public-api.mjs +0 -5
- package/esm2020/component/pager/util/pager-util.mjs +0 -6
- package/esm2020/component/panel/panel/panel.component.mjs +0 -51
- package/esm2020/component/panel/panel.module.mjs +0 -22
- package/esm2020/component/panel/public-api.mjs +0 -3
- package/esm2020/component/progress-bar/progress-bar/progress-bar.component.mjs +0 -131
- package/esm2020/component/progress-bar/progress-bar.module.mjs +0 -22
- package/esm2020/component/progress-bar/public-api.mjs +0 -3
- package/esm2020/component/property-grid/default/date-item-default/date-item-default.component.mjs +0 -13
- package/esm2020/component/property-grid/default/list-item-default/list-item-default.component.mjs +0 -13
- package/esm2020/component/property-grid/default/numeric-item-default/numeric-item-default.component.mjs +0 -13
- package/esm2020/component/property-grid/default/string-item-default/string-item-default.component.mjs +0 -13
- package/esm2020/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +0 -34
- package/esm2020/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +0 -103
- package/esm2020/component/property-grid/property-grid/property-grid.component.mjs +0 -59
- package/esm2020/component/property-grid/property-grid.module.mjs +0 -94
- package/esm2020/component/property-grid/public-api.mjs +0 -3
- package/esm2020/component/public-api.mjs +0 -61
- package/esm2020/component/radio/public-api.mjs +0 -4
- package/esm2020/component/radio/radio/radio.component.mjs +0 -245
- package/esm2020/component/radio/radio-button/radio-button.component.mjs +0 -63
- package/esm2020/component/radio/radio.module.mjs +0 -20
- package/esm2020/component/resize-panel/public-api.mjs +0 -3
- package/esm2020/component/resize-panel/resize-panel/resize-panel.component.mjs +0 -162
- package/esm2020/component/resize-panel/resize-panel.module.mjs +0 -20
- package/esm2020/component/select/public-api.mjs +0 -5
- package/esm2020/component/select/select/select.component.mjs +0 -234
- package/esm2020/component/select/select-option.directive.mjs +0 -16
- package/esm2020/component/select/select-value.directive.mjs +0 -16
- package/esm2020/component/select/select.module.mjs +0 -48
- package/esm2020/component/sidebar/public-api.mjs +0 -4
- package/esm2020/component/sidebar/sidebar/sidebar.component.mjs +0 -54
- package/esm2020/component/sidebar/sidebar-position.enum.mjs +0 -8
- package/esm2020/component/sidebar/sidebar.module.mjs +0 -30
- package/esm2020/component/switch/public-api.mjs +0 -4
- package/esm2020/component/switch/switch/switch.component.mjs +0 -52
- package/esm2020/component/switch/switch-button/switch-button.component.mjs +0 -47
- package/esm2020/component/switch/switch.module.mjs +0 -23
- package/esm2020/component/switch/switch.service.mjs +0 -21
- package/esm2020/component/table/base/cell-component-base.mjs +0 -94
- package/esm2020/component/table/base/detail-component-base.mjs +0 -3
- package/esm2020/component/table/base/group-row-component-base.mjs +0 -3
- package/esm2020/component/table/base/head-cell-component-base.mjs +0 -17
- package/esm2020/component/table/cell/cell.component.mjs +0 -33
- package/esm2020/component/table/cell-host/cell-host.component.mjs +0 -50
- package/esm2020/component/table/contract/cell-components-map.mjs +0 -17
- package/esm2020/component/table/contract/column-reorder-event.mjs +0 -7
- package/esm2020/component/table/contract/column-resize-event.mjs +0 -7
- package/esm2020/component/table/contract/i-cell-coordinates.mjs +0 -2
- package/esm2020/component/table/contract/i-cell-event.mjs +0 -2
- package/esm2020/component/table/contract/i-cell-value.mjs +0 -2
- package/esm2020/component/table/contract/public-api.mjs +0 -12
- package/esm2020/component/table/contract/sort-event.mjs +0 -7
- package/esm2020/component/table/contract/table-column-store.mjs +0 -12
- package/esm2020/component/table/contract/table-column.mjs +0 -43
- package/esm2020/component/table/contract/table-context-menu-config.mjs +0 -17
- package/esm2020/component/table/contract/table-row.mjs +0 -40
- package/esm2020/component/table/default/boolean-cell/boolean-cell.component.mjs +0 -45
- package/esm2020/component/table/default/date-cell/date-cell.component.mjs +0 -47
- package/esm2020/component/table/default/date-time-cell/date-time-cell.component.mjs +0 -46
- package/esm2020/component/table/default/default-head-cell/default-head-cell.component.mjs +0 -28
- package/esm2020/component/table/default/group-row/group-row.component.mjs +0 -20
- package/esm2020/component/table/default/list-cell/list-cell.component.mjs +0 -66
- package/esm2020/component/table/default/numeric-cell/numeric-cell.component.mjs +0 -46
- package/esm2020/component/table/default/string-cell/string-cell.component.mjs +0 -44
- package/esm2020/component/table/enum/aggregation-type.enum.mjs +0 -9
- package/esm2020/component/table/enum/edit-event.enum.mjs +0 -7
- package/esm2020/component/table/enum/edit-type.enum.mjs +0 -6
- package/esm2020/component/table/enum/public-api.mjs +0 -5
- package/esm2020/component/table/enum/select-type.enum.mjs +0 -7
- package/esm2020/component/table/head-cell/head-cell.component.mjs +0 -136
- package/esm2020/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +0 -198
- package/esm2020/component/table/head-cell-host/head-cell-host.component.mjs +0 -36
- package/esm2020/component/table/public-api.mjs +0 -43
- package/esm2020/component/table/selection-cell/selection-cell.component.mjs +0 -46
- package/esm2020/component/table/selection-head-cell/selection-head-cell.component.mjs +0 -45
- package/esm2020/component/table/service/table.service.mjs +0 -433
- package/esm2020/component/table/table/table.component.mjs +0 -427
- package/esm2020/component/table/table-body/table-body.component.mjs +0 -240
- package/esm2020/component/table/table-head/table-head.component.mjs +0 -98
- package/esm2020/component/table/table-head-group/table-head-group.component.mjs +0 -59
- package/esm2020/component/table/table.module.mjs +0 -176
- package/esm2020/component/table/util/public-api.mjs +0 -3
- package/esm2020/component/table/util/state-util.mjs +0 -139
- package/esm2020/component/table/util/table-util.mjs +0 -131
- package/esm2020/component/tabs/public-api.mjs +0 -12
- package/esm2020/component/tabs/tab/tab.component.mjs +0 -42
- package/esm2020/component/tabs/tab-content.directive.mjs +0 -16
- package/esm2020/component/tabs/tab-title.directive.mjs +0 -16
- package/esm2020/component/tabs/tabs/tabs.component.mjs +0 -70
- package/esm2020/component/tabs/tabs.module.mjs +0 -41
- package/esm2020/component/theme-switch/public-api.mjs +0 -4
- package/esm2020/component/theme-switch/theme-switch/theme-switch.component.mjs +0 -28
- package/esm2020/component/theme-switch/theme-switch.module.mjs +0 -30
- package/esm2020/component/theme-switch/theme-switch.service.mjs +0 -34
- package/esm2020/component/toggle/public-api.mjs +0 -3
- package/esm2020/component/toggle/toggle/toggle.component.mjs +0 -79
- package/esm2020/component/toggle/toggle.module.mjs +0 -19
- package/esm2020/component/toolbar/public-api.mjs +0 -6
- package/esm2020/component/toolbar/toolbar/toolbar.component.mjs +0 -26
- package/esm2020/component/toolbar/toolbar.module.mjs +0 -22
- package/esm2020/component/tree/public-api.mjs +0 -5
- package/esm2020/component/tree/tree/tree.component.mjs +0 -76
- package/esm2020/component/tree/tree-item/tree-item.component.mjs +0 -80
- package/esm2020/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +0 -28
- package/esm2020/component/tree/tree.module.mjs +0 -22
- package/esm2020/component/tree/tree.service.mjs +0 -35
- package/esm2020/directive/click-outside/click-outside.directive.mjs +0 -60
- package/esm2020/directive/click-outside/click-outside.module.mjs +0 -22
- package/esm2020/directive/click-outside/public-api.mjs +0 -3
- package/esm2020/directive/context-menu/context-menu.directive.mjs +0 -94
- package/esm2020/directive/context-menu/context-menu.module.mjs +0 -26
- package/esm2020/directive/context-menu/public-api.mjs +0 -3
- package/esm2020/directive/disable-control/disable-control.directive.mjs +0 -29
- package/esm2020/directive/disable-control/disable-control.module.mjs +0 -24
- package/esm2020/directive/disable-control/public-api.mjs +0 -3
- package/esm2020/directive/drag-sort/drag-sort-container.directive.mjs +0 -64
- package/esm2020/directive/drag-sort/drag-sort-event.mjs +0 -2
- package/esm2020/directive/drag-sort/drag-sort-item.directive.mjs +0 -115
- package/esm2020/directive/drag-sort/drag-sort.module.mjs +0 -19
- package/esm2020/directive/drag-sort/public-api.mjs +0 -5
- package/esm2020/directive/dynamic-content-base.directive.mjs +0 -81
- package/esm2020/directive/highlight/highlight.directive.mjs +0 -72
- package/esm2020/directive/highlight/highlight.module.mjs +0 -22
- package/esm2020/directive/highlight/public-api.mjs +0 -3
- package/esm2020/directive/hint/hint.directive.mjs +0 -97
- package/esm2020/directive/hint/hint.module.mjs +0 -26
- package/esm2020/directive/hint/public-api.mjs +0 -3
- package/esm2020/directive/loader/loader.directive.mjs +0 -63
- package/esm2020/directive/loader/loader.module.mjs +0 -22
- package/esm2020/directive/loader/public-api.mjs +0 -3
- package/esm2020/directive/no-autofill/no-autofill.directive.mjs +0 -30
- package/esm2020/directive/no-autofill/no-autofill.module.mjs +0 -18
- package/esm2020/directive/no-autofill/public-api.mjs +0 -3
- package/esm2020/directive/only-number/only-number.directive.mjs +0 -175
- package/esm2020/directive/only-number/only-number.module.mjs +0 -18
- package/esm2020/directive/only-number/public-api.mjs +0 -3
- package/esm2020/directive/public-api.mjs +0 -15
- package/esm2020/directive/resize-drag/public-api.mjs +0 -3
- package/esm2020/directive/resize-drag/resize-drag.directive.mjs +0 -71
- package/esm2020/directive/resize-drag/resize-drag.module.mjs +0 -18
- package/esm2020/directive/teta-template/public-api.mjs +0 -3
- package/esm2020/directive/teta-template/teta-template.directive.mjs +0 -22
- package/esm2020/directive/teta-template/teta-template.module.mjs +0 -26
- package/esm2020/directive/tooltip/public-api.mjs +0 -3
- package/esm2020/directive/tooltip/tooltip.directive.mjs +0 -76
- package/esm2020/directive/tooltip/tooltip.module.mjs +0 -20
- package/esm2020/pipe/number-pipe/number-pipe.module.mjs +0 -24
- package/esm2020/pipe/number-pipe/number.pipe.mjs +0 -24
- package/esm2020/pipe/number-pipe/public-api.mjs +0 -3
- package/esm2020/pipe/prepend-zero/prepend-zero.module.mjs +0 -18
- package/esm2020/pipe/prepend-zero/prepend-zero.pipe.mjs +0 -21
- package/esm2020/pipe/public-api.mjs +0 -2
- package/esm2020/pipe/util/number-helper.mjs +0 -25
- package/esm2020/public-api.mjs +0 -21
- package/esm2020/tetacom-ng-components.mjs +0 -5
- package/esm2020/util/date-util.mjs +0 -195
- package/esm2020/util/forms-util.mjs +0 -61
- package/esm2020/util/public-api.mjs +0 -4
- package/esm2020/util/string-util.mjs +0 -7
- package/fesm2015/tetacom-ng-components.mjs +0 -13336
- package/fesm2015/tetacom-ng-components.mjs.map +0 -1
- package/fesm2020/tetacom-ng-components.mjs +0 -13228
- package/fesm2020/tetacom-ng-components.mjs.map +0 -1
|
@@ -1,1339 +0,0 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import * as d3 from 'd3';
|
|
3
|
-
import { zoomIdentity } from 'd3';
|
|
4
|
-
import * as d3annotation from 'd3-svg-annotation';
|
|
5
|
-
import { Scale } from '../model/enum/scale';
|
|
6
|
-
import { SeriesType } from '../model/enum/series-type';
|
|
7
|
-
import { defaultDrawerMapping } from '../drawer/default-drawer-mapping';
|
|
8
|
-
import { defaultLegendDrawerMapping } from '../legend-drawer/default-drawer-legend-mapping';
|
|
9
|
-
import { LegendType } from '../model/enum/legend-type';
|
|
10
|
-
import { Axis } from './axis-creator';
|
|
11
|
-
import { AxisType } from '../model/enum/axis-type';
|
|
12
|
-
import { ScaleType } from '../model/enum/scale-type';
|
|
13
|
-
import { ZoomType } from '../model/enum/zoom-type';
|
|
14
|
-
import { DispatchType } from '../model/enum/dispatch-type';
|
|
15
|
-
export class TetaChart {
|
|
16
|
-
constructor(options, element) {
|
|
17
|
-
this.plotLinesMove$ = new Subject();
|
|
18
|
-
this.plotBandsMove$ = new Subject();
|
|
19
|
-
this.seriesMove$ = new Subject();
|
|
20
|
-
this.pointMove$ = new Subject();
|
|
21
|
-
this.zoom$ = new Subject();
|
|
22
|
-
this._container = null;
|
|
23
|
-
this._width = 0;
|
|
24
|
-
this._height = 0;
|
|
25
|
-
this._zoomYCache = new Map();
|
|
26
|
-
this._zoomXCache = new Map();
|
|
27
|
-
this._zoom = d3.zoom();
|
|
28
|
-
this.visibleChartWindowWidth = 0;
|
|
29
|
-
this._xScales = new Map();
|
|
30
|
-
this._yScales = new Map();
|
|
31
|
-
this._clonedX = new Map();
|
|
32
|
-
this._clonedY = new Map();
|
|
33
|
-
this.offsetOpposite = 0;
|
|
34
|
-
this.offsetNonOpposite = 0;
|
|
35
|
-
this._zoomAdded = false;
|
|
36
|
-
this._options = options;
|
|
37
|
-
this.selectNode(element);
|
|
38
|
-
this.createTooltip();
|
|
39
|
-
this.plotLinesMove = this.plotLinesMove$.asObservable();
|
|
40
|
-
this.plotBandsMove = this.plotBandsMove$.asObservable();
|
|
41
|
-
this.seriesMove = this.seriesMove$.asObservable();
|
|
42
|
-
this.pointMove = this.pointMove$.asObservable();
|
|
43
|
-
this.zoom = this.zoom$.asObservable();
|
|
44
|
-
}
|
|
45
|
-
redraw(options) {
|
|
46
|
-
if (options) {
|
|
47
|
-
this._options = options;
|
|
48
|
-
}
|
|
49
|
-
this.createAxis();
|
|
50
|
-
this.createScales();
|
|
51
|
-
this.createMarkers();
|
|
52
|
-
this.createVisibleWindow();
|
|
53
|
-
this._redraw();
|
|
54
|
-
this.drawLegend();
|
|
55
|
-
if (this._commonZoomTransform) {
|
|
56
|
-
this._chart.call(this._zoom.transform, this._commonZoomTransform);
|
|
57
|
-
}
|
|
58
|
-
if (!this._zoomAdded) {
|
|
59
|
-
this.addZoom();
|
|
60
|
-
this._zoomAdded = true;
|
|
61
|
-
}
|
|
62
|
-
this.addAxesZoom();
|
|
63
|
-
}
|
|
64
|
-
setZoom(zoom) {
|
|
65
|
-
if (!this._zoom) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
this._chart.call(this._zoom.transform, zoom?.zoomTransform ?? zoomIdentity);
|
|
69
|
-
}
|
|
70
|
-
setSize(size = { width: 0, height: 0 }) {
|
|
71
|
-
this._height = size.height;
|
|
72
|
-
this._width = size.width;
|
|
73
|
-
this._chart.attr('width', this._width).attr('height', this._height);
|
|
74
|
-
this._canvas.attr('width', this._width).attr('height', this._height);
|
|
75
|
-
const extent = [
|
|
76
|
-
[
|
|
77
|
-
this.offsetNonOpposite
|
|
78
|
-
? this.offsetNonOpposite
|
|
79
|
-
: this._options.bounds.left,
|
|
80
|
-
this._options.bounds.top,
|
|
81
|
-
],
|
|
82
|
-
[
|
|
83
|
-
this._width -
|
|
84
|
-
(this.offsetOpposite
|
|
85
|
-
? this.offsetOpposite
|
|
86
|
-
: this._options.bounds.right),
|
|
87
|
-
this._height - this._options.bounds.bottom,
|
|
88
|
-
],
|
|
89
|
-
];
|
|
90
|
-
this._zoom
|
|
91
|
-
.scaleExtent([1, Infinity])
|
|
92
|
-
.translateExtent(extent)
|
|
93
|
-
.extent(extent);
|
|
94
|
-
}
|
|
95
|
-
createVisibleWindow() {
|
|
96
|
-
this.uniqId = (Date.now() + Math.random()).toString(36);
|
|
97
|
-
this._chart.selectAll('defs').remove();
|
|
98
|
-
this._chart
|
|
99
|
-
.append('defs')
|
|
100
|
-
.append('clipPath')
|
|
101
|
-
.attr('id', `draw-window-${this.uniqId}`)
|
|
102
|
-
.append('rect')
|
|
103
|
-
.attr('x', this.offsetNonOpposite === 0
|
|
104
|
-
? this._options.bounds.left
|
|
105
|
-
: this.offsetNonOpposite)
|
|
106
|
-
.attr('y', this._options.bounds.top)
|
|
107
|
-
.attr('width', this.visibleChartWindowWidth + 1)
|
|
108
|
-
.attr('height', this._height -
|
|
109
|
-
this._options.bounds.bottom -
|
|
110
|
-
this._options.bounds.top +
|
|
111
|
-
1 >
|
|
112
|
-
0
|
|
113
|
-
? this._height -
|
|
114
|
-
this._options.bounds.bottom -
|
|
115
|
-
this._options.bounds.top +
|
|
116
|
-
1
|
|
117
|
-
: 0);
|
|
118
|
-
}
|
|
119
|
-
createAxis() {
|
|
120
|
-
this._xAxisList = this._options.xAxis.map((_, index) => new Axis({
|
|
121
|
-
type: AxisType.abscissa,
|
|
122
|
-
index,
|
|
123
|
-
chartOptions: this._options,
|
|
124
|
-
}));
|
|
125
|
-
this._yAxisList = this._options.yAxis.map((_, index) => {
|
|
126
|
-
const axis = new Axis({
|
|
127
|
-
type: AxisType.ordinatus,
|
|
128
|
-
index,
|
|
129
|
-
chartOptions: this._options,
|
|
130
|
-
height: this._height,
|
|
131
|
-
});
|
|
132
|
-
return axis;
|
|
133
|
-
});
|
|
134
|
-
const nonTitleOffset = 6;
|
|
135
|
-
this.offsetNonOpposite = d3.reduce(this._yAxisList.filter((_) => _.options?.opposite !== true && _.options?.visible), (sum, axis) => {
|
|
136
|
-
const offset = sum +
|
|
137
|
-
axis.width +
|
|
138
|
-
(axis?.options?.title ? Axis.offsetFactor : nonTitleOffset);
|
|
139
|
-
axis.setOffset(offset);
|
|
140
|
-
return offset;
|
|
141
|
-
}, 0);
|
|
142
|
-
this.offsetOpposite = d3.reduce(this._yAxisList.filter((_) => _.options?.opposite === true && _.options?.visible), (sum, axis) => {
|
|
143
|
-
const offset = sum +
|
|
144
|
-
axis.width +
|
|
145
|
-
(axis?.options?.title ? Axis.offsetFactor : nonTitleOffset);
|
|
146
|
-
axis.setOffset(offset);
|
|
147
|
-
return offset;
|
|
148
|
-
}, 0);
|
|
149
|
-
this.visibleChartWindowWidth = this.caluclateChartWidth();
|
|
150
|
-
}
|
|
151
|
-
_redraw() {
|
|
152
|
-
this.drawPlotBands();
|
|
153
|
-
this.drawPlotLines();
|
|
154
|
-
this.drawChart();
|
|
155
|
-
this.drawAxis();
|
|
156
|
-
this.drawGridLines();
|
|
157
|
-
this.drawAnnotations();
|
|
158
|
-
}
|
|
159
|
-
addZoom() {
|
|
160
|
-
if (this._options?.zoom?.enable) {
|
|
161
|
-
const hasXZoom = [ZoomType.x, ZoomType.xy].includes(this._options.zoom.zoomType);
|
|
162
|
-
const hasYZoom = [ZoomType.y, ZoomType.xy].includes(this._options.zoom.zoomType);
|
|
163
|
-
this._chart.call(this._zoom.on('start end zoom', (event) => {
|
|
164
|
-
if (hasXZoom) {
|
|
165
|
-
for (const [key, value] of this._clonedX.entries()) {
|
|
166
|
-
const rescaled = event.transform.rescaleX(value);
|
|
167
|
-
this._xScales.set(key, rescaled);
|
|
168
|
-
if (event.sourceEvent) {
|
|
169
|
-
this.zoom$.next({
|
|
170
|
-
domain: rescaled.domain(),
|
|
171
|
-
zoomTransform: event.transform,
|
|
172
|
-
zoomType: ZoomType.x,
|
|
173
|
-
event,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (hasYZoom) {
|
|
179
|
-
for (const [key, value] of this._clonedY.entries()) {
|
|
180
|
-
const rescaled = event.transform.rescaleY(value);
|
|
181
|
-
this._yScales.set(key, rescaled);
|
|
182
|
-
if (event.type === 'zoom') {
|
|
183
|
-
if (event.sourceEvent) {
|
|
184
|
-
this.zoom$.next({
|
|
185
|
-
domain: rescaled.domain(),
|
|
186
|
-
zoomTransform: event.transform,
|
|
187
|
-
zoomType: ZoomType.y,
|
|
188
|
-
event,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (event.type === 'end') {
|
|
195
|
-
this._commonZoomTransform = event.transform;
|
|
196
|
-
}
|
|
197
|
-
this._redraw();
|
|
198
|
-
}));
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
addAxesZoom() {
|
|
202
|
-
this._chart.selectAll('.zoom-behavior').remove();
|
|
203
|
-
[...this._yAxisList, ...this._xAxisList]
|
|
204
|
-
.filter((axis) => axis.options.visible && axis.options.zoom)
|
|
205
|
-
.forEach((axis) => {
|
|
206
|
-
const foundNode = this._chart
|
|
207
|
-
.select(`[data-${axis.type === AxisType.abscissa ? 'x' : 'y'}-scale-id='${axis.index}']`)
|
|
208
|
-
.node();
|
|
209
|
-
if (!foundNode) {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
const bBox = foundNode.getBBox();
|
|
213
|
-
const translateX = axis.type === AxisType.abscissa
|
|
214
|
-
? this.offsetNonOpposite
|
|
215
|
-
? this.offsetNonOpposite
|
|
216
|
-
: this._options.bounds.left + this.offsetNonOpposite
|
|
217
|
-
: axis.options.opposite
|
|
218
|
-
? this._width - axis.offset
|
|
219
|
-
: axis.offset - bBox.width;
|
|
220
|
-
const zoom = d3
|
|
221
|
-
.zoom()
|
|
222
|
-
.scaleExtent([1, Infinity])
|
|
223
|
-
.on('zoom end', (event) => {
|
|
224
|
-
if (axis.type === AxisType.abscissa) {
|
|
225
|
-
const scale = this._clonedX.get(axis.index);
|
|
226
|
-
this._xScales.set(axis.index, event.transform.rescaleX(scale));
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
const scale = this._clonedY.get(axis.index);
|
|
230
|
-
this._yScales.set(axis.index, event.transform.rescaleY(scale));
|
|
231
|
-
}
|
|
232
|
-
if (event.type === 'end') {
|
|
233
|
-
if (axis.type === AxisType.ordinatus) {
|
|
234
|
-
this._zoomYCache.set(axis.index, event.transform);
|
|
235
|
-
}
|
|
236
|
-
if (axis.type === AxisType.abscissa) {
|
|
237
|
-
this._zoomXCache.set(axis.index, event.transform);
|
|
238
|
-
this._chart.call(this._zoom.transform, event.transform);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
this._redraw();
|
|
242
|
-
});
|
|
243
|
-
const restoredTransform = axis.type === AxisType.ordinatus
|
|
244
|
-
? this._zoomYCache.get(axis.index)
|
|
245
|
-
: this._zoomXCache.get(axis.index);
|
|
246
|
-
this._chart
|
|
247
|
-
.append('rect')
|
|
248
|
-
.attr('class', 'zoom-behavior')
|
|
249
|
-
.attr('height', bBox.height)
|
|
250
|
-
.attr('width', bBox.width)
|
|
251
|
-
.attr('transform', `translate(${translateX}, ${axis.type === AxisType.abscissa
|
|
252
|
-
? this._height - this._options.bounds.bottom
|
|
253
|
-
: this._options.bounds.top})`)
|
|
254
|
-
.style('opacity', '0')
|
|
255
|
-
.style('pointer-events', 'all')
|
|
256
|
-
.call(zoom.transform, restoredTransform ?? d3.zoomIdentity)
|
|
257
|
-
.call(zoom);
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
selectNode(element) {
|
|
261
|
-
this._container = element;
|
|
262
|
-
d3.select(element.nativeElement).selectAll('.tooltip-chart').remove();
|
|
263
|
-
d3.select(element.nativeElement).selectAll('svg').remove();
|
|
264
|
-
d3.select(element.nativeElement).selectAll('canvas').remove();
|
|
265
|
-
this._chart = d3
|
|
266
|
-
.select(element.nativeElement)
|
|
267
|
-
.append('svg')
|
|
268
|
-
.attr('position', 'relative')
|
|
269
|
-
.style('z-index', 0);
|
|
270
|
-
this._canvas = d3
|
|
271
|
-
.select(element.nativeElement)
|
|
272
|
-
.append('canvas')
|
|
273
|
-
.attr('class', 'main-canvas')
|
|
274
|
-
.style('transform', 'translate(35, 0)')
|
|
275
|
-
.style('position', 'absolute')
|
|
276
|
-
.style('z-index', 1);
|
|
277
|
-
}
|
|
278
|
-
drawAnnotations() {
|
|
279
|
-
this._chart.selectAll('.annotations').remove();
|
|
280
|
-
const annotations = this._options.annotations?.map((annotation) => {
|
|
281
|
-
const x = this._xScales.get(annotation.xAxisIndex);
|
|
282
|
-
const y = this._yScales.get(annotation.yAxisIndex);
|
|
283
|
-
return {
|
|
284
|
-
note: annotation.note,
|
|
285
|
-
connector: annotation.connector,
|
|
286
|
-
x: x(annotation.point?.x),
|
|
287
|
-
y: y(annotation.point?.y),
|
|
288
|
-
dx: annotation.dx,
|
|
289
|
-
dy: annotation.dy,
|
|
290
|
-
type: annotation.type,
|
|
291
|
-
className: annotation.className,
|
|
292
|
-
};
|
|
293
|
-
});
|
|
294
|
-
const makeAnnotations = d3annotation
|
|
295
|
-
.annotation()
|
|
296
|
-
.annotations(annotations ?? []);
|
|
297
|
-
this._chart
|
|
298
|
-
.append('g')
|
|
299
|
-
.attr('class', 'annotations')
|
|
300
|
-
.attr('clip-path', `url(#draw-window-${this.uniqId})`)
|
|
301
|
-
.call(makeAnnotations)
|
|
302
|
-
.lower();
|
|
303
|
-
}
|
|
304
|
-
drawPlotLines() {
|
|
305
|
-
this._chart.selectAll('.plotlines').remove();
|
|
306
|
-
const plotlineGroup = this._chart
|
|
307
|
-
.append('g')
|
|
308
|
-
.attr('class', 'plotlines')
|
|
309
|
-
.style('shape-rendering', 'crispEdges')
|
|
310
|
-
.attr('clip-path', `url(#draw-window-${this.uniqId})`);
|
|
311
|
-
this._xAxisList
|
|
312
|
-
.filter((_) => _.options.plotLines.length > 0)
|
|
313
|
-
.forEach((axis) => {
|
|
314
|
-
const [min, max] = axis.extent;
|
|
315
|
-
const x = this._xScales.get(axis.index);
|
|
316
|
-
const plotlinesPoints = axis.options.plotLines;
|
|
317
|
-
const getTextCenterPointPx = (d, idx) => x((d?.value +
|
|
318
|
-
(plotlinesPoints[idx - 1]
|
|
319
|
-
? plotlinesPoints[idx - 1]?.value
|
|
320
|
-
: 0)) /
|
|
321
|
-
2);
|
|
322
|
-
const opacity = (d, idx) => {
|
|
323
|
-
const displayWidth = 20;
|
|
324
|
-
const width = x(d?.value) -
|
|
325
|
-
x(plotlinesPoints[idx - 1] ? plotlinesPoints[idx - 1]?.value : 0);
|
|
326
|
-
return width <= displayWidth ? 0 : 1;
|
|
327
|
-
};
|
|
328
|
-
plotlineGroup
|
|
329
|
-
.selectAll('.label')
|
|
330
|
-
.data(plotlinesPoints)
|
|
331
|
-
.join('text')
|
|
332
|
-
.attr('class', 'label font-body-3 fill-text-70')
|
|
333
|
-
.attr('x', getTextCenterPointPx)
|
|
334
|
-
.attr('y', (d) => this._height / 2)
|
|
335
|
-
.attr('text-anchor', 'middle')
|
|
336
|
-
.attr('dominant-baseline', 'central')
|
|
337
|
-
.attr('transform', (d, idx) => `rotate(-90, ${getTextCenterPointPx(d, idx)}, ${this._height / 2})`)
|
|
338
|
-
.text((d) => d?.label ?? '')
|
|
339
|
-
.style('opacity', opacity);
|
|
340
|
-
plotlineGroup
|
|
341
|
-
.selectAll('.plotline')
|
|
342
|
-
.data(plotlinesPoints)
|
|
343
|
-
.join('line')
|
|
344
|
-
.attr('class', 'plotline')
|
|
345
|
-
.attr('data-plotline-id', (d) => d.id)
|
|
346
|
-
.attr('x1', (d) => x(d.value))
|
|
347
|
-
.attr('x2', (d) => x(d.value))
|
|
348
|
-
.attr('y1', 0)
|
|
349
|
-
.attr('y2', this._height -
|
|
350
|
-
this._options.bounds.top -
|
|
351
|
-
this._options.bounds.bottom)
|
|
352
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
353
|
-
.style('stroke-width', (d) => d.width)
|
|
354
|
-
.style('stroke', (d) => d.color)
|
|
355
|
-
.style('stroke-dasharray', (d) => (d.dashed ? '8, 8' : '0, 0'));
|
|
356
|
-
const emit = (event, plotLine) => {
|
|
357
|
-
this.plotLinesMove$.next({ event, target: plotLine });
|
|
358
|
-
};
|
|
359
|
-
plotlineGroup
|
|
360
|
-
.selectAll('.drag-plotline')
|
|
361
|
-
.data(plotlinesPoints)
|
|
362
|
-
.join('line')
|
|
363
|
-
.attr('class', 'drag-plotline')
|
|
364
|
-
.attr('x1', (d) => x(d.value))
|
|
365
|
-
.attr('x2', (d) => x(d.value))
|
|
366
|
-
.attr('y1', 0)
|
|
367
|
-
.attr('y2', this._height -
|
|
368
|
-
this._options.bounds.top -
|
|
369
|
-
this._options.bounds.bottom)
|
|
370
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
371
|
-
.style('stroke-width', 8)
|
|
372
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
373
|
-
.style('cursor', 'col-resize')
|
|
374
|
-
.call(d3
|
|
375
|
-
.drag()
|
|
376
|
-
.on('drag', function (event, d) {
|
|
377
|
-
const group = d3.select(this).node().parentElement;
|
|
378
|
-
const draggedPlotLine = d3
|
|
379
|
-
.select(group)
|
|
380
|
-
.select(`[data-plotline-id='${d.id}']`);
|
|
381
|
-
d.value = x.invert(event.x);
|
|
382
|
-
const minValue = d.min ?? min;
|
|
383
|
-
const maxValue = d.max ?? max;
|
|
384
|
-
const borderLeftReached = d.value <= minValue;
|
|
385
|
-
const borderRightReached = d.value >= maxValue;
|
|
386
|
-
if (borderLeftReached) {
|
|
387
|
-
d.value = minValue;
|
|
388
|
-
}
|
|
389
|
-
if (borderRightReached) {
|
|
390
|
-
d.value = maxValue;
|
|
391
|
-
}
|
|
392
|
-
d3.select(this).attr('x1', x(d.value)).attr('x2', x(d.value));
|
|
393
|
-
draggedPlotLine.attr('x1', x(d.value)).attr('x2', x(d.value));
|
|
394
|
-
emit(event, d);
|
|
395
|
-
})
|
|
396
|
-
.on('end', (event, d) => {
|
|
397
|
-
emit(event, d);
|
|
398
|
-
}));
|
|
399
|
-
});
|
|
400
|
-
this._yAxisList
|
|
401
|
-
.filter((_) => _.options.plotLines.length > 0)
|
|
402
|
-
.forEach((axis) => {
|
|
403
|
-
const [min, max] = axis.extent;
|
|
404
|
-
const y = this._yScales.get(axis.index);
|
|
405
|
-
const plotlinesPoints = axis.options.plotLines;
|
|
406
|
-
plotlineGroup
|
|
407
|
-
.selectAll('.plotline')
|
|
408
|
-
.data(plotlinesPoints)
|
|
409
|
-
.join('line')
|
|
410
|
-
.attr('class', 'plotline')
|
|
411
|
-
.attr('data-plotline-id', (d) => d.id)
|
|
412
|
-
.attr('y1', (d) => y(d.value))
|
|
413
|
-
.attr('y2', (d) => y(d.value))
|
|
414
|
-
.attr('x1', 0)
|
|
415
|
-
.attr('x2', this._width - this._options.bounds.left - this._options.bounds.right)
|
|
416
|
-
.attr('transform', `translate(${this._options.bounds.left}, 0)`)
|
|
417
|
-
.style('stroke-width', (d) => d.width)
|
|
418
|
-
.style('stroke', (d) => d.color)
|
|
419
|
-
.style('stroke-dasharray', (d) => (d.dashed ? '8, 8' : '0, 0'));
|
|
420
|
-
const emit = (event, plotLine) => {
|
|
421
|
-
this.plotLinesMove$.next({ event, target: plotLine });
|
|
422
|
-
};
|
|
423
|
-
plotlineGroup
|
|
424
|
-
.selectAll('.drag-plotline')
|
|
425
|
-
.data(plotlinesPoints)
|
|
426
|
-
.join('line')
|
|
427
|
-
.attr('class', 'drag-plotline')
|
|
428
|
-
.attr('y1', (d) => y(d.value))
|
|
429
|
-
.attr('y2', (d) => y(d.value))
|
|
430
|
-
.attr('x1', 0)
|
|
431
|
-
.attr('x2', this._width - this._options.bounds.left - this._options.bounds.right)
|
|
432
|
-
.attr('transform', `translate(${this._options.bounds.left}, 0)`)
|
|
433
|
-
.style('stroke-width', 8)
|
|
434
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
435
|
-
.style('cursor', 'row-resize')
|
|
436
|
-
.call(d3
|
|
437
|
-
.drag()
|
|
438
|
-
.on('drag', function (event, d) {
|
|
439
|
-
const group = d3.select(this).node().parentElement;
|
|
440
|
-
const draggedPlotLine = d3
|
|
441
|
-
.select(group)
|
|
442
|
-
.select(`[data-plotline-id='${d.id}']`);
|
|
443
|
-
d.value = y.invert(event.y);
|
|
444
|
-
const minValue = d.min ?? min;
|
|
445
|
-
const maxValue = d.max ?? max;
|
|
446
|
-
const borderTopReached = d.value <= minValue;
|
|
447
|
-
const borderBottomReached = d.value >= maxValue;
|
|
448
|
-
if (borderTopReached) {
|
|
449
|
-
d.value = minValue;
|
|
450
|
-
}
|
|
451
|
-
if (borderBottomReached) {
|
|
452
|
-
d.value = maxValue;
|
|
453
|
-
}
|
|
454
|
-
d3.select(this).attr('y1', y(d.value)).attr('y2', y(d.value));
|
|
455
|
-
draggedPlotLine.attr('y1', y(d.value)).attr('y2', y(d.value));
|
|
456
|
-
emit(event, d);
|
|
457
|
-
})
|
|
458
|
-
.on('end', (event, d) => {
|
|
459
|
-
emit(event, d);
|
|
460
|
-
}));
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
drawPlotBands() {
|
|
464
|
-
this._chart.selectAll('.plotbands').remove();
|
|
465
|
-
const plotBandGroup = this._chart
|
|
466
|
-
.append('g')
|
|
467
|
-
.attr('class', 'plotbands')
|
|
468
|
-
.attr('clip-path', `url(#draw-window-${this.uniqId})`);
|
|
469
|
-
this._xAxisList
|
|
470
|
-
.filter((_) => _.options.plotBands.length > 0)
|
|
471
|
-
.forEach((axis) => {
|
|
472
|
-
const x = this._xScales.get(axis.index);
|
|
473
|
-
const [min, max] = axis.extent;
|
|
474
|
-
const plotband = plotBandGroup
|
|
475
|
-
.append('g')
|
|
476
|
-
.style('shape-rendering', 'crispEdges');
|
|
477
|
-
const plotBandHeight = this._height - this._options.bounds.top - this._options.bounds.bottom;
|
|
478
|
-
const emit = (event, plotBand) => {
|
|
479
|
-
this.plotBandsMove$.next({
|
|
480
|
-
event,
|
|
481
|
-
target: plotBand,
|
|
482
|
-
});
|
|
483
|
-
};
|
|
484
|
-
plotband
|
|
485
|
-
.selectAll('rect')
|
|
486
|
-
.data(axis.options.plotBands)
|
|
487
|
-
.on('start', (_) => {
|
|
488
|
-
this._chart.selectAll('.marker').style('display', 'none');
|
|
489
|
-
d3.select(this._container.nativeElement)
|
|
490
|
-
.select('.tooltip-chart')
|
|
491
|
-
.style('display', 'none');
|
|
492
|
-
})
|
|
493
|
-
.join('rect')
|
|
494
|
-
.attr('data-plotband-id', (d) => d.id)
|
|
495
|
-
.attr('x', (d) => x(d.from))
|
|
496
|
-
.attr('y', 0)
|
|
497
|
-
.attr('width', (d) => Math.abs(x(d.to) - x(d.from)))
|
|
498
|
-
.attr('fill', (d) => {
|
|
499
|
-
if (d.image) {
|
|
500
|
-
return `url(#${d.image})`;
|
|
501
|
-
}
|
|
502
|
-
return d.color;
|
|
503
|
-
})
|
|
504
|
-
.style('opacity', (d) => d.opacity ?? 1)
|
|
505
|
-
.attr('height', plotBandHeight > 0 ? plotBandHeight : 0)
|
|
506
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`);
|
|
507
|
-
plotband
|
|
508
|
-
.selectAll('.line-left')
|
|
509
|
-
.data(axis.options.plotBands)
|
|
510
|
-
.join('line')
|
|
511
|
-
.attr('data-line-left-id', (d) => d.id)
|
|
512
|
-
.attr('class', 'line-left')
|
|
513
|
-
.attr('x1', (d) => x(d.from))
|
|
514
|
-
.attr('x2', (d) => x(d.from))
|
|
515
|
-
.attr('y1', 0)
|
|
516
|
-
.attr('y2', this._height -
|
|
517
|
-
this._options.bounds.top -
|
|
518
|
-
this._options.bounds.bottom)
|
|
519
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
520
|
-
.style('stroke-width', 1)
|
|
521
|
-
.style('stroke-dasharray', '8, 8')
|
|
522
|
-
.style('stroke', 'var(--color-text-90)')
|
|
523
|
-
.style('opacity', (d) => (d.showGrabbers ? 1 : 0));
|
|
524
|
-
plotband
|
|
525
|
-
.selectAll('.drag-left')
|
|
526
|
-
.data(axis.options.plotBands)
|
|
527
|
-
.join('line')
|
|
528
|
-
.attr('x1', (d) => x(d.from))
|
|
529
|
-
.attr('x2', (d) => x(d.from))
|
|
530
|
-
.attr('y1', 0)
|
|
531
|
-
.attr('y2', this._height -
|
|
532
|
-
this._options.bounds.top -
|
|
533
|
-
this._options.bounds.bottom)
|
|
534
|
-
.style('display', (d) => (d?.resizable ? 'unset' : 'none'))
|
|
535
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
536
|
-
.style('stroke-width', 8)
|
|
537
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
538
|
-
.style('cursor', 'col-resize')
|
|
539
|
-
.call(d3
|
|
540
|
-
.drag()
|
|
541
|
-
.on('drag', function (event, d) {
|
|
542
|
-
const group = d3.select(this).node().parentElement;
|
|
543
|
-
const draggedBand = d3
|
|
544
|
-
.select(group)
|
|
545
|
-
.select(`[data-plotband-id='${d.id}']`);
|
|
546
|
-
const draggedLine = d3
|
|
547
|
-
.select(group)
|
|
548
|
-
.select(`[data-line-left-id='${d.id}']`);
|
|
549
|
-
d.from = x.invert(event.x);
|
|
550
|
-
const minValue = d.min ?? min;
|
|
551
|
-
const borderReached = d.from <= minValue;
|
|
552
|
-
if (borderReached) {
|
|
553
|
-
d.from = minValue;
|
|
554
|
-
}
|
|
555
|
-
if (d.from >= d.to) {
|
|
556
|
-
d.from = d.to;
|
|
557
|
-
}
|
|
558
|
-
d3.select(this).attr('x1', x(d.from)).attr('x2', x(d.from));
|
|
559
|
-
draggedBand
|
|
560
|
-
.attr('x', x(d.from))
|
|
561
|
-
.attr('width', x(d.to) - x(d.from));
|
|
562
|
-
draggedLine.attr('x1', x(d.from)).attr('x2', x(d.from));
|
|
563
|
-
emit(event, d);
|
|
564
|
-
})
|
|
565
|
-
.on('end', (event, d) => emit(event, d)));
|
|
566
|
-
plotband
|
|
567
|
-
.selectAll('.line-right')
|
|
568
|
-
.data(axis.options.plotBands)
|
|
569
|
-
.join('line')
|
|
570
|
-
.attr('data-line-right-id', (d) => d.id)
|
|
571
|
-
.attr('class', 'line-right')
|
|
572
|
-
.attr('x1', (d) => x(d.to))
|
|
573
|
-
.attr('x2', (d) => x(d.to))
|
|
574
|
-
.attr('y1', 0)
|
|
575
|
-
.attr('y2', this._height -
|
|
576
|
-
this._options.bounds.top -
|
|
577
|
-
this._options.bounds.bottom)
|
|
578
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
579
|
-
.style('stroke-width', 1)
|
|
580
|
-
.style('stroke-dasharray', '8, 8')
|
|
581
|
-
.style('stroke', 'var(--color-text-90)')
|
|
582
|
-
.style('opacity', (d) => (d.showGrabbers ? 1 : 0));
|
|
583
|
-
plotband
|
|
584
|
-
.selectAll('.drag-right')
|
|
585
|
-
.data(axis.options.plotBands)
|
|
586
|
-
.join('line')
|
|
587
|
-
.attr('class', 'drag-right')
|
|
588
|
-
.style('display', (d) => (d?.resizable ? 'unset' : 'none'))
|
|
589
|
-
.attr('x1', (d) => x(d.to))
|
|
590
|
-
.attr('x2', (d) => x(d.to))
|
|
591
|
-
.attr('y1', 0)
|
|
592
|
-
.attr('y2', this._height -
|
|
593
|
-
this._options.bounds.top -
|
|
594
|
-
this._options.bounds.bottom)
|
|
595
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
596
|
-
.style('stroke-width', 8)
|
|
597
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
598
|
-
.style('cursor', 'col-resize')
|
|
599
|
-
.call(d3
|
|
600
|
-
.drag()
|
|
601
|
-
.on('drag', function (event, d) {
|
|
602
|
-
const group = d3.select(this).node().parentElement;
|
|
603
|
-
const draggedBand = d3
|
|
604
|
-
.select(group)
|
|
605
|
-
.select(`[data-plotband-id='${d.id}']`);
|
|
606
|
-
const draggedLine = d3
|
|
607
|
-
.select(group)
|
|
608
|
-
.select(`[data-line-right-id='${d.id}']`);
|
|
609
|
-
d.to = x.invert(event.x);
|
|
610
|
-
const maxValue = d.max ?? max;
|
|
611
|
-
const borderReached = d.to >= maxValue;
|
|
612
|
-
if (borderReached) {
|
|
613
|
-
d.to = maxValue;
|
|
614
|
-
}
|
|
615
|
-
if (d.to <= d.from) {
|
|
616
|
-
d.to = d.from;
|
|
617
|
-
}
|
|
618
|
-
d3.select(this).attr('x1', x(d.to)).attr('x2', x(d.to));
|
|
619
|
-
draggedBand.attr('width', x(d.to) - x(d.from));
|
|
620
|
-
draggedLine.attr('x1', x(d.to)).attr('x2', x(d.to));
|
|
621
|
-
emit(event, d);
|
|
622
|
-
})
|
|
623
|
-
.on('end', (event, d) => emit(event, d)));
|
|
624
|
-
});
|
|
625
|
-
this._yAxisList
|
|
626
|
-
.filter((_) => _.options.plotBands.length > 0)
|
|
627
|
-
.forEach((axis) => {
|
|
628
|
-
const y = this._yScales.get(axis.index);
|
|
629
|
-
const [min, max] = axis.extent;
|
|
630
|
-
const plotband = plotBandGroup
|
|
631
|
-
.append('g')
|
|
632
|
-
.style('shape-rendering', 'crispEdges');
|
|
633
|
-
const plotBandWidth = this._width - this._options.bounds.left - this._options.bounds.right; // TODO add multiaxis support width
|
|
634
|
-
const emit = (event, plotBand) => {
|
|
635
|
-
this.plotBandsMove$.next({
|
|
636
|
-
event,
|
|
637
|
-
target: plotBand,
|
|
638
|
-
});
|
|
639
|
-
};
|
|
640
|
-
const dragPlotband = d3
|
|
641
|
-
.drag()
|
|
642
|
-
.subject(function () {
|
|
643
|
-
const element = d3.select(this);
|
|
644
|
-
return { y: element.attr('y') };
|
|
645
|
-
})
|
|
646
|
-
.on('start drag end', function (event, d) {
|
|
647
|
-
const element = d3.select(this);
|
|
648
|
-
const height = parseFloat(element.attr('height'));
|
|
649
|
-
d.to = y.invert(event.y + height);
|
|
650
|
-
d.from = y.invert(event.y);
|
|
651
|
-
const minValue = d.min ?? min;
|
|
652
|
-
const maxValue = d.max ?? max;
|
|
653
|
-
const borderReachedMin = d.from <= minValue;
|
|
654
|
-
const borderReachedMax = d.to >= maxValue;
|
|
655
|
-
if (borderReachedMin) {
|
|
656
|
-
d.to = y.invert(y(minValue) + height);
|
|
657
|
-
d.from = minValue;
|
|
658
|
-
}
|
|
659
|
-
if (borderReachedMax) {
|
|
660
|
-
d.to = maxValue;
|
|
661
|
-
d.from = y.invert(y(maxValue) - height);
|
|
662
|
-
}
|
|
663
|
-
element.attr('y', y(d.from));
|
|
664
|
-
const group = element.node().parentElement;
|
|
665
|
-
d3.select(group)
|
|
666
|
-
.select(`[data-line-left-id='${d.id}']`)
|
|
667
|
-
.attr('y1', y(d.from))
|
|
668
|
-
.attr('y2', y(d.from));
|
|
669
|
-
d3.select(group)
|
|
670
|
-
.select(`[data-grab-left-id='${d.id}']`)
|
|
671
|
-
.attr('y1', y(d.from))
|
|
672
|
-
.attr('y2', y(d.from));
|
|
673
|
-
d3.select(group)
|
|
674
|
-
.select(`[data-line-right-id='${d.id}']`)
|
|
675
|
-
.attr('y1', y(d.to))
|
|
676
|
-
.attr('y2', y(d.to));
|
|
677
|
-
d3.select(group)
|
|
678
|
-
.select(`[data-grab-right-id='${d.id}']`)
|
|
679
|
-
.attr('y1', y(d.to))
|
|
680
|
-
.attr('y2', y(d.to));
|
|
681
|
-
emit(event, d);
|
|
682
|
-
});
|
|
683
|
-
const leftGrabDrag = d3
|
|
684
|
-
.drag()
|
|
685
|
-
.on('drag', function (event, d) {
|
|
686
|
-
const group = d3.select(this).node().parentElement;
|
|
687
|
-
const draggedBand = d3
|
|
688
|
-
.select(group)
|
|
689
|
-
.select(`[data-plotband-id='${d.id}']`);
|
|
690
|
-
const draggedLine = d3
|
|
691
|
-
.select(group)
|
|
692
|
-
.select(`[data-line-left-id='${d.id}']`);
|
|
693
|
-
d.from = y.invert(event.y);
|
|
694
|
-
const minValue = d.min ?? min;
|
|
695
|
-
const borderReached = d.from <= minValue;
|
|
696
|
-
if (borderReached) {
|
|
697
|
-
d.from = minValue;
|
|
698
|
-
}
|
|
699
|
-
if (d.from >= d.to) {
|
|
700
|
-
d.from = d.to;
|
|
701
|
-
}
|
|
702
|
-
d3.select(this).attr('y1', y(d.from)).attr('y2', y(d.from));
|
|
703
|
-
draggedBand
|
|
704
|
-
.attr('y', y(d.from))
|
|
705
|
-
.attr('height', Math.abs(y(d.to) - y(d.from)));
|
|
706
|
-
draggedLine.attr('y1', y(d.from)).attr('y2', y(d.from));
|
|
707
|
-
emit(event, d);
|
|
708
|
-
})
|
|
709
|
-
.on('end', (event, d) => emit(event, d));
|
|
710
|
-
const rightGrabDrag = d3
|
|
711
|
-
.drag()
|
|
712
|
-
.on('drag', function (event, d) {
|
|
713
|
-
const group = d3.select(this).node().parentElement;
|
|
714
|
-
const draggedBand = d3
|
|
715
|
-
.select(group)
|
|
716
|
-
.select(`[data-plotband-id='${d.id}']`);
|
|
717
|
-
const draggedLine = d3
|
|
718
|
-
.select(group)
|
|
719
|
-
.select(`[data-line-right-id='${d.id}']`);
|
|
720
|
-
d.to = y.invert(event.y);
|
|
721
|
-
const maxValue = d.max ?? max;
|
|
722
|
-
const borderReached = d.to >= maxValue;
|
|
723
|
-
if (borderReached) {
|
|
724
|
-
d.to = maxValue;
|
|
725
|
-
}
|
|
726
|
-
if (d.to <= d.from) {
|
|
727
|
-
d.to = d.from;
|
|
728
|
-
}
|
|
729
|
-
d3.select(this).attr('y1', y(d.to)).attr('y2', y(d.to));
|
|
730
|
-
draggedBand
|
|
731
|
-
.attr('y', y(d.from))
|
|
732
|
-
.attr('height', Math.abs(y(d.to) - y(d.from)));
|
|
733
|
-
draggedLine.attr('y1', y(d.to)).attr('y2', y(d.to));
|
|
734
|
-
emit(event, d);
|
|
735
|
-
})
|
|
736
|
-
.on('end', (event, d) => emit(event, d));
|
|
737
|
-
plotband
|
|
738
|
-
.selectAll('rect')
|
|
739
|
-
.data(axis.options.plotBands)
|
|
740
|
-
.join('rect')
|
|
741
|
-
.attr('data-plotband-id', (d) => d.id)
|
|
742
|
-
.attr('x', 0)
|
|
743
|
-
.attr('y', (d) => y(d.from))
|
|
744
|
-
.attr('width', (d) => plotBandWidth)
|
|
745
|
-
.attr('fill', (d) => {
|
|
746
|
-
if (d.image) {
|
|
747
|
-
return `url(#${d.image})`;
|
|
748
|
-
}
|
|
749
|
-
return d.color;
|
|
750
|
-
})
|
|
751
|
-
.style('opacity', (d) => d.opacity ?? 1)
|
|
752
|
-
.attr('height', (d) => Math.abs(y(d.to) - y(d.from)))
|
|
753
|
-
.attr('cursor', (d) => (d.draggable ? 'move' : 'default'));
|
|
754
|
-
plotband
|
|
755
|
-
.selectAll('.line-left')
|
|
756
|
-
.data(axis.options.plotBands.filter((d) => d.resizable))
|
|
757
|
-
.join('line')
|
|
758
|
-
.attr('data-line-left-id', (d) => d.id)
|
|
759
|
-
.attr('class', 'line-left')
|
|
760
|
-
.attr('y1', (d) => y(d.from))
|
|
761
|
-
.attr('y2', (d) => y(d.from))
|
|
762
|
-
.attr('x1', 0)
|
|
763
|
-
.attr('x2', plotBandWidth)
|
|
764
|
-
.style('stroke-width', 1)
|
|
765
|
-
.style('stroke-dasharray', '8, 8')
|
|
766
|
-
.style('stroke', 'var(--color-text-90)')
|
|
767
|
-
.style('opacity', (d) => (d.showGrabbers ? 1 : 0));
|
|
768
|
-
plotband
|
|
769
|
-
.selectAll('.drag-left')
|
|
770
|
-
.data(axis.options.plotBands.filter((d) => d.resizable))
|
|
771
|
-
.join('line')
|
|
772
|
-
.attr('data-grab-left-id', (d) => d.id)
|
|
773
|
-
.attr('y1', (d) => y(d.from))
|
|
774
|
-
.attr('y2', (d) => y(d.from))
|
|
775
|
-
.attr('x1', 0)
|
|
776
|
-
.attr('x2', plotBandWidth)
|
|
777
|
-
.style('stroke-width', 8)
|
|
778
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
779
|
-
.style('cursor', (d) => (d.resizable ? 'row-resize' : 'default'));
|
|
780
|
-
plotband
|
|
781
|
-
.selectAll('.line-right')
|
|
782
|
-
.data(axis.options.plotBands.filter((d) => d.resizable))
|
|
783
|
-
.join('line')
|
|
784
|
-
.attr('data-line-right-id', (d) => d.id)
|
|
785
|
-
.attr('class', 'line-right')
|
|
786
|
-
.attr('y1', (d) => y(d.to))
|
|
787
|
-
.attr('y2', (d) => y(d.to))
|
|
788
|
-
.attr('x1', 0)
|
|
789
|
-
.attr('x2', plotBandWidth)
|
|
790
|
-
.style('stroke-width', 1)
|
|
791
|
-
.style('stroke-dasharray', '8, 8')
|
|
792
|
-
.style('stroke', 'var(--color-text-90)')
|
|
793
|
-
.style('opacity', (d) => (d.showGrabbers ? 1 : 0));
|
|
794
|
-
plotband
|
|
795
|
-
.selectAll('.drag-right')
|
|
796
|
-
.data(axis.options.plotBands.filter((d) => d.resizable))
|
|
797
|
-
.join('line')
|
|
798
|
-
.attr('class', 'drag-right')
|
|
799
|
-
.attr('data-grab-right-id', (d) => d.id)
|
|
800
|
-
.attr('y1', (d) => y(d.to))
|
|
801
|
-
.attr('y2', (d) => y(d.to))
|
|
802
|
-
.attr('x1', 0)
|
|
803
|
-
.attr('x2', plotBandWidth)
|
|
804
|
-
.style('stroke-width', 8)
|
|
805
|
-
.style('stroke', 'rgba(0, 0, 0, 0)')
|
|
806
|
-
.style('cursor', (d) => (d.resizable ? 'row-resize' : 'default'));
|
|
807
|
-
axis.options.plotBands.forEach((_) => {
|
|
808
|
-
if (_.draggable) {
|
|
809
|
-
plotband.select(`[data-plotband-id='${_.id}']`).call(dragPlotband);
|
|
810
|
-
}
|
|
811
|
-
if (_.resizable) {
|
|
812
|
-
plotband.select(`[data-grab-left-id='${_.id}']`).call(leftGrabDrag);
|
|
813
|
-
plotband
|
|
814
|
-
.select(`[data-grab-right-id='${_.id}']`)
|
|
815
|
-
.call(rightGrabDrag);
|
|
816
|
-
}
|
|
817
|
-
});
|
|
818
|
-
});
|
|
819
|
-
}
|
|
820
|
-
drawChart() {
|
|
821
|
-
const series = this._options.series?.filter((_) => _.visible);
|
|
822
|
-
this._chart.selectAll('.series').remove();
|
|
823
|
-
if (!series || series.length < 1) {
|
|
824
|
-
d3.select(this._container.nativeElement)
|
|
825
|
-
.select('canvas')
|
|
826
|
-
.style('display', 'none');
|
|
827
|
-
}
|
|
828
|
-
const group = this._chart
|
|
829
|
-
.append('g')
|
|
830
|
-
.attr('class', 'series')
|
|
831
|
-
.attr('clip-path', `url(#draw-window-${this.uniqId})`);
|
|
832
|
-
series?.forEach((seriesItem, index) => {
|
|
833
|
-
if (seriesItem.renderTo === 'canvas') {
|
|
834
|
-
d3.select(this._container.nativeElement)
|
|
835
|
-
.select('canvas')
|
|
836
|
-
.style('display', null);
|
|
837
|
-
d3.select(this._container.nativeElement)
|
|
838
|
-
.select('svg')
|
|
839
|
-
.style('position', 'absolute');
|
|
840
|
-
}
|
|
841
|
-
else {
|
|
842
|
-
d3.select(this._container.nativeElement)
|
|
843
|
-
.select('canvas')
|
|
844
|
-
.style('display', 'none');
|
|
845
|
-
}
|
|
846
|
-
if (!this._xScales.has(seriesItem.xAxisIndex) ||
|
|
847
|
-
!this._yScales.has(seriesItem.yAxisIndex)) {
|
|
848
|
-
return;
|
|
849
|
-
}
|
|
850
|
-
const foundX = this._xScales.get(seriesItem.xAxisIndex);
|
|
851
|
-
const foundY = this._yScales.get(seriesItem.yAxisIndex);
|
|
852
|
-
const drawer = seriesItem.drawer != null
|
|
853
|
-
? seriesItem.drawer
|
|
854
|
-
: defaultDrawerMapping.get(seriesItem.type);
|
|
855
|
-
if (!drawer) {
|
|
856
|
-
throw new Error(`No drawer for series ${seriesItem.name}, type ${SeriesType[seriesItem.type]}`);
|
|
857
|
-
}
|
|
858
|
-
if (seriesItem.renderTo === 'canvas') {
|
|
859
|
-
const context = this._canvas.node().getContext('2d');
|
|
860
|
-
context.clearRect(0, 0, this._width, this._height);
|
|
861
|
-
}
|
|
862
|
-
let [xMin, xMax] = foundX.domain();
|
|
863
|
-
let [yMin, yMax] = foundY.domain();
|
|
864
|
-
xMin = xMin instanceof Date ? xMin.getTime() : xMin;
|
|
865
|
-
xMax = xMax instanceof Date ? xMax.getTime() : xMax;
|
|
866
|
-
yMin = yMin instanceof Date ? yMin.getTime() : yMin;
|
|
867
|
-
yMax = yMax instanceof Date ? yMax.getTime() : yMax;
|
|
868
|
-
const visiblePoints = (point, idx, arr) => (point.x <= xMax ||
|
|
869
|
-
point.x1 <= xMax ||
|
|
870
|
-
(arr[idx - 1] && arr[idx - 1].x <= xMax) ||
|
|
871
|
-
(arr[idx - 1] && arr[idx - 1].x1 <= xMax)) &&
|
|
872
|
-
(point.x >= xMin ||
|
|
873
|
-
point.x1 >= xMin ||
|
|
874
|
-
(arr[idx + 1] && arr[idx + 1].x >= xMin) ||
|
|
875
|
-
(arr[idx + 1] && arr[idx + 1].x1 >= xMin)) &&
|
|
876
|
-
(point.y <= yMax ||
|
|
877
|
-
point.y1 <= yMax ||
|
|
878
|
-
(arr[idx - 1] && arr[idx - 1].y <= yMax) ||
|
|
879
|
-
(arr[idx - 1] && arr[idx - 1].y1 <= yMax)) &&
|
|
880
|
-
(point.y >= yMin ||
|
|
881
|
-
point.y1 >= yMin ||
|
|
882
|
-
(arr[idx + 1] && arr[idx + 1].y >= yMin) ||
|
|
883
|
-
(arr[idx + 1] && arr[idx + 1].y1 >= yMin));
|
|
884
|
-
const filteredData = seriesItem.data; //.filter(visiblePoints);
|
|
885
|
-
const serie = {
|
|
886
|
-
...seriesItem,
|
|
887
|
-
data: filteredData,
|
|
888
|
-
};
|
|
889
|
-
drawer.draw(serie, seriesItem.renderTo === 'canvas' ? this._canvas : group, foundX, foundY, this._options);
|
|
890
|
-
const emit = (event) => {
|
|
891
|
-
this.seriesMove$.next(event);
|
|
892
|
-
};
|
|
893
|
-
const emitPoint = (event) => {
|
|
894
|
-
this.pointMove$.next(event);
|
|
895
|
-
};
|
|
896
|
-
drawer?.dispatch?.on(DispatchType.moveLine, function () {
|
|
897
|
-
emit(this);
|
|
898
|
-
});
|
|
899
|
-
drawer?.dispatch?.on(DispatchType.movePoint, function () {
|
|
900
|
-
emitPoint(this);
|
|
901
|
-
});
|
|
902
|
-
});
|
|
903
|
-
}
|
|
904
|
-
createTooltip() {
|
|
905
|
-
d3.select(this._container.nativeElement)
|
|
906
|
-
.append('div')
|
|
907
|
-
.attr('class', 'tooltip-chart color-text-90 bg-background-50 shadow-2')
|
|
908
|
-
.style('position', 'fixed')
|
|
909
|
-
.style('top', 'unset')
|
|
910
|
-
.style('right', 'unset')
|
|
911
|
-
.style('bottom', 'unset')
|
|
912
|
-
.style('left', 'unset')
|
|
913
|
-
.style('pointer-events', 'none')
|
|
914
|
-
.style('display', 'none');
|
|
915
|
-
}
|
|
916
|
-
handleMouseMove(options) {
|
|
917
|
-
const mouse = d3.pointer(options.event);
|
|
918
|
-
const { top, right, bottom, left } = this.tooltipPosition(options.event);
|
|
919
|
-
const tooltipsData = [];
|
|
920
|
-
this._chart
|
|
921
|
-
.select('.marker-line')
|
|
922
|
-
.attr('transform', `translate(${0}, ${mouse[1] - 2})`);
|
|
923
|
-
this._chart
|
|
924
|
-
.selectAll('.marker')
|
|
925
|
-
.attr('transform', (d) => {
|
|
926
|
-
if (!d.data.length) {
|
|
927
|
-
return;
|
|
928
|
-
}
|
|
929
|
-
if (!this._xScales.has(d.xAxisIndex) ||
|
|
930
|
-
!this._yScales.has(d.yAxisIndex)) {
|
|
931
|
-
return;
|
|
932
|
-
}
|
|
933
|
-
const foundX = this._xScales.get(d.xAxisIndex);
|
|
934
|
-
const foundY = this._yScales.get(d.yAxisIndex);
|
|
935
|
-
if (this._options.tooltip.tracking === 'x') {
|
|
936
|
-
const [min, max] = foundX.domain();
|
|
937
|
-
const filteredData = d.data.filter((point) => point.x <= max && point.x >= min);
|
|
938
|
-
const sorted = [...filteredData].sort((a, b) => d3.ascending(a.x, b.x));
|
|
939
|
-
const bisect = d3.bisector((dd) => dd.x).left;
|
|
940
|
-
const x0 = foundX.invert(mouse[0]);
|
|
941
|
-
const index = bisect(sorted, x0);
|
|
942
|
-
const data = sorted[index] ? sorted[index] : sorted[index - 1];
|
|
943
|
-
tooltipsData.push({
|
|
944
|
-
point: data,
|
|
945
|
-
color: d.color,
|
|
946
|
-
name: d.name,
|
|
947
|
-
});
|
|
948
|
-
return `translate(${!isNaN(data?.x) && data?.x != null ? foundX(data.x) : -10}, ${!isNaN(data?.y) && data?.y != null ? foundY(data.y) : -10})`;
|
|
949
|
-
}
|
|
950
|
-
if (this._options.tooltip.tracking === 'y') {
|
|
951
|
-
const sorted = [...d.data].sort((a, b) => d3.ascending(a.y, b.y));
|
|
952
|
-
const bisect = d3.bisector((dd) => dd.y).left;
|
|
953
|
-
const y0 = foundY.invert(mouse[1]);
|
|
954
|
-
const index = bisect(sorted, y0, 0);
|
|
955
|
-
const data = sorted[index] ? sorted[index] : sorted[index - 1];
|
|
956
|
-
tooltipsData.push({
|
|
957
|
-
point: data,
|
|
958
|
-
color: d.color,
|
|
959
|
-
name: d.name,
|
|
960
|
-
});
|
|
961
|
-
return `translate(${!isNaN(data?.x) && data?.x != null ? foundX(data.x) : -10}, ${!isNaN(data?.y) && data?.y != null ? foundY(data.y) : -10})`;
|
|
962
|
-
}
|
|
963
|
-
});
|
|
964
|
-
if (this._options.tooltip?.format) {
|
|
965
|
-
const formatted = this._options.tooltip?.format(tooltipsData);
|
|
966
|
-
d3.select(this._container.nativeElement)
|
|
967
|
-
.select('.tooltip-chart')
|
|
968
|
-
.style('top', top)
|
|
969
|
-
.style('right', right)
|
|
970
|
-
.style('bottom', bottom)
|
|
971
|
-
.style('left', left)
|
|
972
|
-
.html(formatted);
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
tooltipPosition(event) {
|
|
976
|
-
const centerX = this._width / 2;
|
|
977
|
-
const centerY = this._height / 2;
|
|
978
|
-
const padding = { x: 10, y: 10 };
|
|
979
|
-
const scene = {
|
|
980
|
-
left: event.pageX > centerX ? 'initial' : `${event.pageX + padding.x}px`,
|
|
981
|
-
top: event.pageY > centerY ? 'initial' : `${event.pageY + padding.y}px`,
|
|
982
|
-
bottom: event.pageY > centerY
|
|
983
|
-
? `${window.innerHeight - event.pageY}px`
|
|
984
|
-
: 'initial',
|
|
985
|
-
right: event.pageX > centerX
|
|
986
|
-
? `${window.innerWidth - event.pageX + padding.x}px`
|
|
987
|
-
: 'initial',
|
|
988
|
-
};
|
|
989
|
-
return scene;
|
|
990
|
-
}
|
|
991
|
-
createMarkers() {
|
|
992
|
-
if (this._options.tooltip === undefined) {
|
|
993
|
-
return;
|
|
994
|
-
}
|
|
995
|
-
if (!this._options.tooltip.enable) {
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
998
|
-
this._chart.selectAll('.marker').remove();
|
|
999
|
-
this._chart.select('.marker-line').remove();
|
|
1000
|
-
this._chart
|
|
1001
|
-
.append('line')
|
|
1002
|
-
.attr('class', 'marker-line')
|
|
1003
|
-
.attr('x1', 35)
|
|
1004
|
-
.attr('x2', this._width)
|
|
1005
|
-
.style('stroke-width', 0.5)
|
|
1006
|
-
.style('stroke', 'var(--color-text-40)')
|
|
1007
|
-
.style('display', 'none');
|
|
1008
|
-
const { series } = this._options;
|
|
1009
|
-
if (!series) {
|
|
1010
|
-
return;
|
|
1011
|
-
}
|
|
1012
|
-
const markers = this._chart
|
|
1013
|
-
.selectAll()
|
|
1014
|
-
.data(series.filter((_) => _.visible));
|
|
1015
|
-
markers
|
|
1016
|
-
.enter()
|
|
1017
|
-
.append('circle')
|
|
1018
|
-
.attr('class', 'marker')
|
|
1019
|
-
.attr('pointer-events', 'none')
|
|
1020
|
-
.attr('r', 3)
|
|
1021
|
-
.attr('fill', (_, i) => _.color)
|
|
1022
|
-
.style('display', 'none');
|
|
1023
|
-
const mouseoutEvent = () => {
|
|
1024
|
-
this._chart.selectAll('.marker').style('display', 'none');
|
|
1025
|
-
this._chart.select('.marker-line').style('display', 'none');
|
|
1026
|
-
d3.select(this._container.nativeElement)
|
|
1027
|
-
.select('.tooltip-chart')
|
|
1028
|
-
.style('display', 'none');
|
|
1029
|
-
};
|
|
1030
|
-
const mouseMoveEvent = (event) => {
|
|
1031
|
-
const options = {
|
|
1032
|
-
event,
|
|
1033
|
-
series,
|
|
1034
|
-
};
|
|
1035
|
-
this.handleMouseMove(options);
|
|
1036
|
-
};
|
|
1037
|
-
const mouseOverEvent = () => {
|
|
1038
|
-
if (this._options.tooltip.showMarkers) {
|
|
1039
|
-
this._chart
|
|
1040
|
-
.selectAll('.marker')
|
|
1041
|
-
.style('display', (d) => {
|
|
1042
|
-
if (d.data.length) {
|
|
1043
|
-
return null;
|
|
1044
|
-
}
|
|
1045
|
-
return 'none';
|
|
1046
|
-
});
|
|
1047
|
-
}
|
|
1048
|
-
if (this._options.tooltip.showLine) {
|
|
1049
|
-
this._chart.select('.marker-line').style('display', null);
|
|
1050
|
-
}
|
|
1051
|
-
d3.select(this._container.nativeElement)
|
|
1052
|
-
.select('.tooltip-chart')
|
|
1053
|
-
.style('display', null);
|
|
1054
|
-
};
|
|
1055
|
-
this._chart
|
|
1056
|
-
.on('mouseover', mouseOverEvent)
|
|
1057
|
-
.on('mousemove', mouseMoveEvent)
|
|
1058
|
-
.on('mouseleave', mouseoutEvent);
|
|
1059
|
-
}
|
|
1060
|
-
drawLegend() {
|
|
1061
|
-
if (this._options.legend?.visible === false) {
|
|
1062
|
-
return;
|
|
1063
|
-
}
|
|
1064
|
-
this._chart.selectAll('.legend').remove();
|
|
1065
|
-
const drawer = this._options.legend?.type
|
|
1066
|
-
? defaultLegendDrawerMapping.get(this._options.legend.type)
|
|
1067
|
-
: defaultLegendDrawerMapping.get(LegendType.swatches);
|
|
1068
|
-
const context = this._container.nativeElement;
|
|
1069
|
-
if (!drawer) {
|
|
1070
|
-
throw new Error(`No drawer for legend
|
|
1071
|
-
}`);
|
|
1072
|
-
}
|
|
1073
|
-
drawer.draw({
|
|
1074
|
-
context,
|
|
1075
|
-
series: this._options.series.filter((_) => _.showInLegend),
|
|
1076
|
-
width: this._width,
|
|
1077
|
-
height: this._height,
|
|
1078
|
-
});
|
|
1079
|
-
}
|
|
1080
|
-
caluclateChartWidth() {
|
|
1081
|
-
let width = -this._width;
|
|
1082
|
-
if (this.offsetOpposite > 0) {
|
|
1083
|
-
width = -this._width + this.offsetOpposite + this.offsetNonOpposite;
|
|
1084
|
-
}
|
|
1085
|
-
if (this.offsetNonOpposite > 0) {
|
|
1086
|
-
width =
|
|
1087
|
-
-this._width + this._options.bounds.right + this.offsetNonOpposite;
|
|
1088
|
-
}
|
|
1089
|
-
if (this.offsetOpposite >= Axis.offsetFactor &&
|
|
1090
|
-
this.offsetNonOpposite === 0) {
|
|
1091
|
-
width = -this._width + this.offsetOpposite + this._options.bounds.left;
|
|
1092
|
-
}
|
|
1093
|
-
if (this.offsetOpposite > 0 && this.offsetNonOpposite > 0) {
|
|
1094
|
-
width = -this._width + this.offsetOpposite + this.offsetNonOpposite;
|
|
1095
|
-
}
|
|
1096
|
-
return Math.abs(width);
|
|
1097
|
-
}
|
|
1098
|
-
drawGridLines() {
|
|
1099
|
-
if (this._options.gridLines === false) {
|
|
1100
|
-
return;
|
|
1101
|
-
}
|
|
1102
|
-
const translateX = this.offsetNonOpposite > 0
|
|
1103
|
-
? this.offsetNonOpposite
|
|
1104
|
-
: this._options.bounds.left + this.offsetNonOpposite;
|
|
1105
|
-
this._chart.selectAll('.grid').remove();
|
|
1106
|
-
const yList = this._yAxisList.filter((_) => _.options.visible && !_.options.opposite);
|
|
1107
|
-
const y = yList?.length > 0
|
|
1108
|
-
? this._yScales.get(yList[yList.length - 1].index)
|
|
1109
|
-
: this._yScales.get(0);
|
|
1110
|
-
const x = this._xScales.get(0);
|
|
1111
|
-
if (!y || !x) {
|
|
1112
|
-
return;
|
|
1113
|
-
}
|
|
1114
|
-
const TICK_HEIGHT = 40;
|
|
1115
|
-
const TICK_WIDTH = 60;
|
|
1116
|
-
const tickCount = Math.round(this._height / TICK_HEIGHT);
|
|
1117
|
-
const tickCountX = Math.round(this._width / TICK_WIDTH);
|
|
1118
|
-
const gridY = this._chart
|
|
1119
|
-
.append('g')
|
|
1120
|
-
.attr('class', 'grid color-text-10')
|
|
1121
|
-
.style('shape-rendering', 'crispEdges');
|
|
1122
|
-
const gridlinesY = d3
|
|
1123
|
-
.axisLeft(y)
|
|
1124
|
-
.tickFormat('')
|
|
1125
|
-
.tickSize(-this.visibleChartWindowWidth);
|
|
1126
|
-
const hasBarSeriesType = this._options.series.some((_) => _.type === SeriesType.bar);
|
|
1127
|
-
if (!hasBarSeriesType) {
|
|
1128
|
-
const gridX = this._chart
|
|
1129
|
-
.append('g')
|
|
1130
|
-
.attr('class', 'grid color-text-10')
|
|
1131
|
-
.style('shape-rendering', 'crispEdges');
|
|
1132
|
-
const gridlinesX = d3
|
|
1133
|
-
.axisBottom(x)
|
|
1134
|
-
.ticks(tickCountX)
|
|
1135
|
-
.tickFormat('')
|
|
1136
|
-
.tickSize(this._height - this._options.bounds.bottom - this._options.bounds.top);
|
|
1137
|
-
gridX
|
|
1138
|
-
.call(gridlinesX)
|
|
1139
|
-
.attr('transform', `translate(0, ${this._options.bounds.top})`)
|
|
1140
|
-
.lower();
|
|
1141
|
-
}
|
|
1142
|
-
gridY
|
|
1143
|
-
.call(gridlinesY)
|
|
1144
|
-
.attr('transform', `translate(${translateX}, ${0})`)
|
|
1145
|
-
.lower();
|
|
1146
|
-
this._chart.selectAll('.grid path').remove();
|
|
1147
|
-
}
|
|
1148
|
-
createScales() {
|
|
1149
|
-
this._xScales.clear();
|
|
1150
|
-
this._yScales.clear();
|
|
1151
|
-
const defaultScaleMapping = new Map()
|
|
1152
|
-
.set(ScaleType.linear, d3.scaleLinear)
|
|
1153
|
-
.set(ScaleType.log, d3.scaleLog)
|
|
1154
|
-
.set(ScaleType.sqrt, d3.scaleSqrt)
|
|
1155
|
-
.set(ScaleType.pow, d3.scalePow);
|
|
1156
|
-
const xRange = [
|
|
1157
|
-
this.offsetNonOpposite
|
|
1158
|
-
? this.offsetNonOpposite
|
|
1159
|
-
: this._options.bounds.left,
|
|
1160
|
-
this._width -
|
|
1161
|
-
(this.offsetOpposite
|
|
1162
|
-
? this.offsetOpposite
|
|
1163
|
-
: this._options.bounds.right),
|
|
1164
|
-
];
|
|
1165
|
-
const yRange = [
|
|
1166
|
-
this._height - this._options.bounds.bottom,
|
|
1167
|
-
this._options.bounds.top,
|
|
1168
|
-
];
|
|
1169
|
-
this._xAxisList.forEach((axis, index) => {
|
|
1170
|
-
let scale = null;
|
|
1171
|
-
if (axis.options.type === Scale.time) {
|
|
1172
|
-
scale = d3
|
|
1173
|
-
.scaleTime()
|
|
1174
|
-
.domain(axis.extent)
|
|
1175
|
-
.range(axis.options.inverted ? [...xRange].reverse() : xRange);
|
|
1176
|
-
}
|
|
1177
|
-
if (axis.options.type === Scale.number) {
|
|
1178
|
-
scale = defaultScaleMapping
|
|
1179
|
-
.get(axis.options.scaleOptions.type)()
|
|
1180
|
-
.domain(axis.extent)
|
|
1181
|
-
.range(axis.options.inverted ? [...xRange].reverse() : xRange);
|
|
1182
|
-
}
|
|
1183
|
-
if (axis.options.niceTicks) {
|
|
1184
|
-
scale.nice();
|
|
1185
|
-
}
|
|
1186
|
-
if (axis.options.scaleOptions.type === ScaleType.log) {
|
|
1187
|
-
scale.base(axis.options.scaleOptions.base);
|
|
1188
|
-
}
|
|
1189
|
-
if (axis.options.scaleOptions.type === ScaleType.pow) {
|
|
1190
|
-
scale.exponent(axis.options.scaleOptions.base);
|
|
1191
|
-
}
|
|
1192
|
-
this._xScales.set(index, scale);
|
|
1193
|
-
});
|
|
1194
|
-
this._yAxisList.forEach((axis, index) => {
|
|
1195
|
-
let scale = null;
|
|
1196
|
-
if (axis.options.type === Scale.number) {
|
|
1197
|
-
scale = defaultScaleMapping
|
|
1198
|
-
.get(axis.options.scaleOptions.type)()
|
|
1199
|
-
.domain(axis.extent)
|
|
1200
|
-
.range(axis.options.inverted ? [...yRange].reverse() : yRange);
|
|
1201
|
-
}
|
|
1202
|
-
if (axis.options.type === Scale.time) {
|
|
1203
|
-
scale = d3
|
|
1204
|
-
.scaleTime()
|
|
1205
|
-
.domain(axis.extent)
|
|
1206
|
-
.range(axis.options.inverted ? [...yRange].reverse() : yRange);
|
|
1207
|
-
}
|
|
1208
|
-
if (axis.options.niceTicks) {
|
|
1209
|
-
scale.nice();
|
|
1210
|
-
}
|
|
1211
|
-
if (axis.options.scaleOptions.type === ScaleType.log) {
|
|
1212
|
-
scale.base(axis.options.scaleOptions.base);
|
|
1213
|
-
}
|
|
1214
|
-
if (axis.options.scaleOptions.type === ScaleType.pow) {
|
|
1215
|
-
scale.exponent(axis.options.scaleOptions.base);
|
|
1216
|
-
}
|
|
1217
|
-
this._yScales.set(index, scale);
|
|
1218
|
-
});
|
|
1219
|
-
for (const [key, value] of this._yScales) {
|
|
1220
|
-
this._clonedY.set(key, value.copy());
|
|
1221
|
-
}
|
|
1222
|
-
for (const [key, value] of this._xScales) {
|
|
1223
|
-
this._clonedX.set(key, value.copy());
|
|
1224
|
-
}
|
|
1225
|
-
}
|
|
1226
|
-
drawAxis() {
|
|
1227
|
-
const hasVisibleAxis = [...this._xAxisList, ...this._yAxisList].filter((axis) => axis.options.visible);
|
|
1228
|
-
if (!hasVisibleAxis) {
|
|
1229
|
-
return;
|
|
1230
|
-
}
|
|
1231
|
-
const negative = false;
|
|
1232
|
-
this._chart.selectAll('.axes').remove();
|
|
1233
|
-
const axes = this._chart
|
|
1234
|
-
.append('g')
|
|
1235
|
-
.attr('class', 'axes')
|
|
1236
|
-
.style('shape-rendering', 'crispEdges');
|
|
1237
|
-
const TICK_HEIGHT = 40;
|
|
1238
|
-
const TICK_WIDTH = 60;
|
|
1239
|
-
const tickCount = Math.round(this._height / TICK_HEIGHT);
|
|
1240
|
-
const tickCountX = Math.round(this._width / TICK_WIDTH);
|
|
1241
|
-
this._xAxisList.forEach((axis) => {
|
|
1242
|
-
const options = axis.options;
|
|
1243
|
-
const translate = `translate(${0}, ${this._height - this._options.bounds.bottom})`;
|
|
1244
|
-
const x = this._xScales.get(axis.index);
|
|
1245
|
-
const xAxis = d3.axisBottom(x).ticks(tickCountX);
|
|
1246
|
-
if (axis.options?.tickFormat) {
|
|
1247
|
-
xAxis.tickFormat(axis.options.tickFormat);
|
|
1248
|
-
}
|
|
1249
|
-
if (options.visible !== false) {
|
|
1250
|
-
const translateX = this.offsetNonOpposite
|
|
1251
|
-
? this.offsetNonOpposite
|
|
1252
|
-
: this._options.bounds.left + this.offsetNonOpposite;
|
|
1253
|
-
axes
|
|
1254
|
-
.append('g')
|
|
1255
|
-
.attr('class', 'x-axis-label')
|
|
1256
|
-
.append('text')
|
|
1257
|
-
.style('fill', 'var(--color-text-50)')
|
|
1258
|
-
.attr('transform', 'translate(' +
|
|
1259
|
-
this._width / 2 +
|
|
1260
|
-
' ,' +
|
|
1261
|
-
(this._height - this._options.bounds.bottom) +
|
|
1262
|
-
')')
|
|
1263
|
-
.style('text-anchor', 'middle')
|
|
1264
|
-
.attr('dy', '3em')
|
|
1265
|
-
.text(options.title ?? '');
|
|
1266
|
-
axes
|
|
1267
|
-
.append('g')
|
|
1268
|
-
.attr('class', 'x-axis font-caption')
|
|
1269
|
-
.attr('data-x-scale-id', axis.index)
|
|
1270
|
-
.attr('transform', translate)
|
|
1271
|
-
.style('pointer-events', 'none')
|
|
1272
|
-
.call(xAxis)
|
|
1273
|
-
.call((_) => {
|
|
1274
|
-
_.select('.domain').remove();
|
|
1275
|
-
_.selectAll('.tick').attr('class', 'color-text-50');
|
|
1276
|
-
if (negative) {
|
|
1277
|
-
_.append('line')
|
|
1278
|
-
.attr('y1', 0)
|
|
1279
|
-
.attr('y2', this._height)
|
|
1280
|
-
.attr('transform', `translate(${x(0)}, -${this._height})`)
|
|
1281
|
-
.style('stroke-width', 0.5)
|
|
1282
|
-
.style('stroke', 'var(--color-text-50)');
|
|
1283
|
-
}
|
|
1284
|
-
_.append('line')
|
|
1285
|
-
.attr('x1', 0)
|
|
1286
|
-
.attr('x2', this.visibleChartWindowWidth)
|
|
1287
|
-
.attr('transform', `translate(${translateX}, ${0})`)
|
|
1288
|
-
.style('stroke-width', 0.5)
|
|
1289
|
-
.style('stroke', 'var(--color-text-50)');
|
|
1290
|
-
});
|
|
1291
|
-
}
|
|
1292
|
-
});
|
|
1293
|
-
this._yAxisList.forEach((axis) => {
|
|
1294
|
-
const translate = axis.options.opposite
|
|
1295
|
-
? `translate(${this._width - axis.offset}, ${0})`
|
|
1296
|
-
: `translate(${axis.offset}, ${0})`;
|
|
1297
|
-
const y = this._yScales.get(axis.index);
|
|
1298
|
-
const yAxis = axis.options.opposite ? d3.axisRight(y) : d3.axisLeft(y);
|
|
1299
|
-
if (axis.options.visible !== false) {
|
|
1300
|
-
const labelOffset = axis.options.opposite
|
|
1301
|
-
? this._width - axis.offset + axis.width
|
|
1302
|
-
: axis.offset - axis.width;
|
|
1303
|
-
axes
|
|
1304
|
-
.append('g')
|
|
1305
|
-
.attr('class', 'y-axis-label')
|
|
1306
|
-
.append('text')
|
|
1307
|
-
.style('fill', 'var(--color-text-50)')
|
|
1308
|
-
.attr('transform', 'rotate(-90)')
|
|
1309
|
-
.attr('y', labelOffset)
|
|
1310
|
-
.attr('x', 0 - this._height / 2)
|
|
1311
|
-
.attr('dy', axis.options.opposite ? '12px' : '-3px')
|
|
1312
|
-
.style('text-anchor', 'middle')
|
|
1313
|
-
.text(axis.options.title ?? '');
|
|
1314
|
-
axes
|
|
1315
|
-
.append('g')
|
|
1316
|
-
.attr('class', 'y-axis font-caption')
|
|
1317
|
-
.attr('data-y-scale-id', axis.index)
|
|
1318
|
-
.attr('transform', translate)
|
|
1319
|
-
.call(yAxis)
|
|
1320
|
-
.style('pointer-events', 'none')
|
|
1321
|
-
.call((_) => {
|
|
1322
|
-
_.select('.domain').remove();
|
|
1323
|
-
_.selectAll('.tick').attr('class', 'color-text-50');
|
|
1324
|
-
if (!negative) {
|
|
1325
|
-
_.append('line')
|
|
1326
|
-
.attr('y1', 0)
|
|
1327
|
-
.attr('y2', this._height -
|
|
1328
|
-
this._options.bounds.top -
|
|
1329
|
-
this._options.bounds.bottom)
|
|
1330
|
-
.attr('transform', `translate(${0}, ${this._options.bounds.top})`)
|
|
1331
|
-
.style('stroke-width', 0.5)
|
|
1332
|
-
.style('stroke', 'var(--color-text-50)');
|
|
1333
|
-
}
|
|
1334
|
-
});
|
|
1335
|
-
}
|
|
1336
|
-
});
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9jb21wb25lbnQvY2hhcnQvY29yZS9jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBZSxZQUFZLEVBQWlCLE1BQU0sSUFBSSxDQUFDO0FBQzlELE9BQU8sS0FBSyxZQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUduRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUszRCxNQUFNLE9BQU8sU0FBUztJQTZEcEIsWUFBWSxPQUFxQixFQUFFLE9BQW1CO1FBckQ5QyxtQkFBYyxHQUFrQyxJQUFJLE9BQU8sRUFFaEUsQ0FBQztRQUNJLG1CQUFjLEdBQWtDLElBQUksT0FBTyxFQUVoRSxDQUFDO1FBRUksZ0JBQVcsR0FBMkMsSUFBSSxPQUFP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R0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUk7b0JBQ2QsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJO29CQUNoQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO29CQUN4QyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzVDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJO29CQUNkLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSTtvQkFDaEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztvQkFDeEMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSTtvQkFDZCxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUk7b0JBQ2hCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7b0JBQ3hDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJ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RXBELElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7NkJBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7NkJBQ2IsSUFBSSxDQUNILElBQUksRUFDSixJQUFJLENBQUMsT0FBTzs0QkFDVixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHOzRCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQzlCOzZCQUNBLElBQUksQ0FDSCxXQUFXLEVBQ1gsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQy9DOzZCQUNBLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDOzZCQUMxQixLQUFLLENBQUMsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7cUJBQzVDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEQzWm9vbUV2ZW50LCB6b29tSWRlbnRpdHksIFpvb21UcmFuc2Zvcm0gfSBmcm9tICdkMyc7XG5pbXBvcnQgKiBhcyBkM2Fubm90YXRpb24gZnJvbSAnZDMtc3ZnLWFubm90YXRpb24nO1xuaW1wb3J0IHsgU2NhbGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtL3NjYWxlJztcbmltcG9ydCB7IENoYXJ0T3B0aW9ucyB9IGZyb20gJy4uL21vZGVsL2NoYXJ0LW9wdGlvbnMnO1xuaW1wb3J0IHsgQXhpc09wdGlvbnMgfSBmcm9tICcuLi9tb2RlbC9heGlzLW9wdGlvbnMnO1xuaW1wb3J0IHsgU2VyaWVzIH0gZnJvbSAnLi4vbW9kZWwvc2VyaWVzJztcbmltcG9ydCB7IEJhc2VQb2ludCB9IGZyb20gJy4uL21vZGVsL3BvaW50L2Jhc2UtcG9pbnQnO1xuaW1wb3J0IHsgU2VyaWVzVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vc2VyaWVzLXR5cGUnO1xuaW1wb3J0IHsgZGVmYXVsdERyYXdlck1hcHBpbmcgfSBmcm9tICcuLi9kcmF3ZXIvZGVmYXVsdC1kcmF3ZXItbWFwcGluZyc7XG5pbXBvcnQgeyBkZWZhdWx0TGVnZW5kRHJhd2VyTWFwcGluZyB9IGZyb20gJy4uL2xlZ2VuZC1kcmF3ZXIvZGVmYXVsdC1kcmF3ZXItbGVnZW5kLW1hcHBpbmcnO1xuaW1wb3J0IHsgTGVnZW5kVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vbGVnZW5kLXR5cGUnO1xuaW1wb3J0IHsgQXhpcyB9IGZyb20gJy4vYXhpcy1jcmVhdG9yJztcbmltcG9ydCB7IEF4aXNUeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9heGlzLXR5cGUnO1xuaW1wb3J0IHsgUGxvdExpbmUgfSBmcm9tICcuLi9tb2RlbC9wbG90LWxpbmUnO1xuaW1wb3J0IHsgUGxvdEJhbmQgfSBmcm9tICcuLi9tb2RlbC9wbG90LWJhbmQnO1xuaW1wb3J0IHsgU2NhbGVUeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9zY2FsZS10eXBlJztcbmltcG9ydCB7IFpvb21UeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bS96b29tLXR5cGUnO1xuaW1wb3J0IHsgSURyYWdFdmVudCB9IGZyb20gJy4uL21vZGVsL2ktZHJhZy1ldmVudCc7XG5pbXBvcnQgeyBEaXNwYXRjaFR5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtL2Rpc3BhdGNoLXR5cGUnO1xuaW1wb3J0IHsgSVpvb21FdmVudCB9IGZyb20gJy4uL21vZGVsL2ktem9vbS1ldmVudCc7XG5cbnR5cGUgQ2hhcnRTaXplID0geyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9O1xuXG5leHBvcnQgY2xhc3MgVGV0YUNoYXJ0IHtcbiAgcGxvdExpbmVzTW92ZTogT2JzZXJ2YWJsZTxJRHJhZ0V2ZW50PFBsb3RMaW5lPj47XG4gIHBsb3RCYW5kc01vdmU6IE9ic2VydmFibGU8SURyYWdFdmVudDxQbG90QmFuZD4+O1xuXG4gIHpvb206IE9ic2VydmFibGU8SVpvb21FdmVudD47XG4gIHNlcmllc01vdmU6IE9ic2VydmFibGU8SURyYWdFdmVudDxTZXJpZXM8QmFzZVBvaW50Pj4+O1xuICBwb2ludE1vdmU6IE9ic2VydmFibGU8SURyYWdFdmVudDxTZXJpZXM8QmFzZVBvaW50Pj4+O1xuXG4gIHByaXZhdGUgcGxvdExpbmVzTW92ZSQ6IFN1YmplY3Q8SURyYWdFdmVudDxQbG90TGluZT4+ID0gbmV3IFN1YmplY3Q8XG4gICAgSURyYWdFdmVudDxQbG90TGluZT5cbiAgPigpO1xuICBwcml2YXRlIHBsb3RCYW5kc01vdmUkOiBTdWJqZWN0PElEcmFnRXZlbnQ8UGxvdEJhbmQ+PiA9IG5ldyBTdWJqZWN0PFxuICAgIElEcmFnRXZlbnQ8UGxvdEJhbmQ+XG4gID4oKTtcblxuICBwcml2YXRlIHNlcmllc01vdmUkOiBTdWJqZWN0PElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PiA9IG5ldyBTdWJqZWN0PFxuICAgIElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+XG4gID4oKTtcbiAgcHJpdmF0ZSBwb2ludE1vdmUkOiBTdWJqZWN0PElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PiA9IG5ldyBTdWJqZWN0PFxuICAgIElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+XG4gID4oKTtcblxuICBwcml2YXRlIHpvb20kOiBTdWJqZWN0PElab29tRXZlbnQ+ID0gbmV3IFN1YmplY3Q8SVpvb21FdmVudD4oKTtcblxuICBwcml2YXRlIF9jb250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuICBwcml2YXRlIF9jYW52YXM6IGFueTtcbiAgcHJpdmF0ZSBfd2lkdGggPSAwO1xuICBwcml2YXRlIF9oZWlnaHQgPSAwO1xuXG4gIHByaXZhdGUgX3pvb21ZQ2FjaGU6IE1hcDxudW1iZXIsIFpvb21UcmFuc2Zvcm0+ID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgWm9vbVRyYW5zZm9ybVxuICA+KCk7XG5cbiAgcHJpdmF0ZSBfem9vbVhDYWNoZTogTWFwPG51bWJlciwgWm9vbVRyYW5zZm9ybT4gPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICBab29tVHJhbnNmb3JtXG4gID4oKTtcblxuICBwcml2YXRlIF96b29tID0gZDMuem9vbSgpO1xuICBwcml2YXRlIF9jb21tb25ab29tVHJhbnNmb3JtOiBab29tVHJhbnNmb3JtO1xuXG4gIHByaXZhdGUgdmlzaWJsZUNoYXJ0V2luZG93V2lkdGggPSAwO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IENoYXJ0T3B0aW9ucztcbiAgcHJpdmF0ZSBfeEF4aXNMaXN0OiBBeGlzW107XG4gIHByaXZhdGUgX3lBeGlzTGlzdDogQXhpc1tdO1xuICBwcml2YXRlIF94U2NhbGVzOiBNYXA8bnVtYmVyLCBhbnk+ID0gbmV3IE1hcDxudW1iZXIsIGFueT4oKTtcbiAgcHJpdmF0ZSBfeVNjYWxlczogTWFwPG51bWJlciwgYW55PiA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XG5cbiAgcHJpdmF0ZSBfY2xvbmVkWCA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XG4gIHByaXZhdGUgX2Nsb25lZFkgPSBuZXcgTWFwPG51bWJlciwgYW55PigpO1xuXG4gIHByaXZhdGUgX2NoYXJ0OiBkMy5TZWxlY3Rpb248YW55LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuXG4gIHByaXZhdGUgb2Zmc2V0T3Bwb3NpdGUgPSAwO1xuICBwcml2YXRlIG9mZnNldE5vbk9wcG9zaXRlID0gMDtcblxuICBwcml2YXRlIHVuaXFJZDogc3RyaW5nO1xuICBwcml2YXRlIF96b29tQWRkZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDaGFydE9wdGlvbnMsIGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnNlbGVjdE5vZGUoZWxlbWVudCk7XG4gICAgdGhpcy5jcmVhdGVUb29sdGlwKCk7XG5cbiAgICB0aGlzLnBsb3RMaW5lc01vdmUgPSB0aGlzLnBsb3RMaW5lc01vdmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucGxvdEJhbmRzTW92ZSA9IHRoaXMucGxvdEJhbmRzTW92ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5zZXJpZXNNb3ZlID0gdGhpcy5zZXJpZXNNb3ZlJC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnBvaW50TW92ZSA9IHRoaXMucG9pbnRNb3ZlJC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnpvb20gPSB0aGlzLnpvb20kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIHJlZHJhdyhvcHRpb25zPzogQ2hhcnRPcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlQXhpcygpO1xuICAgIHRoaXMuY3JlYXRlU2NhbGVzKCk7XG4gICAgdGhpcy5jcmVhdGVNYXJrZXJzKCk7XG4gICAgdGhpcy5jcmVhdGVWaXNpYmxlV2luZG93KCk7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gICAgdGhpcy5kcmF3TGVnZW5kKCk7XG5cbiAgICBpZiAodGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5fY2hhcnQuY2FsbCh0aGlzLl96b29tLnRyYW5zZm9ybSwgdGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl96b29tQWRkZWQpIHtcbiAgICAgIHRoaXMuYWRkWm9vbSgpO1xuICAgICAgdGhpcy5fem9vbUFkZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEF4ZXNab29tKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbSh6b29tOiBJWm9vbUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl96b29tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0LmNhbGwodGhpcy5fem9vbS50cmFuc2Zvcm0sIHpvb20/Lnpvb21UcmFuc2Zvcm0gPz8gem9vbUlkZW50aXR5KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTaXplKHNpemU6IENoYXJ0U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9KSB7XG4gICAgdGhpcy5faGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgdGhpcy5fd2lkdGggPSBzaXplLndpZHRoO1xuXG4gICAgdGhpcy5fY2hhcnQuYXR0cignd2lkdGgnLCB0aGlzLl93aWR0aCkuYXR0cignaGVpZ2h0JywgdGhpcy5faGVpZ2h0KTtcbiAgICB0aGlzLl9jYW52YXMuYXR0cignd2lkdGgnLCB0aGlzLl93aWR0aCkuYXR0cignaGVpZ2h0JywgdGhpcy5faGVpZ2h0KTtcblxuICAgIGNvbnN0IGV4dGVudCA9IFtcbiAgICAgIFtcbiAgICAgICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCxcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgdGhpcy5fd2lkdGggLVxuICAgICAgICAgICh0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgICA/IHRoaXMub2Zmc2V0T3Bwb3NpdGVcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5ib3VuZHMucmlnaHQpLFxuICAgICAgICB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b20sXG4gICAgICBdLFxuICAgIF0gYXMgYW55O1xuXG4gICAgdGhpcy5fem9vbVxuICAgICAgLnNjYWxlRXh0ZW50KFsxLCBJbmZpbml0eV0pXG4gICAgICAudHJhbnNsYXRlRXh0ZW50KGV4dGVudClcbiAgICAgIC5leHRlbnQoZXh0ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlzaWJsZVdpbmRvdygpIHtcbiAgICB0aGlzLnVuaXFJZCA9IChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpO1xuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCdkZWZzJykucmVtb3ZlKCk7XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLmFwcGVuZCgnZGVmcycpXG4gICAgICAuYXBwZW5kKCdjbGlwUGF0aCcpXG4gICAgICAuYXR0cignaWQnLCBgZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH1gKVxuICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3gnLFxuICAgICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlID09PSAwXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0XG4gICAgICAgICAgOiB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICApXG4gICAgICAuYXR0cigneScsIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcClcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGggKyAxKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSAtXG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wICtcbiAgICAgICAgICAxID5cbiAgICAgICAgICAwXG4gICAgICAgICAgPyB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b20gLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgK1xuICAgICAgICAgICAgICAxXG4gICAgICAgICAgOiAwXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBeGlzKCkge1xuICAgIHRoaXMuX3hBeGlzTGlzdCA9IHRoaXMuX29wdGlvbnMueEF4aXMubWFwKFxuICAgICAgKF8sIGluZGV4KSA9PlxuICAgICAgICBuZXcgQXhpcyh7XG4gICAgICAgICAgdHlwZTogQXhpc1R5cGUuYWJzY2lzc2EsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY2hhcnRPcHRpb25zOiB0aGlzLl9vcHRpb25zLFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl95QXhpc0xpc3QgPSB0aGlzLl9vcHRpb25zLnlBeGlzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXMgPSBuZXcgQXhpcyh7XG4gICAgICAgIHR5cGU6IEF4aXNUeXBlLm9yZGluYXR1cyxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIGNoYXJ0T3B0aW9uczogdGhpcy5fb3B0aW9ucyxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgbm9uVGl0bGVPZmZzZXQgPSA2O1xuXG4gICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA9IGQzLnJlZHVjZShcbiAgICAgIHRoaXMuX3lBeGlzTGlzdC5maWx0ZXIoXG4gICAgICAgIChfKSA9PiBfLm9wdGlvbnM/Lm9wcG9zaXRlICE9PSB0cnVlICYmIF8ub3B0aW9ucz8udmlzaWJsZVxuICAgICAgKSxcbiAgICAgIChzdW0sIGF4aXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICBzdW0gK1xuICAgICAgICAgIGF4aXMud2lkdGggK1xuICAgICAgICAgIChheGlzPy5vcHRpb25zPy50aXRsZSA/IEF4aXMub2Zmc2V0RmFjdG9yIDogbm9uVGl0bGVPZmZzZXQpO1xuICAgICAgICBheGlzLnNldE9mZnNldChvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgdGhpcy5vZmZzZXRPcHBvc2l0ZSA9IGQzLnJlZHVjZShcbiAgICAgIHRoaXMuX3lBeGlzTGlzdC5maWx0ZXIoXG4gICAgICAgIChfKSA9PiBfLm9wdGlvbnM/Lm9wcG9zaXRlID09PSB0cnVlICYmIF8ub3B0aW9ucz8udmlzaWJsZVxuICAgICAgKSxcbiAgICAgIChzdW0sIGF4aXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICBzdW0gK1xuICAgICAgICAgIGF4aXMud2lkdGggK1xuICAgICAgICAgIChheGlzPy5vcHRpb25zPy50aXRsZSA/IEF4aXMub2Zmc2V0RmFjdG9yIDogbm9uVGl0bGVPZmZzZXQpO1xuICAgICAgICBheGlzLnNldE9mZnNldChvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgdGhpcy52aXNpYmxlQ2hhcnRXaW5kb3dXaWR0aCA9IHRoaXMuY2FsdWNsYXRlQ2hhcnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVkcmF3KCkge1xuICAgIHRoaXMuZHJhd1Bsb3RCYW5kcygpO1xuICAgIHRoaXMuZHJhd1Bsb3RMaW5lcygpO1xuXG4gICAgdGhpcy5kcmF3Q2hhcnQoKTtcbiAgICB0aGlzLmRyYXdBeGlzKCk7XG4gICAgdGhpcy5kcmF3R3JpZExpbmVzKCk7XG5cbiAgICB0aGlzLmRyYXdBbm5vdGF0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRab29tKCkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zPy56b29tPy5lbmFibGUpIHtcbiAgICAgIGNvbnN0IGhhc1hab29tID0gW1pvb21UeXBlLngsIFpvb21UeXBlLnh5XS5pbmNsdWRlcyhcbiAgICAgICAgdGhpcy5fb3B0aW9ucy56b29tLnpvb21UeXBlXG4gICAgICApO1xuICAgICAgY29uc3QgaGFzWVpvb20gPSBbWm9vbVR5cGUueSwgWm9vbVR5cGUueHldLmluY2x1ZGVzKFxuICAgICAgICB0aGlzLl9vcHRpb25zLnpvb20uem9vbVR5cGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX2NoYXJ0LmNhbGwoXG4gICAgICAgIHRoaXMuX3pvb20ub24oJ3N0YXJ0IGVuZCB6b29tJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGhhc1hab29tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9jbG9uZWRYLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXNjYWxlZCA9IGV2ZW50LnRyYW5zZm9ybS5yZXNjYWxlWCh2YWx1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuX3hTY2FsZXMuc2V0KGtleSwgcmVzY2FsZWQpO1xuXG4gICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2VFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbSQubmV4dCh7XG4gICAgICAgICAgICAgICAgICBkb21haW46IHJlc2NhbGVkLmRvbWFpbigpLFxuICAgICAgICAgICAgICAgICAgem9vbVRyYW5zZm9ybTogZXZlbnQudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgem9vbVR5cGU6IFpvb21UeXBlLngsXG4gICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNZWm9vbSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fY2xvbmVkWS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzY2FsZWQgPSBldmVudC50cmFuc2Zvcm0ucmVzY2FsZVkodmFsdWUpO1xuICAgICAgICAgICAgICB0aGlzLl95U2NhbGVzLnNldChrZXksIHJlc2NhbGVkKTtcblxuICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3pvb20nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnpvb20kLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBkb21haW46IHJlc2NhbGVkLmRvbWFpbigpLFxuICAgICAgICAgICAgICAgICAgICB6b29tVHJhbnNmb3JtOiBldmVudC50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgIHpvb21UeXBlOiBab29tVHlwZS55LFxuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAnZW5kJykge1xuICAgICAgICAgICAgdGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSA9IGV2ZW50LnRyYW5zZm9ybTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9yZWRyYXcoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBeGVzWm9vbSgpIHtcbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy56b29tLWJlaGF2aW9yJykucmVtb3ZlKCk7XG5cbiAgICBbLi4udGhpcy5feUF4aXNMaXN0LCAuLi50aGlzLl94QXhpc0xpc3RdXG4gICAgICAuZmlsdGVyKChheGlzKSA9PiBheGlzLm9wdGlvbnMudmlzaWJsZSAmJiBheGlzLm9wdGlvbnMuem9vbSlcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kTm9kZSA9IHRoaXMuX2NoYXJ0XG4gICAgICAgICAgLnNlbGVjdChcbiAgICAgICAgICAgIGBbZGF0YS0ke2F4aXMudHlwZSA9PT0gQXhpc1R5cGUuYWJzY2lzc2EgPyAneCcgOiAneSd9LXNjYWxlLWlkPScke1xuICAgICAgICAgICAgICBheGlzLmluZGV4XG4gICAgICAgICAgICB9J11gXG4gICAgICAgICAgKVxuICAgICAgICAgIC5ub2RlKCkgYXMgYW55O1xuXG4gICAgICAgIGlmICghZm91bmROb2RlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYkJveCA9IGZvdW5kTm9kZS5nZXRCQm94KCk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9XG4gICAgICAgICAgYXhpcy50eXBlID09PSBBeGlzVHlwZS5hYnNjaXNzYVxuICAgICAgICAgICAgPyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgICAgICA6IGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgICAgPyB0aGlzLl93aWR0aCAtIGF4aXMub2Zmc2V0XG4gICAgICAgICAgICA6IGF4aXMub2Zmc2V0IC0gYkJveC53aWR0aDtcblxuICAgICAgICBjb25zdCB6b29tID0gZDNcbiAgICAgICAgICAuem9vbSgpXG4gICAgICAgICAgLnNjYWxlRXh0ZW50KFsxLCBJbmZpbml0eV0pXG4gICAgICAgICAgLm9uKCd6b29tIGVuZCcsIChldmVudDogRDNab29tRXZlbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoYXhpcy50eXBlID09PSBBeGlzVHlwZS5hYnNjaXNzYSkge1xuICAgICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2Nsb25lZFguZ2V0KGF4aXMuaW5kZXgpO1xuICAgICAgICAgICAgICB0aGlzLl94U2NhbGVzLnNldChheGlzLmluZGV4LCBldmVudC50cmFuc2Zvcm0ucmVzY2FsZVgoc2NhbGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fY2xvbmVkWS5nZXQoYXhpcy5pbmRleCk7XG4gICAgICAgICAgICAgIHRoaXMuX3lTY2FsZXMuc2V0KGF4aXMuaW5kZXgsIGV2ZW50LnRyYW5zZm9ybS5yZXNjYWxlWShzY2FsZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgaWYgKGF4aXMudHlwZSA9PT0gQXhpc1R5cGUub3JkaW5hdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbVlDYWNoZS5zZXQoYXhpcy5pbmRleCwgZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChheGlzLnR5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbVhDYWNoZS5zZXQoYXhpcy5pbmRleCwgZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5jYWxsKHRoaXMuX3pvb20udHJhbnNmb3JtLCBldmVudC50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JlZHJhdygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3RvcmVkVHJhbnNmb3JtOiBab29tVHJhbnNmb3JtID1cbiAgICAgICAgICBheGlzLnR5cGUgPT09IEF4aXNUeXBlLm9yZGluYXR1c1xuICAgICAgICAgICAgPyB0aGlzLl96b29tWUNhY2hlLmdldChheGlzLmluZGV4KVxuICAgICAgICAgICAgOiB0aGlzLl96b29tWENhY2hlLmdldChheGlzLmluZGV4KTtcblxuICAgICAgICB0aGlzLl9jaGFydFxuICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd6b29tLWJlaGF2aW9yJylcbiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgYkJveC5oZWlnaHQpXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgYkJveC53aWR0aClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9LCAke1xuICAgICAgICAgICAgICBheGlzLnR5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcFxuICAgICAgICAgICAgfSlgXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwJylcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpXG4gICAgICAgICAgLmNhbGwoem9vbS50cmFuc2Zvcm0sIHJlc3RvcmVkVHJhbnNmb3JtID8/IGQzLnpvb21JZGVudGl0eSlcbiAgICAgICAgICAuY2FsbCh6b29tKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3ROb2RlKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9jb250YWluZXIgPSBlbGVtZW50O1xuXG4gICAgZDMuc2VsZWN0KGVsZW1lbnQubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCcudG9vbHRpcC1jaGFydCcpLnJlbW92ZSgpO1xuXG4gICAgZDMuc2VsZWN0KGVsZW1lbnQubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICBkMy5zZWxlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJ2NhbnZhcycpLnJlbW92ZSgpO1xuXG4gICAgdGhpcy5fY2hhcnQgPSBkM1xuICAgICAgLnNlbGVjdChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJylcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDApO1xuXG4gICAgdGhpcy5fY2FudmFzID0gZDNcbiAgICAgIC5zZWxlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnY2FudmFzJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtYWluLWNhbnZhcycpXG4gICAgICAuc3R5bGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMzUsIDApJylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdBbm5vdGF0aW9ucygpIHtcbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5hbm5vdGF0aW9ucycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSB0aGlzLl9vcHRpb25zLmFubm90YXRpb25zPy5tYXAoKGFubm90YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLl94U2NhbGVzLmdldChhbm5vdGF0aW9uLnhBeGlzSW5kZXgpO1xuICAgICAgY29uc3QgeSA9IHRoaXMuX3lTY2FsZXMuZ2V0KGFubm90YXRpb24ueUF4aXNJbmRleCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vdGU6IGFubm90YXRpb24ubm90ZSxcbiAgICAgICAgY29ubmVjdG9yOiBhbm5vdGF0aW9uLmNvbm5lY3RvcixcbiAgICAgICAgeDogeChhbm5vdGF0aW9uLnBvaW50Py54KSxcbiAgICAgICAgeTogeShhbm5vdGF0aW9uLnBvaW50Py55KSxcbiAgICAgICAgZHg6IGFubm90YXRpb24uZHgsXG4gICAgICAgIGR5OiBhbm5vdGF0aW9uLmR5LFxuICAgICAgICB0eXBlOiBhbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgIGNsYXNzTmFtZTogYW5ub3RhdGlvbi5jbGFzc05hbWUsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgbWFrZUFubm90YXRpb25zID0gZDNhbm5vdGF0aW9uXG4gICAgICAuYW5ub3RhdGlvbigpXG4gICAgICAuYW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMgPz8gW10pO1xuXG4gICAgdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2Fubm90YXRpb25zJylcbiAgICAgIC5hdHRyKCdjbGlwLXBhdGgnLCBgdXJsKCNkcmF3LXdpbmRvdy0ke3RoaXMudW5pcUlkfSlgKVxuICAgICAgLmNhbGwobWFrZUFubm90YXRpb25zIGFzIGFueSlcbiAgICAgIC5sb3dlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3UGxvdExpbmVzKCkge1xuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLnBsb3RsaW5lcycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgcGxvdGxpbmVHcm91cCA9IHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdwbG90bGluZXMnKVxuICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpXG4gICAgICAuYXR0cignY2xpcC1wYXRoJywgYHVybCgjZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH0pYCk7XG5cbiAgICB0aGlzLl94QXhpc0xpc3RcbiAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5wbG90TGluZXMubGVuZ3RoID4gMClcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBheGlzLmV4dGVudDtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX3hTY2FsZXMuZ2V0KGF4aXMuaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IHBsb3RsaW5lc1BvaW50cyA9IGF4aXMub3B0aW9ucy5wbG90TGluZXM7XG5cbiAgICAgICAgY29uc3QgZ2V0VGV4dENlbnRlclBvaW50UHggPSAoZDogUGxvdExpbmUsIGlkeDogbnVtYmVyKSA9PlxuICAgICAgICAgIHgoXG4gICAgICAgICAgICAoZD8udmFsdWUgK1xuICAgICAgICAgICAgICAocGxvdGxpbmVzUG9pbnRzW2lkeCAtIDFdXG4gICAgICAgICAgICAgICAgPyBwbG90bGluZXNQb2ludHNbaWR4IC0gMV0/LnZhbHVlXG4gICAgICAgICAgICAgICAgOiAwKSkgL1xuICAgICAgICAgICAgICAyXG4gICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBvcGFjaXR5ID0gKGQ6IFBsb3RMaW5lLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlXaWR0aCA9IDIwO1xuXG4gICAgICAgICAgY29uc3Qgd2lkdGggPVxuICAgICAgICAgICAgeChkPy52YWx1ZSkgLVxuICAgICAgICAgICAgeChwbG90bGluZXNQb2ludHNbaWR4IC0gMV0gPyBwbG90bGluZXNQb2ludHNbaWR4IC0gMV0/LnZhbHVlIDogMCk7XG4gICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IGRpc3BsYXlXaWR0aCA/IDAgOiAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIHBsb3RsaW5lR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCcubGFiZWwnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbigndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xhYmVsIGZvbnQtYm9keS0zIGZpbGwtdGV4dC03MCcpXG4gICAgICAgICAgLmF0dHIoJ3gnLCBnZXRUZXh0Q2VudGVyUG9pbnRQeClcbiAgICAgICAgICAuYXR0cigneScsIChkKSA9PiB0aGlzLl9oZWlnaHQgLyAyKVxuICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdjZW50cmFsJylcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgKGQsIGlkeCkgPT5cbiAgICAgICAgICAgICAgYHJvdGF0ZSgtOTAsICR7Z2V0VGV4dENlbnRlclBvaW50UHgoZCwgaWR4KX0sICR7XG4gICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC8gMlxuICAgICAgICAgICAgICB9KWBcbiAgICAgICAgICApXG4gICAgICAgICAgLnRleHQoKGQpID0+IGQ/LmxhYmVsID8/ICcnKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIG9wYWNpdHkpO1xuXG4gICAgICAgIHBsb3RsaW5lR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCcucGxvdGxpbmUnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Bsb3RsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1wbG90bGluZS1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd4MScsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd4MicsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgKGQpID0+IGQud2lkdGgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAoZCkgPT4gZC5jb2xvcilcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAoZCkgPT4gKGQuZGFzaGVkID8gJzgsIDgnIDogJzAsIDAnKSk7XG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90TGluZTogUGxvdExpbmUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RMaW5lc01vdmUkLm5leHQoeyBldmVudCwgdGFyZ2V0OiBwbG90TGluZSB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBwbG90bGluZUdyb3VwXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmRyYWctcGxvdGxpbmUnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RyYWctcGxvdGxpbmUnKVxuICAgICAgICAgIC5hdHRyKCd4MScsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd4MicsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgOClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2JhKDAsIDAsIDAsIDApJylcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdjb2wtcmVzaXplJylcbiAgICAgICAgICAuY2FsbChcbiAgICAgICAgICAgIGQzXG4gICAgICAgICAgICAgIC5kcmFnKClcbiAgICAgICAgICAgICAgLm9uKCdkcmFnJywgZnVuY3Rpb24gKGV2ZW50LCBkOiBQbG90TGluZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gZDMuc2VsZWN0KHRoaXMpLm5vZGUoKS5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dlZFBsb3RMaW5lID0gZDNcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90bGluZS1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLnZhbHVlID0geC5pbnZlcnQoZXZlbnQueCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IGQubWluID8/IG1pbjtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IGQubWF4ID8/IG1heDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlckxlZnRSZWFjaGVkID0gZC52YWx1ZSA8PSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSaWdodFJlYWNoZWQgPSBkLnZhbHVlID49IG1heFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlckxlZnRSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLnZhbHVlID0gbWluVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlclJpZ2h0UmVhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgZC52YWx1ZSA9IG1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCd4MScsIHgoZC52YWx1ZSkpLmF0dHIoJ3gyJywgeChkLnZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICBkcmFnZ2VkUGxvdExpbmUuYXR0cigneDEnLCB4KGQudmFsdWUpKS5hdHRyKCd4MicsIHgoZC52YWx1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vbignZW5kJywgKGV2ZW50OiBEcmFnRXZlbnQsIGQ6IFBsb3RMaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZCk7XG4gICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3lBeGlzTGlzdFxuICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnBsb3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGF4aXMuZXh0ZW50O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy5feVNjYWxlcy5nZXQoYXhpcy5pbmRleCk7XG5cbiAgICAgICAgY29uc3QgcGxvdGxpbmVzUG9pbnRzID0gYXhpcy5vcHRpb25zLnBsb3RMaW5lcztcblxuICAgICAgICBwbG90bGluZUdyb3VwXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLnBsb3RsaW5lJylcbiAgICAgICAgICAuZGF0YShwbG90bGluZXNQb2ludHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdwbG90bGluZScpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtcGxvdGxpbmUtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneTInLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3gyJyxcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLnJpZ2h0XG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdH0sIDApYClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIChkKSA9PiBkLndpZHRoKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgKGQpID0+IGQuY29sb3IpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgKGQpID0+IChkLmRhc2hlZCA/ICc4LCA4JyA6ICcwLCAwJykpO1xuXG4gICAgICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IERyYWdFdmVudCwgcGxvdExpbmU6IFBsb3RMaW5lKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbG90TGluZXNNb3ZlJC5uZXh0KHsgZXZlbnQsIHRhcmdldDogcGxvdExpbmUgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcGxvdGxpbmVHcm91cFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5kcmFnLXBsb3RsaW5lJylcbiAgICAgICAgICAuZGF0YShwbG90bGluZXNQb2ludHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdkcmFnLXBsb3RsaW5lJylcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneTInLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3gyJyxcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLnJpZ2h0XG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdH0sIDApYClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiYSgwLCAwLCAwLCAwKScpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncm93LXJlc2l6ZScpXG4gICAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICBkM1xuICAgICAgICAgICAgICAuZHJhZygpXG4gICAgICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uIChldmVudCwgZDogUGxvdExpbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRQbG90TGluZSA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGxpbmUtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICAgICAgZC52YWx1ZSA9IHkuaW52ZXJ0KGV2ZW50LnkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWluVmFsdWUgPSBkLm1pbiA/PyBtaW47XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBkLm1heCA/PyBtYXg7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJUb3BSZWFjaGVkID0gZC52YWx1ZSA8PSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJCb3R0b21SZWFjaGVkID0gZC52YWx1ZSA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChib3JkZXJUb3BSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLnZhbHVlID0gbWluVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlckJvdHRvbVJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIGQudmFsdWUgPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuYXR0cigneTEnLCB5KGQudmFsdWUpKS5hdHRyKCd5MicsIHkoZC52YWx1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZHJhZ2dlZFBsb3RMaW5lLmF0dHIoJ3kxJywgeShkLnZhbHVlKSkuYXR0cigneTInLCB5KGQudmFsdWUpKTtcblxuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAub24oJ2VuZCcsIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90TGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KSBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdQbG90QmFuZHMoKSB7XG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcucGxvdGJhbmRzJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBwbG90QmFuZEdyb3VwID0gdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Bsb3RiYW5kcycpXG4gICAgICAuYXR0cignY2xpcC1wYXRoJywgYHVybCgjZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH0pYCk7XG5cbiAgICB0aGlzLl94QXhpc0xpc3RcbiAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5wbG90QmFuZHMubGVuZ3RoID4gMClcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLl94U2NhbGVzLmdldChheGlzLmluZGV4KTtcblxuICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gYXhpcy5leHRlbnQ7XG5cbiAgICAgICAgY29uc3QgcGxvdGJhbmQgPSBwbG90QmFuZEdyb3VwXG4gICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpO1xuXG4gICAgICAgIGNvbnN0IHBsb3RCYW5kSGVpZ2h0ID1cbiAgICAgICAgICB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b207XG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90QmFuZDogUGxvdEJhbmQpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RCYW5kc01vdmUkLm5leHQoe1xuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHBsb3RCYW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAub24oJ3N0YXJ0JywgKF8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLm1hcmtlcicpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLnNlbGVjdCgnLnRvb2x0aXAtY2hhcnQnKVxuICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJ3JlY3QnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLXBsb3RiYW5kLWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ3gnLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAuYXR0cignd2lkdGgnLCAoZCkgPT4gTWF0aC5hYnMoeChkLnRvKSAtIHgoZC5mcm9tKSkpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoIyR7ZC5pbWFnZX0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkLmNvbG9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IGQub3BhY2l0eSA/PyAxKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBwbG90QmFuZEhlaWdodCA+IDAgPyBwbG90QmFuZEhlaWdodCA6IDApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmxpbmUtbGVmdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtbGluZS1sZWZ0LWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmUtbGVmdCcpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDInLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnOCwgOCcpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY29sb3ItdGV4dC05MCknKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIChkKSA9PiAoZC5zaG93R3JhYmJlcnMgPyAxIDogMCkpO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmRyYWctbGVmdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDInLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkKSA9PiAoZD8ucmVzaXphYmxlID8gJ3Vuc2V0JyA6ICdub25lJykpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCA4KVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3JnYmEoMCwgMCwgMCwgMCknKVxuICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ2NvbC1yZXNpemUnKVxuICAgICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgZDNcbiAgICAgICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2VkQmFuZCA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGJhbmQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dlZExpbmUgPSBkM1xuICAgICAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoYFtkYXRhLWxpbmUtbGVmdC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLmZyb20gPSB4LmludmVydChldmVudC54KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyUmVhY2hlZCA9IGQuZnJvbSA8PSBtaW5WYWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChib3JkZXJSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLmZyb20gPSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZC5mcm9tID49IGQudG8pIHtcbiAgICAgICAgICAgICAgICAgIGQuZnJvbSA9IGQudG87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3gxJywgeChkLmZyb20pKS5hdHRyKCd4MicsIHgoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgICAgICBkcmFnZ2VkQmFuZFxuICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB4KGQuZnJvbSkpXG4gICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB4KGQudG8pIC0geChkLmZyb20pKTtcblxuICAgICAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3gxJywgeChkLmZyb20pKS5hdHRyKCd4MicsIHgoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgICAgICBlbWl0KGV2ZW50LCBkKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+XG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZClcbiAgICAgICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgICApO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmxpbmUtcmlnaHQnKVxuICAgICAgICAgIC5kYXRhKGF4aXMub3B0aW9ucy5wbG90QmFuZHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLWxpbmUtcmlnaHQtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGluZS1yaWdodCcpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd5MicsXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc4LCA4JylcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTkwKScpXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IChkLnNob3dHcmFiYmVycyA/IDEgOiAwKSk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuZHJhZy1yaWdodCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RyYWctcmlnaHQnKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkKSA9PiAoZD8ucmVzaXphYmxlID8gJ3Vuc2V0JyA6ICdub25lJykpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd5MicsXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCA4KVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3JnYmEoMCwgMCwgMCwgMCknKVxuICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ2NvbC1yZXNpemUnKVxuICAgICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgZDNcbiAgICAgICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRCYW5kID0gZDNcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90YmFuZC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2VkTGluZSA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1yaWdodC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLnRvID0geC5pbnZlcnQoZXZlbnQueCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IGQubWF4ID8/IG1heDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlYWNoZWQgPSBkLnRvID49IG1heFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIGQudG8gPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZC50byA8PSBkLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgIGQudG8gPSBkLmZyb207XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3gxJywgeChkLnRvKSkuYXR0cigneDInLCB4KGQudG8pKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkQmFuZC5hdHRyKCd3aWR0aCcsIHgoZC50bykgLSB4KGQuZnJvbSkpO1xuICAgICAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3gxJywgeChkLnRvKSkuYXR0cigneDInLCB4KGQudG8pKTtcblxuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAub24oJ2VuZCcsIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90QmFuZCkgPT5cbiAgICAgICAgICAgICAgICBlbWl0KGV2ZW50LCBkKVxuICAgICAgICAgICAgICApIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3lBeGlzTGlzdFxuICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnBsb3RCYW5kcy5sZW5ndGggPiAwKVxuICAgICAgLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX3lTY2FsZXMuZ2V0KGF4aXMuaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBheGlzLmV4dGVudDtcblxuICAgICAgICBjb25zdCBwbG90YmFuZCA9IHBsb3RCYW5kR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuc3R5bGUoJ3NoYXBlLXJlbmRlcmluZycsICdjcmlzcEVkZ2VzJyk7XG5cbiAgICAgICAgY29uc3QgcGxvdEJhbmRXaWR0aCA9XG4gICAgICAgICAgdGhpcy5fd2lkdGggLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0IC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMucmlnaHQ7IC8vIFRPRE8gYWRkIG11bHRpYXhpcyBzdXBwb3J0IHdpZHRoXG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90QmFuZDogUGxvdEJhbmQpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RCYW5kc01vdmUkLm5leHQoe1xuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHBsb3RCYW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRyYWdQbG90YmFuZCA9IGQzXG4gICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgIC5zdWJqZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkMy5zZWxlY3QodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4geyB5OiBlbGVtZW50LmF0dHIoJ3knKSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdzdGFydCBkcmFnIGVuZCcsIGZ1bmN0aW9uIChldmVudDogYW55LCBkOiBQbG90QmFuZCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGQzLnNlbGVjdCh0aGlzKTtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChlbGVtZW50LmF0dHIoJ2hlaWdodCcpKTtcblxuICAgICAgICAgICAgZC50byA9IHkuaW52ZXJ0KGV2ZW50LnkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBkLm1heCA/PyBtYXg7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlYWNoZWRNaW4gPSBkLmZyb20gPD0gbWluVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkTWF4ID0gZC50byA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWRNaW4pIHtcbiAgICAgICAgICAgICAgZC50byA9IHkuaW52ZXJ0KHkobWluVmFsdWUpICsgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgZC5mcm9tID0gbWluVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChib3JkZXJSZWFjaGVkTWF4KSB7XG4gICAgICAgICAgICAgIGQudG8gPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoeShtYXhWYWx1ZSkgLSBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3knLCB5KGQuZnJvbSkpO1xuXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGVsZW1lbnQubm9kZSgpLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1sZWZ0LWlkPScke2QuaWR9J11gKVxuICAgICAgICAgICAgICAuYXR0cigneTEnLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1sZWZ0LWlkPScke2QuaWR9J11gKVxuICAgICAgICAgICAgICAuYXR0cigneTEnLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1yaWdodC1pZD0nJHtkLmlkfSddYClcbiAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgeShkLnRvKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1yaWdodC1pZD0nJHtkLmlkfSddYClcbiAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgeShkLnRvKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjb25zdCBsZWZ0R3JhYkRyYWcgPSBkM1xuICAgICAgICAgIC5kcmFnKClcbiAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gZDMuc2VsZWN0KHRoaXMpLm5vZGUoKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgZHJhZ2dlZEJhbmQgPSBkM1xuICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90YmFuZC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRMaW5lID0gZDNcbiAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1sZWZ0LWlkPScke2QuaWR9J11gKTtcblxuICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkID0gZC5mcm9tIDw9IG1pblZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoYm9yZGVyUmVhY2hlZCkge1xuICAgICAgICAgICAgICBkLmZyb20gPSBtaW5WYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGQuZnJvbSA+PSBkLnRvKSB7XG4gICAgICAgICAgICAgIGQuZnJvbSA9IGQudG87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCd5MScsIHkoZC5mcm9tKSkuYXR0cigneTInLCB5KGQuZnJvbSkpO1xuXG4gICAgICAgICAgICBkcmFnZ2VkQmFuZFxuICAgICAgICAgICAgICAuYXR0cigneScsIHkoZC5mcm9tKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIE1hdGguYWJzKHkoZC50bykgLSB5KGQuZnJvbSkpKTtcbiAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3kxJywgeShkLmZyb20pKS5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+IGVtaXQoZXZlbnQsIGQpKSBhcyBhbnk7XG5cbiAgICAgICAgY29uc3QgcmlnaHRHcmFiRHJhZyA9IGQzXG4gICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90QmFuZCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkMy5zZWxlY3QodGhpcykubm9kZSgpLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRCYW5kID0gZDNcbiAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGJhbmQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICBjb25zdCBkcmFnZ2VkTGluZSA9IGQzXG4gICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgIC5zZWxlY3QoYFtkYXRhLWxpbmUtcmlnaHQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICBkLnRvID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1heFZhbHVlID0gZC5tYXggPz8gbWF4O1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkID0gZC50byA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgZC50byA9IG1heFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZC50byA8PSBkLmZyb20pIHtcbiAgICAgICAgICAgICAgZC50byA9IGQuZnJvbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3kxJywgeShkLnRvKSkuYXR0cigneTInLCB5KGQudG8pKTtcblxuICAgICAgICAgICAgZHJhZ2dlZEJhbmRcbiAgICAgICAgICAgICAgLmF0dHIoJ3knLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBNYXRoLmFicyh5KGQudG8pIC0geShkLmZyb20pKSk7XG4gICAgICAgICAgICBkcmFnZ2VkTGluZS5hdHRyKCd5MScsIHkoZC50bykpLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+IGVtaXQoZXZlbnQsIGQpKSBhcyBhbnk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCdyZWN0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzKVxuICAgICAgICAgIC5qb2luKCdyZWN0JylcbiAgICAgICAgICAuYXR0cignZGF0YS1wbG90YmFuZC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgICAuYXR0cigneScsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgKGQpID0+IHBsb3RCYW5kV2lkdGgpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoIyR7ZC5pbWFnZX0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkLmNvbG9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IGQub3BhY2l0eSA/PyAxKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAoZCkgPT4gTWF0aC5hYnMoeShkLnRvKSAtIHkoZC5mcm9tKSkpXG4gICAgICAgICAgLmF0dHIoJ2N1cnNvcicsIChkKSA9PiAoZC5kcmFnZ2FibGUgPyAnbW92ZScgOiAnZGVmYXVsdCcpKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5saW5lLWxlZnQnKVxuICAgICAgICAgIC5kYXRhKGF4aXMub3B0aW9ucy5wbG90QmFuZHMuZmlsdGVyKChkKSA9PiBkLnJlc2l6YWJsZSkpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLWxpbmUtbGVmdC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaW5lLWxlZnQnKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3kyJywgKGQpID0+IHkoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKCd4MicsIHBsb3RCYW5kV2lkdGgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc4LCA4JylcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTkwKScpXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IChkLnNob3dHcmFiYmVycyA/IDEgOiAwKSk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuZHJhZy1sZWZ0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1ncmFiLWxlZnQtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAuYXR0cigneDInLCBwbG90QmFuZFdpZHRoKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgOClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2JhKDAsIDAsIDAsIDApJylcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsIChkKSA9PiAoZC5yZXNpemFibGUgPyAncm93LXJlc2l6ZScgOiAnZGVmYXVsdCcpKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5saW5lLXJpZ2h0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1saW5lLXJpZ2h0LWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmUtcmlnaHQnKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgLmF0dHIoJ3gyJywgcGxvdEJhbmRXaWR0aClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDEpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzgsIDgnKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNvbG9yLXRleHQtOTApJylcbiAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAoZCkgPT4gKGQuc2hvd0dyYWJiZXJzID8gMSA6IDApKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5kcmFnLXJpZ2h0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZHJhZy1yaWdodCcpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtZ3JhYi1yaWdodC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgLmF0dHIoJ3gyJywgcGxvdEJhbmRXaWR0aClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiYSgwLCAwLCAwLCAwKScpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAoZCkgPT4gKGQucmVzaXphYmxlID8gJ3Jvdy1yZXNpemUnIDogJ2RlZmF1bHQnKSk7XG5cbiAgICAgICAgYXhpcy5vcHRpb25zLnBsb3RCYW5kcy5mb3JFYWNoKChfKSA9PiB7XG4gICAgICAgICAgaWYgKF8uZHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICBwbG90YmFuZC5zZWxlY3QoYFtkYXRhLXBsb3RiYW5kLWlkPScke18uaWR9J11gKS5jYWxsKGRyYWdQbG90YmFuZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF8ucmVzaXphYmxlKSB7XG4gICAgICAgICAgICBwbG90YmFuZC5zZWxlY3QoYFtkYXRhLWdyYWItbGVmdC1pZD0nJHtfLmlkfSddYCkuY2FsbChsZWZ0R3JhYkRyYWcpO1xuICAgICAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1yaWdodC1pZD0nJHtfLmlkfSddYClcbiAgICAgICAgICAgICAgLmNhbGwocmlnaHRHcmFiRHJhZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3Q2hhcnQoKSB7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5fb3B0aW9ucy5zZXJpZXM/LmZpbHRlcigoXykgPT4gXy52aXNpYmxlKTtcblxuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLnNlcmllcycpLnJlbW92ZSgpO1xuXG4gICAgaWYgKCFzZXJpZXMgfHwgc2VyaWVzLmxlbmd0aCA8IDEpIHtcbiAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdzZXJpZXMnKVxuICAgICAgLmF0dHIoJ2NsaXAtcGF0aCcsIGB1cmwoI2RyYXctd2luZG93LSR7dGhpcy51bmlxSWR9KWApO1xuXG4gICAgc2VyaWVzPy5mb3JFYWNoKChzZXJpZXNJdGVtOiBTZXJpZXM8QmFzZVBvaW50PiwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChzZXJpZXNJdGVtLnJlbmRlclRvID09PSAnY2FudmFzJykge1xuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCBudWxsKTtcblxuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnc3ZnJylcbiAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5feFNjYWxlcy5oYXMoc2VyaWVzSXRlbS54QXhpc0luZGV4KSB8fFxuICAgICAgICAhdGhpcy5feVNjYWxlcy5oYXMoc2VyaWVzSXRlbS55QXhpc0luZGV4KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRYID0gdGhpcy5feFNjYWxlcy5nZXQoc2VyaWVzSXRlbS54QXhpc0luZGV4KTtcbiAgICAgIGNvbnN0IGZvdW5kWSA9IHRoaXMuX3lTY2FsZXMuZ2V0KHNlcmllc0l0ZW0ueUF4aXNJbmRleCk7XG5cbiAgICAgIGNvbnN0IGRyYXdlciA9XG4gICAgICAgIHNlcmllc0l0ZW0uZHJhd2VyICE9IG51bGxcbiAgICAgICAgICA/IHNlcmllc0l0ZW0uZHJhd2VyXG4gICAgICAgICAgOiBkZWZhdWx0RHJhd2VyTWFwcGluZy5nZXQoc2VyaWVzSXRlbS50eXBlKTtcblxuICAgICAgaWYgKCFkcmF3ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBkcmF3ZXIgZm9yIHNlcmllcyAke3Nlcmllc0l0ZW0ubmFtZX0sIHR5cGUgJHtcbiAgICAgICAgICAgIFNlcmllc1R5cGVbc2VyaWVzSXRlbS50eXBlXVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXJpZXNJdGVtLnJlbmRlclRvID09PSAnY2FudmFzJykge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IFt4TWluLCB4TWF4XSA9IGZvdW5kWC5kb21haW4oKTtcbiAgICAgIGxldCBbeU1pbiwgeU1heF0gPSBmb3VuZFkuZG9tYWluKCk7XG5cbiAgICAgIHhNaW4gPSB4TWluIGluc3RhbmNlb2YgRGF0ZSA/IHhNaW4uZ2V0VGltZSgpIDogeE1pbjtcbiAgICAgIHhNYXggPSB4TWF4IGluc3RhbmNlb2YgRGF0ZSA/IHhNYXguZ2V0VGltZSgpIDogeE1heDtcblxuICAgICAgeU1pbiA9IHlNaW4gaW5zdGFuY2VvZiBEYXRlID8geU1pbi5nZXRUaW1lKCkgOiB5TWluO1xuICAgICAgeU1heCA9IHlNYXggaW5zdGFuY2VvZiBEYXRlID8geU1heC5nZXRUaW1lKCkgOiB5TWF4O1xuXG4gICAgICBjb25zdCB2aXNpYmxlUG9pbnRzID0gKFxuICAgICAgICBwb2ludDogQmFzZVBvaW50LFxuICAgICAgICBpZHg6IG51bWJlcixcbiAgICAgICAgYXJyOiBBcnJheTxCYXNlUG9pbnQ+XG4gICAgICApID0+XG4gICAgICAgIChwb2ludC54IDw9IHhNYXggfHxcbiAgICAgICAgICBwb2ludC54MSA8PSB4TWF4IHx8XG4gICAgICAgICAgKGFycltpZHggLSAxXSAmJiBhcnJbaWR4IC0gMV0ueCA8PSB4TWF4KSB8fFxuICAgICAgICAgIChhcnJbaWR4IC0gMV0gJiYgYXJyW2lkeCAtIDFdLngxIDw9IHhNYXgpKSAmJlxuICAgICAgICAocG9pbnQueCA+PSB4TWluIHx8XG4gICAgICAgICAgcG9pbnQueDEgPj0geE1pbiB8fFxuICAgICAgICAgIChhcnJbaWR4ICsgMV0gJiYgYXJyW2lkeCArIDFdLnggPj0geE1pbikgfHxcbiAgICAgICAgICAoYXJyW2lkeCArIDFdICYmIGFycltpZHggKyAxXS54MSA+PSB4TWluKSkgJiZcbiAgICAgICAgKHBvaW50LnkgPD0geU1heCB8fFxuICAgICAgICAgIHBvaW50LnkxIDw9IHlNYXggfHxcbiAgICAgICAgICAoYXJyW2lkeCAtIDFdICYmIGFycltpZHggLSAxXS55IDw9IHlNYXgpIHx8XG4gICAgICAgICAgKGFycltpZHggLSAxXSAmJiBhcnJbaWR4IC0gMV0ueTEgPD0geU1heCkpICYmXG4gICAgICAgIChwb2ludC55ID49IHlNaW4gfHxcbiAgICAgICAgICBwb2ludC55MSA+PSB5TWluIHx8XG4gICAgICAgICAgKGFycltpZHggKyAxXSAmJiBhcnJbaWR4ICsgMV0ueSA+PSB5TWluKSB8fFxuICAgICAgICAgIChhcnJbaWR4ICsgMV0gJiYgYXJyW2lkeCArIDFdLnkxID49IHlNaW4pKTtcblxuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gc2VyaWVzSXRlbS5kYXRhOyAvLy5maWx0ZXIodmlzaWJsZVBvaW50cyk7XG5cbiAgICAgIGNvbnN0IHNlcmllID0ge1xuICAgICAgICAuLi5zZXJpZXNJdGVtLFxuICAgICAgICBkYXRhOiBmaWx0ZXJlZERhdGEsXG4gICAgICB9O1xuXG4gICAgICBkcmF3ZXIuZHJhdyhcbiAgICAgICAgc2VyaWUsXG4gICAgICAgIHNlcmllc0l0ZW0ucmVuZGVyVG8gPT09ICdjYW52YXMnID8gdGhpcy5fY2FudmFzIDogZ3JvdXAsXG4gICAgICAgIGZvdW5kWCxcbiAgICAgICAgZm91bmRZLFxuICAgICAgICB0aGlzLl9vcHRpb25zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+PikgPT4ge1xuICAgICAgICB0aGlzLnNlcmllc01vdmUkLm5leHQoZXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW1pdFBvaW50ID0gKGV2ZW50OiBJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+PikgPT4ge1xuICAgICAgICB0aGlzLnBvaW50TW92ZSQubmV4dChldmVudCk7XG4gICAgICB9O1xuXG4gICAgICBkcmF3ZXI/LmRpc3BhdGNoPy5vbihEaXNwYXRjaFR5cGUubW92ZUxpbmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZW1pdCh0aGlzKTtcbiAgICAgIH0pO1xuXG4gICAgICBkcmF3ZXI/LmRpc3BhdGNoPy5vbihEaXNwYXRjaFR5cGUubW92ZVBvaW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVtaXRQb2ludCh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwKCkge1xuICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAndG9vbHRpcC1jaGFydCBjb2xvci10ZXh0LTkwIGJnLWJhY2tncm91bmQtNTAgc2hhZG93LTInKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdmaXhlZCcpXG4gICAgICAuc3R5bGUoJ3RvcCcsICd1bnNldCcpXG4gICAgICAuc3R5bGUoJ3JpZ2h0JywgJ3Vuc2V0JylcbiAgICAgIC5zdHlsZSgnYm90dG9tJywgJ3Vuc2V0JylcbiAgICAgIC5zdHlsZSgnbGVmdCcsICd1bnNldCcpXG4gICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VNb3ZlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb3VzZSA9IGQzLnBvaW50ZXIob3B0aW9ucy5ldmVudCk7XG4gICAgY29uc3QgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQgfSA9IHRoaXMudG9vbHRpcFBvc2l0aW9uKG9wdGlvbnMuZXZlbnQpO1xuXG4gICAgY29uc3QgdG9vbHRpcHNEYXRhID0gW107XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLnNlbGVjdCgnLm1hcmtlci1saW5lJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7MH0sICR7bW91c2VbMV0gLSAyfSlgKTtcblxuICAgIHRoaXMuX2NoYXJ0XG4gICAgICAuc2VsZWN0QWxsKCcubWFya2VyJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZDogU2VyaWVzPEJhc2VQb2ludD4pID0+IHtcbiAgICAgICAgaWYgKCFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLl94U2NhbGVzLmhhcyhkLnhBeGlzSW5kZXgpIHx8XG4gICAgICAgICAgIXRoaXMuX3lTY2FsZXMuaGFzKGQueUF4aXNJbmRleClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm91bmRYID0gdGhpcy5feFNjYWxlcy5nZXQoZC54QXhpc0luZGV4KTtcbiAgICAgICAgY29uc3QgZm91bmRZID0gdGhpcy5feVNjYWxlcy5nZXQoZC55QXhpc0luZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwLnRyYWNraW5nID09PSAneCcpIHtcbiAgICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gZm91bmRYLmRvbWFpbigpO1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGQuZGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAocG9pbnQpID0+IHBvaW50LnggPD0gbWF4ICYmIHBvaW50LnggPj0gbWluXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5maWx0ZXJlZERhdGFdLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICBkMy5hc2NlbmRpbmcoYS54LCBiLngpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChkZDogYW55KSA9PiBkZC54KS5sZWZ0O1xuICAgICAgICAgIGNvbnN0IHgwID0gZm91bmRYLmludmVydChtb3VzZVswXSk7XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGJpc2VjdChzb3J0ZWQsIHgwKTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzb3J0ZWRbaW5kZXhdID8gc29ydGVkW2luZGV4XSA6IHNvcnRlZFtpbmRleCAtIDFdO1xuXG4gICAgICAgICAgdG9vbHRpcHNEYXRhLnB1c2goe1xuICAgICAgICAgICAgcG9pbnQ6IGRhdGEsXG4gICAgICAgICAgICBjb2xvcjogZC5jb2xvcixcbiAgICAgICAgICAgIG5hbWU6IGQubmFtZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7XG4gICAgICAgICAgICAhaXNOYU4oZGF0YT8ueCkgJiYgZGF0YT8ueCAhPSBudWxsID8gZm91bmRYKGRhdGEueCkgOiAtMTBcbiAgICAgICAgICB9LCAkeyFpc05hTihkYXRhPy55KSAmJiBkYXRhPy55ICE9IG51bGwgPyBmb3VuZFkoZGF0YS55KSA6IC0xMH0pYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnRvb2x0aXAudHJhY2tpbmcgPT09ICd5Jykge1xuICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5kLmRhdGFdLnNvcnQoKGEsIGIpID0+IGQzLmFzY2VuZGluZyhhLnksIGIueSkpO1xuICAgICAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChkZDogYW55KSA9PiBkZC55KS5sZWZ0O1xuICAgICAgICAgIGNvbnN0IHkwID0gZm91bmRZLmludmVydChtb3VzZVsxXSk7XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGJpc2VjdChzb3J0ZWQsIHkwLCAwKTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzb3J0ZWRbaW5kZXhdID8gc29ydGVkW2luZGV4XSA6IHNvcnRlZFtpbmRleCAtIDFdO1xuXG4gICAgICAgICAgdG9vbHRpcHNEYXRhLnB1c2goe1xuICAgICAgICAgICAgcG9pbnQ6IGRhdGEsXG4gICAgICAgICAgICBjb2xvcjogZC5jb2xvcixcbiAgICAgICAgICAgIG5hbWU6IGQubmFtZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7XG4gICAgICAgICAgICAhaXNOYU4oZGF0YT8ueCkgJiYgZGF0YT8ueCAhPSBudWxsID8gZm91bmRYKGRhdGEueCkgOiAtMTBcbiAgICAgICAgICB9LCAkeyFpc05hTihkYXRhPy55KSAmJiBkYXRhPy55ICE9IG51bGwgPyBmb3VuZFkoZGF0YS55KSA6IC0xMH0pYDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwPy5mb3JtYXQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX29wdGlvbnMudG9vbHRpcD8uZm9ybWF0KHRvb2x0aXBzRGF0YSk7XG5cbiAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgLnNlbGVjdCgnLnRvb2x0aXAtY2hhcnQnKVxuICAgICAgICAuc3R5bGUoJ3RvcCcsIHRvcClcbiAgICAgICAgLnN0eWxlKCdyaWdodCcsIHJpZ2h0KVxuICAgICAgICAuc3R5bGUoJ2JvdHRvbScsIGJvdHRvbSlcbiAgICAgICAgLnN0eWxlKCdsZWZ0JywgbGVmdClcbiAgICAgICAgLmh0bWwoZm9ybWF0dGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvb2x0aXBQb3NpdGlvbihldmVudCkge1xuICAgIGNvbnN0IGNlbnRlclggPSB0aGlzLl93aWR0aCAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IHRoaXMuX2hlaWdodCAvIDI7XG5cbiAgICBjb25zdCBwYWRkaW5nID0geyB4OiAxMCwgeTogMTAgfTtcblxuICAgIGNvbnN0IHNjZW5lID0ge1xuICAgICAgbGVmdDogZXZlbnQucGFnZVggPiBjZW50ZXJYID8gJ2luaXRpYWwnIDogYCR7ZXZlbnQucGFnZVggKyBwYWRkaW5nLnh9cHhgLFxuICAgICAgdG9wOiBldmVudC5wYWdlWSA+IGNlbnRlclkgPyAnaW5pdGlhbCcgOiBgJHtldmVudC5wYWdlWSArIHBhZGRpbmcueX1weGAsXG4gICAgICBib3R0b206XG4gICAgICAgIGV2ZW50LnBhZ2VZID4gY2VudGVyWVxuICAgICAgICAgID8gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gZXZlbnQucGFnZVl9cHhgXG4gICAgICAgICAgOiAnaW5pdGlhbCcsXG4gICAgICByaWdodDpcbiAgICAgICAgZXZlbnQucGFnZVggPiBjZW50ZXJYXG4gICAgICAgICAgPyBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIGV2ZW50LnBhZ2VYICsgcGFkZGluZy54fXB4YFxuICAgICAgICAgIDogJ2luaXRpYWwnLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2NlbmU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1hcmtlcnMoKSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMudG9vbHRpcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLnRvb2x0aXAuZW5hYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcubWFya2VyJykucmVtb3ZlKCk7XG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0KCcubWFya2VyLWxpbmUnKS5yZW1vdmUoKTtcblxuICAgIHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtYXJrZXItbGluZScpXG4gICAgICAuYXR0cigneDEnLCAzNSlcbiAgICAgIC5hdHRyKCd4MicsIHRoaXMuX3dpZHRoKVxuICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAwLjUpXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTQwKScpXG4gICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgY29uc3QgeyBzZXJpZXMgfSA9IHRoaXMuX29wdGlvbnM7XG5cbiAgICBpZiAoIXNlcmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmtlcnMgPSB0aGlzLl9jaGFydFxuICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAuZGF0YShzZXJpZXMuZmlsdGVyKChfKSA9PiBfLnZpc2libGUpKTtcblxuICAgIG1hcmtlcnNcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ21hcmtlcicpXG4gICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAuYXR0cigncicsIDMpXG4gICAgICAuYXR0cignZmlsbCcsIChfLCBpKSA9PiBfLmNvbG9yKVxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgIGNvbnN0IG1vdXNlb3V0RXZlbnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5tYXJrZXInKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB0aGlzLl9jaGFydC5zZWxlY3QoJy5tYXJrZXItbGluZScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgZDMuc2VsZWN0KHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgICAuc2VsZWN0KCcudG9vbHRpcC1jaGFydCcpXG4gICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1vdXNlTW92ZUV2ZW50ID0gKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBldmVudCxcbiAgICAgICAgc2VyaWVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1vdXNlT3ZlckV2ZW50ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX29wdGlvbnMudG9vbHRpcC5zaG93TWFya2Vycykge1xuICAgICAgICB0aGlzLl9jaGFydFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5tYXJrZXInKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkOiBTZXJpZXM8QmFzZVBvaW50PikgPT4ge1xuICAgICAgICAgICAgaWYgKGQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ25vbmUnO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwLnNob3dMaW5lKSB7XG4gICAgICAgIHRoaXMuX2NoYXJ0LnNlbGVjdCgnLm1hcmtlci1saW5lJykuc3R5bGUoJ2Rpc3BsYXknLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgZDMuc2VsZWN0KHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgICAuc2VsZWN0KCcudG9vbHRpcC1jaGFydCcpXG4gICAgICAgIC5zdHlsZSgnZGlzcGxheScsIG51bGwpO1xuICAgIH07XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLm9uKCdtb3VzZW92ZXInLCBtb3VzZU92ZXJFdmVudClcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgbW91c2VNb3ZlRXZlbnQpXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCBtb3VzZW91dEV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0xlZ2VuZCgpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sZWdlbmQ/LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcubGVnZW5kJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBkcmF3ZXIgPSB0aGlzLl9vcHRpb25zLmxlZ2VuZD8udHlwZVxuICAgICAgPyBkZWZhdWx0TGVnZW5kRHJhd2VyTWFwcGluZy5nZXQodGhpcy5fb3B0aW9ucy5sZWdlbmQudHlwZSlcbiAgICAgIDogZGVmYXVsdExlZ2VuZERyYXdlck1hcHBpbmcuZ2V0KExlZ2VuZFR5cGUuc3dhdGNoZXMpO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFkcmF3ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGRyYXdlciBmb3IgbGVnZW5kXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGRyYXdlci5kcmF3KHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBzZXJpZXM6IHRoaXMuX29wdGlvbnMuc2VyaWVzLmZpbHRlcigoXykgPT4gXy5zaG93SW5MZWdlbmQpLFxuICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbHVjbGF0ZUNoYXJ0V2lkdGgoKSB7XG4gICAgbGV0IHdpZHRoID0gLXRoaXMuX3dpZHRoO1xuXG4gICAgaWYgKHRoaXMub2Zmc2V0T3Bwb3NpdGUgPiAwKSB7XG4gICAgICB3aWR0aCA9IC10aGlzLl93aWR0aCArIHRoaXMub2Zmc2V0T3Bwb3NpdGUgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldE5vbk9wcG9zaXRlID4gMCkge1xuICAgICAgd2lkdGggPVxuICAgICAgICAtdGhpcy5fd2lkdGggKyB0aGlzLl9vcHRpb25zLmJvdW5kcy5yaWdodCArIHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vZmZzZXRPcHBvc2l0ZSA+PSBBeGlzLm9mZnNldEZhY3RvciAmJlxuICAgICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA9PT0gMFxuICAgICkge1xuICAgICAgd2lkdGggPSAtdGhpcy5fd2lkdGggKyB0aGlzLm9mZnNldE9wcG9zaXRlICsgdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRPcHBvc2l0ZSA+IDAgJiYgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA+IDApIHtcbiAgICAgIHdpZHRoID0gLXRoaXMuX3dpZHRoICsgdGhpcy5vZmZzZXRPcHBvc2l0ZSArIHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguYWJzKHdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0dyaWRMaW5lcygpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5ncmlkTGluZXMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlWCA9XG4gICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlID4gMFxuICAgICAgICA/IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgOiB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0ICsgdGhpcy5vZmZzZXROb25PcHBvc2l0ZTtcblxuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLmdyaWQnKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IHlMaXN0ID0gdGhpcy5feUF4aXNMaXN0LmZpbHRlcihcbiAgICAgIChfKSA9PiBfLm9wdGlvbnMudmlzaWJsZSAmJiAhXy5vcHRpb25zLm9wcG9zaXRlXG4gICAgKTtcblxuICAgIGNvbnN0IHk6IGFueSA9XG4gICAgICB5TGlzdD8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuX3lTY2FsZXMuZ2V0KHlMaXN0W3lMaXN0Lmxlbmd0aCAtIDFdLmluZGV4KVxuICAgICAgICA6IHRoaXMuX3lTY2FsZXMuZ2V0KDApO1xuXG4gICAgY29uc3QgeCA9IHRoaXMuX3hTY2FsZXMuZ2V0KDApO1xuXG4gICAgaWYgKCF5IHx8ICF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgVElDS19IRUlHSFQgPSA0MDtcbiAgICBjb25zdCBUSUNLX1dJRFRIID0gNjA7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX2hlaWdodCAvIFRJQ0tfSEVJR0hUKTtcbiAgICBjb25zdCB0aWNrQ291bnRYID0gTWF0aC5yb3VuZCh0aGlzLl93aWR0aCAvIFRJQ0tfV0lEVEgpO1xuXG4gICAgY29uc3QgZ3JpZFkgPSB0aGlzLl9jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCBjb2xvci10ZXh0LTEwJylcbiAgICAgIC5zdHlsZSgnc2hhcGUtcmVuZGVyaW5nJywgJ2NyaXNwRWRnZXMnKTtcblxuICAgIGNvbnN0IGdyaWRsaW5lc1kgPSBkM1xuICAgICAgLmF4aXNMZWZ0KHkpXG4gICAgICAudGlja0Zvcm1hdCgnJyBhcyBhbnkpXG4gICAgICAudGlja1NpemUoLXRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGgpO1xuXG4gICAgY29uc3QgaGFzQmFyU2VyaWVzVHlwZSA9IHRoaXMuX29wdGlvbnMuc2VyaWVzLnNvbWUoXG4gICAgICAoXykgPT4gXy50eXBlID09PSBTZXJpZXNUeXBlLmJhclxuICAgICk7XG5cbiAgICBpZiAoIWhhc0JhclNlcmllc1R5cGUpIHtcbiAgICAgIGNvbnN0IGdyaWRYID0gdGhpcy5fY2hhcnRcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkIGNvbG9yLXRleHQtMTAnKVxuICAgICAgICAuc3R5bGUoJ3NoYXBlLXJlbmRlcmluZycsICdjcmlzcEVkZ2VzJyk7XG5cbiAgICAgIGNvbnN0IGdyaWRsaW5lc1ggPSBkM1xuICAgICAgICAuYXhpc0JvdHRvbSh4KVxuICAgICAgICAudGlja3ModGlja0NvdW50WClcbiAgICAgICAgLnRpY2tGb3JtYXQoJycgYXMgYW55KVxuICAgICAgICAudGlja1NpemUoXG4gICAgICAgICAgdGhpcy5faGVpZ2h0IC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wXG4gICAgICAgICk7XG5cbiAgICAgIGdyaWRYXG4gICAgICAgIC5jYWxsKGdyaWRsaW5lc1gpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAubG93ZXIoKTtcbiAgICB9XG5cbiAgICBncmlkWVxuICAgICAgLmNhbGwoZ3JpZGxpbmVzWSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH0sICR7MH0pYClcbiAgICAgIC5sb3dlcigpO1xuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcuZ3JpZCBwYXRoJykucmVtb3ZlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNjYWxlcygpIHtcbiAgICB0aGlzLl94U2NhbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5feVNjYWxlcy5jbGVhcigpO1xuXG4gICAgY29uc3QgZGVmYXVsdFNjYWxlTWFwcGluZzogTWFwPFNjYWxlVHlwZSwgYW55PiA9IG5ldyBNYXA8U2NhbGVUeXBlLCBhbnk+KClcbiAgICAgIC5zZXQoU2NhbGVUeXBlLmxpbmVhciwgZDMuc2NhbGVMaW5lYXIpXG4gICAgICAuc2V0KFNjYWxlVHlwZS5sb2csIGQzLnNjYWxlTG9nKVxuICAgICAgLnNldChTY2FsZVR5cGUuc3FydCwgZDMuc2NhbGVTcXJ0KVxuICAgICAgLnNldChTY2FsZVR5cGUucG93LCBkMy5zY2FsZVBvdyk7XG5cbiAgICBjb25zdCB4UmFuZ2UgPSBbXG4gICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQsXG4gICAgICB0aGlzLl93aWR0aCAtXG4gICAgICAgICh0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgPyB0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgOiB0aGlzLl9vcHRpb25zLmJvdW5kcy5yaWdodCksXG4gICAgXTtcblxuICAgIGNvbnN0IHlSYW5nZSA9IFtcbiAgICAgIHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSxcbiAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcCxcbiAgICBdO1xuXG4gICAgdGhpcy5feEF4aXNMaXN0LmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnR5cGUgPT09IFNjYWxlLnRpbWUpIHtcbiAgICAgICAgc2NhbGUgPSBkM1xuICAgICAgICAgIC5zY2FsZVRpbWUoKVxuICAgICAgICAgIC5kb21haW4oYXhpcy5leHRlbnQpXG4gICAgICAgICAgLnJhbmdlKGF4aXMub3B0aW9ucy5pbnZlcnRlZCA/IFsuLi54UmFuZ2VdLnJldmVyc2UoKSA6IHhSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzLm9wdGlvbnMudHlwZSA9PT0gU2NhbGUubnVtYmVyKSB7XG4gICAgICAgIHNjYWxlID0gZGVmYXVsdFNjYWxlTWFwcGluZ1xuICAgICAgICAgIC5nZXQoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlKSgpXG4gICAgICAgICAgLmRvbWFpbihheGlzLmV4dGVudClcbiAgICAgICAgICAucmFuZ2UoYXhpcy5vcHRpb25zLmludmVydGVkID8gWy4uLnhSYW5nZV0ucmV2ZXJzZSgpIDogeFJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5uaWNlVGlja3MpIHtcbiAgICAgICAgc2NhbGUubmljZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlID09PSBTY2FsZVR5cGUubG9nKSB7XG4gICAgICAgIHNjYWxlLmJhc2UoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy5iYXNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSA9PT0gU2NhbGVUeXBlLnBvdykge1xuICAgICAgICBzY2FsZS5leHBvbmVudChheGlzLm9wdGlvbnMuc2NhbGVPcHRpb25zLmJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl94U2NhbGVzLnNldChpbmRleCwgc2NhbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5feUF4aXNMaXN0LmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnR5cGUgPT09IFNjYWxlLm51bWJlcikge1xuICAgICAgICBzY2FsZSA9IGRlZmF1bHRTY2FsZU1hcHBpbmdcbiAgICAgICAgICAuZ2V0KGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSkoKVxuICAgICAgICAgIC5kb21haW4oYXhpcy5leHRlbnQpXG4gICAgICAgICAgLnJhbmdlKGF4aXMub3B0aW9ucy5pbnZlcnRlZCA/IFsuLi55UmFuZ2VdLnJldmVyc2UoKSA6IHlSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzLm9wdGlvbnMudHlwZSA9PT0gU2NhbGUudGltZSkge1xuICAgICAgICBzY2FsZSA9IGQzXG4gICAgICAgICAgLnNjYWxlVGltZSgpXG4gICAgICAgICAgLmRvbWFpbihheGlzLmV4dGVudClcbiAgICAgICAgICAucmFuZ2UoYXhpcy5vcHRpb25zLmludmVydGVkID8gWy4uLnlSYW5nZV0ucmV2ZXJzZSgpIDogeVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5uaWNlVGlja3MpIHtcbiAgICAgICAgc2NhbGUubmljZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlID09PSBTY2FsZVR5cGUubG9nKSB7XG4gICAgICAgIHNjYWxlLmJhc2UoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy5iYXNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSA9PT0gU2NhbGVUeXBlLnBvdykge1xuICAgICAgICBzY2FsZS5leHBvbmVudChheGlzLm9wdGlvbnMuc2NhbGVPcHRpb25zLmJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl95U2NhbGVzLnNldChpbmRleCwgc2NhbGUpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5feVNjYWxlcykge1xuICAgICAgdGhpcy5fY2xvbmVkWS5zZXQoa2V5LCB2YWx1ZS5jb3B5KCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuX3hTY2FsZXMpIHtcbiAgICAgIHRoaXMuX2Nsb25lZFguc2V0KGtleSwgdmFsdWUuY29weSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRyYXdBeGlzKCkge1xuICAgIGNvbnN0IGhhc1Zpc2libGVBeGlzID0gWy4uLnRoaXMuX3hBeGlzTGlzdCwgLi4udGhpcy5feUF4aXNMaXN0XS5maWx0ZXIoXG4gICAgICAoYXhpcykgPT4gYXhpcy5vcHRpb25zLnZpc2libGVcbiAgICApO1xuXG4gICAgaWYgKCFoYXNWaXNpYmxlQXhpcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5heGVzJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBheGVzID0gdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4ZXMnKVxuICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpO1xuXG4gICAgY29uc3QgVElDS19IRUlHSFQgPSA0MDtcbiAgICBjb25zdCBUSUNLX1dJRFRIID0gNjA7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX2hlaWdodCAvIFRJQ0tfSEVJR0hUKTtcbiAgICBjb25zdCB0aWNrQ291bnRYID0gTWF0aC5yb3VuZCh0aGlzLl93aWR0aCAvIFRJQ0tfV0lEVEgpO1xuXG4gICAgdGhpcy5feEF4aXNMaXN0LmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IEF4aXNPcHRpb25zID0gYXhpcy5vcHRpb25zO1xuXG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSBgdHJhbnNsYXRlKCR7MH0sICR7XG4gICAgICAgIHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbVxuICAgICAgfSlgO1xuXG4gICAgICBjb25zdCB4ID0gdGhpcy5feFNjYWxlcy5nZXQoYXhpcy5pbmRleCk7XG5cbiAgICAgIGNvbnN0IHhBeGlzID0gZDMuYXhpc0JvdHRvbSh4KS50aWNrcyh0aWNrQ291bnRYKTtcblxuICAgICAgaWYgKGF4aXMub3B0aW9ucz8udGlja0Zvcm1hdCkge1xuICAgICAgICB4QXhpcy50aWNrRm9ybWF0KGF4aXMub3B0aW9ucy50aWNrRm9ybWF0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgICA/IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneC1heGlzLWxhYmVsJylcbiAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY29sb3ItdGV4dC01MCknKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgICAgICB0aGlzLl93aWR0aCAvIDIgK1xuICAgICAgICAgICAgICAnICwnICtcbiAgICAgICAgICAgICAgKHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSkgK1xuICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICApXG4gICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkeScsICczZW0nKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMudGl0bGUgPz8gJycpO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneC1heGlzIGZvbnQtY2FwdGlvbicpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteC1zY2FsZS1pZCcsIGF4aXMuaW5kZXgpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSlcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5jYWxsKHhBeGlzKVxuICAgICAgICAgIC5jYWxsKChfKSA9PiB7XG4gICAgICAgICAgICBfLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgXy5zZWxlY3RBbGwoJy50aWNrJykuYXR0cignY2xhc3MnLCAnY29sb3ItdGV4dC01MCcpO1xuXG4gICAgICAgICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgICAgICAgXy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5faGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7eCgwKX0sIC0ke3RoaXMuX2hlaWdodH0pYClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDAuNSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTUwKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgICAgIC5hdHRyKCd4MicsIHRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGgpXG4gICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH0sICR7MH0pYClcbiAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAwLjUpXG4gICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNvbG9yLXRleHQtNTApJyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl95QXhpc0xpc3QuZm9yRWFjaCgoYXhpcykgPT4ge1xuICAgICAgY29uc3QgdHJhbnNsYXRlID0gYXhpcy5vcHRpb25zLm9wcG9zaXRlXG4gICAgICAgID8gYHRyYW5zbGF0ZSgke3RoaXMuX3dpZHRoIC0gYXhpcy5vZmZzZXR9LCAkezB9KWBcbiAgICAgICAgOiBgdHJhbnNsYXRlKCR7YXhpcy5vZmZzZXR9LCAkezB9KWA7XG5cbiAgICAgIGNvbnN0IHkgPSB0aGlzLl95U2NhbGVzLmdldChheGlzLmluZGV4KTtcblxuICAgICAgY29uc3QgeUF4aXMgPSBheGlzLm9wdGlvbnMub3Bwb3NpdGUgPyBkMy5heGlzUmlnaHQoeSkgOiBkMy5heGlzTGVmdCh5KTtcblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy52aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBsYWJlbE9mZnNldCA9IGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgID8gdGhpcy5fd2lkdGggLSBheGlzLm9mZnNldCArIGF4aXMud2lkdGhcbiAgICAgICAgICA6IGF4aXMub2Zmc2V0IC0gYXhpcy53aWR0aDtcblxuICAgICAgICBheGVzXG4gICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ktYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNvbG9yLXRleHQtNTApJylcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgICAgICAuYXR0cigneScsIGxhYmVsT2Zmc2V0KVxuICAgICAgICAgIC5hdHRyKCd4JywgMCAtIHRoaXMuX2hlaWdodCAvIDIpXG4gICAgICAgICAgLmF0dHIoJ2R5JywgYXhpcy5vcHRpb25zLm9wcG9zaXRlID8gJzEycHgnIDogJy0zcHgnKVxuICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAudGV4dChheGlzLm9wdGlvbnMudGl0bGUgPz8gJycpO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneS1heGlzIGZvbnQtY2FwdGlvbicpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteS1zY2FsZS1pZCcsIGF4aXMuaW5kZXgpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSlcbiAgICAgICAgICAuY2FsbCh5QXhpcylcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5jYWxsKChfKSA9PiB7XG4gICAgICAgICAgICBfLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgXy5zZWxlY3RBbGwoJy50aWNrJykuYXR0cignY2xhc3MnLCAnY29sb3ItdGV4dC01MCcpO1xuXG4gICAgICAgICAgICBpZiAoIW5lZ2F0aXZlKSB7XG4gICAgICAgICAgICAgIF8uYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICAgJ3kyJyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgICAgICAgYHRyYW5zbGF0ZSgkezB9LCAke3RoaXMuX29wdGlvbnMuYm91bmRzLnRvcH0pYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDAuNSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTUwKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|