@worktile/theia 16.1.7 → 16.1.9
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/components/contextmenu/contextmenu.component.d.ts +1 -1
- package/components/conversion-hint/conversion-hint.component.d.ts +1 -1
- package/components/inline-toolbar/inline-toolbar.component.d.ts +1 -1
- package/components/listbox/listbox.d.ts +3 -3
- package/components/plugin-menu/plugin-menu.component.d.ts +5 -4
- package/components/table-select/table-select.component.d.ts +1 -1
- package/components/toolbar/toolbar.component.d.ts +2 -2
- package/components/toolbar-group/toolbar-group.component.d.ts +1 -1
- package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
- package/custom-types.d.ts +1 -0
- package/editor.component.d.ts +1 -1
- package/editor.module.d.ts +2 -2
- package/{esm2020 → esm2022}/components/action/prevent-default.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize-notifier.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize.directive.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize.module.mjs +9 -9
- package/{esm2020 → esm2022}/components/column-resize/event-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/overlay-handle.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/resizing.store.mjs +4 -4
- package/{esm2020 → esm2022}/components/contextmenu/contextmenu.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/conversion-hint/conversion-hint.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/element/element.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/inline-toolbar/inline-toolbar.component.mjs +6 -6
- package/esm2022/components/listbox/listbox.mjs +375 -0
- package/esm2022/components/plugin-menu/plugin-menu.component.mjs +205 -0
- package/{esm2020 → esm2022}/components/table-select/table-select.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/template/template.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/text/text.component.mjs +4 -4
- package/esm2022/components/toolbar/toolbar.component.mjs +267 -0
- package/{esm2020 → esm2022}/components/toolbar-dropdown/toolbar-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/toolbar-group/toolbar-group.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/toolbar-item/toolbar-item.component.mjs +6 -6
- package/{esm2020 → esm2022}/core/toolbar-item/base-toolbar-item.mjs +7 -7
- package/esm2022/custom-types.mjs +2 -0
- package/{esm2020 → esm2022}/editor.component.mjs +11 -11
- package/esm2022/editor.module.mjs +254 -0
- package/esm2022/interfaces/image.mjs +3 -0
- package/{esm2020 → esm2022}/interfaces/view-base.mjs +4 -4
- package/{esm2020 → esm2022}/pipes.mjs +10 -10
- package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-block.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/blockquote/blockquote.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/code/code.component.mjs +5 -5
- package/{esm2020 → esm2022}/plugins/color/toolbar-item.component.mjs +4 -4
- package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +59 -0
- package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +136 -0
- package/{esm2020 → esm2022}/plugins/hr/hr.component.mjs +6 -6
- package/esm2022/plugins/image/image.component.mjs +438 -0
- package/esm2022/plugins/image/image.editor.mjs +96 -0
- package/{esm2020 → esm2022}/plugins/inline-code/inline-code.component.mjs +6 -6
- package/{esm2020 → esm2022}/plugins/link/edit/link-edit.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/link/hover/link-hover.component.mjs +5 -5
- package/{esm2020 → esm2022}/plugins/link/link.component.mjs +9 -9
- package/{esm2020 → esm2022}/plugins/list/components/bulleted-list.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/list/components/list-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/list/components/numbered-list.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/mention/suggestion.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/quick-insert/components/quick-insert.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/components/insert-mark/insert-mark.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/components/row/row.component.mjs +6 -6
- package/esm2022/plugins/table/components/table.component.mjs +834 -0
- package/{esm2020 → esm2022}/plugins/table/components/td/td.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-options.component.mjs +6 -6
- package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-toolbar.component.mjs +5 -5
- package/{esm2020 → esm2022}/plugins/table/table.pipe.mjs +7 -7
- package/{esm2020 → esm2022}/plugins/table/table.service.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/table.store.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/toolbar-item.component.mjs +6 -6
- package/{esm2020 → esm2022}/plugins/todo-item/todo-item.component.mjs +6 -6
- package/{esm2020 → esm2022}/plugins/vertical-align/toolbar-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/services/context.service.mjs +4 -4
- package/{esm2020 → esm2022}/services/table-contextmenu.service.mjs +4 -4
- package/{esm2020 → esm2022}/services/toolbar.service.mjs +4 -4
- package/{esm2020 → esm2022}/transforms/on-keydown-reset-block-type.mjs +1 -1
- package/{fesm2020 → fesm2022}/worktile-theia.mjs +420 -393
- package/fesm2022/worktile-theia.mjs.map +1 -0
- package/interfaces/editor.d.ts +5 -3
- package/interfaces/image.d.ts +5 -4
- package/package.json +6 -15
- package/plugins/image/image.component.d.ts +1 -1
- package/plugins/image/image.editor.d.ts +7 -0
- package/plugins/link/edit/link-edit.component.d.ts +1 -1
- package/plugins/link/hover/link-hover.component.d.ts +1 -1
- package/plugins/mention/suggestion.component.d.ts +1 -1
- package/plugins/quick-insert/components/quick-insert.component.d.ts +1 -1
- package/plugins/table/components/insert-mark/insert-mark.component.d.ts +1 -1
- package/plugins/table/components/table.component.d.ts +7 -7
- package/plugins/table/components/toolbar/table-options.component.d.ts +1 -1
- package/plugins/table/components/toolbar/table-toolbar.component.d.ts +1 -1
- package/esm2020/components/listbox/listbox.mjs +0 -375
- package/esm2020/components/plugin-menu/plugin-menu.component.mjs +0 -204
- package/esm2020/components/toolbar/toolbar.component.mjs +0 -266
- package/esm2020/custom-types.mjs +0 -2
- package/esm2020/editor.module.mjs +0 -254
- package/esm2020/interfaces/image.mjs +0 -3
- package/esm2020/plugins/deserialize/deserialize-html.plugin.mjs +0 -53
- package/esm2020/plugins/deserialize/deserialize-md.plugin.mjs +0 -130
- package/esm2020/plugins/image/image.component.mjs +0 -440
- package/esm2020/plugins/image/image.editor.mjs +0 -81
- package/esm2020/plugins/table/components/table.component.mjs +0 -834
- package/fesm2015/worktile-theia.mjs +0 -16711
- package/fesm2015/worktile-theia.mjs.map +0 -1
- package/fesm2020/worktile-theia.mjs.map +0 -1
- /package/{esm2020 → esm2022}/components/column-resize/resize-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/components/column-resize/selectors.mjs +0 -0
- /package/{esm2020 → esm2022}/components/index.mjs +0 -0
- /package/{esm2020 → esm2022}/components/listbox/listbox.type.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/auto-format-rules.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/code.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/color-select.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/default.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/error.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/node-types.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/plugin-menu.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/selector.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/core/create-plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/core/create-toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/core/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/combine-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/flatten-deep-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugin-options.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-array.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-deep-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-options.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/nested-structure-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/plugin-menu.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/plugins-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/core/with-theia.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/auto-format.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/editor.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/no-infer.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/plugin-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/plugin-menu.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/with-override.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/reset-block-type-plugin-options.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/upload.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/nested-structure-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/override-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/types.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/valid-children-types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/align/align.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/align/align.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/autoformat/autoformat.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-inline.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/code/code.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/code/code.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/color/color.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/color/color.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/block-card.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/common.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/get-fragment.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/history.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/insert-data-by-invalid-type.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/move-selection.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/remove-empty.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/remove-void.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/reset-type.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/common/transforms.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/font-size/font-size.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/heading/heading.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/heading/heading.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/hr/hr.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/hr/hr.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/image/image.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/indent/indent.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/indent/indent.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/indent/on-keydown-indent.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/link/link.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/link/link.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/link/link.types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/list.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/list.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/normalizers/get-list-normalizer.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-no.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/on-key-down-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-entry.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-sublist.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-list-types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-start-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/has-list-in-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-in-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-list-nested.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-node-type-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/is-single-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-data.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-item.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-down.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-up.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/transforms/unwrap-list.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mark/mark.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mark/mark.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/mention.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/mention.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/mention.type.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/node-id/node-id.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/normalizers/insert-paragraph-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/normalizers/remove-empty-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/normalizers/trailing-node.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/paint-format/paint-format.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/table.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/table.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/table.types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/clear-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/clear-table-node.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/insert-column.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/insert-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/insert-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/remove-column.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/remove-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/remove-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/add-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/calc-anchor-position.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/calc-span.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/calculate-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/cell-position.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-table-position.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/get-grid-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/get-min-max-cell-index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/get-select-cell-node.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/handle-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-header-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-legal-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-range-in-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-selection-in-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-virtual-key.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/merge-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/next-path.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/normalize-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/remove-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/remove-row-column.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/set-cells-background-color.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/set-node-options.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/split-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/table-entry.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/table-position.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/vertical-align/vertical-align.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/anchor-block-entry.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/anchor-block.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/anchor-inline-entry.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/find-descendant.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/find-node.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/find-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-above-by-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-above.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-anchor-block-entry.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-block-above.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-block-card-above.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-block-card-cursor.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-container-blocks.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-directly-parent.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-insert-elements-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-last-child-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-last-node.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-next-sibling-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-node.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-nodes-by-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-parent.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-plain-text.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-plugin-by-toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-point-before.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-point-from-location.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-previous-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-rang-from-block-start.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-range-before.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-selection-marks.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-selection-nodes-by-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-text.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-toolbar-disabled.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/index.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-across-blocks.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-ancestor-empty.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-ancestor.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-block-above-empty.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-block-active.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-block-card-cursor.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-block-text-empty-after-selection.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-collapsed.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-contain-nested-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-container-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-descendant.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-empty-content-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-empty-content.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-empty-paragraph-by-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-empty-paragraph.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-first-child.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-global-collapsed.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-include-types.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-node-type-in.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-node-type.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-paragraph.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-point-at-root.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-range-across-blocks.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-range-at-root.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-start.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/some-node.mjs +0 -0
- /package/{esm2020 → esm2022}/shortcuts/index.mjs +0 -0
- /package/{esm2020 → esm2022}/shortcuts/mark.mjs +0 -0
- /package/{esm2020 → esm2022}/test/index.mjs +0 -0
- /package/{esm2020 → esm2022}/test/utils/with-plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/apply-deep-to-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/clear-marks.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/close-conversion-hint.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/delete-element.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/handle-continual-delete-backward.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/handle-continual-insert-break.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/index.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/insert-elements.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/insert-paragraph.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/merge-deep-to-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/move-children.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/set-end-selection.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/set-marks.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/set-node.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/un-hang-range.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/un-wrap.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/unwrap-nodes-by-type.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/auto-focus.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/blob.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/cast-array.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/color-picker.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/copy-node.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/create-empty-paragraph.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/data-transform.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/dom.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/editor-uuid.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/fragment.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/get-editable-element-height.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/get-toolbar-class.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/insert-data-by-invalid-type.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/is-clean-empty-paragraph.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/is-inline.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/lodash.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/match.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/merge-element-options.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/refocus.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/scroll-into-view.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/weak-maps.mjs +0 -0
- /package/{esm2020 → esm2022}/worktile-theia.mjs +0 -0
|
@@ -0,0 +1,834 @@
|
|
|
1
|
+
import { Component, ElementRef, HostListener, Inject, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
+
import { isKeyHotkey } from 'is-hotkey';
|
|
3
|
+
import { Subject, fromEvent, merge } from 'rxjs';
|
|
4
|
+
import { debounceTime, distinctUntilChanged, filter, map, take, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { Editor, Transforms } from 'slate';
|
|
6
|
+
import { AngularEditor } from 'slate-angular';
|
|
7
|
+
import { ColumnResizeNotifierSource, TableCellEventDispatcher } from '../../../components';
|
|
8
|
+
import { DEFAULT_SCROLL_CONTAINER } from '../../../constants/default';
|
|
9
|
+
import { ScrollDirection } from '../../../constants/node-types';
|
|
10
|
+
import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
|
|
11
|
+
import { getPluginOptions } from '../../../core';
|
|
12
|
+
import { PluginKeys, THE_MODE_TOKEN, TheBaseElementComponent, TheEditor } from '../../../interfaces';
|
|
13
|
+
import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
|
|
14
|
+
import * as TheTransforms from '../../../transforms';
|
|
15
|
+
import { coercePixelsFromCssValue, getElementHeight, getElementWidth, isColorInput, isColorPanel } from '../../../utils';
|
|
16
|
+
import { TableFreezeColumnPipe, TableFreezeRowPipe } from '../table.pipe';
|
|
17
|
+
import { TableService } from '../table.service';
|
|
18
|
+
import { TableStore } from '../table.store';
|
|
19
|
+
import { HEADER_CELL_CLASS, TABLE_CONTROL, TABLE_INSERT_MASK, TABLE_NUMBER_COLUMN, TABLE_PADDING, THE_TABLE_COMPONENT_TOKEN, TableOptions, TableWithStickyRowClass } from '../table.types';
|
|
20
|
+
import { calcColumnGroups, calculateRowControls, createTablePosition, getColumnsWidth, getGridColumns, isHeaderRow, isSelectedAllCell, isVirtualKey } from '../utils';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "../../../components";
|
|
23
|
+
import * as i2 from "../table.store";
|
|
24
|
+
import * as i3 from "../table.service";
|
|
25
|
+
import * as i4 from "../../../services/table-contextmenu.service";
|
|
26
|
+
import * as i5 from "../table.pipe";
|
|
27
|
+
import * as i6 from "../../../services/context.service";
|
|
28
|
+
import * as i7 from "@angular/common";
|
|
29
|
+
import * as i8 from "slate-angular";
|
|
30
|
+
import * as i9 from "../../../components/column-resize/column-resize.directive";
|
|
31
|
+
import * as i10 from "./insert-mark/insert-mark.component";
|
|
32
|
+
import * as i11 from "../../../interfaces";
|
|
33
|
+
export class TheTableComponent extends TheBaseElementComponent {
|
|
34
|
+
get nativeElement() {
|
|
35
|
+
return this.elementRef.nativeElement;
|
|
36
|
+
}
|
|
37
|
+
get tbodyNativeElement() {
|
|
38
|
+
return this.tbodyElement?.nativeElement;
|
|
39
|
+
}
|
|
40
|
+
handleMousedown(event) {
|
|
41
|
+
if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!TheEditor.isFocused(this.editor)) {
|
|
45
|
+
TheEditor.focus(this.editor);
|
|
46
|
+
}
|
|
47
|
+
AngularEditor.moveBlockCard(this.editor, this.element, { direction: 'left' });
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
}
|
|
50
|
+
onContextChange() {
|
|
51
|
+
super.onContextChange();
|
|
52
|
+
if (this.initialized) {
|
|
53
|
+
Promise.resolve().then(() => {
|
|
54
|
+
this.tableStore.emitTableChange();
|
|
55
|
+
this.tableStore.setSelectedColumnsAndRowIndex();
|
|
56
|
+
this.bindTableScrollingShadow();
|
|
57
|
+
this.useRowControls();
|
|
58
|
+
this.setHeaderCellStyle();
|
|
59
|
+
this.setHeaderRowShadow();
|
|
60
|
+
this.setHeaderRowLeftStyle();
|
|
61
|
+
this.cdr.markForCheck();
|
|
62
|
+
});
|
|
63
|
+
this.getIsInTable();
|
|
64
|
+
this.getColControls();
|
|
65
|
+
this.getColumnGroups();
|
|
66
|
+
}
|
|
67
|
+
this.headerRow = isHeaderRow(this.element);
|
|
68
|
+
}
|
|
69
|
+
constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService, config) {
|
|
70
|
+
super(elementRef, cdr);
|
|
71
|
+
this.eventDispatcher = eventDispatcher;
|
|
72
|
+
this.resizeNotifier = resizeNotifier;
|
|
73
|
+
this.tableStore = tableStore;
|
|
74
|
+
this.cdr = cdr;
|
|
75
|
+
this.ngZone = ngZone;
|
|
76
|
+
this.tableService = tableService;
|
|
77
|
+
this.theTableContextMenuService = theTableContextMenuService;
|
|
78
|
+
this.freezeColumnPipe = freezeColumnPipe;
|
|
79
|
+
this.freezeRowPipe = freezeRowPipe;
|
|
80
|
+
this.renderer = renderer;
|
|
81
|
+
this.contextService = contextService;
|
|
82
|
+
this.config = config;
|
|
83
|
+
this.headerRow = false;
|
|
84
|
+
this.isSelectedAllCell = false;
|
|
85
|
+
this.destroy$ = new Subject();
|
|
86
|
+
this.rowControls = [];
|
|
87
|
+
this.colControls = [];
|
|
88
|
+
this.getColControlButtonWidth = () => {
|
|
89
|
+
let result = 0;
|
|
90
|
+
result += this.element?.options?.numberedColumn ? TABLE_NUMBER_COLUMN : 0;
|
|
91
|
+
return result;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
ngOnInit() {
|
|
95
|
+
super.ngOnInit();
|
|
96
|
+
this.getColControls();
|
|
97
|
+
this.getIsInTable();
|
|
98
|
+
this.tablePluginOptions = getPluginOptions(this.editor, PluginKeys.table);
|
|
99
|
+
if (this.tablePluginOptions.showFullscreen && this.tablePluginOptions.fullscreenAction) {
|
|
100
|
+
this.tablePluginOptions
|
|
101
|
+
.fullscreenAction(this.editor)
|
|
102
|
+
.pipe(takeUntil(this.destroy$), filter(content => {
|
|
103
|
+
return content.element === this.element;
|
|
104
|
+
}), map(content => {
|
|
105
|
+
return content.state === 'off' ? false : true;
|
|
106
|
+
}))
|
|
107
|
+
.subscribe(value => {
|
|
108
|
+
this.tableStore.isFullscreen = value;
|
|
109
|
+
if (this.tableStore.isFullscreen) {
|
|
110
|
+
this.previousScrollContainer = this.editor.options.scrollContainer;
|
|
111
|
+
this.editor.options.scrollContainer = DEFAULT_SCROLL_CONTAINER;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.editor.options.scrollContainer = this.previousScrollContainer;
|
|
115
|
+
}
|
|
116
|
+
this.isStickyTop = false;
|
|
117
|
+
this.setHeaderRowStyle();
|
|
118
|
+
this.contextService.rebindContainerScroll();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
this.tableStore
|
|
122
|
+
.selectedCellsChange()
|
|
123
|
+
.pipe(takeUntil(this.destroy$))
|
|
124
|
+
.subscribe(() => {
|
|
125
|
+
this.isSelectedAllCell = isSelectedAllCell(this.editor, this.tableStore.getSelectedCellPositions());
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
getWrapperWidth() {
|
|
129
|
+
const tableContainer = this.nativeElement.firstChild;
|
|
130
|
+
const paddingLeft = coercePixelsFromCssValue(window.getComputedStyle(tableContainer)['paddingLeft']);
|
|
131
|
+
const width = tableContainer.offsetWidth - paddingLeft;
|
|
132
|
+
return width;
|
|
133
|
+
}
|
|
134
|
+
ngAfterViewInit() {
|
|
135
|
+
this.ngZone.onStable.pipe(take(1)).subscribe(async () => {
|
|
136
|
+
const blockCardElement = this.nativeElement.closest('slate-block-card');
|
|
137
|
+
if (blockCardElement) {
|
|
138
|
+
blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
|
|
139
|
+
}
|
|
140
|
+
this.tableStore.initEditor(this.editor);
|
|
141
|
+
this.subscribeCellsChange();
|
|
142
|
+
this.subscribeCellPositionChange();
|
|
143
|
+
this.listenTableContextMenuEvent();
|
|
144
|
+
this.listenOnSelectedCells();
|
|
145
|
+
this.listenKeydownEvent();
|
|
146
|
+
this.listenKeyupEvent();
|
|
147
|
+
this.listenTableWrapperScroll();
|
|
148
|
+
this.listenSelectstartEvent();
|
|
149
|
+
this.getColumnGroups();
|
|
150
|
+
this.bindTableScrollingShadow();
|
|
151
|
+
if (this.element.options?.numberedColumn) {
|
|
152
|
+
const loadImageDone = await this.resolveImage();
|
|
153
|
+
// 等待序号列表格内图片加载完成后再去渲染表格行高度
|
|
154
|
+
if (loadImageDone) {
|
|
155
|
+
this.useRowControls();
|
|
156
|
+
this.cdr.detectChanges();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.useRowControls();
|
|
161
|
+
this.cdr.markForCheck();
|
|
162
|
+
}
|
|
163
|
+
this.setHeaderCellStyle();
|
|
164
|
+
const { left } = this.nativeElement.getBoundingClientRect();
|
|
165
|
+
this.tableRectLeft = left;
|
|
166
|
+
this.subscribeScrollContainerScroll();
|
|
167
|
+
this.contextService.containerResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
|
|
168
|
+
if (result.widthChanged) {
|
|
169
|
+
this.setHeaderRowShadow();
|
|
170
|
+
this.setHeaderRowLeftStyle();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
this.contextService.theEditorResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
|
|
174
|
+
if (result.widthChanged) {
|
|
175
|
+
this.setGridColumnsStyle();
|
|
176
|
+
this.setStickyRowStyle();
|
|
177
|
+
this.bindTableScrollingShadow();
|
|
178
|
+
this.setHeaderRowShadow();
|
|
179
|
+
this.getColumnGroups();
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
this.contextService.windowResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
|
|
183
|
+
if (result.widthChanged) {
|
|
184
|
+
this.setHeaderRowShadow();
|
|
185
|
+
this.setHeaderRowLeftStyle();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
getColumnGroups() {
|
|
191
|
+
this.columns = calcColumnGroups(this.readonly, this.element, this.elementRef.nativeElement.offsetWidth, this.config.mode);
|
|
192
|
+
this.cdr.detectChanges();
|
|
193
|
+
}
|
|
194
|
+
/* 给标题行的左/右加阴影 */
|
|
195
|
+
setHeaderRowShadow() {
|
|
196
|
+
// 固定标题行遮盖
|
|
197
|
+
this.renderer.setStyle(this.tableWrapper.nativeElement, 'z-index', this.isStickyTop ? '3' : '0');
|
|
198
|
+
if (this.isLeftShadow || this.isRightShadow) {
|
|
199
|
+
let { height, top } = this.calcHeaderRowShadow();
|
|
200
|
+
let { left, width } = this.nativeElement.getBoundingClientRect();
|
|
201
|
+
if (this.isRightShadow && this.headerRowRightShadow) {
|
|
202
|
+
const headerRowRightShadow = this.headerRowRightShadow.nativeElement;
|
|
203
|
+
this.renderer.setStyle(headerRowRightShadow, 'height', `${height}px`);
|
|
204
|
+
this.renderer.setStyle(headerRowRightShadow, 'top', `${top}px`);
|
|
205
|
+
this.renderer.setStyle(headerRowRightShadow, 'left', `${left + width - 8}px`);
|
|
206
|
+
}
|
|
207
|
+
if (this.isLeftShadow && this.headerRowLeftShadow) {
|
|
208
|
+
const headerRowLeftShadow = this.headerRowLeftShadow.nativeElement;
|
|
209
|
+
this.renderer.setStyle(headerRowLeftShadow, 'height', `${height}px`);
|
|
210
|
+
this.renderer.setStyle(headerRowLeftShadow, 'top', `${top}px`);
|
|
211
|
+
this.renderer.setStyle(headerRowLeftShadow, 'left', `${left + this.getColControlButtonWidth()}px`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
calcHeaderRowShadow() {
|
|
216
|
+
const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
|
|
217
|
+
let height = headerRowHeight;
|
|
218
|
+
// 默认(没有聚焦)的 top 值:滚动容器高度 + 表格的padding(8)
|
|
219
|
+
let top = this.scrollContainerTop + TABLE_PADDING;
|
|
220
|
+
// 聚焦在表格中: 高度 + control(11),top 加一个 mask(19)
|
|
221
|
+
if (this.isInTable) {
|
|
222
|
+
height = height + TABLE_CONTROL;
|
|
223
|
+
top = top + TABLE_INSERT_MASK - 1;
|
|
224
|
+
}
|
|
225
|
+
return { height, top };
|
|
226
|
+
}
|
|
227
|
+
subscribeScrollContainerScroll() {
|
|
228
|
+
this.ngZone.runOutsideAngular(() => {
|
|
229
|
+
this.contextService.containerScrolled$
|
|
230
|
+
.pipe(takeUntil(this.destroy$), map(entires => {
|
|
231
|
+
const { event, direction } = entires;
|
|
232
|
+
if (direction === ScrollDirection.X) {
|
|
233
|
+
const { left } = this.nativeElement.getBoundingClientRect();
|
|
234
|
+
this.isScrollX = this.tableRectLeft !== left;
|
|
235
|
+
this.setHeaderRowLeftStyle();
|
|
236
|
+
}
|
|
237
|
+
if (direction === ScrollDirection.Y) {
|
|
238
|
+
this.scrollContainerTop = event.target.getBoundingClientRect().top;
|
|
239
|
+
const clientRect = this.theTableElement.nativeElement.getBoundingClientRect();
|
|
240
|
+
const headerTopHeight = this.isInTable ? -19 : 11;
|
|
241
|
+
const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
|
|
242
|
+
const top = clientRect.top + headerTopHeight;
|
|
243
|
+
this.isStickyTop =
|
|
244
|
+
top <= this.scrollContainerTop + 8 &&
|
|
245
|
+
clientRect.bottom - this.scrollContainerTop >= headerRowHeight &&
|
|
246
|
+
this.freezeRowPipe.transform(this.element, this.headerRow, this.tablePluginOptions);
|
|
247
|
+
// 标题行内容超过固定高度时移除冻结
|
|
248
|
+
if (this.isStickyTop) {
|
|
249
|
+
const maxHeaderRowHeight = (24 + 8) * 11; // 超出 11 行,取消冻结
|
|
250
|
+
this.isStickyTop = headerRowHeight <= maxHeaderRowHeight;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return this.isStickyTop;
|
|
254
|
+
}), distinctUntilChanged())
|
|
255
|
+
.subscribe(() => {
|
|
256
|
+
this.setHeaderRowStyle();
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
setHeaderCellStyle() {
|
|
261
|
+
let headerRowCells = this.element.children[0].children;
|
|
262
|
+
let headerColumnCells = this.element.children.map(item => item.children[0]);
|
|
263
|
+
if (!this.headerRow) {
|
|
264
|
+
this.removeHeaderCellStyle(headerRowCells);
|
|
265
|
+
headerRowCells = [];
|
|
266
|
+
}
|
|
267
|
+
if (!this.element.options?.headerColumn) {
|
|
268
|
+
this.removeHeaderCellStyle(headerColumnCells);
|
|
269
|
+
headerColumnCells = [];
|
|
270
|
+
}
|
|
271
|
+
let headerCells = headerRowCells.concat(headerColumnCells).filter(item => !item.hidden);
|
|
272
|
+
if (this.headerRow && this.element.options?.headerColumn) {
|
|
273
|
+
headerCells.shift();
|
|
274
|
+
}
|
|
275
|
+
if (headerCells.length) {
|
|
276
|
+
headerCells.map(item => {
|
|
277
|
+
const cellElement = TheEditor.toDOMNode(this.editor, item);
|
|
278
|
+
this.renderer.addClass(cellElement, HEADER_CELL_CLASS);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
this.setHeaderColumnAndControlStyle(headerColumnCells);
|
|
282
|
+
this.setHeaderRowStyle();
|
|
283
|
+
}
|
|
284
|
+
removeHeaderCellStyle(cells) {
|
|
285
|
+
cells.map(item => {
|
|
286
|
+
const cellElement = TheEditor.toDOMNode(this.editor, item);
|
|
287
|
+
this.renderer.removeClass(cellElement, HEADER_CELL_CLASS);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
setHeaderColumnAndControlStyle(cells) {
|
|
291
|
+
let headerColumnCells = [];
|
|
292
|
+
if (cells.length === 0) {
|
|
293
|
+
headerColumnCells = this.element.children.map(item => item.children[0]).filter(item => !item.hidden);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
headerColumnCells = cells.filter(item => !item.hidden);
|
|
297
|
+
}
|
|
298
|
+
const headerColControl = this.columnControlsWrapper.nativeElement.firstElementChild;
|
|
299
|
+
const headerColumnElements = headerColumnCells.map(item => {
|
|
300
|
+
return TheEditor.toDOMNode(this.editor, item);
|
|
301
|
+
});
|
|
302
|
+
[...headerColumnElements, headerColControl].map(item => {
|
|
303
|
+
if (this.freezeColumnPipe.transform(this.element, this.tablePluginOptions)) {
|
|
304
|
+
this.renderer.addClass(item, 'the-sticky-cell');
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.renderer.removeClass(item, 'the-sticky-cell');
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
setHeaderRowStyle() {
|
|
312
|
+
this.setGridColumnsStyle();
|
|
313
|
+
this.setStickyRowStyle();
|
|
314
|
+
this.setHeaderRowShadow();
|
|
315
|
+
this.setHeaderRowLeftStyle();
|
|
316
|
+
}
|
|
317
|
+
setGridColumnsStyle() {
|
|
318
|
+
const colControl = this.columnControlsWrapper.nativeElement;
|
|
319
|
+
if (this.freezeRowPipe.transform(this.element, this.headerRow, this.tablePluginOptions)) {
|
|
320
|
+
const headerRow = this.tbodyElement.nativeElement.childNodes[0];
|
|
321
|
+
const cellsWidth = this.element?.columns && this.colgroup?.nativeElement
|
|
322
|
+
? getColumnsWidth(this.colgroup.nativeElement, true)
|
|
323
|
+
: this.getDefaultCellWidth();
|
|
324
|
+
const gridColumns = getGridColumns(headerRow, cellsWidth);
|
|
325
|
+
const tablePadding = 44;
|
|
326
|
+
let tableWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
|
|
327
|
+
// 序号列存在时, 表格宽度加序号列宽度
|
|
328
|
+
// 只读模式下, 表格宽度不变
|
|
329
|
+
tableWidth = !this.readonly && this.element?.options?.numberedColumn ? tableWidth - tablePadding : tableWidth;
|
|
330
|
+
const stickyRows = this.isInTable ? [colControl, headerRow] : [headerRow];
|
|
331
|
+
stickyRows.map(item => {
|
|
332
|
+
this.renderer.setStyle(item, 'grid-template-columns', gridColumns);
|
|
333
|
+
this.renderer.setStyle(item, 'width', tableWidth + 'px');
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
setStickyRowStyle() {
|
|
338
|
+
const colControl = this.columnControlsWrapper.nativeElement;
|
|
339
|
+
const headerRow = this.nativeElement.querySelector('tbody tr');
|
|
340
|
+
const rowControlInner = this.rowControlsInner.nativeElement;
|
|
341
|
+
const tableCornerBtn = this.cornerControl.nativeElement;
|
|
342
|
+
const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
|
|
343
|
+
const numberedColumn = this.element?.options?.numberedColumn;
|
|
344
|
+
if (this.isStickyTop) {
|
|
345
|
+
this.renderer.addClass(this.nativeElement, TableWithStickyRowClass);
|
|
346
|
+
this.updateStickyRowScrollLeft();
|
|
347
|
+
const top = this.isInTable ? this.scrollContainerTop + 36 : this.scrollContainerTop;
|
|
348
|
+
this.renderer.setStyle(headerRow, 'top', top + 'px');
|
|
349
|
+
this.renderer.setStyle(headerRow, 'height', `${headerRowHeight}px`);
|
|
350
|
+
if (this.isInTable || numberedColumn) {
|
|
351
|
+
[colControl, tableCornerBtn].map(item => {
|
|
352
|
+
item && this.renderer.setStyle(item, 'top', this.scrollContainerTop + 'px');
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// 优化:table 的 padding-top 应该动态变化(与阴影同变)
|
|
356
|
+
const tablePaddingTop = headerRowHeight + 11; // 标题行高 + ctrl btn(11px)高度
|
|
357
|
+
this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', tablePaddingTop + 'px');
|
|
358
|
+
this.renderer.setStyle(rowControlInner, 'padding-top', tablePaddingTop + 'px');
|
|
359
|
+
this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '4');
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
this.renderer.removeClass(this.nativeElement, TableWithStickyRowClass);
|
|
363
|
+
[headerRow, colControl, tableCornerBtn].map(item => {
|
|
364
|
+
item && this.renderer.setStyle(item, 'top', null);
|
|
365
|
+
});
|
|
366
|
+
this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', null);
|
|
367
|
+
this.renderer.setStyle(rowControlInner, 'padding-top', null);
|
|
368
|
+
this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '1');
|
|
369
|
+
}
|
|
370
|
+
const rowControlButton = this.rowControlsButtonWrapper.first?.nativeElement;
|
|
371
|
+
if (this.initialized && rowControlButton) {
|
|
372
|
+
this.setRowControlButtonStyle(rowControlButton);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// setTimeout: 需要等待 rowControls 在 dom 中渲染完毕后才能获取到 rowControlButton
|
|
376
|
+
setTimeout(() => this.setRowControlButtonStyle(rowControlButton));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
setRowControlButtonStyle(rowControlButton) {
|
|
380
|
+
const numberedColumn = this.element?.options?.numberedColumn;
|
|
381
|
+
if (!rowControlButton) {
|
|
382
|
+
rowControlButton = this.rowControlsButtonWrapper.first?.nativeElement;
|
|
383
|
+
}
|
|
384
|
+
if (this.isStickyTop) {
|
|
385
|
+
if ((this.isInTable || numberedColumn) && rowControlButton) {
|
|
386
|
+
this.renderer.setStyle(rowControlButton, 'top', this.scrollContainerTop + 'px');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
rowControlButton && this.renderer.setStyle(rowControlButton, 'top', null);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
bindTableScrollingShadow() {
|
|
394
|
+
const nativeElement = this.tableWrapper.nativeElement;
|
|
395
|
+
const scrollLeft = nativeElement.scrollLeft;
|
|
396
|
+
const scrollWidth = nativeElement.scrollWidth;
|
|
397
|
+
const clientWidth = nativeElement.clientWidth;
|
|
398
|
+
this.isLeftShadow = scrollLeft > 0;
|
|
399
|
+
this.isRightShadow = scrollLeft + clientWidth < scrollWidth;
|
|
400
|
+
const rows = nativeElement.querySelectorAll(`tr`);
|
|
401
|
+
const stickyCells = Array.from(rows).map(item => item.querySelector('th.the-table-col-controls') || item.querySelector('td.slate-element-table-cell'));
|
|
402
|
+
const isColumnHeader = this.freezeColumnPipe.transform(this.element, this.tablePluginOptions);
|
|
403
|
+
const elements = isColumnHeader ? stickyCells : [nativeElement.parentElement];
|
|
404
|
+
if (this.isLeftShadow) {
|
|
405
|
+
elements.forEach(element => {
|
|
406
|
+
element.classList.add('the-table-left-shadow');
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
elements.forEach(item => {
|
|
411
|
+
item.classList.remove('the-table-left-shadow');
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (this.isRightShadow) {
|
|
415
|
+
nativeElement.parentElement.classList.add('the-table-right-shadow');
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
nativeElement.parentElement.classList.remove('the-table-right-shadow');
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
subscribeCellPositionChange() {
|
|
422
|
+
this.tableStore
|
|
423
|
+
.cellsPositionChange()
|
|
424
|
+
.pipe(debounceTime(100), takeUntil(this.destroy$))
|
|
425
|
+
.subscribe(() => {
|
|
426
|
+
this.cdr.detectChanges();
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
subscribeCellsChange() {
|
|
430
|
+
this.tableStore
|
|
431
|
+
.dangerousOrSelectedCellsChange()
|
|
432
|
+
.pipe(takeUntil(this.destroy$))
|
|
433
|
+
.subscribe(() => {
|
|
434
|
+
this.cdr.detectChanges();
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
useRowControls() {
|
|
438
|
+
if ((this.selection && !this.readonly) ||
|
|
439
|
+
this.element?.options?.numberedColumn ||
|
|
440
|
+
this.tableStore.isRightClicking ||
|
|
441
|
+
this.tableStore.isFocusedInput) {
|
|
442
|
+
this.rowControls = calculateRowControls(this.editor, this.element);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
detectChanges() {
|
|
446
|
+
this.cdr.detectChanges();
|
|
447
|
+
}
|
|
448
|
+
resolveImage() {
|
|
449
|
+
const imageElements = this.nativeElement.querySelectorAll('img');
|
|
450
|
+
if (imageElements.length) {
|
|
451
|
+
const imageResolves = [];
|
|
452
|
+
imageElements.forEach(item => {
|
|
453
|
+
const image = new Image();
|
|
454
|
+
const imageLoad = new Promise(resolve => {
|
|
455
|
+
image.onload = () => {
|
|
456
|
+
resolve(true);
|
|
457
|
+
};
|
|
458
|
+
image.onerror = () => {
|
|
459
|
+
resolve(true);
|
|
460
|
+
};
|
|
461
|
+
image.src = item.getAttribute('src');
|
|
462
|
+
});
|
|
463
|
+
imageResolves.push(imageLoad);
|
|
464
|
+
});
|
|
465
|
+
return Promise.all(imageResolves);
|
|
466
|
+
}
|
|
467
|
+
return Promise.resolve(true);
|
|
468
|
+
}
|
|
469
|
+
getColControls() {
|
|
470
|
+
this.colControls = this.element?.children[0]?.children || [];
|
|
471
|
+
}
|
|
472
|
+
getIsInTable() {
|
|
473
|
+
if (this.selection && !this.readonly) {
|
|
474
|
+
const opts = new TableOptions();
|
|
475
|
+
const selection = this.editor.selection;
|
|
476
|
+
const startPosition = createTablePosition(this.editor);
|
|
477
|
+
const endPosition = createTablePosition(this.editor, selection.focus.path);
|
|
478
|
+
this.isInTable = startPosition.isInTable() && endPosition.isInTable();
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
this.isInTable = false;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
getDefaultCellWidth() {
|
|
485
|
+
const tr = this.element.children[0];
|
|
486
|
+
let width = this.elementRef.nativeElement.getBoundingClientRect().width;
|
|
487
|
+
if (this.rowControlsInner) {
|
|
488
|
+
width -= this.rowControlsInner.nativeElement.getBoundingClientRect().width;
|
|
489
|
+
if (this.isCollapsedAndNonReadonly) {
|
|
490
|
+
// 聚焦之后会向左偏移一个 control(-11),见 .the-table-row-controls-wrapper
|
|
491
|
+
width += TABLE_CONTROL;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
let cellsWidth = [];
|
|
495
|
+
// 只读模式,如果有序号列,需要减去序号列的宽度
|
|
496
|
+
if (this.readonly && this.element?.options?.numberedColumn) {
|
|
497
|
+
width -= TABLE_NUMBER_COLUMN;
|
|
498
|
+
cellsWidth.push(TABLE_NUMBER_COLUMN);
|
|
499
|
+
}
|
|
500
|
+
tr.children.forEach(() => {
|
|
501
|
+
cellsWidth.push(Number((width / tr.children.length).toFixed(2)));
|
|
502
|
+
});
|
|
503
|
+
return cellsWidth;
|
|
504
|
+
}
|
|
505
|
+
initializeColumns() {
|
|
506
|
+
if (this.element.columns) {
|
|
507
|
+
const columns = [];
|
|
508
|
+
this.tableWrapper.nativeElement.querySelectorAll('col').forEach((ele) => {
|
|
509
|
+
// Compatible with the problem that the width cannot be obtained under safari #WIK-9643
|
|
510
|
+
columns.push({ width: ele.clientWidth || coercePixelsFromCssValue(ele.style.width) });
|
|
511
|
+
});
|
|
512
|
+
// Editor container width changes, resulting in column widths no longer valid #WIK-6766
|
|
513
|
+
const warning = this.element.columns.some((col, index) => col.width !== columns[index]?.width);
|
|
514
|
+
if (warning) {
|
|
515
|
+
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
const tr = this.element.children[0];
|
|
520
|
+
const tableWidth = AngularEditor.toDOMNode(this.editor, tr).offsetWidth;
|
|
521
|
+
const columns = tr.children.map(cell => {
|
|
522
|
+
return { width: Number((tableWidth / tr.children.length - tr.children.length).toFixed(2)) };
|
|
523
|
+
});
|
|
524
|
+
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
initializeRows() {
|
|
528
|
+
this.element.children.map((row, index) => {
|
|
529
|
+
if (!row.height) {
|
|
530
|
+
const element = TheEditor.toDOMNode(this.editor, row);
|
|
531
|
+
let height = getElementHeight(element);
|
|
532
|
+
TheTransforms.setNode(this.editor, { height }, row);
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
transformRowHeight() {
|
|
537
|
+
const rowElements = this.nativeElement.querySelector('tbody').children;
|
|
538
|
+
if (rowElements) {
|
|
539
|
+
[...rowElements].map((row, index) => {
|
|
540
|
+
let height = getElementHeight(row);
|
|
541
|
+
TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
transformColumnsWidth() {
|
|
546
|
+
const cols = [...this.nativeElement.querySelector('colgroup').children];
|
|
547
|
+
const columns = cols.map(col => {
|
|
548
|
+
return { width: getElementWidth(col) };
|
|
549
|
+
});
|
|
550
|
+
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
551
|
+
}
|
|
552
|
+
onColMousedown(event, index) {
|
|
553
|
+
event.stopPropagation();
|
|
554
|
+
event.preventDefault();
|
|
555
|
+
if (!!this.selection && this.isInTable) {
|
|
556
|
+
this.tableStore.clearDangerousCells();
|
|
557
|
+
this.tableStore.selectColumn(this.editor, index);
|
|
558
|
+
this.tableService.afterSelectedCells(event.target, this.element);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
onRowMousedown(event, index) {
|
|
562
|
+
if (this.readonly)
|
|
563
|
+
return;
|
|
564
|
+
event.stopPropagation();
|
|
565
|
+
event.preventDefault();
|
|
566
|
+
if (!this.isInTable) {
|
|
567
|
+
const path = TheEditor.findPath(this.editor, this.element);
|
|
568
|
+
Transforms.select(this.editor, path);
|
|
569
|
+
}
|
|
570
|
+
this.tableStore.selectRow(this.editor, index);
|
|
571
|
+
this.tableService.afterSelectedCells(event.target, this.element);
|
|
572
|
+
}
|
|
573
|
+
onSelectTable(event) {
|
|
574
|
+
event.stopPropagation();
|
|
575
|
+
event.preventDefault();
|
|
576
|
+
this.tableStore.selectTable(this.editor);
|
|
577
|
+
this.tableService.afterSelectedCells(event.target, this.element);
|
|
578
|
+
}
|
|
579
|
+
listenTableContextMenuEvent() {
|
|
580
|
+
this.ngZone.runOutsideAngular(() => {
|
|
581
|
+
fromEvent(this.theTableElement.nativeElement, 'contextmenu')
|
|
582
|
+
.pipe(takeUntil(this.destroy$))
|
|
583
|
+
.subscribe(event => {
|
|
584
|
+
if (this.readonly) {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
event.preventDefault();
|
|
588
|
+
this.tableStore.isRightClicking = true;
|
|
589
|
+
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
590
|
+
if (!cell) {
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
if (!cell.classList.contains('selected-cell')) {
|
|
595
|
+
this.tableStore.selectCell(cell, this.editor);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
if (this.theTableContextMenuService.isOpened) {
|
|
599
|
+
this.theTableContextMenuService
|
|
600
|
+
.closeContextMenu()
|
|
601
|
+
.pipe(take(1))
|
|
602
|
+
.subscribe(() => {
|
|
603
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
else if (this.tableService.isOpened) {
|
|
607
|
+
this.tableService
|
|
608
|
+
.closeToolbar()
|
|
609
|
+
.pipe(take(1))
|
|
610
|
+
.subscribe(() => {
|
|
611
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
this.cdr.markForCheck();
|
|
616
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
617
|
+
}
|
|
618
|
+
// patch for right click select next cell
|
|
619
|
+
setTimeout(() => {
|
|
620
|
+
Transforms.select(this.editor, Editor.start(this.editor, this.editor.selection));
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
listenOnSelectedCells() {
|
|
626
|
+
merge(fromEvent(document, 'mousedown').pipe(filter((e) => e.button !== 2)), fromEvent(document, 'keydown').pipe(filter((e) => {
|
|
627
|
+
return !isVirtualKey(e) && !this.theTableContextMenuService.isOpened;
|
|
628
|
+
})))
|
|
629
|
+
.pipe(filter((event) => {
|
|
630
|
+
if (isColorInput(event.target)) {
|
|
631
|
+
this.tableStore.isFocusedInput = true;
|
|
632
|
+
return false;
|
|
633
|
+
}
|
|
634
|
+
if (isColorPanel(event.target)) {
|
|
635
|
+
return false;
|
|
636
|
+
}
|
|
637
|
+
const selectedCellPositions = this.tableStore.getSelectedCellPositions();
|
|
638
|
+
return selectedCellPositions?.length > 0;
|
|
639
|
+
}), takeUntil(this.destroy$))
|
|
640
|
+
.subscribe((e) => {
|
|
641
|
+
if (e.type === 'keydown') {
|
|
642
|
+
this.tableStore.clearSelectedCellsContent();
|
|
643
|
+
}
|
|
644
|
+
const isCurrentTableElement = this.nativeElement.contains(e.target);
|
|
645
|
+
if (!isCurrentTableElement || (!this.tableStore.pointerSelection && !this.tableStore.areaSelection)) {
|
|
646
|
+
this.tableStore.clearSelectedCells();
|
|
647
|
+
}
|
|
648
|
+
if (!isCurrentTableElement) {
|
|
649
|
+
this.tableStore.clearLastFocusPath();
|
|
650
|
+
}
|
|
651
|
+
this.theTableContextMenuService.closeContextMenu();
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
listenKeydownEvent() {
|
|
655
|
+
this.ngZone.runOutsideAngular(() => {
|
|
656
|
+
fromEvent(document, 'keydown')
|
|
657
|
+
.pipe(takeUntil(this.destroy$), filter((e) => !!e))
|
|
658
|
+
.subscribe((event) => {
|
|
659
|
+
if (!this.readonly && isKeyHotkey('mod', event)) {
|
|
660
|
+
this.tableService.handleKeydownForPointerSelection(event, this.tbodyNativeElement);
|
|
661
|
+
}
|
|
662
|
+
if (!this.readonly && isKeyHotkey('shift', event)) {
|
|
663
|
+
this.tableService.handleKeydownForAreaSelection(event, this.tbodyNativeElement);
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
listenKeyupEvent() {
|
|
669
|
+
this.ngZone.runOutsideAngular(() => {
|
|
670
|
+
fromEvent(document, 'keyup')
|
|
671
|
+
.pipe(takeUntil(this.destroy$), filter((e) => !!e))
|
|
672
|
+
.subscribe(() => {
|
|
673
|
+
this.tableService.cancelPointerSelection();
|
|
674
|
+
this.tableService.cancelAreaSelection();
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
listenSelectstartEvent() {
|
|
679
|
+
this.ngZone.runOutsideAngular(() => {
|
|
680
|
+
fromEvent(document, 'selectstart')
|
|
681
|
+
.pipe(takeUntil(this.destroy$))
|
|
682
|
+
.subscribe((event) => {
|
|
683
|
+
this.tableService.selectStartPreventDefault(event);
|
|
684
|
+
});
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
listenTableWrapperScroll() {
|
|
688
|
+
const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
|
|
689
|
+
const setStickyRowPointerEvents = (pointerEventsStyle) => {
|
|
690
|
+
for (const stiRow of stickyRows) {
|
|
691
|
+
this.renderer.setStyle(stiRow, 'pointer-events', pointerEventsStyle);
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
let timer;
|
|
695
|
+
fromEvent(this.tableWrapper.nativeElement, 'wheel')
|
|
696
|
+
.pipe(takeUntil(this.destroy$))
|
|
697
|
+
.subscribe(() => {
|
|
698
|
+
// 处理标题行固定时的滚动跟随
|
|
699
|
+
setStickyRowPointerEvents('none');
|
|
700
|
+
timer && clearTimeout(timer);
|
|
701
|
+
timer = setTimeout(() => {
|
|
702
|
+
setStickyRowPointerEvents('auto');
|
|
703
|
+
timer = null;
|
|
704
|
+
}, 200);
|
|
705
|
+
});
|
|
706
|
+
fromEvent(this.tableWrapper.nativeElement, 'scroll')
|
|
707
|
+
.pipe(takeUntil(this.destroy$))
|
|
708
|
+
.subscribe(() => {
|
|
709
|
+
this.bindTableScrollingShadow();
|
|
710
|
+
this.updateStickyRowScrollLeft();
|
|
711
|
+
this.setHeaderRowShadow();
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
updateStickyRowScrollLeft() {
|
|
715
|
+
// 判断是否出现固定标题行
|
|
716
|
+
if (this.isStickyTop) {
|
|
717
|
+
const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
|
|
718
|
+
for (const stiRow of stickyRows) {
|
|
719
|
+
// 修复获取 scrollLeft 属性引起的浏览器重绘,导致跳动问题 #WIK-11038
|
|
720
|
+
requestAnimationFrame(() => {
|
|
721
|
+
// 同步滚动状态到 .the-sticky-row
|
|
722
|
+
stiRow.scrollLeft = this.tableWrapper.nativeElement.scrollLeft;
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
setHeaderRowLeftStyle() {
|
|
728
|
+
const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
|
|
729
|
+
const cornerControl = this.cornerControl.nativeElement;
|
|
730
|
+
const rowControl = this.rowControlsButtonWrapper.first?.nativeElement;
|
|
731
|
+
const stickyElements = [...stickyRows, cornerControl, rowControl];
|
|
732
|
+
const { left } = this.nativeElement.getBoundingClientRect();
|
|
733
|
+
const buffer = this.isInTable ? -TABLE_CONTROL : 0;
|
|
734
|
+
if (this.isStickyTop && this.isScrollX) {
|
|
735
|
+
this.setHeaderRowShadow();
|
|
736
|
+
stickyRows.forEach((element) => {
|
|
737
|
+
this.renderer.setStyle(element, 'left', `${left + this.getColControlButtonWidth()}px`);
|
|
738
|
+
});
|
|
739
|
+
this.renderer.setStyle(cornerControl, 'left', `${left + buffer}px`);
|
|
740
|
+
rowControl && this.renderer.setStyle(rowControl, 'left', `${left + buffer}px`);
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
stickyElements.forEach((element) => {
|
|
744
|
+
element && this.renderer.setStyle(element, 'left', null);
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
trackByFnRowControls(index) {
|
|
749
|
+
return index;
|
|
750
|
+
}
|
|
751
|
+
trackByFnColControls(index) {
|
|
752
|
+
return index;
|
|
753
|
+
}
|
|
754
|
+
ngOnDestroy() {
|
|
755
|
+
super.ngOnDestroy();
|
|
756
|
+
this.destroy$.next();
|
|
757
|
+
this.destroy$.complete();
|
|
758
|
+
}
|
|
759
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }, { token: THE_MODE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
760
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" }, properties: { "class.the-table-with-controls": "isInTable || tableStore.isRightClicking || tableStore.isFocusedInput", "class.the-table-with-sticky-column": "freezeColumnPipe.transform(element, tablePluginOptions)", "class.the-numbered-table": "element?.options?.numberedColumn", "class.the-table-selection-hide": "tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput" } }, providers: [
|
|
761
|
+
TableStore,
|
|
762
|
+
TableService,
|
|
763
|
+
TheTableContextMenuService,
|
|
764
|
+
TableCellEventDispatcher,
|
|
765
|
+
ColumnResizeNotifierSource,
|
|
766
|
+
TableFreezeColumnPipe,
|
|
767
|
+
TableFreezeRowPipe,
|
|
768
|
+
{
|
|
769
|
+
provide: THE_TABLE_COMPONENT_TOKEN,
|
|
770
|
+
useExisting: TheTableComponent
|
|
771
|
+
}
|
|
772
|
+
], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking || tableStore.isFocusedInput\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildren, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] }); }
|
|
773
|
+
}
|
|
774
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: TheTableComponent, decorators: [{
|
|
775
|
+
type: Component,
|
|
776
|
+
args: [{ selector: 'the-table, [theTable]', providers: [
|
|
777
|
+
TableStore,
|
|
778
|
+
TableService,
|
|
779
|
+
TheTableContextMenuService,
|
|
780
|
+
TableCellEventDispatcher,
|
|
781
|
+
ColumnResizeNotifierSource,
|
|
782
|
+
TableFreezeColumnPipe,
|
|
783
|
+
TableFreezeRowPipe,
|
|
784
|
+
{
|
|
785
|
+
provide: THE_TABLE_COMPONENT_TOKEN,
|
|
786
|
+
useExisting: TheTableComponent
|
|
787
|
+
}
|
|
788
|
+
], host: {
|
|
789
|
+
'[class.the-table-with-controls]': 'isInTable || tableStore.isRightClicking || tableStore.isFocusedInput',
|
|
790
|
+
'[class.the-table-with-sticky-column]': 'freezeColumnPipe.transform(element, tablePluginOptions)',
|
|
791
|
+
'[class.the-numbered-table]': 'element?.options?.numberedColumn',
|
|
792
|
+
'[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput'
|
|
793
|
+
}, template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking || tableStore.isFocusedInput\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
|
|
794
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }, { type: i11.TheModeConfig, decorators: [{
|
|
795
|
+
type: Inject,
|
|
796
|
+
args: [THE_MODE_TOKEN]
|
|
797
|
+
}] }]; }, propDecorators: { tableWrapper: [{
|
|
798
|
+
type: ViewChild,
|
|
799
|
+
args: ['tableWrapper', { read: ElementRef, static: true }]
|
|
800
|
+
}], theTableElement: [{
|
|
801
|
+
type: ViewChild,
|
|
802
|
+
args: ['theTable', { read: ElementRef, static: true }]
|
|
803
|
+
}], tbodyElement: [{
|
|
804
|
+
type: ViewChild,
|
|
805
|
+
args: ['tbody', { read: ElementRef, static: true }]
|
|
806
|
+
}], tableRowControlsWrapper: [{
|
|
807
|
+
type: ViewChild,
|
|
808
|
+
args: ['tableRowControlsWrapper', { read: ElementRef, static: false }]
|
|
809
|
+
}], columnControlsWrapper: [{
|
|
810
|
+
type: ViewChild,
|
|
811
|
+
args: ['columnControlsWrapper', { read: ElementRef, static: false }]
|
|
812
|
+
}], cornerControl: [{
|
|
813
|
+
type: ViewChild,
|
|
814
|
+
args: ['cornerControl', { read: ElementRef, static: false }]
|
|
815
|
+
}], rowControlsInner: [{
|
|
816
|
+
type: ViewChild,
|
|
817
|
+
args: ['rowControlsInner', { read: ElementRef, static: false }]
|
|
818
|
+
}], headerRowLeftShadow: [{
|
|
819
|
+
type: ViewChild,
|
|
820
|
+
args: ['headerRowLeftShadow', { read: ElementRef, static: false }]
|
|
821
|
+
}], headerRowRightShadow: [{
|
|
822
|
+
type: ViewChild,
|
|
823
|
+
args: ['headerRowRightShadow', { read: ElementRef, static: false }]
|
|
824
|
+
}], colgroup: [{
|
|
825
|
+
type: ViewChild,
|
|
826
|
+
args: ['colgroup', { read: ElementRef, static: false }]
|
|
827
|
+
}], rowControlsButtonWrapper: [{
|
|
828
|
+
type: ViewChildren,
|
|
829
|
+
args: ['rowControlsButtonWrapper', { read: ElementRef }]
|
|
830
|
+
}], handleMousedown: [{
|
|
831
|
+
type: HostListener,
|
|
832
|
+
args: ['mousedown', ['$event']]
|
|
833
|
+
}] } });
|
|
834
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBTU4sU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSx1QkFB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QUFFO2dCQUlyRSxvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXRFLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR00sd0JBQXdCO3NCQUF2RixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzS2V5SG90a2V5IH0gZnJvbSAnaXMtaG90a2V5JztcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBERUZBVUxUX1NDUk9MTF9DT05UQUlORVIgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBnZXRQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5LZXlzLCBUSEVfTU9ERV9UT0tFTiwgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQsIFRoZUVkaXRvciwgVGhlTW9kZUNvbmZpZywgVGhlUGx1Z2luT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgVGhlVHJhbnNmb3JtcyBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCBpc0NvbG9ySW5wdXQsIGlzQ29sb3JQYW5lbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlIH0gZnJvbSAnLi4vdGFibGUucGlwZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi90YWJsZS5zdG9yZSc7XG5pbXBvcnQge1xuICAgIEhFQURFUl9DRUxMX0NMQVNTLFxuICAgIFRBQkxFX0NPTlRST0wsXG4gICAgVEFCTEVfSU5TRVJUX01BU0ssXG4gICAgVEFCTEVfTlVNQkVSX0NPTFVNTixcbiAgICBUQUJMRV9QQURESU5HLFxuICAgIFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU4sXG4gICAgVGFibGVPcHRpb25zLFxuICAgIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzLFxuICAgIFRoZVBsdWdpblRhYmxlT3B0aW9uLFxuICAgIFRoZVRhYmxlQ29sdW1uXG59IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7XG4gICAgY2FsY0NvbHVtbkdyb3VwcyxcbiAgICBjYWxjdWxhdGVSb3dDb250cm9scyxcbiAgICBjcmVhdGVUYWJsZVBvc2l0aW9uLFxuICAgIGdldENvbHVtbnNXaWR0aCxcbiAgICBnZXRHcmlkQ29sdW1ucyxcbiAgICBpc0hlYWRlclJvdyxcbiAgICBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICBpc1ZpcnR1YWxLZXlcbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS10YWJsZSwgW3RoZVRhYmxlXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgVGFibGVTdG9yZSxcbiAgICAgICAgVGFibGVTZXJ2aWNlLFxuICAgICAgICBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlVGFibGVDb21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS13aXRoLWNvbnRyb2xzXSc6ICdpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCcsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtc3RpY2t5LWNvbHVtbl0nOiAnZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0oZWxlbWVudCwgdGFibGVQbHVnaW5PcHRpb25zKScsXG4gICAgICAgICdbY2xhc3MudGhlLW51bWJlcmVkLXRhYmxlXSc6ICdlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbicsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXNlbGVjdGlvbi1oaWRlXSc6ICd0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZyB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyB8fCB0YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0J1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaGVhZGVyUm93ID0gZmFsc2U7XG5cbiAgICBpc1NlbGVjdGVkQWxsQ2VsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICBjb2xDb250cm9scyA9IFtdO1xuXG4gICAgaXNJblRhYmxlOiBib29sZWFuO1xuXG4gICAgdGFibGVQbHVnaW5PcHRpb25zOiBUaGVQbHVnaW5PcHRpb248VGhlUGx1Z2luVGFibGVPcHRpb24+O1xuXG4gICAgaXNTdGlja3lUb3A6IGJvb2xlYW47XG5cbiAgICBpc1Njcm9sbFg6IGJvb2xlYW47XG5cbiAgICBzY3JvbGxDb250YWluZXJUb3A6IG51bWJlcjtcblxuICAgIHRhYmxlUmVjdExlZnQ6IG51bWJlcjtcblxuICAgIGlzUmlnaHRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBpc0xlZnRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBwcmV2aW91c1Njcm9sbENvbnRhaW5lcjogc3RyaW5nO1xuXG4gICAgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXTtcblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHRhYmxlUm93Q29udHJvbHNXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbHVtbkNvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb3JuZXJDb250cm9sJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29ybmVyQ29udHJvbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdyb3dDb250cm9sc0lubmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcm93Q29udHJvbHNJbm5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dMZWZ0U2hhZG93JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaGVhZGVyUm93TGVmdFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dSaWdodFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd1JpZ2h0U2hhZG93OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbGdyb3VwJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29sZ3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNldFNlbGVjdGVkQ29sdW1uc0FuZFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVhZGVyUm93ID0gaXNIZWFkZXJSb3codGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBldmVudERpc3BhdGNoZXI6IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgcHVibGljIHJlc2l6ZU5vdGlmaWVyOiBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgcHVibGljIHRhYmxlU3RvcmU6IFRhYmxlU3RvcmUsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aGVUYWJsZUNvbnRleHRNZW51U2VydmljZTogVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZnJlZXplQ29sdW1uUGlwZTogVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBwdWJsaWMgZnJlZXplUm93UGlwZTogVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IFRoZUNvbnRleHRTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFRIRV9NT0RFX1RPS0VOKVxuICAgICAgICBwcml2YXRlIGNvbmZpZzogVGhlTW9kZUNvbmZpZ1xuICAgICkge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgIHRoaXMudGFibGVQbHVnaW5PcHRpb25zID0gZ2V0UGx1Z2luT3B0aW9uczxUaGVQbHVnaW5UYWJsZU9wdGlvbj4odGhpcy5lZGl0b3IsIFBsdWdpbktleXMudGFibGUpO1xuICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuc2hvd0Z1bGxzY3JlZW4gJiYgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuZnVsbHNjcmVlbkFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAuZnVsbHNjcmVlbkFjdGlvbih0aGlzLmVkaXRvcilcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY29udGVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5lbGVtZW50ID09PSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoY29udGVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5zdGF0ZSA9PT0gJ29mZicgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyID0gdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lciA9IERFRkFVTFRfU0NST0xMX0NPTlRBSU5FUjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5wcmV2aW91c1Njcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5yZWJpbmRDb250YWluZXJTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZWxlY3RlZEFsbENlbGwgPSBpc1NlbGVjdGVkQWxsQ2VsbCh0aGlzLmVkaXRvciwgdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFdyYXBwZXJXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgdGFibGVDb250YWluZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0xlZnQgPSBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFibGVDb250YWluZXIpWydwYWRkaW5nTGVmdCddKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0YWJsZUNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0NhcmRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3NsYXRlLWJsb2NrLWNhcmQnKTtcbiAgICAgICAgICAgIGlmIChibG9ja0NhcmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmxvY2tDYXJkRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBzbGF0ZS1ibG9jay1jYXJkLSR7dGhpcy5lbGVtZW50LnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaW5pdEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuT25TZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbktleWRvd25FdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5LZXl1cEV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5TZWxlY3RzdGFydEV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRJbWFnZURvbmUgPSBhd2FpdCB0aGlzLnJlc29sdmVJbWFnZSgpO1xuICAgICAgICAgICAgICAgIC8vIOetieW+heW6j+WPt+WIl+ihqOagvOWGheWbvueJh+WKoOi9veWujOaIkOWQjuWGjeWOu+a4suafk+ihqOagvOihjOmrmOW6plxuICAgICAgICAgICAgICAgIGlmIChsb2FkSW1hZ2VEb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVJlY3RMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlU2Nyb2xsQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNvbnRhaW5lclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnRoZUVkaXRvclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEdyaWRDb2x1bW5zU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLndpbmRvd1Jlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb2x1bW5Hcm91cHMoKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNhbGNDb2x1bW5Hcm91cHModGhpcy5yZWFkb25seSwgdGhpcy5lbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCwgdGhpcy5jb25maWcubW9kZSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiDnu5nmoIfpopjooYznmoTlt6Yv5Y+z5Yqg6Zi05b2xICovXG4gICAgc2V0SGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICAvLyDlm7rlrprmoIfpopjooYzpga7nm5ZcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsIHRoaXMuaXNTdGlja3lUb3AgPyAnMycgOiAnMCcpO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cgfHwgdGhpcy5pc1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHQsIHRvcCB9ID0gdGhpcy5jYWxjSGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICBsZXQgeyBsZWZ0LCB3aWR0aCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93UmlnaHRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB3aWR0aCAtIDh9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dMZWZ0U2hhZG93ID0gdGhpcy5oZWFkZXJSb3dMZWZ0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjSGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KVswXT8uaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0gaGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAvLyDpu5jorqTvvIjmsqHmnInogZrnhKbvvInnmoQgdG9wIOWAvO+8mua7muWKqOWuueWZqOmrmOW6piArIOihqOagvOeahHBhZGRpbmfvvIg477yJXG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIFRBQkxFX1BBRERJTkc7XG4gICAgICAgIC8vIOiBmueEpuWcqOihqOagvOS4re+8miDpq5jluqYgKyBjb250cm9s77yIMTHvvInvvIx0b3Ag5Yqg5LiA5LiqIG1hc2vvvIgxOe+8iVxuICAgICAgICBpZiAodGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodCArIFRBQkxFX0NPTlRST0w7XG4gICAgICAgICAgICB0b3AgPSB0b3AgKyBUQUJMRV9JTlNFUlRfTUFTSyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0LCB0b3AgfTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY29udGFpbmVyU2Nyb2xsZWQkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVudGlyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBldmVudCwgZGlyZWN0aW9uIH0gPSBlbnRpcmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsWCA9IHRoaXMudGFibGVSZWN0TGVmdCAhPT0gbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclRvcEhlaWdodCA9IHRoaXMuaXNJblRhYmxlID8gLTE5IDogMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGhlYWRlclRvcEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDw9IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgOCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRSZWN0LmJvdHRvbSAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID49IGhlYWRlclJvd0hlaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBoZWFkZXJSb3dIZWlnaHQgPD0gbWF4SGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGhlYWRlckNvbHVtbkNlbGxzKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUhlYWRlckNlbGxTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNlbGxFbGVtZW50LCBIRUFERVJfQ0VMTF9DTEFTUyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNvbHVtbkFuZENvbnRyb2xTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGxldCBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoaXRlbSA9PiBpdGVtLmNoaWxkcmVuWzBdKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBjZWxscy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICBjb25zdCBoZWFkZXJDb2x1bW5FbGVtZW50cyA9IGhlYWRlckNvbHVtbkNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFsuLi5oZWFkZXJDb2x1bW5FbGVtZW50cywgaGVhZGVyQ29sQ29udHJvbF0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0ZW0sICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhpdGVtLCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlclJvd1N0eWxlKCkge1xuICAgICAgICB0aGlzLnNldEdyaWRDb2x1bW5zU3R5bGUoKTtcbiAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgIH1cblxuICAgIHNldEdyaWRDb2x1bW5zU3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5mcmVlemVSb3dQaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMuaGVhZGVyUm93LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvdyA9ICh0aGlzLnRib2R5RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY2VsbHNXaWR0aCA9XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Py5jb2x1bW5zICYmIHRoaXMuY29sZ3JvdXA/Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRDb2x1bW5zV2lkdGgodGhpcy5jb2xncm91cC5uYXRpdmVFbGVtZW50LCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0RGVmYXVsdENlbGxXaWR0aCgpO1xuXG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgIC8vIOW6j+WPt+WIl+WtmOWcqOaXtiwg6KGo5qC85a695bqm5Yqg5bqP5Y+35YiX5a695bqmXG4gICAgICAgICAgICAvLyDlj6ror7vmqKHlvI/kuIssIOihqOagvOWuveW6puS4jeWPmFxuICAgICAgICAgICAgdGFibGVXaWR0aCA9ICF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyB0YWJsZVdpZHRoIC0gdGFibGVQYWRkaW5nIDogdGFibGVXaWR0aDtcblxuICAgICAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuaXNJblRhYmxlID8gW2NvbENvbnRyb2wsIGhlYWRlclJvd10gOiBbaGVhZGVyUm93XTtcbiAgICAgICAgICAgIHN0aWNreVJvd3MubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsIGdyaWRDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd3aWR0aCcsIHRhYmxlV2lkdGggKyAncHgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3RpY2t5Um93U3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHkgdHInKTtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbElubmVyID0gdGhpcy5yb3dDb250cm9sc0lubmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29ybmVyQnRuID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IGNhbGN1bGF0ZVJvd0NvbnRyb2xzKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpWzBdPy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcblxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5pc0luVGFibGUgPyB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIDM2IDogdGhpcy5zY3JvbGxDb250YWluZXJUb3A7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvdywgJ3RvcCcsIHRvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICdoZWlnaHQnLCBgJHtoZWFkZXJSb3dIZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5UYWJsZSB8fCBudW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgICAgIFtjb2xDb250cm9sLCB0YWJsZUNvcm5lckJ0bl0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDkvJjljJbvvJp0YWJsZSDnmoQgcGFkZGluZy10b3Ag5bqU6K+l5Yqo5oCB5Y+Y5YyW77yI5LiO6Zi05b2x5ZCM5Y+Y77yJXG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmdUb3AgPSBoZWFkZXJSb3dIZWlnaHQgKyAxMTsgLy8g5qCH6aKY6KGM6auYICsgY3RybCBidG7vvIgxMXB477yJ6auY5bqmXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIHRhYmxlUGFkZGluZ1RvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sSW5uZXIsICdwYWRkaW5nLXRvcCcsIHRhYmxlUGFkZGluZ1RvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlUm93Q29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgJzQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyk7XG4gICAgICAgICAgICBbaGVhZGVyUm93LCBjb2xDb250cm9sLCB0YWJsZUNvcm5lckJ0bl0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVSb3dDb250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCAnMScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q29udHJvbEJ1dHRvbiA9IHRoaXMucm93Q29udHJvbHNCdXR0b25XcmFwcGVyLmZpcnN0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiByb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNldFRpbWVvdXTvvJog6ZyA6KaB562J5b6FIHJvd0NvbnRyb2xzIOWcqCBkb20g5Lit5riy5p+T5a6M5q+V5ZCO5omN6IO96I635Y+W5YiwIHJvd0NvbnRyb2xCdXR0b25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b246IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgaWYgKCFyb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pICYmIHJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93Q29udHJvbEJ1dHRvbiAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBuYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gbmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBuYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLmlzTGVmdFNoYWRvdyA9IHNjcm9sbExlZnQgPiAwO1xuICAgICAgICB0aGlzLmlzUmlnaHRTaGFkb3cgPSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPCBzY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgdHJgKTtcbiAgICAgICAgY29uc3Qgc3RpY2t5Q2VsbHMgPSBBcnJheS5mcm9tKHJvd3MpLm1hcChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5xdWVyeVNlbGVjdG9yKCd0aC50aGUtdGFibGUtY29sLWNvbnRyb2xzJykgfHwgaXRlbS5xdWVyeVNlbGVjdG9yKCd0ZC5zbGF0ZS1lbGVtZW50LXRhYmxlLWNlbGwnKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc0NvbHVtbkhlYWRlciA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaXNDb2x1bW5IZWFkZXIgPyBzdGlja3lDZWxscyA6IFtuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRdO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmNlbGxzUG9zaXRpb25DaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5kYW5nZXJvdXNPclNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXNlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkgfHxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gfHxcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHxcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucm93Q29udHJvbHMgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZXNvbHZlSW1hZ2UoKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG4gICAgICAgIGlmIChpbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VSZXNvbHZlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgICAgIGltYWdlRWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlTG9hZCA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGltYWdlUmVzb2x2ZXMucHVzaChpbWFnZUxvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW1hZ2VSZXNvbHZlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9scygpIHtcbiAgICAgICAgdGhpcy5jb2xDb250cm9scyA9IHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuIHx8IFtdO1xuICAgIH1cblxuICAgIGdldElzSW5UYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3Iuc2VsZWN0aW9uO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24odGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdENlbGxXaWR0aCgpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnJvd0NvbnRyb2xzSW5uZXIpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMucm93Q29udHJvbHNJbm5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgICAgIC8vIOiBmueEpuS5i+WQjuS8muWQkeW3puWBj+enu+S4gOS4qiBjb250cm9s77yILTEx77yJ77yM6KeBIC50aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBUQUJMRV9DT05UUk9MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNlbGxzV2lkdGggPSBbXTtcbiAgICAgICAgLy8g5Y+q6K+75qih5byP77yM5aaC5p6c5pyJ5bqP5Y+35YiX77yM6ZyA6KaB5YeP5Y675bqP5Y+35YiX55qE5a695bqmXG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgIHdpZHRoIC09IFRBQkxFX05VTUJFUl9DT0xVTU47XG4gICAgICAgICAgICBjZWxsc1dpZHRoLnB1c2goVEFCTEVfTlVNQkVSX0NPTFVNTik7XG4gICAgICAgIH1cbiAgICAgICAgdHIuY2hpbGRyZW4uZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBjZWxsc1dpZHRoLnB1c2goTnVtYmVyKCh3aWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2VsbHNXaWR0aDtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvbCcpLmZvckVhY2goKGVsZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb21wYXRpYmxlIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgd2lkdGggY2Fubm90IGJlIG9idGFpbmVkIHVuZGVyIHNhZmFyaSAjV0lLLTk2NDNcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goeyB3aWR0aDogZWxlLmNsaWVudFdpZHRoIHx8IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShlbGUuc3R5bGUud2lkdGgpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFZGl0b3IgY29udGFpbmVyIHdpZHRoIGNoYW5nZXMsIHJlc3VsdGluZyBpbiBjb2x1bW4gd2lkdGhzIG5vIGxvbmdlciB2YWxpZCAjV0lLLTY3NjZcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSB0aGlzLmVsZW1lbnQuY29sdW1ucy5zb21lKChjb2wsIGluZGV4KSA9PiBjb2wud2lkdGggIT09IGNvbHVtbnNbaW5kZXhdPy53aWR0aCk7XG4gICAgICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRyKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IE51bWJlcigodGFibGVXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCAtIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVSb3dzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgcm93KTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3Qgcm93RWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHJvd0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAoWy4uLnJvd0VsZW1lbnRzXSBhcyBIVE1MVGFibGVSb3dFbGVtZW50W10pLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KHJvdyk7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGhlaWdodCB9LCB0aGlzLmVsZW1lbnQuY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjb2xncm91cCcpLmNoaWxkcmVuXSBhcyBIVE1MVGFibGVDb2xFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW10gPSBjb2xzLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IGdldEVsZW1lbnRXaWR0aChjb2wpIH07XG4gICAgICAgIH0pO1xuICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uQ29sTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoISF0aGlzLnNlbGVjdGlvbiAmJiB0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyRGFuZ2Vyb3VzQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDb2x1bW4odGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJvd01vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Um93KHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RUYWJsZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFRhYmxlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkLWNlbGwnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZUNvbnRleHRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlVG9vbGJhcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaCBmb3IgcmlnaHQgY2xpY2sgc2VsZWN0IG5leHQgY2VsbFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBFZGl0b3Iuc3RhcnQodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yLnNlbGVjdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuT25TZWxlY3RlZENlbGxzKCkge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlZG93bicpLnBpcGUoZmlsdGVyKChlOiBNb3VzZUV2ZW50KSA9PiBlLmJ1dHRvbiAhPT0gMikpLFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNWaXJ0dWFsS2V5KGUpICYmICF0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbG9ySW5wdXQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb2xvclBhbmVsKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxQb3NpdGlvbnMgPSB0aGlzLnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZENlbGxQb3NpdGlvbnM/Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHNDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudFRhYmxlRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRUYWJsZUVsZW1lbnQgfHwgKCF0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiAmJiAhdGhpcy50YWJsZVN0b3JlLmFyZWFTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRUYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyTGFzdEZvY3VzUGF0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbktleWRvd25FdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBpc0tleUhvdGtleSgnbW9kJywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5oYW5kbGVLZXlkb3duRm9yUG9pbnRlclNlbGVjdGlvbihldmVudCwgdGhpcy50Ym9keU5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBpc0tleUhvdGtleSgnc2hpZnQnLCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmhhbmRsZUtleWRvd25Gb3JBcmVhU2VsZWN0aW9uKGV2ZW50LCB0aGlzLnRib2R5TmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuS2V5dXBFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2FuY2VsUG9pbnRlclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jYW5jZWxBcmVhU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuU2VsZWN0c3RhcnRFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uuc2VsZWN0U3RhcnRQcmV2ZW50RGVmYXVsdChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuXG4gICAgICAgIGNvbnN0IHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMgPSAocG9pbnRlckV2ZW50c1N0eWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RpUm93IG9mIHN0aWNreVJvd3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHN0aVJvdywgJ3BvaW50ZXItZXZlbnRzJywgcG9pbnRlckV2ZW50c1N0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdGltZXI7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnd2hlZWwnKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g5aSE55CG5qCH6aKY6KGM5Zu65a6a5pe255qE5rua5Yqo6Lef6ZqPXG4gICAgICAgICAgICAgICAgc2V0U3RpY2t5Um93UG9pbnRlckV2ZW50cygnbm9uZScpO1xuICAgICAgICAgICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5Um93UG9pbnRlckV2ZW50cygnYXV0bycpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKSB7XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWHuueOsOWbuuWumuagh+mimOihjFxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdGlSb3cgb2Ygc3RpY2t5Um93cykge1xuICAgICAgICAgICAgICAgIC8vIOS/ruWkjeiOt+WPliBzY3JvbGxMZWZ0IOWxnuaAp+W8lei1t+eahOa1j+iniOWZqOmHjee7mO+8jOWvvOiHtOi3s+WKqOmXrumimCAjV0lLLTExMDM4XG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5ZCM5q2l5rua5Yqo54q25oCB5YiwIC50aGUtc3RpY2t5LXJvd1xuICAgICAgICAgICAgICAgICAgICBzdGlSb3cuc2Nyb2xsTGVmdCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEhlYWRlclJvd0xlZnRTdHlsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuICAgICAgICBjb25zdCBjb3JuZXJDb250cm9sID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2wgPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3RpY2t5RWxlbWVudHMgPSBbLi4uc3RpY2t5Um93cywgY29ybmVyQ29udHJvbCwgcm93Q29udHJvbF07XG4gICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmlzSW5UYWJsZSA/IC1UQUJMRV9DT05UUk9MIDogMDtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3AgJiYgdGhpcy5pc1Njcm9sbFgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICBzdGlja3lSb3dzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29ybmVyQ29udHJvbCwgJ2xlZnQnLCBgJHtsZWZ0ICsgYnVmZmVyfXB4YCk7XG4gICAgICAgICAgICByb3dDb250cm9sICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbCwgJ2xlZnQnLCBgJHtsZWZ0ICsgYnVmZmVyfXB4YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGlja3lFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnbGVmdCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9sQnV0dG9uV2lkdGggPSAoKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICByZXN1bHQgKz0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgPGRpdiAjdGFibGVSb3dDb250cm9sc1dyYXBwZXIgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCksXG4gICAgICAgICdjb250cm9sLWFjdGl2ZSc6IGlzU2VsZWN0ZWRBbGxDZWxsLFxuICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuaXNTZWxlY3RlZFRhYmxlICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgfVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItYnV0dG9uXCIgKG1vdXNlZG93bik9XCJvblNlbGVjdFRhYmxlKCRldmVudClcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWNvbnRyb2xzLWluc2VydC1yb3ctbWFya2VyXCIgKm5nSWY9XCIhaGVhZGVyUm93XCI+XG4gICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtY29sdW1uLW1hcmtlclwiICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCkgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0lmPVwicmVhZG9ubHkgJiYgZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIiBjbGFzcz1cInRoZS10YWJsZS1udW1iZXItY29sXCIgLz5cbiAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9scy13cmFwcGVyIHRoZS1zdGlja3ktcm93XCIgI2NvbHVtbkNvbnRyb2xzV3JhcHBlcj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJyZWFkb25seSAmJiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiIGNsYXNzPVwidGhlLXRhYmxlLW51bWJlci1jb2xcIj48L3RoPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sTW91c2Vkb3duKCRldmVudCwgaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmtcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICBbYXRdPVwiaSArIDFcIlxuICAgICAgICAgICAgICBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCJcbiAgICAgICAgICAgICAgW3BhcmVudEVsZW1lbnRdPVwiY29sQ29udHJvbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSAjdGJvZHk+XG4gICAgICAgIDxzbGF0ZS1jaGlsZHJlbiBbY2hpbGRyZW5dPVwiY2hpbGRyZW5cIiBbY29udGV4dF09XCJjaGlsZHJlbkNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj4gPC9zbGF0ZS1jaGlsZHJlbj5cbiAgICAgIDwvdGJvZHk+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiXG4gICAgICAgICNoZWFkZXJSb3dMZWZ0U2hhZG93XG4gICAgICAgIGNsYXNzPVwiaGVhZGVyLXJvdy1zaGFkb3cgaGVhZGVyLXJvdy1sZWZ0LXNoYWRvd1wiXG4gICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LXJpZ2h0LXNoYWRvd1wiICNoZWFkZXJSb3dSaWdodFNoYWRvdyBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiPjwvZGl2PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|