@worktile/theia 18.0.16 → 19.0.0
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/constants/node-types.d.ts +1 -0
- package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
- package/fesm2022/worktile-theia.mjs +262 -281
- package/fesm2022/worktile-theia.mjs.map +1 -1
- package/package.json +4 -6
- package/plugins/code/code.component.scss +1 -2
- package/plugins/image/image.component.d.ts +1 -1
- package/plugins/mention/suggestion.component.d.ts +1 -1
- package/esm2022/components/action/prevent-default.mjs +0 -21
- package/esm2022/components/column-resize/column-resize-notifier.mjs +0 -31
- package/esm2022/components/column-resize/column-resize.directive.mjs +0 -124
- package/esm2022/components/column-resize/event-dispatcher.mjs +0 -56
- package/esm2022/components/column-resize/overlay-handle.component.mjs +0 -144
- package/esm2022/components/column-resize/resize-ref.mjs +0 -26
- package/esm2022/components/column-resize/resizing.store.mjs +0 -92
- package/esm2022/components/column-resize/selectors.mjs +0 -4
- package/esm2022/components/contextmenu/contextmenu.component.mjs +0 -99
- package/esm2022/components/conversion-hint/conversion-hint.component.mjs +0 -56
- package/esm2022/components/element/element.component.mjs +0 -23
- package/esm2022/components/index.mjs +0 -24
- package/esm2022/components/inline-toolbar/inline-toolbar.component.mjs +0 -131
- package/esm2022/components/listbox/listbox.mjs +0 -380
- package/esm2022/components/listbox/listbox.type.mjs +0 -5
- package/esm2022/components/plugin-menu/plugin-menu.component.mjs +0 -272
- package/esm2022/components/table-select/table-select.component.mjs +0 -49
- package/esm2022/components/template/template.component.mjs +0 -62
- package/esm2022/components/text/text.component.mjs +0 -57
- package/esm2022/components/toolbar/toolbar.component.mjs +0 -262
- package/esm2022/components/toolbar-dropdown/toolbar-dropdown.component.mjs +0 -137
- package/esm2022/components/toolbar-group/toolbar-group.component.mjs +0 -125
- package/esm2022/components/toolbar-item/toolbar-item.component.mjs +0 -80
- package/esm2022/constants/auto-format-rules.mjs +0 -167
- package/esm2022/constants/code.mjs +0 -85
- package/esm2022/constants/color-select.mjs +0 -3
- package/esm2022/constants/default.mjs +0 -11
- package/esm2022/constants/error.mjs +0 -7
- package/esm2022/constants/index.mjs +0 -9
- package/esm2022/constants/node-types.mjs +0 -136
- package/esm2022/constants/plugin-menu.mjs +0 -311
- package/esm2022/constants/selector.mjs +0 -3
- package/esm2022/constants/toolbar.mjs +0 -53
- package/esm2022/core/create-plugin.mjs +0 -5
- package/esm2022/core/create-toolbar.mjs +0 -55
- package/esm2022/core/index.mjs +0 -6
- package/esm2022/core/toolbar-item/base-toolbar-item.mjs +0 -95
- package/esm2022/core/utils/combine-plugins.mjs +0 -10
- package/esm2022/core/utils/flatten-deep-plugins.mjs +0 -19
- package/esm2022/core/utils/get-plugin-options.mjs +0 -3
- package/esm2022/core/utils/get-plugin.mjs +0 -2
- package/esm2022/core/utils/get-plugins.mjs +0 -4
- package/esm2022/core/utils/index.mjs +0 -12
- package/esm2022/core/utils/merge-array.mjs +0 -18
- package/esm2022/core/utils/merge-deep-plugins.mjs +0 -14
- package/esm2022/core/utils/merge-options.mjs +0 -25
- package/esm2022/core/utils/nested-structure-by-key.mjs +0 -11
- package/esm2022/core/utils/plugin-menu.mjs +0 -63
- package/esm2022/core/utils/plugins-by-key.mjs +0 -10
- package/esm2022/core/with-theia.mjs +0 -25
- package/esm2022/custom-types.mjs +0 -2
- package/esm2022/editor.component.mjs +0 -488
- package/esm2022/editor.module.mjs +0 -18
- package/esm2022/i18n/i18n.mjs +0 -10
- package/esm2022/i18n/i18n.service.mjs +0 -46
- package/esm2022/i18n/i18n.token.mjs +0 -9
- package/esm2022/i18n/index.mjs +0 -10
- package/esm2022/i18n/locales/de-de.mjs +0 -102
- package/esm2022/i18n/locales/en-us.mjs +0 -102
- package/esm2022/i18n/locales/ja-jp.mjs +0 -102
- package/esm2022/i18n/locales/ru-ru.mjs +0 -102
- package/esm2022/i18n/locales/zh-hans.mjs +0 -102
- package/esm2022/i18n/locales/zh-hant.mjs +0 -102
- package/esm2022/interfaces/auto-format.mjs +0 -2
- package/esm2022/interfaces/editor.mjs +0 -26
- package/esm2022/interfaces/element.mjs +0 -2
- package/esm2022/interfaces/image.mjs +0 -3
- package/esm2022/interfaces/index.mjs +0 -11
- package/esm2022/interfaces/plugins/index.mjs +0 -6
- package/esm2022/interfaces/plugins/no-infer.mjs +0 -2
- package/esm2022/interfaces/plugins/plugin-key.mjs +0 -42
- package/esm2022/interfaces/plugins/plugin-menu.mjs +0 -19
- package/esm2022/interfaces/plugins/plugins.mjs +0 -2
- package/esm2022/interfaces/plugins/with-override.mjs +0 -2
- package/esm2022/interfaces/preset.mjs +0 -3
- package/esm2022/interfaces/reset-block-type-plugin-options.mjs +0 -2
- package/esm2022/interfaces/toolbar.mjs +0 -12
- package/esm2022/interfaces/upload.mjs +0 -2
- package/esm2022/interfaces/utility/index.mjs +0 -4
- package/esm2022/interfaces/utility/nested-structure-by-key.mjs +0 -2
- package/esm2022/interfaces/utility/override-by-key.mjs +0 -2
- package/esm2022/interfaces/utility/types.mjs +0 -2
- package/esm2022/interfaces/valid-children-types.mjs +0 -36
- package/esm2022/interfaces/view-base.mjs +0 -38
- package/esm2022/pipes.mjs +0 -61
- package/esm2022/plugins/align/align.editor.mjs +0 -41
- package/esm2022/plugins/align/align.plugin.mjs +0 -64
- package/esm2022/plugins/autoformat/autoformat.plugin.mjs +0 -109
- package/esm2022/plugins/autoformat/transforms/auto-format-block.mjs +0 -14
- package/esm2022/plugins/autoformat/transforms/auto-format-inline.mjs +0 -78
- package/esm2022/plugins/blockquote/blockquote.component.mjs +0 -16
- package/esm2022/plugins/blockquote/blockquote.editor.mjs +0 -20
- package/esm2022/plugins/blockquote/blockquote.plugin.mjs +0 -84
- package/esm2022/plugins/code/code.component.mjs +0 -255
- package/esm2022/plugins/code/code.editor.mjs +0 -59
- package/esm2022/plugins/code/code.plugin.mjs +0 -67
- package/esm2022/plugins/color/color.editor.mjs +0 -27
- package/esm2022/plugins/color/color.plugin.mjs +0 -32
- package/esm2022/plugins/color/toolbar-item.component.mjs +0 -99
- package/esm2022/plugins/common/block-card.plugin.mjs +0 -330
- package/esm2022/plugins/common/common.plugin.mjs +0 -49
- package/esm2022/plugins/common/get-fragment.plugin.mjs +0 -24
- package/esm2022/plugins/common/history.plugin.mjs +0 -31
- package/esm2022/plugins/common/insert-data-by-invalid-type.mjs +0 -23
- package/esm2022/plugins/common/move-selection.plugin.mjs +0 -105
- package/esm2022/plugins/common/remove-empty.plugin.mjs +0 -61
- package/esm2022/plugins/common/remove-void.plugin.mjs +0 -60
- package/esm2022/plugins/common/reset-type.plugin.mjs +0 -35
- package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +0 -61
- package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +0 -142
- package/esm2022/plugins/font-size/font-size.editor.mjs +0 -98
- package/esm2022/plugins/heading/heading.editor.mjs +0 -54
- package/esm2022/plugins/heading/heading.plugin.mjs +0 -136
- package/esm2022/plugins/hr/hr.component.mjs +0 -37
- package/esm2022/plugins/hr/hr.editor.mjs +0 -16
- package/esm2022/plugins/hr/hr.plugin.mjs +0 -56
- package/esm2022/plugins/image/image.component.mjs +0 -474
- package/esm2022/plugins/image/image.editor.mjs +0 -116
- package/esm2022/plugins/image/image.plugin.mjs +0 -90
- package/esm2022/plugins/indent/indent.editor.mjs +0 -78
- package/esm2022/plugins/indent/indent.plugin.mjs +0 -59
- package/esm2022/plugins/indent/on-keydown-indent.mjs +0 -59
- package/esm2022/plugins/index.mjs +0 -73
- package/esm2022/plugins/inline-code/inline-code.component.mjs +0 -28
- package/esm2022/plugins/inline-code/inline-code.editor.mjs +0 -49
- package/esm2022/plugins/inline-code/inline-code.plugin.mjs +0 -67
- package/esm2022/plugins/link/edit/link-edit.component.mjs +0 -104
- package/esm2022/plugins/link/hover/link-hover.component.mjs +0 -38
- package/esm2022/plugins/link/link.component.mjs +0 -170
- package/esm2022/plugins/link/link.editor.mjs +0 -87
- package/esm2022/plugins/link/link.plugin.mjs +0 -89
- package/esm2022/plugins/link/link.types.mjs +0 -12
- package/esm2022/plugins/list/components/bulleted-list.component.mjs +0 -28
- package/esm2022/plugins/list/components/list-item.component.mjs +0 -88
- package/esm2022/plugins/list/components/numbered-list.component.mjs +0 -37
- package/esm2022/plugins/list/list.editor.mjs +0 -128
- package/esm2022/plugins/list/list.plugin.mjs +0 -302
- package/esm2022/plugins/list/normalizers/get-list-normalizer.mjs +0 -39
- package/esm2022/plugins/list/normalizers/normalize-list-item.mjs +0 -18
- package/esm2022/plugins/list/normalizers/normalize-no.mjs +0 -43
- package/esm2022/plugins/list/on-key-down-list.mjs +0 -33
- package/esm2022/plugins/list/queries/get-list-item-entry.mjs +0 -28
- package/esm2022/plugins/list/queries/get-list-item-sublist.mjs +0 -12
- package/esm2022/plugins/list/queries/get-list-types.mjs +0 -5
- package/esm2022/plugins/list/queries/get-start-list-item.mjs +0 -27
- package/esm2022/plugins/list/queries/has-list-in-list-item.mjs +0 -27
- package/esm2022/plugins/list/queries/is-in-list.mjs +0 -6
- package/esm2022/plugins/list/queries/is-list-nested.mjs +0 -10
- package/esm2022/plugins/list/queries/is-list.mjs +0 -5
- package/esm2022/plugins/list/queries/is-node-type-list.mjs +0 -5
- package/esm2022/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -13
- package/esm2022/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -17
- package/esm2022/plugins/list/queries/is-single-list-item.mjs +0 -9
- package/esm2022/plugins/list/transforms/insert-list-data.mjs +0 -72
- package/esm2022/plugins/list/transforms/insert-list-item.mjs +0 -73
- package/esm2022/plugins/list/transforms/move-list-item-down.mjs +0 -41
- package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -43
- package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -30
- package/esm2022/plugins/list/transforms/move-list-item-up.mjs +0 -78
- package/esm2022/plugins/list/transforms/unwrap-list.mjs +0 -10
- package/esm2022/plugins/list/types.mjs +0 -2
- package/esm2022/plugins/mark/mark.editor.mjs +0 -28
- package/esm2022/plugins/mark/mark.plugin.mjs +0 -105
- package/esm2022/plugins/mention/index.mjs +0 -5
- package/esm2022/plugins/mention/mention.editor.mjs +0 -179
- package/esm2022/plugins/mention/mention.plugin.mjs +0 -92
- package/esm2022/plugins/mention/mention.type.mjs +0 -2
- package/esm2022/plugins/mention/suggestion.component.mjs +0 -22
- package/esm2022/plugins/node-id/node-id.plugin.mjs +0 -78
- package/esm2022/plugins/normalizers/insert-paragraph-nodes.mjs +0 -28
- package/esm2022/plugins/normalizers/remove-empty-nodes.mjs +0 -18
- package/esm2022/plugins/normalizers/trailing-node.plugin.mjs +0 -33
- package/esm2022/plugins/paint-format/paint-format.editor.mjs +0 -126
- package/esm2022/plugins/public-api.mjs +0 -20
- package/esm2022/plugins/quick-insert/components/quick-insert.component.mjs +0 -126
- package/esm2022/plugins/quick-insert/index.mjs +0 -4
- package/esm2022/plugins/quick-insert/quick-insert.editor.mjs +0 -70
- package/esm2022/plugins/quick-insert/quick-insert.plugin.mjs +0 -109
- package/esm2022/plugins/soft-break/soft-break.plugin.mjs +0 -36
- package/esm2022/plugins/soft-break/soft-break.types.mjs +0 -2
- package/esm2022/plugins/table/components/insert-mark/insert-mark.component.mjs +0 -132
- package/esm2022/plugins/table/components/row/row.component.mjs +0 -93
- package/esm2022/plugins/table/components/table.component.mjs +0 -887
- package/esm2022/plugins/table/components/td/td.component.mjs +0 -610
- package/esm2022/plugins/table/components/toolbar/table-options.component.mjs +0 -102
- package/esm2022/plugins/table/components/toolbar/table-toolbar.component.mjs +0 -179
- package/esm2022/plugins/table/table.editor.mjs +0 -301
- package/esm2022/plugins/table/table.pipe.mjs +0 -66
- package/esm2022/plugins/table/table.plugin.mjs +0 -556
- package/esm2022/plugins/table/table.service.mjs +0 -122
- package/esm2022/plugins/table/table.store.mjs +0 -417
- package/esm2022/plugins/table/table.types.mjs +0 -68
- package/esm2022/plugins/table/toolbar-item.component.mjs +0 -95
- package/esm2022/plugins/table/transforms/clear-cell.mjs +0 -14
- package/esm2022/plugins/table/transforms/clear-table-node.mjs +0 -27
- package/esm2022/plugins/table/transforms/index.mjs +0 -8
- package/esm2022/plugins/table/transforms/insert-column.mjs +0 -69
- package/esm2022/plugins/table/transforms/insert-row.mjs +0 -50
- package/esm2022/plugins/table/transforms/insert-table.mjs +0 -15
- package/esm2022/plugins/table/transforms/move-selection-from-cell.mjs +0 -91
- package/esm2022/plugins/table/transforms/remove-column.mjs +0 -51
- package/esm2022/plugins/table/transforms/remove-row.mjs +0 -48
- package/esm2022/plugins/table/transforms/remove-table.mjs +0 -49
- package/esm2022/plugins/table/utils/add-columns.mjs +0 -38
- package/esm2022/plugins/table/utils/calc-anchor-position.mjs +0 -26
- package/esm2022/plugins/table/utils/calc-span.mjs +0 -73
- package/esm2022/plugins/table/utils/calculate-table.mjs +0 -116
- package/esm2022/plugins/table/utils/cell-position.mjs +0 -57
- package/esm2022/plugins/table/utils/create-cell.mjs +0 -19
- package/esm2022/plugins/table/utils/create-row.mjs +0 -12
- package/esm2022/plugins/table/utils/create-table-position.mjs +0 -10
- package/esm2022/plugins/table/utils/create-table.mjs +0 -15
- package/esm2022/plugins/table/utils/get-grid-columns.mjs +0 -79
- package/esm2022/plugins/table/utils/get-min-max-cell-index.mjs +0 -69
- package/esm2022/plugins/table/utils/get-next-cell.mjs +0 -44
- package/esm2022/plugins/table/utils/get-select-cell-node.mjs +0 -16
- package/esm2022/plugins/table/utils/handle-cell.mjs +0 -25
- package/esm2022/plugins/table/utils/index.mjs +0 -16
- package/esm2022/plugins/table/utils/is-header-row.mjs +0 -15
- package/esm2022/plugins/table/utils/is-legal-table.mjs +0 -26
- package/esm2022/plugins/table/utils/is-range-in-table.mjs +0 -16
- package/esm2022/plugins/table/utils/is-selection-in-table.mjs +0 -51
- package/esm2022/plugins/table/utils/is-virtual-key.mjs +0 -13
- package/esm2022/plugins/table/utils/merge-cell.mjs +0 -110
- package/esm2022/plugins/table/utils/next-path.mjs +0 -5
- package/esm2022/plugins/table/utils/normalize-table.mjs +0 -31
- package/esm2022/plugins/table/utils/remove-columns.mjs +0 -23
- package/esm2022/plugins/table/utils/remove-row-column.mjs +0 -45
- package/esm2022/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -45
- package/esm2022/plugins/table/utils/split-cell.mjs +0 -29
- package/esm2022/plugins/table/utils/table-entry.mjs +0 -21
- package/esm2022/plugins/table/utils/table-position.mjs +0 -251
- package/esm2022/plugins/table/utils/table-viewport.mjs +0 -41
- package/esm2022/plugins/todo-item/todo-item.component.mjs +0 -65
- package/esm2022/plugins/todo-item/todo-item.editor.mjs +0 -32
- package/esm2022/plugins/todo-item/todo-item.plugin.mjs +0 -93
- package/esm2022/plugins/vertical-align/toolbar-item.component.mjs +0 -95
- package/esm2022/plugins/vertical-align/vertical-align.editor.mjs +0 -59
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/queries/anchor-block-entry.mjs +0 -13
- package/esm2022/queries/anchor-block.mjs +0 -6
- package/esm2022/queries/anchor-inline-entry.mjs +0 -10
- package/esm2022/queries/find-descendant.mjs +0 -47
- package/esm2022/queries/find-node.mjs +0 -45
- package/esm2022/queries/find-path.mjs +0 -28
- package/esm2022/queries/get-above-by-type.mjs +0 -14
- package/esm2022/queries/get-above.mjs +0 -9
- package/esm2022/queries/get-anchor-block-entry.mjs +0 -8
- package/esm2022/queries/get-block-above.mjs +0 -10
- package/esm2022/queries/get-block-card-above.mjs +0 -10
- package/esm2022/queries/get-block-card-cursor.mjs +0 -9
- package/esm2022/queries/get-container-blocks.mjs +0 -12
- package/esm2022/queries/get-directly-parent.mjs +0 -12
- package/esm2022/queries/get-insert-elements-path.mjs +0 -46
- package/esm2022/queries/get-last-child-path.mjs +0 -9
- package/esm2022/queries/get-last-node.mjs +0 -17
- package/esm2022/queries/get-next-sibling-nodes.mjs +0 -17
- package/esm2022/queries/get-node.mjs +0 -10
- package/esm2022/queries/get-nodes-by-type.mjs +0 -15
- package/esm2022/queries/get-nodes.mjs +0 -7
- package/esm2022/queries/get-parent.mjs +0 -12
- package/esm2022/queries/get-plain-text.mjs +0 -16
- package/esm2022/queries/get-plugin-by-toolbar.mjs +0 -13
- package/esm2022/queries/get-point-before.mjs +0 -62
- package/esm2022/queries/get-point-from-location.mjs +0 -15
- package/esm2022/queries/get-previous-path.mjs +0 -9
- package/esm2022/queries/get-rang-from-block-start.mjs +0 -16
- package/esm2022/queries/get-range-before.mjs +0 -17
- package/esm2022/queries/get-selection-marks.mjs +0 -18
- package/esm2022/queries/get-selection-nodes-by-type.mjs +0 -30
- package/esm2022/queries/get-text.mjs +0 -9
- package/esm2022/queries/get-toolbar-disabled.mjs +0 -13
- package/esm2022/queries/index.mjs +0 -62
- package/esm2022/queries/is-across-blocks.mjs +0 -7
- package/esm2022/queries/is-ancestor-empty.mjs +0 -6
- package/esm2022/queries/is-ancestor.mjs +0 -3
- package/esm2022/queries/is-block-above-empty.mjs +0 -11
- package/esm2022/queries/is-block-active.mjs +0 -8
- package/esm2022/queries/is-block-card-cursor.mjs +0 -16
- package/esm2022/queries/is-block-text-empty-after-selection.mjs +0 -31
- package/esm2022/queries/is-collapsed.mjs +0 -7
- package/esm2022/queries/is-contain-nested-type.mjs +0 -29
- package/esm2022/queries/is-container-type.mjs +0 -3
- package/esm2022/queries/is-descendant.mjs +0 -3
- package/esm2022/queries/is-empty-content-filter.mjs +0 -22
- package/esm2022/queries/is-empty-content.mjs +0 -15
- package/esm2022/queries/is-empty-paragraph-by-path.mjs +0 -7
- package/esm2022/queries/is-empty-paragraph.mjs +0 -28
- package/esm2022/queries/is-first-child.mjs +0 -5
- package/esm2022/queries/is-global-collapsed.mjs +0 -5
- package/esm2022/queries/is-include-types.mjs +0 -12
- package/esm2022/queries/is-node-type-in.mjs +0 -9
- package/esm2022/queries/is-node-type.mjs +0 -15
- package/esm2022/queries/is-paragraph.mjs +0 -9
- package/esm2022/queries/is-point-at-root.mjs +0 -2
- package/esm2022/queries/is-range-across-blocks.mjs +0 -22
- package/esm2022/queries/is-range-at-root.mjs +0 -3
- package/esm2022/queries/is-root-path.mjs +0 -2
- package/esm2022/queries/is-start.mjs +0 -6
- package/esm2022/queries/some-node.mjs +0 -9
- package/esm2022/services/context.service.mjs +0 -140
- package/esm2022/services/table-contextmenu.service.mjs +0 -288
- package/esm2022/services/toolbar.service.mjs +0 -47
- package/esm2022/shortcuts/index.mjs +0 -5
- package/esm2022/shortcuts/mark.mjs +0 -25
- package/esm2022/test/basic/basic.component.mjs +0 -61
- package/esm2022/test/faker/data-transfer-faker.mjs +0 -13
- package/esm2022/test/faker/tethys-icon-faker.mjs +0 -22
- package/esm2022/test/index.mjs +0 -7
- package/esm2022/test/utils/mock-plugins.mjs +0 -104
- package/esm2022/test/utils/preset-config.mjs +0 -17
- package/esm2022/test/utils/with-plugin.mjs +0 -11
- package/esm2022/transforms/apply-deep-to-nodes.mjs +0 -22
- package/esm2022/transforms/clear-marks.mjs +0 -23
- package/esm2022/transforms/delete-element.mjs +0 -12
- package/esm2022/transforms/delete-node-by-type.mjs +0 -10
- package/esm2022/transforms/handle-continual-delete-backward.mjs +0 -18
- package/esm2022/transforms/handle-continual-insert-break.mjs +0 -20
- package/esm2022/transforms/index.mjs +0 -19
- package/esm2022/transforms/insert-elements.mjs +0 -55
- package/esm2022/transforms/insert-paragraph.mjs +0 -6
- package/esm2022/transforms/merge-deep-to-nodes.mjs +0 -9
- package/esm2022/transforms/move-children.mjs +0 -22
- package/esm2022/transforms/on-keydown-reset-block-type.mjs +0 -23
- package/esm2022/transforms/set-end-selection.mjs +0 -10
- package/esm2022/transforms/set-marks.mjs +0 -9
- package/esm2022/transforms/set-node-by-type.mjs +0 -10
- package/esm2022/transforms/set-node.mjs +0 -6
- package/esm2022/transforms/un-hang-range.mjs +0 -11
- package/esm2022/transforms/un-wrap.mjs +0 -12
- package/esm2022/transforms/unwrap-nodes-by-type.mjs +0 -14
- package/esm2022/utils/auto-focus.mjs +0 -24
- package/esm2022/utils/blob.mjs +0 -16
- package/esm2022/utils/cast-array.mjs +0 -7
- package/esm2022/utils/color-picker.mjs +0 -15
- package/esm2022/utils/common.mjs +0 -11
- package/esm2022/utils/copy-node.mjs +0 -38
- package/esm2022/utils/create-empty-paragraph.mjs +0 -14
- package/esm2022/utils/data-transform.mjs +0 -48
- package/esm2022/utils/dom.mjs +0 -56
- package/esm2022/utils/editor-uuid.mjs +0 -8
- package/esm2022/utils/fragment.mjs +0 -82
- package/esm2022/utils/get-editable-element-height.mjs +0 -6
- package/esm2022/utils/get-mode.mjs +0 -14
- package/esm2022/utils/get-toolbar-class.mjs +0 -6
- package/esm2022/utils/id-creator.mjs +0 -11
- package/esm2022/utils/index.mjs +0 -23
- package/esm2022/utils/insert-data-by-invalid-type.mjs +0 -70
- package/esm2022/utils/is-clean-empty-paragraph.mjs +0 -37
- package/esm2022/utils/is-inline.mjs +0 -9
- package/esm2022/utils/lodash.mjs +0 -3
- package/esm2022/utils/match.mjs +0 -32
- package/esm2022/utils/merge-element-options.mjs +0 -19
- package/esm2022/utils/normalize.mjs +0 -61
- package/esm2022/utils/refocus.mjs +0 -47
- package/esm2022/utils/scrolling.mjs +0 -43
- package/esm2022/utils/update-popover-position.mjs +0 -26
- package/esm2022/utils/weak-maps.mjs +0 -9
- package/esm2022/worktile-theia.mjs +0 -5
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
import { timer } from 'rxjs';
|
|
2
|
-
import { Editor, Element, Node, Operation, Path, Range, Transforms } from 'slate';
|
|
3
|
-
import { AngularEditor, ELEMENT_TO_COMPONENT, hotkeys } from 'slate-angular';
|
|
4
|
-
import { DropdownMode } from '../../constants';
|
|
5
|
-
import { ElementKinds } from '../../constants/node-types';
|
|
6
|
-
import { PluginMenuIcons, ThePluginMenuItemType } from '../../constants/plugin-menu';
|
|
7
|
-
import { PluginKeys, TheEditor, ToolbarItemType } from '../../interfaces';
|
|
8
|
-
import * as TheQueries from '../../queries';
|
|
9
|
-
import { createEmptyParagraph } from '../../utils/create-empty-paragraph';
|
|
10
|
-
import { extractFragment } from '../../utils/fragment';
|
|
11
|
-
import { cloneDeep } from '../../utils/lodash';
|
|
12
|
-
import { TheTableRow } from './components/row/row.component';
|
|
13
|
-
import { TheTable } from './components/table.component';
|
|
14
|
-
import { TheTd } from './components/td/td.component';
|
|
15
|
-
import { TableEditor } from './table.editor';
|
|
16
|
-
import { TableOptions } from './table.types';
|
|
17
|
-
import { TheTableToolbarItem } from './toolbar-item.component';
|
|
18
|
-
import { clearTableNode } from './transforms/clear-table-node';
|
|
19
|
-
import { insertColumnAtRow } from './transforms/insert-column';
|
|
20
|
-
import { TablePosition, isRangeInTable, isSelectionInTable, isVirtualKey } from './utils';
|
|
21
|
-
import { addColumns } from './utils/add-columns';
|
|
22
|
-
import { calculateAnchorPositionInCell } from './utils/calc-anchor-position';
|
|
23
|
-
import { getOriginCell } from './utils/calc-span';
|
|
24
|
-
import { createTablePosition } from './utils/create-table-position';
|
|
25
|
-
import { isInTable, isInTableRow, isLegalTable } from './utils/is-legal-table';
|
|
26
|
-
import { isSelectedCellMerged } from './utils/merge-cell';
|
|
27
|
-
import { normalizeTable } from './utils/normalize-table';
|
|
28
|
-
import { removeColumns } from './utils/remove-columns';
|
|
29
|
-
import { resetTableCell } from './utils/split-cell';
|
|
30
|
-
import { createPluginFactory } from '../../core';
|
|
31
|
-
import { setClipboardDataByDom } from '../../utils';
|
|
32
|
-
export const withTable = (editor) => {
|
|
33
|
-
const { deleteBackward, deleteForward, onKeydown, setFragmentData, insertFragmentData, normalizeNode, isBlockCard, renderElement, deleteCutData, isContainer, onChange, onClick, mousedown } = editor;
|
|
34
|
-
editor.deleteBackward = unit => {
|
|
35
|
-
const opts = new TableOptions();
|
|
36
|
-
if (!isSelectionInTable(opts, editor)) {
|
|
37
|
-
deleteBackward(unit);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const { selection } = editor;
|
|
41
|
-
const [, startBlockPath] = Editor.above(editor, {
|
|
42
|
-
match: n => Element.isElement(n) && Editor.isBlock(editor, n)
|
|
43
|
-
});
|
|
44
|
-
const startPosition = createTablePosition(editor);
|
|
45
|
-
if (startBlockPath.length <= startPosition.cellEntry[1].length + 1 &&
|
|
46
|
-
startBlockPath.pop() === 0 &&
|
|
47
|
-
selection.anchor.offset === 0 &&
|
|
48
|
-
TheQueries.isStart(editor, selection.anchor, startBlockPath) &&
|
|
49
|
-
!Editor.isVoid(editor, TheQueries.anchorBlock(editor))) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
deleteBackward(unit);
|
|
53
|
-
};
|
|
54
|
-
editor.deleteForward = unit => {
|
|
55
|
-
const opts = new TableOptions();
|
|
56
|
-
const afterPoint = Editor.after(editor, editor.selection);
|
|
57
|
-
if (afterPoint && isRangeInTable(opts, editor, { anchor: afterPoint, focus: afterPoint })) {
|
|
58
|
-
const beforePosition = createTablePosition(editor);
|
|
59
|
-
const afterPosition = createTablePosition(editor, afterPoint.path);
|
|
60
|
-
if (beforePosition.cell && beforePosition.cell !== afterPosition.cell) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
deleteForward(unit);
|
|
65
|
-
};
|
|
66
|
-
editor.onClick = (event) => {
|
|
67
|
-
if (event.detail === 3) {
|
|
68
|
-
const isMergedCell = isSelectedCellMerged(editor);
|
|
69
|
-
const domSelection = window.getSelection();
|
|
70
|
-
if (domSelection && !domSelection.isCollapsed && editor.selection) {
|
|
71
|
-
const slateSelection = AngularEditor.toSlateRange(editor, domSelection);
|
|
72
|
-
const opts = new TableOptions();
|
|
73
|
-
const startPosition = TablePosition.create(opts, editor, slateSelection.anchor.path);
|
|
74
|
-
const endPosition = TablePosition.create(opts, editor, slateSelection.focus.path);
|
|
75
|
-
if (isMergedCell && startPosition.cell !== endPosition.cell) {
|
|
76
|
-
timer(81).subscribe(() => {
|
|
77
|
-
Transforms.select(editor, slateSelection.anchor.path);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
onClick(event);
|
|
83
|
-
};
|
|
84
|
-
editor.mousedown = (event) => {
|
|
85
|
-
const hitElement = event.target;
|
|
86
|
-
if (hitElement.classList.contains('the-table-wrapper')) {
|
|
87
|
-
if (!TheEditor.isFocused(editor)) {
|
|
88
|
-
TheEditor.focus(editor);
|
|
89
|
-
}
|
|
90
|
-
event.preventDefault();
|
|
91
|
-
}
|
|
92
|
-
mousedown(event);
|
|
93
|
-
};
|
|
94
|
-
editor.onKeydown = (event) => {
|
|
95
|
-
const opts = new TableOptions();
|
|
96
|
-
const isMoveUp = hotkeys.isMoveUp(event);
|
|
97
|
-
const isMoveDown = hotkeys.isMoveDown(event);
|
|
98
|
-
const isMoveBackward = hotkeys.isMoveBackward(event);
|
|
99
|
-
const isMoveForward = hotkeys.isMoveForward(event);
|
|
100
|
-
const { selection } = editor;
|
|
101
|
-
if (!selection || !selection.anchor || !selection.focus) {
|
|
102
|
-
onKeydown(event);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
const startPosition = createTablePosition(editor);
|
|
106
|
-
const endPosition = createTablePosition(editor, selection.focus.path);
|
|
107
|
-
const isCollapsed = Range.isCollapsed(selection);
|
|
108
|
-
if (startPosition && endPosition && endPosition.isInTable()) {
|
|
109
|
-
// for keyboard up and down key in the table
|
|
110
|
-
if (isMoveUp || isMoveDown) {
|
|
111
|
-
const cellPath = endPosition.cellEntry[1];
|
|
112
|
-
const startPath = Editor.start(editor, cellPath).path;
|
|
113
|
-
const endPath = Editor.end(editor, cellPath).path;
|
|
114
|
-
const { isFirstLine, isLastLine } = calculateAnchorPositionInCell(editor);
|
|
115
|
-
startPath.pop();
|
|
116
|
-
endPath.pop();
|
|
117
|
-
if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== startPath.toString() || !isFirstLine) && isMoveUp) {
|
|
118
|
-
onKeydown(event);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== endPath.toString() || !isLastLine) && isMoveDown) {
|
|
122
|
-
onKeydown(event);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
event.preventDefault();
|
|
126
|
-
let at;
|
|
127
|
-
if (isMoveUp) {
|
|
128
|
-
const aboveRow = startPosition.table.children[startPosition.getRowIndex() - 1];
|
|
129
|
-
const aboveCell = aboveRow && aboveRow.children[startPosition.getColumnIndex()];
|
|
130
|
-
if (aboveCell) {
|
|
131
|
-
if (aboveCell.hidden) {
|
|
132
|
-
TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() - 1, startPosition.getColumnIndex(), false);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
at = Editor.end(editor, TheEditor.findPath(editor, aboveCell));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
const previousNodeEntry = Editor.previous(editor, { at: startPosition.tableEntry[1] });
|
|
141
|
-
const beforePoint = Editor.before(editor, startPosition.tableEntry[1]);
|
|
142
|
-
Editor.next(editor, { at: startPosition.tableEntry[1] });
|
|
143
|
-
if (previousNodeEntry) {
|
|
144
|
-
at = Editor.end(editor, previousNodeEntry[1]);
|
|
145
|
-
}
|
|
146
|
-
if (!previousNodeEntry && beforePoint) {
|
|
147
|
-
at = Editor.end(editor, beforePoint.path);
|
|
148
|
-
}
|
|
149
|
-
if (!previousNodeEntry && !beforePoint) {
|
|
150
|
-
AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'left' });
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
Transforms.select(editor, at);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
let belowRowIndex = startPosition.getRowIndex() + 1;
|
|
158
|
-
if (startPosition.cell.rowspan > 1) {
|
|
159
|
-
belowRowIndex = startPosition.getRowIndex() + startPosition.cell.rowspan;
|
|
160
|
-
}
|
|
161
|
-
const belowRow = startPosition.table.children[belowRowIndex];
|
|
162
|
-
const belowCell = belowRow && belowRow.children[startPosition.getColumnIndex()];
|
|
163
|
-
if (belowCell) {
|
|
164
|
-
if (belowCell.hidden) {
|
|
165
|
-
TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() + 1, startPosition.getColumnIndex(), true);
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
at = Editor.start(editor, TheEditor.findPath(editor, belowCell));
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
const nextNodeEntry = Editor.next(editor, { at: startPosition.tableEntry[1] });
|
|
174
|
-
const movePath = nextNodeEntry ? nextNodeEntry[1] : Editor.after(editor, startPosition.tableEntry[1]).path;
|
|
175
|
-
at = Editor.start(editor, movePath);
|
|
176
|
-
}
|
|
177
|
-
Transforms.select(editor, at);
|
|
178
|
-
}
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (isMoveBackward) {
|
|
182
|
-
const beforePoint = Editor.before(editor, editor.selection);
|
|
183
|
-
const beforePosition = beforePoint && createTablePosition(editor, beforePoint.path);
|
|
184
|
-
if (beforePosition && beforePosition.cell && beforePosition.cell.hidden) {
|
|
185
|
-
event.preventDefault();
|
|
186
|
-
const at = Editor.end(editor, TheEditor.findPath(editor, beforePosition.findPrevious()));
|
|
187
|
-
Transforms.select(editor, at);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
if (isMoveForward) {
|
|
191
|
-
const afterPoint = Editor.after(editor, editor.selection);
|
|
192
|
-
const afterPosition = afterPoint && createTablePosition(editor, afterPoint.path);
|
|
193
|
-
if (afterPosition.cell && afterPosition.cell.hidden) {
|
|
194
|
-
event.preventDefault();
|
|
195
|
-
const nextCell = afterPosition.findNext();
|
|
196
|
-
if (nextCell) {
|
|
197
|
-
const at = Editor.start(editor, TheEditor.findPath(editor, afterPosition.findNext()));
|
|
198
|
-
Transforms.select(editor, at);
|
|
199
|
-
event.preventDefault();
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'right' });
|
|
203
|
-
event.preventDefault();
|
|
204
|
-
}
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
// Prevent deleting cells in the table
|
|
209
|
-
if (!isCollapsed && !startPosition.isInTable() && !isVirtualKey(event)) {
|
|
210
|
-
event.preventDefault();
|
|
211
|
-
let tableOutPath;
|
|
212
|
-
Editor.withoutNormalizing(editor, () => {
|
|
213
|
-
if (Range.isForward(selection)) {
|
|
214
|
-
tableOutPath = Editor.end(editor, [selection.focus.path[0] - 1]);
|
|
215
|
-
clearTableNode(opts, editor, true);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
tableOutPath = Editor.start(editor, [selection.focus.path[0] + 1]);
|
|
219
|
-
clearTableNode(opts, editor);
|
|
220
|
-
}
|
|
221
|
-
const tableOutRange = Editor.range(editor, selection.anchor, tableOutPath);
|
|
222
|
-
Transforms.delete(editor, { at: tableOutRange });
|
|
223
|
-
});
|
|
224
|
-
// new range
|
|
225
|
-
const cellRange = Editor.range(editor, editor.selection.focus.path.slice(0, 3));
|
|
226
|
-
const focusRange = Range.intersection(editor.selection, cellRange);
|
|
227
|
-
Transforms.select(editor, focusRange);
|
|
228
|
-
Editor.deleteFragment(editor);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
onKeydown(event);
|
|
233
|
-
return;
|
|
234
|
-
};
|
|
235
|
-
editor.setFragmentData = (data, originEvent) => {
|
|
236
|
-
const opts = new TableOptions();
|
|
237
|
-
if (isSelectionInTable(opts, editor)) {
|
|
238
|
-
const tablePosition = createTablePosition(editor);
|
|
239
|
-
const tableComponent = ELEMENT_TO_COMPONENT.get(tablePosition.table);
|
|
240
|
-
const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
|
|
241
|
-
let tableFragment = null;
|
|
242
|
-
if (tableComponent.tableStore.selectedRowsIndex.length > 0) {
|
|
243
|
-
const rows = tablePosition.table.children.slice(tableComponent.tableStore.selectedRowsIndex[0], tableComponent.tableStore.selectedRowsIndex[tableComponent.tableStore.selectedRowsIndex.length - 1] + 1);
|
|
244
|
-
tableFragment = {
|
|
245
|
-
...tablePosition.table,
|
|
246
|
-
children: rows
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
else if (selectedCellPositions.length > 0) {
|
|
250
|
-
const tempRows = {};
|
|
251
|
-
for (const cell of selectedCellPositions) {
|
|
252
|
-
const { row, col } = cell;
|
|
253
|
-
const cellPath = [...tablePosition.tableEntry[1], row, col];
|
|
254
|
-
const cellNode = Node.get(editor, cellPath);
|
|
255
|
-
if (!tempRows[row]) {
|
|
256
|
-
tempRows[row] = [];
|
|
257
|
-
}
|
|
258
|
-
tempRows[row].push(cellNode);
|
|
259
|
-
}
|
|
260
|
-
const rows = Object.values(tempRows).map((item) => {
|
|
261
|
-
return {
|
|
262
|
-
type: ElementKinds.tableRow,
|
|
263
|
-
children: item
|
|
264
|
-
};
|
|
265
|
-
});
|
|
266
|
-
tableFragment = {
|
|
267
|
-
type: ElementKinds.table,
|
|
268
|
-
children: rows
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
const fragment = editor.getFragment();
|
|
273
|
-
const isAcrossBlocks = TheQueries.isAcrossBlocks(editor, fragment);
|
|
274
|
-
if (isAcrossBlocks && fragment.length === 1 && fragment[0].type === ElementKinds.table) {
|
|
275
|
-
tableFragment = fragment[0];
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
if (tableFragment) {
|
|
279
|
-
tableFragment = normalizeTable(cloneDeep(tableFragment));
|
|
280
|
-
setClipboardDataByDom(editor, tableFragment, data);
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
setFragmentData(data, originEvent);
|
|
285
|
-
};
|
|
286
|
-
editor.insertFragmentData = async (data) => {
|
|
287
|
-
const fragment = await extractFragment(data);
|
|
288
|
-
if (fragment) {
|
|
289
|
-
const opts = new TableOptions();
|
|
290
|
-
if (isSelectionInTable(opts, editor) &&
|
|
291
|
-
fragment.length === 1 &&
|
|
292
|
-
Element.isElement(fragment[0]) &&
|
|
293
|
-
fragment[0].type === ElementKinds.table) {
|
|
294
|
-
const tablePosition = createTablePosition(editor);
|
|
295
|
-
const clipboardTable = fragment[0].children;
|
|
296
|
-
const clipboardRow = clipboardTable[0].children;
|
|
297
|
-
const selectRowIndex = tablePosition.getRowIndex();
|
|
298
|
-
const selectColIndex = tablePosition.getColumnIndex();
|
|
299
|
-
const lastRowIndex = selectRowIndex + clipboardTable.length - 1;
|
|
300
|
-
const lastColIndex = selectColIndex + clipboardRow.length - 1;
|
|
301
|
-
for (let i = selectRowIndex; i <= lastRowIndex; i++) {
|
|
302
|
-
for (let j = selectColIndex; j <= lastColIndex; j++) {
|
|
303
|
-
const row = tablePosition.table.children[i];
|
|
304
|
-
if (row && row.children[j]) {
|
|
305
|
-
const originCell = getOriginCell(tablePosition.table, i, j);
|
|
306
|
-
if (originCell && (originCell.colspan || originCell.rowspan)) {
|
|
307
|
-
const path = TheEditor.findPath(editor, originCell).slice(-2);
|
|
308
|
-
resetTableCell(editor, tablePosition.table, originCell, path[0], path[1]);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
Editor.withoutNormalizing(editor, () => {
|
|
314
|
-
if (lastColIndex > tablePosition.getWidth() - 1) {
|
|
315
|
-
const addColCount = lastColIndex - (tablePosition.getWidth() - 1);
|
|
316
|
-
TableEditor.insertColumn(editor, addColCount, tablePosition.getWidth());
|
|
317
|
-
}
|
|
318
|
-
if (lastRowIndex > tablePosition.getHeight() - 1) {
|
|
319
|
-
const addRowCount = lastRowIndex - (tablePosition.getHeight() - 1);
|
|
320
|
-
TableEditor.insertRow(editor, addRowCount, tablePosition.getHeight());
|
|
321
|
-
}
|
|
322
|
-
clipboardTable.forEach((row, i) => {
|
|
323
|
-
row.children.forEach((col, j) => {
|
|
324
|
-
const at = [...tablePosition.tableEntry[1], selectRowIndex + i, selectColIndex + j];
|
|
325
|
-
Transforms.removeNodes(editor, { at });
|
|
326
|
-
Transforms.insertNodes(editor, col, { at });
|
|
327
|
-
});
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
const target = Editor.start(editor, [...tablePosition.tableEntry[1], selectRowIndex, selectColIndex]);
|
|
331
|
-
Transforms.select(editor, target);
|
|
332
|
-
return true;
|
|
333
|
-
}
|
|
334
|
-
// when pasting data, the last one is a table, and the focus position is specially handled
|
|
335
|
-
// * this is to focus after withTrailingNode.normalizeNode() to avoid incorrect focus element.
|
|
336
|
-
// * if there is a node below, the focus will be on the left side of the node below.
|
|
337
|
-
// * if there is no node below, the focus will be on the right side of the current table.
|
|
338
|
-
const lastInsertNode = fragment[fragment.length - 1];
|
|
339
|
-
const isTable = lastInsertNode.type === ElementKinds.table;
|
|
340
|
-
if (isTable) {
|
|
341
|
-
setTimeout(() => {
|
|
342
|
-
Editor.withoutNormalizing(editor, () => {
|
|
343
|
-
const [, currentPath] = TheQueries.findNode(editor, {
|
|
344
|
-
match: n => Element.isElement(n) && n.type === ElementKinds.table
|
|
345
|
-
});
|
|
346
|
-
const nextPath = Path.next(currentPath);
|
|
347
|
-
const hasNextNode = Node.has(editor, nextPath);
|
|
348
|
-
const focusPath = hasNextNode ? nextPath : currentPath;
|
|
349
|
-
const focusNode = Node.get(editor, focusPath);
|
|
350
|
-
const isBlockCard = editor.isBlockCard(focusNode);
|
|
351
|
-
const cursorPath = {
|
|
352
|
-
path: focusPath,
|
|
353
|
-
offset: isBlockCard ? (hasNextNode ? -1 : -2) : 0
|
|
354
|
-
};
|
|
355
|
-
Transforms.select(editor, cursorPath);
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
return insertFragmentData(data);
|
|
360
|
-
}
|
|
361
|
-
return insertFragmentData(data);
|
|
362
|
-
};
|
|
363
|
-
editor.normalizeNode = ([node, path]) => {
|
|
364
|
-
if (Element.isElement(node) && node.type === ElementKinds.table) {
|
|
365
|
-
const table = node;
|
|
366
|
-
const maxWidth = Math.max(...table.children.map(row => row.children.length));
|
|
367
|
-
const invalidRows = table.children.filter(row => row.children.length < maxWidth);
|
|
368
|
-
if (invalidRows.length > 0) {
|
|
369
|
-
const opts = new TableOptions();
|
|
370
|
-
Editor.withoutNormalizing(editor, () => {
|
|
371
|
-
table.children.map((row, rowIndex) => {
|
|
372
|
-
row.children.map((cell, cellIndex) => {
|
|
373
|
-
if (cell.hidden || cell.colspan || cell.rowspan) {
|
|
374
|
-
Transforms.setNodes(editor, { hidden: null, colspan: null, rowspan: null }, { at: [...path, rowIndex, cellIndex] });
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
invalidRows.forEach(row => {
|
|
379
|
-
const count = maxWidth - row.children.length;
|
|
380
|
-
insertColumnAtRow(opts, editor, count, [node, path], table.children.indexOf(row), row.children.length);
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
if (table.columns && table.columns.length !== maxWidth) {
|
|
385
|
-
const columns = table.columns.length > maxWidth ? removeColumns(table, maxWidth) : addColumns(table, maxWidth);
|
|
386
|
-
Transforms.setNodes(editor, { columns }, { at: path });
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
// noramlize illegal cell and row to be paragraph
|
|
390
|
-
if (Element.isElement(node) && [ElementKinds.tableCell, ElementKinds.tableRow].includes(node.type)) {
|
|
391
|
-
if (!isLegalTable(editor, node, path)) {
|
|
392
|
-
try {
|
|
393
|
-
const rootPath = [path[0]];
|
|
394
|
-
const offset = editor.selection.focus.offset;
|
|
395
|
-
// find all tableCell and tableRow
|
|
396
|
-
const nodes = Editor.nodes(editor, {
|
|
397
|
-
at: rootPath,
|
|
398
|
-
mode: 'lowest',
|
|
399
|
-
match: (node) => {
|
|
400
|
-
return node.type === ElementKinds.tableCell;
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
let cursorPath = path[0];
|
|
404
|
-
if (nodes) {
|
|
405
|
-
let index = 0;
|
|
406
|
-
// noramlize to be paragraph
|
|
407
|
-
for (const [targetNode, targetPath] of nodes) {
|
|
408
|
-
index++;
|
|
409
|
-
const paragraph = createEmptyParagraph();
|
|
410
|
-
const text = Node.string(targetNode);
|
|
411
|
-
paragraph.children[0].text = text;
|
|
412
|
-
if (targetNode.key === node.key) {
|
|
413
|
-
cursorPath = rootPath[0] + index;
|
|
414
|
-
}
|
|
415
|
-
Transforms.insertNodes(editor, paragraph, { at: [rootPath[0] + index] });
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
const cursor = { path: [cursorPath, 0], offset: offset };
|
|
419
|
-
Transforms.select(editor, { anchor: cursor, focus: cursor });
|
|
420
|
-
// remove root node
|
|
421
|
-
Transforms.removeNodes(editor, {
|
|
422
|
-
at: rootPath
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
catch (error) { }
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
// adjust selection when selection is in hidden cell
|
|
430
|
-
if (Element.isElement(node) && node.type === ElementKinds.tableCell) {
|
|
431
|
-
if (editor.selection &&
|
|
432
|
-
Range.isCollapsed(editor.selection) &&
|
|
433
|
-
Path.isAncestor(path, editor.selection.anchor.path) &&
|
|
434
|
-
node.hidden) {
|
|
435
|
-
setTimeout(() => {
|
|
436
|
-
const opts = new TableOptions();
|
|
437
|
-
const tablePosition = createTablePosition(editor);
|
|
438
|
-
const origin = getOriginCell(tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex());
|
|
439
|
-
if (origin) {
|
|
440
|
-
const path = AngularEditor.findPath(editor, origin);
|
|
441
|
-
Transforms.select(editor, Editor.end(editor, path));
|
|
442
|
-
}
|
|
443
|
-
}, 0);
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
normalizeNode([node, path]);
|
|
448
|
-
};
|
|
449
|
-
editor.isBlockCard = (element) => {
|
|
450
|
-
if (element && element.type === ElementKinds.table) {
|
|
451
|
-
return true;
|
|
452
|
-
}
|
|
453
|
-
return isBlockCard(element);
|
|
454
|
-
};
|
|
455
|
-
editor.renderElement = (element) => {
|
|
456
|
-
if (element.type === ElementKinds.table) {
|
|
457
|
-
return TheTable;
|
|
458
|
-
}
|
|
459
|
-
if (element.type === ElementKinds.tableRow && isInTable(editor, element)) {
|
|
460
|
-
return TheTableRow;
|
|
461
|
-
}
|
|
462
|
-
if (element.type === ElementKinds.tableCell && isInTableRow(editor, element)) {
|
|
463
|
-
return TheTd;
|
|
464
|
-
}
|
|
465
|
-
return renderElement(element);
|
|
466
|
-
};
|
|
467
|
-
editor.deleteCutData = () => {
|
|
468
|
-
const opts = new TableOptions();
|
|
469
|
-
if (!isSelectionInTable(opts, editor)) {
|
|
470
|
-
deleteCutData();
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
const element = createTablePosition(editor);
|
|
474
|
-
const tableComponent = ELEMENT_TO_COMPONENT.get(element.table);
|
|
475
|
-
const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
|
|
476
|
-
if (selectedCellPositions.length > 0) {
|
|
477
|
-
Editor.withoutNormalizing(editor, () => {
|
|
478
|
-
if (tableComponent.tableStore.isSelectedTable) {
|
|
479
|
-
if (tableComponent.tableStore.isFullscreen) {
|
|
480
|
-
return;
|
|
481
|
-
}
|
|
482
|
-
TableEditor.removeTable(editor);
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
TableEditor.clearCellsContent(editor);
|
|
486
|
-
}
|
|
487
|
-
tableComponent.tableService.closeToolbar();
|
|
488
|
-
});
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
deleteCutData();
|
|
492
|
-
};
|
|
493
|
-
editor.isContainer = (element) => {
|
|
494
|
-
return element.type === ElementKinds.tableCell ? true : isContainer(element);
|
|
495
|
-
};
|
|
496
|
-
editor.onChange = () => {
|
|
497
|
-
onChange();
|
|
498
|
-
// adujst selection when selection is in hidden cell
|
|
499
|
-
// just hook set_selection
|
|
500
|
-
try {
|
|
501
|
-
const isCollapsed = editor.selection && Range.isCollapsed(editor.selection);
|
|
502
|
-
const isSelectionOperation = editor.operations.every(op => Operation.isSelectionOperation(op));
|
|
503
|
-
if (isCollapsed && isSelectionOperation) {
|
|
504
|
-
const opts = new TableOptions();
|
|
505
|
-
const tablePosition = createTablePosition(editor);
|
|
506
|
-
if (tablePosition.isInTable() && tablePosition.cell.hidden) {
|
|
507
|
-
TableEditor.selectOriginCell(editor, tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex(), false);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
catch (error) { }
|
|
512
|
-
};
|
|
513
|
-
return editor;
|
|
514
|
-
};
|
|
515
|
-
export const createTablePlugin = (locale) => createPluginFactory({
|
|
516
|
-
key: PluginKeys.table,
|
|
517
|
-
withOverrides: withTable,
|
|
518
|
-
nestedStructureByKey: {
|
|
519
|
-
[ElementKinds.table]: ElementKinds.tableRow,
|
|
520
|
-
[ElementKinds.tableRow]: ElementKinds.tableCell
|
|
521
|
-
},
|
|
522
|
-
toolbarItems: [
|
|
523
|
-
{
|
|
524
|
-
key: ElementKinds.table,
|
|
525
|
-
icon: 'table-border-all',
|
|
526
|
-
name: locale().table,
|
|
527
|
-
type: ToolbarItemType.dropdown,
|
|
528
|
-
dropdownMode: DropdownMode.icon,
|
|
529
|
-
iconComponent: TheTableToolbarItem,
|
|
530
|
-
execute: editor => TableEditor.insertTable(editor),
|
|
531
|
-
active: editor => TableEditor.isActive(editor)
|
|
532
|
-
}
|
|
533
|
-
],
|
|
534
|
-
menuItems: [
|
|
535
|
-
{
|
|
536
|
-
key: ElementKinds.table,
|
|
537
|
-
keywords: `biaoge,bg,table,${locale().table}`,
|
|
538
|
-
execute: editor => TableEditor.insertTable(editor),
|
|
539
|
-
active: editor => TableEditor.isActive(editor),
|
|
540
|
-
name: locale().table,
|
|
541
|
-
type: ThePluginMenuItemType.group,
|
|
542
|
-
menuIcon: PluginMenuIcons.table,
|
|
543
|
-
description: locale().tableDesc,
|
|
544
|
-
displayKey: '/bg'
|
|
545
|
-
}
|
|
546
|
-
],
|
|
547
|
-
options: {
|
|
548
|
-
showFullscreen: false,
|
|
549
|
-
freezeColumnHeader: false,
|
|
550
|
-
freezeRowHeader: false,
|
|
551
|
-
setFullscreen: (editor, event, element) => {
|
|
552
|
-
event.preventDefault();
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
})();
|
|
556
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvdGFibGUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFhLFNBQVMsRUFBRSxJQUFJLEVBQVMsS0FBSyxFQUFRLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMxRyxPQUFPLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3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QixDQUFDO0tBQ0o7Q0FDSixDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFZGl0b3IsIEVsZW1lbnQsIE5vZGUsIE5vZGVFbnRyeSwgT3BlcmF0aW9uLCBQYXRoLCBQb2ludCwgUmFuZ2UsIFRleHQsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yLCBFTEVNRU5UX1RPX0NPTVBPTkVOVCwgaG90a2V5cywgT3JpZ2luRXZlbnQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERyb3Bkb3duTW9kZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5NZW51SWNvbnMsIFRoZVBsdWdpbk1lbnVJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wbHVnaW4tbWVudSc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50LCBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5LZXlzLCBUaGVFZGl0b3IsIFRvb2xiYXJJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0ICogYXMgVGhlUXVlcmllcyBmcm9tICcuLi8uLi9xdWVyaWVzJztcbmltcG9ydCB7IGNyZWF0ZUVtcHR5UGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlLWVtcHR5LXBhcmFncmFwaCc7XG5pbXBvcnQgeyBleHRyYWN0RnJhZ21lbnQgfSBmcm9tICcuLi8uLi91dGlscy9mcmFnbWVudCc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuLi8uLi91dGlscy9sb2Rhc2gnO1xuaW1wb3J0IHsgVGhlVGFibGVSb3cgfSBmcm9tICcuL2NvbXBvbmVudHMvcm93L3Jvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGhlVGFibGUgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZVRkIH0gZnJvbSAnLi9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUVkaXRvciB9IGZyb20gJy4vdGFibGUuZWRpdG9yJztcbmltcG9ydCB7IFRhYmxlT3B0aW9ucywgVGhlUGx1Z2luVGFibGVPcHRpb24gfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IFRoZVRhYmxlVG9vbGJhckl0ZW0gfSBmcm9tICcuL3Rvb2xiYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY2xlYXJUYWJsZU5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybXMvY2xlYXItdGFibGUtbm9kZSc7XG5pbXBvcnQgeyBpbnNlcnRDb2x1bW5BdFJvdyB9IGZyb20gJy4vdHJhbnNmb3Jtcy9pbnNlcnQtY29sdW1uJztcbmltcG9ydCB7IFRhYmxlUG9zaXRpb24sIGlzUmFuZ2VJblRhYmxlLCBpc1NlbGVjdGlvbkluVGFibGUsIGlzVmlydHVhbEtleSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgYWRkQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvYWRkLWNvbHVtbnMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlQW5jaG9yUG9zaXRpb25JbkNlbGwgfSBmcm9tICcuL3V0aWxzL2NhbGMtYW5jaG9yLXBvc2l0aW9uJztcbmltcG9ydCB7IGdldE9yaWdpbkNlbGwgfSBmcm9tICcuL3V0aWxzL2NhbGMtc3Bhbic7XG5pbXBvcnQgeyBjcmVhdGVUYWJsZVBvc2l0aW9uIH0gZnJvbSAnLi91dGlscy9jcmVhdGUtdGFibGUtcG9zaXRpb24nO1xuaW1wb3J0IHsgaXNJblRhYmxlLCBpc0luVGFibGVSb3csIGlzTGVnYWxUYWJsZSB9IGZyb20gJy4vdXRpbHMvaXMtbGVnYWwtdGFibGUnO1xuaW1wb3J0IHsgaXNTZWxlY3RlZENlbGxNZXJnZWQgfSBmcm9tICcuL3V0aWxzL21lcmdlLWNlbGwnO1xuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tICcuL3V0aWxzL25vcm1hbGl6ZS10YWJsZSc7XG5pbXBvcnQgeyByZW1vdmVDb2x1bW5zIH0gZnJvbSAnLi91dGlscy9yZW1vdmUtY29sdW1ucyc7XG5pbXBvcnQgeyByZXNldFRhYmxlQ2VsbCB9IGZyb20gJy4vdXRpbHMvc3BsaXQtY2VsbCc7XG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5GYWN0b3J5IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBzZXRDbGlwYm9hcmREYXRhQnlEb20gfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRoZUkxOG5UcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uL2kxOG4nO1xuXG5leHBvcnQgY29uc3Qgd2l0aFRhYmxlID0gPFQgZXh0ZW5kcyBUaGVFZGl0b3I+KGVkaXRvcjogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGVsZXRlQmFja3dhcmQsXG4gICAgICAgIGRlbGV0ZUZvcndhcmQsXG4gICAgICAgIG9uS2V5ZG93bixcbiAgICAgICAgc2V0RnJhZ21lbnREYXRhLFxuICAgICAgICBpbnNlcnRGcmFnbWVudERhdGEsXG4gICAgICAgIG5vcm1hbGl6ZU5vZGUsXG4gICAgICAgIGlzQmxvY2tDYXJkLFxuICAgICAgICByZW5kZXJFbGVtZW50LFxuICAgICAgICBkZWxldGVDdXREYXRhLFxuICAgICAgICBpc0NvbnRhaW5lcixcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIG1vdXNlZG93blxuICAgIH0gPSBlZGl0b3I7XG5cbiAgICBlZGl0b3IuZGVsZXRlQmFja3dhcmQgPSB1bml0ID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgaWYgKCFpc1NlbGVjdGlvbkluVGFibGUob3B0cywgZWRpdG9yKSkge1xuICAgICAgICAgICAgZGVsZXRlQmFja3dhcmQodW5pdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcblxuICAgICAgICBjb25zdCBbLCBzdGFydEJsb2NrUGF0aF0gPSBFZGl0b3IuYWJvdmU8RWxlbWVudD4oZWRpdG9yLCB7XG4gICAgICAgICAgICBtYXRjaDogbiA9PiBFbGVtZW50LmlzRWxlbWVudChuKSAmJiBFZGl0b3IuaXNCbG9jayhlZGl0b3IsIG4pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGFydEJsb2NrUGF0aC5sZW5ndGggPD0gc3RhcnRQb3NpdGlvbi5jZWxsRW50cnlbMV0ubGVuZ3RoICsgMSAmJlxuICAgICAgICAgICAgc3RhcnRCbG9ja1BhdGgucG9wKCkgPT09IDAgJiZcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3Iub2Zmc2V0ID09PSAwICYmXG4gICAgICAgICAgICBUaGVRdWVyaWVzLmlzU3RhcnQoZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLCBzdGFydEJsb2NrUGF0aCkgJiZcbiAgICAgICAgICAgICFFZGl0b3IuaXNWb2lkKGVkaXRvciwgVGhlUXVlcmllcy5hbmNob3JCbG9jayhlZGl0b3IpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmRlbGV0ZUZvcndhcmQgPSB1bml0ID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgYWZ0ZXJQb2ludCA9IEVkaXRvci5hZnRlcihlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICBpZiAoYWZ0ZXJQb2ludCAmJiBpc1JhbmdlSW5UYWJsZShvcHRzLCBlZGl0b3IsIHsgYW5jaG9yOiBhZnRlclBvaW50LCBmb2N1czogYWZ0ZXJQb2ludCB9KSkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCBhZnRlclBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IsIGFmdGVyUG9pbnQucGF0aCk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlUG9zaXRpb24uY2VsbCAmJiBiZWZvcmVQb3NpdGlvbi5jZWxsICE9PSBhZnRlclBvc2l0aW9uLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlRm9yd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm9uQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PT0gMykge1xuICAgICAgICAgICAgY29uc3QgaXNNZXJnZWRDZWxsID0gaXNTZWxlY3RlZENlbGxNZXJnZWQoZWRpdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbVNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChkb21TZWxlY3Rpb24gJiYgIWRvbVNlbGVjdGlvbi5pc0NvbGxhcHNlZCAmJiBlZGl0b3Iuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xhdGVTZWxlY3Rpb24gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVSYW5nZShlZGl0b3IsIGRvbVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBzbGF0ZVNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCBlZGl0b3IsIHNsYXRlU2VsZWN0aW9uLmZvY3VzLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChpc01lcmdlZENlbGwgJiYgc3RhcnRQb3NpdGlvbi5jZWxsICE9PSBlbmRQb3NpdGlvbi5jZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyKDgxKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBzbGF0ZVNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm1vdXNlZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoaGl0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3RoZS10YWJsZS13cmFwcGVyJykpIHtcbiAgICAgICAgICAgIGlmICghVGhlRWRpdG9yLmlzRm9jdXNlZChlZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgVGhlRWRpdG9yLmZvY3VzKGVkaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdXNlZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbktleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgaXNNb3ZlVXAgPSBob3RrZXlzLmlzTW92ZVVwKGV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlRG93biA9IGhvdGtleXMuaXNNb3ZlRG93bihldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUJhY2t3YXJkID0gaG90a2V5cy5pc01vdmVCYWNrd2FyZChldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUZvcndhcmQgPSBob3RrZXlzLmlzTW92ZUZvcndhcmQoZXZlbnQpO1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLmFuY2hvciB8fCAhc2VsZWN0aW9uLmZvY3VzKSB7XG4gICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBSYW5nZS5pc0NvbGxhcHNlZChzZWxlY3Rpb24pO1xuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKSkge1xuICAgICAgICAgICAgLy8gZm9yIGtleWJvYXJkIHVwIGFuZCBkb3duIGtleSBpbiB0aGUgdGFibGVcbiAgICAgICAgICAgIGlmIChpc01vdmVVcCB8fCBpc01vdmVEb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBlbmRQb3NpdGlvbi5jZWxsRW50cnlbMV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgY2VsbFBhdGgpLnBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBjZWxsUGF0aCkucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGlzRmlyc3RMaW5lLCBpc0xhc3RMaW5lIH0gPSBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIHN0YXJ0UGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbmRQYXRoLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChUaGVRdWVyaWVzLmFuY2hvckJsb2NrRW50cnkoZWRpdG9yKVsxXS50b1N0cmluZygpICE9PSBzdGFydFBhdGgudG9TdHJpbmcoKSB8fCAhaXNGaXJzdExpbmUpICYmIGlzTW92ZVVwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2tFbnRyeShlZGl0b3IpWzFdLnRvU3RyaW5nKCkgIT09IGVuZFBhdGgudG9TdHJpbmcoKSB8fCAhaXNMYXN0TGluZSkgJiYgaXNNb3ZlRG93bikge1xuICAgICAgICAgICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXQ6IFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChpc01vdmVVcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm92ZVJvdyA9IHN0YXJ0UG9zaXRpb24udGFibGUuY2hpbGRyZW5bc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3ZlQ2VsbCA9IGFib3ZlUm93ICYmIGFib3ZlUm93LmNoaWxkcmVuW3N0YXJ0UG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3Iuc2VsZWN0T3JpZ2luQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGFib3ZlQ2VsbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlRW50cnkgPSBFZGl0b3IucHJldmlvdXMoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGVFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIHByZXZpb3VzTm9kZUVudHJ5WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c05vZGVFbnRyeSAmJiBiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIGJlZm9yZVBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzTm9kZUVudHJ5ICYmICFiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlbG93Um93SW5kZXggPSBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd0luZGV4ID0gc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb3dSb3cgPSBzdGFydFBvc2l0aW9uLnRhYmxlLmNoaWxkcmVuW2JlbG93Um93SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWxvd0NlbGwgPSBiZWxvd1JvdyAmJiBiZWxvd1Jvdy5jaGlsZHJlbltzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi50YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVsb3dDZWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZUVudHJ5ID0gRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb3ZlUGF0aCA9IG5leHROb2RlRW50cnkgPyBuZXh0Tm9kZUVudHJ5WzFdIDogRWRpdG9yLmFmdGVyKGVkaXRvciwgc3RhcnRQb3NpdGlvbi50YWJsZUVudHJ5WzFdKS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBtb3ZlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTW92ZUJhY2t3YXJkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBFZGl0b3IuYmVmb3JlKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBiZWZvcmVQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYmVmb3JlUG9pbnQucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZVBvc2l0aW9uICYmIGJlZm9yZVBvc2l0aW9uLmNlbGwgJiYgYmVmb3JlUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3IuZW5kKGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVmb3JlUG9zaXRpb24uZmluZFByZXZpb3VzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNNb3ZlRm9yd2FyZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclBvc2l0aW9uID0gYWZ0ZXJQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYWZ0ZXJQb2ludC5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJQb3NpdGlvbi5jZWxsICYmIGFmdGVyUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dENlbGwgPSBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBUaGVFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdyaWdodCcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZXZlbnQgZGVsZXRpbmcgY2VsbHMgaW4gdGhlIHRhYmxlXG4gICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2VkICYmICFzdGFydFBvc2l0aW9uLmlzSW5UYWJsZSgpICYmICFpc1ZpcnR1YWxLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgdGFibGVPdXRQYXRoOiBQb2ludDtcbiAgICAgICAgICAgICAgICBFZGl0b3Iud2l0aG91dE5vcm1hbGl6aW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmFuZ2UuaXNGb3J3YXJkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlT3V0UGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBbc2VsZWN0aW9uLmZvY3VzLnBhdGhbMF0gLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRhYmxlTm9kZShvcHRzLCBlZGl0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVPdXRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgW3NlbGVjdGlvbi5mb2N1cy5wYXRoWzBdICsgMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUYWJsZU5vZGUob3B0cywgZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZU91dFJhbmdlID0gRWRpdG9yLnJhbmdlKGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvciwgdGFibGVPdXRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiB0YWJsZU91dFJhbmdlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIG5ldyByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxSYW5nZSA9IEVkaXRvci5yYW5nZShlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24uZm9jdXMucGF0aC5zbGljZSgwLCAzKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9jdXNSYW5nZSA9IFJhbmdlLmludGVyc2VjdGlvbihlZGl0b3Iuc2VsZWN0aW9uLCBjZWxsUmFuZ2UpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgZm9jdXNSYW5nZSk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KGVkaXRvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnNldEZyYWdtZW50RGF0YSA9IChkYXRhOiBEYXRhVHJhbnNmZXIsIG9yaWdpbkV2ZW50PzogT3JpZ2luRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoaXNTZWxlY3Rpb25JblRhYmxlKG9wdHMsIGVkaXRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IEVMRU1FTlRfVE9fQ09NUE9ORU5ULmdldCh0YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbFBvc2l0aW9ucyA9IHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgICAgICBsZXQgdGFibGVGcmFnbWVudCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW4uc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXhbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXhbdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleC5sZW5ndGggLSAxXSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRhYmxlUG9zaXRpb24udGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDZWxsUG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUm93cyA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBzZWxlY3RlZENlbGxQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByb3csIGNvbCB9ID0gY2VsbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBbLi4udGFibGVQb3NpdGlvbi50YWJsZUVudHJ5WzFdLCByb3csIGNvbF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxOb2RlID0gTm9kZS5nZXQoZWRpdG9yLCBjZWxsUGF0aCkgYXMgVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wUm93c1tyb3ddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUm93c1tyb3ddID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGVtcFJvd3Nbcm93XS5wdXNoKGNlbGxOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93czogVGFibGVSb3dFbGVtZW50W10gPSBPYmplY3QudmFsdWVzKHRlbXBSb3dzKS5tYXAoKGl0ZW06IFRhYmxlQ2VsbEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLnRhYmxlUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0YWJsZUZyYWdtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBFbGVtZW50S2luZHMudGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBlZGl0b3IuZ2V0RnJhZ21lbnQoKSBhcyBDdXN0b21FbGVtZW50W107XG4gICAgICAgICAgICAgICAgY29uc3QgaXNBY3Jvc3NCbG9ja3MgPSBUaGVRdWVyaWVzLmlzQWNyb3NzQmxvY2tzKGVkaXRvciwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Fjcm9zc0Jsb2NrcyAmJiBmcmFnbWVudC5sZW5ndGggPT09IDEgJiYgZnJhZ21lbnRbMF0udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSBmcmFnbWVudFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGVGcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSBub3JtYWxpemVUYWJsZShjbG9uZURlZXAodGFibGVGcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgIHNldENsaXBib2FyZERhdGFCeURvbShlZGl0b3IsIHRhYmxlRnJhZ21lbnQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRGcmFnbWVudERhdGEoZGF0YSwgb3JpZ2luRXZlbnQpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaW5zZXJ0RnJhZ21lbnREYXRhID0gYXN5bmMgKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4ge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGF3YWl0IGV4dHJhY3RGcmFnbWVudChkYXRhKTtcbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpICYmXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgRWxlbWVudC5pc0VsZW1lbnQoZnJhZ21lbnRbMF0pICYmXG4gICAgICAgICAgICAgICAgZnJhZ21lbnRbMF0udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFRhYmxlID0gZnJhZ21lbnRbMF0uY2hpbGRyZW4gYXMgTm9kZVtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFJvdyA9IChjbGlwYm9hcmRUYWJsZVswXSBhcyBFbGVtZW50KS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RSb3dJbmRleCA9IHRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RDb2xJbmRleCA9IHRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Um93SW5kZXggPSBzZWxlY3RSb3dJbmRleCArIGNsaXBib2FyZFRhYmxlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENvbEluZGV4ID0gc2VsZWN0Q29sSW5kZXggKyBjbGlwYm9hcmRSb3cubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3RSb3dJbmRleDsgaSA8PSBsYXN0Um93SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc2VsZWN0Q29sSW5kZXg7IGogPD0gbGFzdENvbEluZGV4OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICYmIHJvdy5jaGlsZHJlbltqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbkNlbGwgPSBnZXRPcmlnaW5DZWxsKHRhYmxlUG9zaXRpb24udGFibGUsIGksIGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5DZWxsICYmIChvcmlnaW5DZWxsLmNvbHNwYW4gfHwgb3JpZ2luQ2VsbC5yb3dzcGFuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgb3JpZ2luQ2VsbCkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFRhYmxlQ2VsbChlZGl0b3IsIHRhYmxlUG9zaXRpb24udGFibGUsIG9yaWdpbkNlbGwsIHBhdGhbMF0sIHBhdGhbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29sSW5kZXggPiB0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRDb2xDb3VudCA9IGxhc3RDb2xJbmRleCAtICh0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLmluc2VydENvbHVtbihlZGl0b3IsIGFkZENvbENvdW50LCB0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Um93SW5kZXggPiB0YWJsZVBvc2l0aW9uLmdldEhlaWdodCgpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkUm93Q291bnQgPSBsYXN0Um93SW5kZXggLSAodGFibGVQb3NpdGlvbi5nZXRIZWlnaHQoKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IuaW5zZXJ0Um93KGVkaXRvciwgYWRkUm93Q291bnQsIHRhYmxlUG9zaXRpb24uZ2V0SGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZFRhYmxlLmZvckVhY2goKHJvdzogVGFibGVFbGVtZW50LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5jaGlsZHJlbi5mb3JFYWNoKChjb2w6IE5vZGUsIGo6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0ID0gWy4uLnRhYmxlUG9zaXRpb24udGFibGVFbnRyeVsxXSwgc2VsZWN0Um93SW5kZXggKyBpLCBzZWxlY3RDb2xJbmRleCArIGpdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMucmVtb3ZlTm9kZXMoZWRpdG9yLCB7IGF0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZXMoZWRpdG9yLCBjb2wsIHsgYXQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgWy4uLnRhYmxlUG9zaXRpb24udGFibGVFbnRyeVsxXSwgc2VsZWN0Um93SW5kZXgsIHNlbGVjdENvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3aGVuIHBhc3RpbmcgZGF0YSwgdGhlIGxhc3Qgb25lIGlzIGEgdGFibGUsIGFuZCB0aGUgZm9jdXMgcG9zaXRpb24gaXMgc3BlY2lhbGx5IGhhbmRsZWRcbiAgICAgICAgICAgIC8vICogdGhpcyBpcyB0byBmb2N1cyBhZnRlciB3aXRoVHJhaWxpbmdOb2RlLm5vcm1hbGl6ZU5vZGUoKSB0byBhdm9pZCBpbmNvcnJlY3QgZm9jdXMgZWxlbWVudC5cbiAgICAgICAgICAgIC8vICogaWYgdGhlcmUgaXMgYSBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBub2RlIGJlbG93LlxuICAgICAgICAgICAgLy8gKiBpZiB0aGVyZSBpcyBubyBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCB0YWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbnNlcnROb2RlID0gZnJhZ21lbnRbZnJhZ21lbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpc1RhYmxlID0gKGxhc3RJbnNlcnROb2RlIGFzIEVsZW1lbnQpLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZTtcbiAgICAgICAgICAgIGlmIChpc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBjdXJyZW50UGF0aF0gPSBUaGVRdWVyaWVzLmZpbmROb2RlKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBuID0+IEVsZW1lbnQuaXNFbGVtZW50KG4pICYmIG4udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gUGF0aC5uZXh0KGN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc05leHROb2RlID0gTm9kZS5oYXMoZWRpdG9yLCBuZXh0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c1BhdGggPSBoYXNOZXh0Tm9kZSA/IG5leHRQYXRoIDogY3VycmVudFBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c05vZGUgPSBOb2RlLmdldChlZGl0b3IsIGZvY3VzUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Jsb2NrQ2FyZCA9IGVkaXRvci5pc0Jsb2NrQ2FyZChmb2N1c05vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUGF0aCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmb2N1c1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBpc0Jsb2NrQ2FyZCA/IChoYXNOZXh0Tm9kZSA/IC0xIDogLTIpIDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgY3Vyc29yUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc2VydEZyYWdtZW50RGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zZXJ0RnJhZ21lbnREYXRhKGRhdGEpO1xuICAgIH07XG5cbiAgICBlZGl0b3Iubm9ybWFsaXplTm9kZSA9IChbbm9kZSwgcGF0aF06IE5vZGVFbnRyeTxOb2RlPikgPT4ge1xuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQobm9kZSkgJiYgbm9kZS50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gbm9kZSBhcyBUYWJsZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KC4uLnRhYmxlLmNoaWxkcmVuLm1hcChyb3cgPT4gcm93LmNoaWxkcmVuLmxlbmd0aCkpO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFJvd3MgPSB0YWJsZS5jaGlsZHJlbi5maWx0ZXIocm93ID0+IHJvdy5jaGlsZHJlbi5sZW5ndGggPCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hpbGRyZW4ubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuY2hpbGRyZW4ubWFwKChjZWxsLCBjZWxsSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5oaWRkZW4gfHwgY2VsbC5jb2xzcGFuIHx8IGNlbGwucm93c3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBoaWRkZW46IG51bGwsIGNvbHNwYW46IG51bGwsIHJvd3NwYW46IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXQ6IFsuLi5wYXRoLCByb3dJbmRleCwgY2VsbEluZGV4XSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IG1heFdpZHRoIC0gcm93LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydENvbHVtbkF0Um93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlLCBwYXRoXSBhcyBOb2RlRW50cnk8VGFibGVFbGVtZW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jaGlsZHJlbi5pbmRleE9mKHJvdyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGUuY29sdW1ucyAmJiB0YWJsZS5jb2x1bW5zLmxlbmd0aCAhPT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGFibGUuY29sdW1ucy5sZW5ndGggPiBtYXhXaWR0aCA/IHJlbW92ZUNvbHVtbnModGFibGUsIG1heFdpZHRoKSA6IGFkZENvbHVtbnModGFibGUsIG1heFdpZHRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKGVkaXRvciwgeyBjb2x1bW5zIH0sIHsgYXQ6IHBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub3JhbWxpemUgaWxsZWdhbCBjZWxsIGFuZCByb3cgdG8gYmUgcGFyYWdyYXBoXG4gICAgICAgIGlmIChFbGVtZW50LmlzRWxlbWVudChub2RlKSAmJiBbRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCwgRWxlbWVudEtpbmRzLnRhYmxlUm93XS5pbmNsdWRlcyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTGVnYWxUYWJsZShlZGl0b3IsIG5vZGUgYXMgVGFibGVSb3dFbGVtZW50IHwgVGFibGVDZWxsRWxlbWVudCwgcGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb290UGF0aCA9IFtwYXRoWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZWRpdG9yLnNlbGVjdGlvbi5mb2N1cy5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgYWxsIHRhYmxlQ2VsbCBhbmQgdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBFZGl0b3Iubm9kZXMoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdDogcm9vdFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbG93ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiAobm9kZTogQ3VzdG9tRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZUNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vyc29yUGF0aCA9IHBhdGhbMF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcmFtbGl6ZSB0byBiZSBwYXJhZ3JhcGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhcmdldE5vZGUsIHRhcmdldFBhdGhdIG9mIG5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBjcmVhdGVFbXB0eVBhcmFncmFwaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBOb2RlLnN0cmluZyh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYWdyYXBoLmNoaWxkcmVuWzBdIGFzIFRleHQpLnRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0Tm9kZSBhcyBDdXN0b21FbGVtZW50KS5rZXkgPT09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvclBhdGggPSByb290UGF0aFswXSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmluc2VydE5vZGVzKGVkaXRvciwgcGFyYWdyYXBoLCB7IGF0OiBbcm9vdFBhdGhbMF0gKyBpbmRleF0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yID0geyBwYXRoOiBbY3Vyc29yUGF0aCwgMF0sIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgeyBhbmNob3I6IGN1cnNvciwgZm9jdXM6IGN1cnNvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQ6IHJvb3RQYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkanVzdCBzZWxlY3Rpb24gd2hlbiBzZWxlY3Rpb24gaXMgaW4gaGlkZGVuIGNlbGxcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24gJiZcbiAgICAgICAgICAgICAgICBSYW5nZS5pc0NvbGxhcHNlZChlZGl0b3Iuc2VsZWN0aW9uKSAmJlxuICAgICAgICAgICAgICAgIFBhdGguaXNBbmNlc3RvcihwYXRoLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUuaGlkZGVuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gZ2V0T3JpZ2luQ2VsbCh0YWJsZVBvc2l0aW9uLnRhYmxlLCB0YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCksIHRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgb3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgRWRpdG9yLmVuZChlZGl0b3IsIHBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1hbGl6ZU5vZGUoW25vZGUsIHBhdGhdKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmlzQmxvY2tDYXJkID0gKGVsZW1lbnQ6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Jsb2NrQ2FyZChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnJlbmRlckVsZW1lbnQgPSAoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVSb3cgJiYgaXNJblRhYmxlKGVkaXRvciwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZVJvdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsICYmIGlzSW5UYWJsZVJvdyhlZGl0b3IsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVDdXREYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpKSB7XG4gICAgICAgICAgICBkZWxldGVDdXREYXRhKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoZWxlbWVudC50YWJsZSkgYXMgVGhlVGFibGU7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbFBvc2l0aW9ucyA9IHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENlbGxQb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVDb21wb25lbnQudGFibGVTdG9yZS5pc1NlbGVjdGVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IucmVtb3ZlVGFibGUoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBUYWJsZUVkaXRvci5jbGVhckNlbGxzQ29udGVudChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YWJsZUNvbXBvbmVudC50YWJsZVNlcnZpY2UuY2xvc2VUb29sYmFyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVDdXREYXRhKCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5pc0NvbnRhaW5lciA9IChlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZUNlbGwgPyB0cnVlIDogaXNDb250YWluZXIoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgb25DaGFuZ2UoKTtcbiAgICAgICAgLy8gYWR1anN0IHNlbGVjdGlvbiB3aGVuIHNlbGVjdGlvbiBpcyBpbiBoaWRkZW4gY2VsbFxuICAgICAgICAvLyBqdXN0IGhvb2sgc2V0X3NlbGVjdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBlZGl0b3Iuc2VsZWN0aW9uICYmIFJhbmdlLmlzQ29sbGFwc2VkKGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3Rpb25PcGVyYXRpb24gPSBlZGl0b3Iub3BlcmF0aW9ucy5ldmVyeShvcCA9PiBPcGVyYXRpb24uaXNTZWxlY3Rpb25PcGVyYXRpb24ob3ApKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxhcHNlZCAmJiBpc1NlbGVjdGlvbk9wZXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVQb3NpdGlvbi5pc0luVGFibGUoKSAmJiB0YWJsZVBvc2l0aW9uLmNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH07XG5cbiAgICByZXR1cm4gZWRpdG9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRhYmxlUGx1Z2luID0gKGxvY2FsZTogU2lnbmFsPFRoZUkxOG5UcmFuc2xhdGlvbj4pID0+XG4gICAgY3JlYXRlUGx1Z2luRmFjdG9yeTxUaGVQbHVnaW5UYWJsZU9wdGlvbj4oe1xuICAgICAgICBrZXk6IFBsdWdpbktleXMudGFibGUsXG4gICAgICAgIHdpdGhPdmVycmlkZXM6IHdpdGhUYWJsZSxcbiAgICAgICAgbmVzdGVkU3RydWN0dXJlQnlLZXk6IHtcbiAgICAgICAgICAgIFtFbGVtZW50S2luZHMudGFibGVdOiBFbGVtZW50S2luZHMudGFibGVSb3csXG4gICAgICAgICAgICBbRWxlbWVudEtpbmRzLnRhYmxlUm93XTogRWxlbWVudEtpbmRzLnRhYmxlQ2VsbFxuICAgICAgICB9LFxuICAgICAgICB0b29sYmFySXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IEVsZW1lbnRLaW5kcy50YWJsZSxcbiAgICAgICAgICAgICAgICBpY29uOiAndGFibGUtYm9yZGVyLWFsbCcsXG4gICAgICAgICAgICAgICAgbmFtZTogbG9jYWxlKCkudGFibGUsXG4gICAgICAgICAgICAgICAgdHlwZTogVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duLFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duTW9kZTogRHJvcGRvd25Nb2RlLmljb24sXG4gICAgICAgICAgICAgICAgaWNvbkNvbXBvbmVudDogVGhlVGFibGVUb29sYmFySXRlbSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaW5zZXJ0VGFibGUoZWRpdG9yKSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pc0FjdGl2ZShlZGl0b3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIG1lbnVJdGVtczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogRWxlbWVudEtpbmRzLnRhYmxlLFxuICAgICAgICAgICAgICAgIGtleXdvcmRzOiBgYmlhb2dlLGJnLHRhYmxlLCR7bG9jYWxlKCkudGFibGV9YCxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaW5zZXJ0VGFibGUoZWRpdG9yKSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pc0FjdGl2ZShlZGl0b3IpLFxuICAgICAgICAgICAgICAgIG5hbWU6IGxvY2FsZSgpLnRhYmxlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5ncm91cCxcbiAgICAgICAgICAgICAgICBtZW51SWNvbjogUGx1Z2luTWVudUljb25zLnRhYmxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBsb2NhbGUoKS50YWJsZURlc2MsXG4gICAgICAgICAgICAgICAgZGlzcGxheUtleTogJy9iZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0Z1bGxzY3JlZW46IGZhbHNlLFxuICAgICAgICAgICAgZnJlZXplQ29sdW1uSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGZyZWV6ZVJvd0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgICBzZXRGdWxsc2NyZWVuOiAoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKCk7XG4iXX0=
|