@talrace/ngx-noder 0.0.18 → 0.0.19
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/fesm2022/talrace-ngx-noder.mjs +181 -181
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +1 -1
- package/lib/editor/components/external-element/external.component.d.ts +1 -1
- package/lib/editor/components/shared/abstract/base.component.d.ts +1 -1
- package/lib/editor/components/shared/abstract/destroy.component.d.ts +1 -1
- package/package.json +1 -3
- package/src/lib/apart-components/add-link-dialog/_add-link-dialog.theme.scss +3 -6
- package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +4 -7
- package/src/lib/apart-components/confirm-dialog/_theme.scss +6 -9
- package/src/lib/apart-components/editor-title/_editor-title.theme.scss +6 -9
- package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +9 -12
- package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +5 -8
- package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +1 -3
- package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +1 -3
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +2 -5
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +3 -6
- package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +3 -6
- package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +15 -18
- package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +2 -4
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +5 -8
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +6 -9
- package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +3 -6
- package/src/lib/apart-components/insert-table/_insert-table.theme.scss +6 -9
- package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +12 -15
- package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +22 -25
- package/src/lib/editor/components/_editor.theme.scss +25 -28
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +0 -73
- package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +0 -7
- package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +0 -49
- package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +0 -34
- package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +0 -75
- package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +0 -95
- package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +0 -24
- package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +0 -117
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +0 -37
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +0 -49
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +0 -90
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +0 -81
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +0 -28
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +0 -53
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +0 -18
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +0 -27
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +0 -71
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +0 -107
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +0 -25
- package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +0 -65
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +0 -86
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +0 -90
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +0 -122
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +0 -8
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.mjs +0 -1148
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +0 -157
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +0 -8
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +0 -11
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-template-type.enum.mjs +0 -16
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +0 -6
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +0 -34
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +0 -26
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +0 -60
- package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +0 -48
- package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +0 -54
- package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +0 -86
- package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +0 -134
- package/esm2022/lib/editor/components/edges/edge-element.model.mjs +0 -38
- package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +0 -6
- package/esm2022/lib/editor/components/edges/edge.component.mjs +0 -141
- package/esm2022/lib/editor/components/edges/edges.mjs +0 -120
- package/esm2022/lib/editor/components/edges/page-type.enum.mjs +0 -7
- package/esm2022/lib/editor/components/editor.component.mjs +0 -112
- package/esm2022/lib/editor/components/external-element/external-element.service.mjs +0 -6
- package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +0 -4
- package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +0 -2
- package/esm2022/lib/editor/components/external-element/external.component.mjs +0 -41
- package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +0 -9
- package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +0 -11
- package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +0 -15
- package/esm2022/lib/editor/components/image/components/image.component.mjs +0 -88
- package/esm2022/lib/editor/components/image/image-api.service.mjs +0 -36
- package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +0 -46
- package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +0 -2
- package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +0 -19
- package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +0 -12
- package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +0 -106
- package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +0 -2
- package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +0 -52
- package/esm2022/lib/editor/components/image/size.mjs +0 -2
- package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +0 -60
- package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +0 -18
- package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +0 -43
- package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +0 -2
- package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +0 -3
- package/esm2022/lib/editor/components/shared/custom-content.mjs +0 -2
- package/esm2022/lib/editor/components/shared/services/component.service.mjs +0 -52
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +0 -123
- package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +0 -55
- package/esm2022/lib/editor/components/tab/tab.component.mjs +0 -44
- package/esm2022/lib/editor/components/tab/tab.helper.mjs +0 -6
- package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +0 -118
- package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +0 -99
- package/esm2022/lib/editor/components/table/components/table.component.mjs +0 -412
- package/esm2022/lib/editor/components/table/enums/hrule.enum.mjs +0 -7
- package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +0 -8
- package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +0 -6
- package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +0 -17
- package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +0 -9
- package/esm2022/lib/editor/components/table/models/row-data.model.mjs +0 -8
- package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +0 -7
- package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +0 -84
- package/esm2022/lib/editor/components/table/selection/table-selection.mjs +0 -383
- package/esm2022/lib/editor/content/constants/display-values.const.mjs +0 -8
- package/esm2022/lib/editor/content/constants/document-info.const.mjs +0 -13
- package/esm2022/lib/editor/content/constants/editor.const.mjs +0 -70
- package/esm2022/lib/editor/content/contents.interface.mjs +0 -2
- package/esm2022/lib/editor/content/display-data/display-data.mjs +0 -839
- package/esm2022/lib/editor/content/display-data/display-token.model.mjs +0 -12
- package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +0 -10
- package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +0 -11
- package/esm2022/lib/editor/content/display-data/indent.model.mjs +0 -9
- package/esm2022/lib/editor/content/display-data/line-info.model.mjs +0 -9
- package/esm2022/lib/editor/content/display-data/lines.mjs +0 -96
- package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +0 -8
- package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +0 -2
- package/esm2022/lib/editor/content/display-data/paragraph.mjs +0 -56
- package/esm2022/lib/editor/content/display-data/text-line-info.mjs +0 -35
- package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +0 -2
- package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +0 -78
- package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +0 -62
- package/esm2022/lib/editor/content/helpers/format.helper.mjs +0 -23
- package/esm2022/lib/editor/content/helpers/indexed-element.helper.mjs +0 -6
- package/esm2022/lib/editor/content/helpers/link.helper.mjs +0 -42
- package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +0 -9
- package/esm2022/lib/editor/content/margin.model.mjs +0 -16
- package/esm2022/lib/editor/content/page-vertical-data.model.mjs +0 -9
- package/esm2022/lib/editor/content/vertical-alignment.enum.mjs +0 -11
- package/esm2022/lib/editor/core/event-emitting.mjs +0 -56
- package/esm2022/lib/editor/display/cell.interface.mjs +0 -2
- package/esm2022/lib/editor/display/event.helper.mjs +0 -18
- package/esm2022/lib/editor/display/layers/cursor.layer.mjs +0 -102
- package/esm2022/lib/editor/display/layers/layer.config.mjs +0 -2
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +0 -109
- package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +0 -7
- package/esm2022/lib/editor/display/layers/print.text.layer.mjs +0 -7
- package/esm2022/lib/editor/display/layers/selection.layer.mjs +0 -119
- package/esm2022/lib/editor/display/layers/text.layer.mjs +0 -226
- package/esm2022/lib/editor/display/print/print.helper.mjs +0 -40
- package/esm2022/lib/editor/display/print/print.renderer.mjs +0 -67
- package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +0 -7
- package/esm2022/lib/editor/display/render-changes.interface.mjs +0 -2
- package/esm2022/lib/editor/display/render-changes.model.mjs +0 -25
- package/esm2022/lib/editor/display/renderer.mjs +0 -204
- package/esm2022/lib/editor/display/rendering.helper.mjs +0 -185
- package/esm2022/lib/editor/display/renderloop.mjs +0 -26
- package/esm2022/lib/editor/display/virtual.renderer.mjs +0 -284
- package/esm2022/lib/editor/display/visible-range.interface.mjs +0 -2
- package/esm2022/lib/editor/editor.module.mjs +0 -91
- package/esm2022/lib/editor/execution/distance.model.mjs +0 -10
- package/esm2022/lib/editor/execution/edit.session.mjs +0 -602
- package/esm2022/lib/editor/execution/editor.mjs +0 -1368
- package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +0 -42
- package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +0 -73
- package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +0 -12
- package/esm2022/lib/editor/execution/helpers/page.helper.mjs +0 -12
- package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +0 -41
- package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +0 -177
- package/esm2022/lib/editor/execution/regulator.service.mjs +0 -212
- package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +0 -18
- package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +0 -14
- package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +0 -8
- package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +0 -3
- package/esm2022/lib/editor/execution/targeting/session.model.mjs +0 -10
- package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +0 -2
- package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +0 -88
- package/esm2022/lib/editor/gadgets/history/operation-history.mjs +0 -208
- package/esm2022/lib/editor/gadgets/history/operation.type.mjs +0 -2
- package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +0 -7
- package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +0 -9
- package/esm2022/lib/editor/gadgets/numbering/numbering-marker-type.enum.mjs +0 -12
- package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +0 -13
- package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +0 -149
- package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +0 -7
- package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +0 -18
- package/esm2022/lib/editor/gadgets/scrollbar.mjs +0 -86
- package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/search/search.mjs +0 -231
- package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +0 -5
- package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +0 -20
- package/esm2022/lib/editor/interaction/base.handler.mjs +0 -19
- package/esm2022/lib/editor/interaction/document.handler.mjs +0 -27
- package/esm2022/lib/editor/interaction/editor.service.mjs +0 -386
- package/esm2022/lib/editor/interaction/input.handler.mjs +0 -152
- package/esm2022/lib/editor/interaction/mode.enum.mjs +0 -7
- package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +0 -7
- package/esm2022/lib/editor/interaction/mouse.handler.mjs +0 -50
- package/esm2022/lib/editor/interaction/text-input.mjs +0 -53
- package/esm2022/lib/editor/operations/commands.service.mjs +0 -20
- package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +0 -32
- package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +0 -7
- package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +0 -9
- package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +0 -15
- package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +0 -85
- package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +0 -19
- package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
- package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +0 -136
- package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
- package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +0 -114
- package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +0 -16
- package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +0 -374
- package/esm2022/lib/editor/operations/operations-helper.helper.mjs +0 -438
- package/esm2022/lib/editor/operations/save-commands.helper.mjs +0 -128
- package/esm2022/lib/editor/operations/target-operations.helper.mjs +0 -23
- package/esm2022/lib/editor/positioning/alignments.const.mjs +0 -8
- package/esm2022/lib/editor/positioning/content.helper.mjs +0 -45
- package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +0 -13
- package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +0 -2
- package/esm2022/lib/editor/positioning/insert-index.interface.mjs +0 -2
- package/esm2022/lib/editor/positioning/line-width.helper.mjs +0 -13
- package/esm2022/lib/editor/positioning/position.helper.mjs +0 -210
- package/esm2022/lib/editor/positioning/range.mjs +0 -94
- package/esm2022/lib/editor/positioning/selection.mjs +0 -351
- package/esm2022/lib/editor/revision.helper.mjs +0 -94
- package/esm2022/lib/models/generated/add-numbering.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-element-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-image-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-paragraph-style.model.mjs +0 -12
- package/esm2022/lib/models/generated/apply-text-style.model.mjs +0 -12
- package/esm2022/lib/models/generated/borders-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/break.model.mjs +0 -8
- package/esm2022/lib/models/generated/cell.model.mjs +0 -12
- package/esm2022/lib/models/generated/column-section.model.mjs +0 -8
- package/esm2022/lib/models/generated/column.model.mjs +0 -8
- package/esm2022/lib/models/generated/command.model.mjs +0 -120
- package/esm2022/lib/models/generated/delete.model.mjs +0 -8
- package/esm2022/lib/models/generated/document-name.model.mjs +0 -8
- package/esm2022/lib/models/generated/document.model.mjs +0 -8
- package/esm2022/lib/models/generated/docx.model.mjs +0 -12
- package/esm2022/lib/models/generated/edge-target.model.mjs +0 -8
- package/esm2022/lib/models/generated/edge.model.mjs +0 -8
- package/esm2022/lib/models/generated/element.model.mjs +0 -8
- package/esm2022/lib/models/generated/file-source.model.mjs +0 -8
- package/esm2022/lib/models/generated/format.model.mjs +0 -12
- package/esm2022/lib/models/generated/heading.model.mjs +0 -16
- package/esm2022/lib/models/generated/image-data.model.mjs +0 -8
- package/esm2022/lib/models/generated/image.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-break.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-element.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-image.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-link.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-paragraph.model.mjs +0 -20
- package/esm2022/lib/models/generated/insert-styled-text.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-tab.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table-rows.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-text.model.mjs +0 -8
- package/esm2022/lib/models/generated/last-document-revision.model.mjs +0 -12
- package/esm2022/lib/models/generated/link-data.model.mjs +0 -8
- package/esm2022/lib/models/generated/link.model.mjs +0 -8
- package/esm2022/lib/models/generated/margins.model.mjs +0 -8
- package/esm2022/lib/models/generated/numbering-level.model.mjs +0 -12
- package/esm2022/lib/models/generated/numbering.model.mjs +0 -8
- package/esm2022/lib/models/generated/operation.model.mjs +0 -12
- package/esm2022/lib/models/generated/page-numbers.model.mjs +0 -8
- package/esm2022/lib/models/generated/paragraph-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/paragraph.model.mjs +0 -12
- package/esm2022/lib/models/generated/remove-numberings.model.mjs +0 -8
- package/esm2022/lib/models/generated/remove-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/remove-table-rows.model.mjs +0 -8
- package/esm2022/lib/models/generated/replace-by-text.model.mjs +0 -8
- package/esm2022/lib/models/generated/replace.model.mjs +0 -44
- package/esm2022/lib/models/generated/resize-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-numberings.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-paragraph-styles.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-table.model.mjs +0 -12
- package/esm2022/lib/models/generated/restore-text-styles.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore.model.mjs +0 -8
- package/esm2022/lib/models/generated/revision.model.mjs +0 -12
- package/esm2022/lib/models/generated/row.model.mjs +0 -8
- package/esm2022/lib/models/generated/tab.model.mjs +0 -8
- package/esm2022/lib/models/generated/table-cell.model.mjs +0 -8
- package/esm2022/lib/models/generated/table.model.mjs +0 -12
- package/esm2022/lib/models/generated/target.model.mjs +0 -16
- package/esm2022/lib/models/generated/text-style.model.mjs +0 -8
- package/esm2022/lib/translate/noder-translate.loader.mjs +0 -22
- package/esm2022/public-api.mjs +0 -54
- package/esm2022/talrace-ngx-noder.mjs +0 -5
|
@@ -1,602 +0,0 @@
|
|
|
1
|
-
import { BreakHelper } from '../gadgets/page-break/break.helper';
|
|
2
|
-
import { BreakTypes } from '../gadgets/page-break/break-types.enum';
|
|
3
|
-
import { ContentHelper } from '../positioning/content.helper';
|
|
4
|
-
import { CursorParagraph } from '../positioning/cursor-paragraph';
|
|
5
|
-
import { CUSTOM_ELEMENT_MARKER } from '../components/shared/custom-content-markers.const';
|
|
6
|
-
import { CustomComponentHelper } from '../components/shared/custom-component.hepler';
|
|
7
|
-
import { ElementModel } from '../../models/generated/element.model';
|
|
8
|
-
import { FormatStyleHelper } from './helpers/format-style.helper';
|
|
9
|
-
import { InsertElementModel } from '../../models/generated/insert-element.model';
|
|
10
|
-
import { NEW_LINE_MARKUP } from '../content/constants/editor.const';
|
|
11
|
-
import { NoderImageComponent } from '../components/image/components/image.component';
|
|
12
|
-
import { NoderTabComponent } from '../components/tab/tab.component';
|
|
13
|
-
import { NoderTableComponent } from '../components/table/components/table.component';
|
|
14
|
-
import { NumberingHelper } from '../gadgets/numbering/numbering.helper';
|
|
15
|
-
import { NumberingParagraphStyleModel } from '../gadgets/numbering/numbering-paragraph-style.model';
|
|
16
|
-
import { OperationsHelper } from '../operations/operations-helper.helper';
|
|
17
|
-
import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
|
|
18
|
-
import { Range } from '../positioning/range';
|
|
19
|
-
import { UnicodeHelper } from '../gadgets/unicode/unicode.helper';
|
|
20
|
-
export class EditSession {
|
|
21
|
-
get scrollTop() {
|
|
22
|
-
return this.scrollBar?.scrollTop ?? 0; // only main session is scrollable
|
|
23
|
-
}
|
|
24
|
-
get scrollBarHeight() {
|
|
25
|
-
return this.scrollBar?.element.clientHeight ?? 0; // only main session is scrollable
|
|
26
|
-
}
|
|
27
|
-
constructor(displayData, sessionId, customContentService, model, selection, generalProperties, editorService, customComponents, type, scrollBar) {
|
|
28
|
-
this.displayData = displayData;
|
|
29
|
-
this.sessionId = sessionId;
|
|
30
|
-
this.customContentService = customContentService;
|
|
31
|
-
this.model = model;
|
|
32
|
-
this.selection = selection;
|
|
33
|
-
this.generalProperties = generalProperties;
|
|
34
|
-
this.editorService = editorService;
|
|
35
|
-
this.customComponents = customComponents;
|
|
36
|
-
this.type = type;
|
|
37
|
-
this.scrollBar = scrollBar;
|
|
38
|
-
this.tokenRe = new RegExp('^[' + UnicodeHelper.wordChars + '\\$_]+', 'g');
|
|
39
|
-
this.nonTokenRe = new RegExp('^(?:[^' + UnicodeHelper.wordChars + '\\$_]|\\s])+', 'g');
|
|
40
|
-
}
|
|
41
|
-
destroy() {
|
|
42
|
-
this.displayData.destroy();
|
|
43
|
-
}
|
|
44
|
-
getRowLength(row) {
|
|
45
|
-
if (!this.displayData.paragraphs[row].nextLineIndexes) {
|
|
46
|
-
return 1;
|
|
47
|
-
}
|
|
48
|
-
return this.displayData.paragraphs[row].nextLineIndexes.length + 1;
|
|
49
|
-
}
|
|
50
|
-
getRowCacheIndex(cacheArray, value) {
|
|
51
|
-
let start = 0;
|
|
52
|
-
let end = cacheArray.length - 1;
|
|
53
|
-
while (start <= end) {
|
|
54
|
-
const mid = (start + end) >> 1;
|
|
55
|
-
const center = cacheArray[mid];
|
|
56
|
-
if (value > center) {
|
|
57
|
-
start = mid + 1;
|
|
58
|
-
}
|
|
59
|
-
else if (value < center) {
|
|
60
|
-
end = mid - 1;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
return mid;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return start - 1;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Calculates the width of the string `str` on the screen while assuming that the string starts at the first column on the screen.
|
|
70
|
-
* The first position indicates the number of columns for `str` on screen.
|
|
71
|
-
* The second value contains the position of the document column that this function read until.
|
|
72
|
-
*/
|
|
73
|
-
getStringScreenWidth(str, maxScreenColumn) {
|
|
74
|
-
let screenColumn = 0;
|
|
75
|
-
let column;
|
|
76
|
-
for (column = 0; column < str.length; column++) {
|
|
77
|
-
screenColumn += 1;
|
|
78
|
-
if (screenColumn > maxScreenColumn) {
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return [screenColumn, column];
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Given a starting row and column, this method returns the `Range` of the first word boundary it finds.
|
|
86
|
-
*/
|
|
87
|
-
getWordRange(row, column) {
|
|
88
|
-
const line = this.displayData.getParagraphContent(row);
|
|
89
|
-
let inToken = false;
|
|
90
|
-
if (column > 0) {
|
|
91
|
-
inToken = !!line.charAt(column - 1).match(this.tokenRe);
|
|
92
|
-
}
|
|
93
|
-
if (!inToken) {
|
|
94
|
-
inToken = !!line.charAt(column).match(this.tokenRe);
|
|
95
|
-
}
|
|
96
|
-
let regexp;
|
|
97
|
-
if (inToken) {
|
|
98
|
-
regexp = this.tokenRe;
|
|
99
|
-
}
|
|
100
|
-
else if (/^\s+$/.test(line.slice(column - 1, column + 1))) {
|
|
101
|
-
regexp = /\s/;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
regexp = this.nonTokenRe;
|
|
105
|
-
}
|
|
106
|
-
let start = column;
|
|
107
|
-
if (start > 0) {
|
|
108
|
-
do {
|
|
109
|
-
start--;
|
|
110
|
-
} while (start >= 0 && line.charAt(start).match(regexp));
|
|
111
|
-
start++;
|
|
112
|
-
}
|
|
113
|
-
let end = column;
|
|
114
|
-
while (end < line.length && line.charAt(end).match(regexp)) {
|
|
115
|
-
end++;
|
|
116
|
-
}
|
|
117
|
-
return new Range(new CursorParagraph(row, start), new CursorParagraph(row, end));
|
|
118
|
-
}
|
|
119
|
-
getDisplayLine(row, endColumn, startColumn) {
|
|
120
|
-
const paragraphContent = this.displayData.getParagraphContent(row);
|
|
121
|
-
return paragraphContent.substring(startColumn || 0, endColumn || paragraphContent.length);
|
|
122
|
-
}
|
|
123
|
-
isEdgeOrWithinEdge() {
|
|
124
|
-
return this.isEdge() || this.isWithinEdge();
|
|
125
|
-
}
|
|
126
|
-
isEdge() {
|
|
127
|
-
return this.type === 'edge';
|
|
128
|
-
}
|
|
129
|
-
isWithinEdge() {
|
|
130
|
-
return this.type === 'cellWithinEdge';
|
|
131
|
-
}
|
|
132
|
-
onRendered() {
|
|
133
|
-
if (this.isEdgeOrWithinEdge()) {
|
|
134
|
-
this.editorService.changedEdge(this.sessionId);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
provideTextStyle(start, end) {
|
|
138
|
-
const components = this.customComponents.customElements;
|
|
139
|
-
let i = components.findIndex(x => x.instance.content.insertIndex >= start);
|
|
140
|
-
if (i === -1) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
let j = this.model.formats.findIndex(x => x.endIndex >= components[i].instance.content.insertIndex);
|
|
144
|
-
while (i < components.length && components[i].instance.content.insertIndex <= end) {
|
|
145
|
-
while (this.model.formats[j].endIndex < components[i].instance.content.insertIndex) {
|
|
146
|
-
j++;
|
|
147
|
-
}
|
|
148
|
-
components[i].instance.receiveStyle(this.model.formats[j].textStyle);
|
|
149
|
-
i++;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
removeByDocumentIndexes(startIndex, endIndex) {
|
|
153
|
-
const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex);
|
|
154
|
-
const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex);
|
|
155
|
-
this.remove(new Range(startParagraphPosition, endParagraphPosition));
|
|
156
|
-
}
|
|
157
|
-
insertTextByDocumentIndex(index, text, style) {
|
|
158
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, index);
|
|
159
|
-
return this.insertText(paragraphPosition, text, style);
|
|
160
|
-
}
|
|
161
|
-
insertElementByDocumentIndex(insertElement) {
|
|
162
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.element.insertIndex);
|
|
163
|
-
return this.insertElement(elementPosition, insertElement.element);
|
|
164
|
-
}
|
|
165
|
-
insertBreakByDocumentIndex(insertElement) {
|
|
166
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
167
|
-
return this.insertBreak(elementPosition, insertElement.breakType);
|
|
168
|
-
}
|
|
169
|
-
insertTabByDocumentIndex(insertElement) {
|
|
170
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
171
|
-
return this.insertTab(elementPosition);
|
|
172
|
-
}
|
|
173
|
-
insertImageByDocumentIndex(insertElement) {
|
|
174
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
175
|
-
return this.insertImage(elementPosition, insertElement.imageData);
|
|
176
|
-
}
|
|
177
|
-
insertTableByDocumentIndex(insertElement) {
|
|
178
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
179
|
-
return this.insertTable(elementPosition, insertElement);
|
|
180
|
-
}
|
|
181
|
-
insertLinkByDocumentIndex(insertElement) {
|
|
182
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
183
|
-
return this.insertLink(elementPosition, insertElement.linkDataModel);
|
|
184
|
-
}
|
|
185
|
-
insertParagraphByDocumentIndex(insertElement) {
|
|
186
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
|
|
187
|
-
return this.insertParagraph(elementPosition, insertElement);
|
|
188
|
-
}
|
|
189
|
-
applyTextStyle(startIndex, endIndex, textStyle) {
|
|
190
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
191
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
|
|
192
|
-
OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
|
|
193
|
-
this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
|
|
194
|
-
this.setTextStyle(textStyle);
|
|
195
|
-
this.provideTextStyle(startIndex, endIndex);
|
|
196
|
-
}
|
|
197
|
-
applyParagraphStyle(startIndex, endIndex, paragraphStyle) {
|
|
198
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
199
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
|
|
200
|
-
OperationsHelper.applyParagraphStyle(this.model, startIndex, endIndex, paragraphStyle);
|
|
201
|
-
this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
|
|
202
|
-
this.applyToolbarStyles();
|
|
203
|
-
}
|
|
204
|
-
applyElementStyle(model) {
|
|
205
|
-
OperationsHelper.applyElementStyle(this.model, model);
|
|
206
|
-
const imageComponentRef = this.customComponents.customElements.find(x => x.instance.insertIndex === model.insertIndex);
|
|
207
|
-
imageComponentRef.instance.initialize();
|
|
208
|
-
const paragraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, model.insertIndex).row;
|
|
209
|
-
this.displayData.updateNextLineIndexes(paragraph, paragraph);
|
|
210
|
-
}
|
|
211
|
-
addNumbering(levels, startIndex, endIndex) {
|
|
212
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
213
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
|
|
214
|
-
OperationsHelper.addNumbering(this.model, this.generalProperties.numberings, startIndex, endIndex, levels);
|
|
215
|
-
this.generalProperties.numberingInfo = {};
|
|
216
|
-
this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
|
|
217
|
-
for (let i = startParagraph; i <= endParagraph; i++) {
|
|
218
|
-
if (this.displayData.getParagraphSettings(i).numberingData.numberingId !== null) {
|
|
219
|
-
this.displayData.updateNumberingsDataOnChange(endParagraph + 1);
|
|
220
|
-
break;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
this.applyToolbarStyles();
|
|
224
|
-
}
|
|
225
|
-
removeNumberings(startIndex, endIndex) {
|
|
226
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
227
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
|
|
228
|
-
OperationsHelper.removeNumberings(this.model, this.generalProperties.numberings, startIndex, endIndex);
|
|
229
|
-
this.displayData.resetAllNumberingInfo(startParagraph);
|
|
230
|
-
this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
|
|
231
|
-
this.displayData.updateNumberingsDataOnChange(endParagraph);
|
|
232
|
-
this.applyToolbarStyles();
|
|
233
|
-
}
|
|
234
|
-
restoreNumberings(paragraphs, numberings) {
|
|
235
|
-
const startIndex = paragraphs[0].insertIndex;
|
|
236
|
-
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
237
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
238
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
|
|
239
|
-
OperationsHelper.restoreNumberings(this.model, this.generalProperties.numberings, paragraphs, numberings);
|
|
240
|
-
this.displayData.resetAllNumberingInfo(startParagraph);
|
|
241
|
-
this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
|
|
242
|
-
for (const paragraph of paragraphs) {
|
|
243
|
-
if (paragraph.paragraphStyle.numberingId !== null) {
|
|
244
|
-
this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
this.selection.placeCursor(endPosition);
|
|
249
|
-
this.applyToolbarStyles();
|
|
250
|
-
}
|
|
251
|
-
applyImageStyle(applyImage) {
|
|
252
|
-
const imageComponentRef = this.customComponents.images.find(x => x.instance.insertIndex === applyImage.insertIndex);
|
|
253
|
-
imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
|
|
254
|
-
OperationsHelper.applyImageStyle(this.model, applyImage);
|
|
255
|
-
const start = this.displayData.indexToPosition(applyImage.insertIndex, 0);
|
|
256
|
-
this.displayData.updateNextLineIndexes(start.row, this.displayData.paragraphs.length - 1);
|
|
257
|
-
}
|
|
258
|
-
restoreTextStyles(formats, linkFormats) {
|
|
259
|
-
const startIndex = formats[0].startIndex;
|
|
260
|
-
const endIndex = formats[formats.length - 1].endIndex;
|
|
261
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
262
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
|
|
263
|
-
OperationsHelper.restoreTextStyles(this.model, formats, linkFormats);
|
|
264
|
-
this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
|
|
265
|
-
this.selection.placeCursor(endPosition);
|
|
266
|
-
this.applyToolbarStyles();
|
|
267
|
-
this.provideTextStyle(startIndex, endIndex);
|
|
268
|
-
}
|
|
269
|
-
restoreParagraphStyles(paragraphs) {
|
|
270
|
-
const startIndex = paragraphs[0].insertIndex;
|
|
271
|
-
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
272
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
|
|
273
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
|
|
274
|
-
OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
|
|
275
|
-
this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
|
|
276
|
-
this.selection.placeCursor(endPosition);
|
|
277
|
-
this.applyToolbarStyles();
|
|
278
|
-
}
|
|
279
|
-
setTextStyle(textStyle) {
|
|
280
|
-
const result = { ...this.editorService.styles };
|
|
281
|
-
for (let key of Object.keys(textStyle)) {
|
|
282
|
-
result[key] = textStyle[key];
|
|
283
|
-
}
|
|
284
|
-
this.editorService.styles = result;
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Removes the `range` from the document.
|
|
288
|
-
* If `range` is empty, this function returns the unmodified value of `range.start`.
|
|
289
|
-
*/
|
|
290
|
-
remove(range) {
|
|
291
|
-
const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.displayData.paragraphs, range);
|
|
292
|
-
this.displayData.removeRange(range);
|
|
293
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.tables, partIndexes.startIndex, partIndexes.endIndex);
|
|
294
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.images, partIndexes.startIndex, partIndexes.endIndex);
|
|
295
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, partIndexes.startIndex, partIndexes.endIndex);
|
|
296
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, partIndexes.startIndex, partIndexes.endIndex);
|
|
297
|
-
OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex - partIndexes.startIndex + 1);
|
|
298
|
-
this.selection.placeCursor(range.start);
|
|
299
|
-
this.displayData.resetAllNumberingInfo(range.start.row);
|
|
300
|
-
this.displayData.updateNextLineIndexes(range.start.row, range.start.row);
|
|
301
|
-
if (range.end.row - range.start.row && this.type !== 'cell') {
|
|
302
|
-
this.displayData.updateNumberingsDataOnChange(range.start.row + 1);
|
|
303
|
-
}
|
|
304
|
-
this.applyToolbarStyles();
|
|
305
|
-
}
|
|
306
|
-
replace(model) {
|
|
307
|
-
this.removeByDocumentIndexes(model.delete.startIndex, model.delete.startIndex + model.delete.count);
|
|
308
|
-
let endPoint;
|
|
309
|
-
if (model.insertText) {
|
|
310
|
-
endPoint = this.insertTextByDocumentIndex(model.insertText.insertIndex, model.insertText.text);
|
|
311
|
-
}
|
|
312
|
-
else if (model.insertParagraph) {
|
|
313
|
-
endPoint = this.insertParagraphByDocumentIndex(model.insertParagraph);
|
|
314
|
-
}
|
|
315
|
-
else if (model.insertElement) {
|
|
316
|
-
endPoint = this.insertElementByDocumentIndex(model.insertElement);
|
|
317
|
-
}
|
|
318
|
-
else if (model.insertBreak) {
|
|
319
|
-
endPoint = this.insertBreakByDocumentIndex(model.insertBreak);
|
|
320
|
-
}
|
|
321
|
-
else if (model.insertTab) {
|
|
322
|
-
endPoint = this.insertTabByDocumentIndex(model.insertTab);
|
|
323
|
-
}
|
|
324
|
-
else if (model.insertImage) {
|
|
325
|
-
endPoint = this.insertImageByDocumentIndex(model.insertImage);
|
|
326
|
-
}
|
|
327
|
-
else if (model.insertTable) {
|
|
328
|
-
endPoint = this.insertTableByDocumentIndex(model.insertTable);
|
|
329
|
-
}
|
|
330
|
-
else if (model.insertLink) {
|
|
331
|
-
endPoint = this.insertLinkByDocumentIndex(model.insertLink);
|
|
332
|
-
}
|
|
333
|
-
return endPoint;
|
|
334
|
-
}
|
|
335
|
-
insertText(position, text, cursorStyle) {
|
|
336
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
337
|
-
if (cursorStyle) {
|
|
338
|
-
OperationsHelper.insertStyledText(this.model, text, insertIndex, cursorStyle);
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
OperationsHelper.insertText(this.model, text, insertIndex);
|
|
342
|
-
}
|
|
343
|
-
const endPosition = this.displayData.insertText(position, text);
|
|
344
|
-
this.displayData.resetAllNumberingInfo(position.row);
|
|
345
|
-
this.displayData.updateNextLineIndexes(position.row, endPosition.row);
|
|
346
|
-
if (endPosition.row - position.row && this.type !== 'cell') {
|
|
347
|
-
this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
|
|
348
|
-
}
|
|
349
|
-
this.selection.placeCursor(endPosition);
|
|
350
|
-
return endPosition;
|
|
351
|
-
}
|
|
352
|
-
insertElement(position, element) {
|
|
353
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
354
|
-
const insertElement = new InsertElementModel({ element: new ElementModel({ insertIndex, ...element }) });
|
|
355
|
-
OperationsHelper.insertElement(this.model, insertElement);
|
|
356
|
-
const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
357
|
-
const model = this.model.elements.find(x => x.insertIndex === insertIndex);
|
|
358
|
-
const type = this.customContentService.findComponentType(model.type);
|
|
359
|
-
this.addComponent(this.customComponents.customElements, model, type);
|
|
360
|
-
this.displayData.updateNextLineIndexes(position.row, endPosition.row);
|
|
361
|
-
this.selection.placeCursor(endPosition);
|
|
362
|
-
return endPosition;
|
|
363
|
-
}
|
|
364
|
-
insertBreak(position, breakType) {
|
|
365
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
366
|
-
const isOnNewParagraph = breakType === BreakTypes.Page &&
|
|
367
|
-
BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
|
|
368
|
-
const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
|
|
369
|
-
OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
|
|
370
|
-
const endPosition = this.displayData.insertText(position, text);
|
|
371
|
-
this.displayData.updateNextLineIndexes(position.row, endPosition.row);
|
|
372
|
-
if (isOnNewParagraph && endPosition.row - position.row) {
|
|
373
|
-
this.displayData.updateNumberingsDataOnChange(endPosition.row);
|
|
374
|
-
}
|
|
375
|
-
const cursorPosition = this.displayData.getPositionAfterBreak(endPosition, breakType);
|
|
376
|
-
this.selection.placeCursor(cursorPosition);
|
|
377
|
-
return endPosition;
|
|
378
|
-
}
|
|
379
|
-
insertTab(position) {
|
|
380
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
381
|
-
OperationsHelper.insertTab(this.model, insertIndex);
|
|
382
|
-
const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
|
|
383
|
-
this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
|
|
384
|
-
const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
385
|
-
this.displayData.updateNextLineIndexes(position.row, position.row);
|
|
386
|
-
this.selection.placeCursor(endPosition);
|
|
387
|
-
return endPosition;
|
|
388
|
-
}
|
|
389
|
-
insertImage(position, imageData) {
|
|
390
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
391
|
-
OperationsHelper.insertImage(this.model, insertIndex, imageData);
|
|
392
|
-
const model = this.model.images.find(x => x.insertIndex === insertIndex);
|
|
393
|
-
this.addComponent(this.customComponents.images, model, NoderImageComponent);
|
|
394
|
-
const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
395
|
-
this.displayData.updateNextLineIndexes(position.row, position.row);
|
|
396
|
-
this.selection.placeCursor(endPosition);
|
|
397
|
-
return endPosition;
|
|
398
|
-
}
|
|
399
|
-
insertLink(position, linkData) {
|
|
400
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
401
|
-
OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex);
|
|
402
|
-
const endPosition = this.displayData.insertText(position, linkData.text);
|
|
403
|
-
this.displayData.updateNextLineIndexes(position.row, position.row);
|
|
404
|
-
this.selection.placeCursor(endPosition);
|
|
405
|
-
return endPosition;
|
|
406
|
-
}
|
|
407
|
-
insertTable(position, tableModel) {
|
|
408
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
409
|
-
OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.displayData.contentWidth);
|
|
410
|
-
const model = this.model.tables.find(x => x.insertIndex === tableModel.insertTableIndex);
|
|
411
|
-
this.addComponent(this.customComponents.tables, model, NoderTableComponent);
|
|
412
|
-
const endPosition = this.displayData.insertText(position, tableModel.content);
|
|
413
|
-
this.displayData.updateNextLineIndexes(position.row, endPosition.row);
|
|
414
|
-
if (endPosition.row - position.row) {
|
|
415
|
-
this.displayData.updateNumberingsDataOnChange(endPosition.row);
|
|
416
|
-
}
|
|
417
|
-
this.selection.placeCursor(endPosition);
|
|
418
|
-
return endPosition;
|
|
419
|
-
}
|
|
420
|
-
insertParagraph(position, paragraphModel) {
|
|
421
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
422
|
-
const text = OperationsHelper.insertParagraph(this.model, insertIndex, paragraphModel, this.displayData.contentWidth);
|
|
423
|
-
const endPosition = this.displayData.insertText(position, text);
|
|
424
|
-
this.displayData.updateNextLineIndexes(position.row, endPosition.row);
|
|
425
|
-
if (endPosition.row - position.row) {
|
|
426
|
-
this.displayData.updateNumberingsDataOnChange(endPosition.row);
|
|
427
|
-
}
|
|
428
|
-
let endPoint;
|
|
429
|
-
if (paragraphModel.insertText) {
|
|
430
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertText.insertIndex);
|
|
431
|
-
endPoint = this.displayData.insertText(paragraphPosition, text);
|
|
432
|
-
this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
|
|
433
|
-
if (endPoint.row - paragraphPosition.row) {
|
|
434
|
-
this.displayData.updateNumberingsDataOnChange(endPoint.row);
|
|
435
|
-
}
|
|
436
|
-
this.selection.placeCursor(endPoint);
|
|
437
|
-
}
|
|
438
|
-
else if (paragraphModel.insertImage) {
|
|
439
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertImage.insertIndex);
|
|
440
|
-
const imageInsertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
|
|
441
|
-
const model = this.model.images.find(x => x.insertIndex === imageInsertIndex);
|
|
442
|
-
this.addComponent(this.customComponents.images, model, NoderImageComponent);
|
|
443
|
-
endPoint = this.displayData.insertText(paragraphPosition, CUSTOM_ELEMENT_MARKER);
|
|
444
|
-
this.displayData.updateNextLineIndexes(paragraphPosition.row, paragraphPosition.row);
|
|
445
|
-
this.selection.placeCursor(endPoint);
|
|
446
|
-
}
|
|
447
|
-
else if (paragraphModel.insertTable) {
|
|
448
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertTable.insertIndex);
|
|
449
|
-
const model = this.model.tables.find(x => x.insertIndex === paragraphModel.insertTable.insertTableIndex);
|
|
450
|
-
this.addComponent(this.customComponents.tables, model, NoderTableComponent);
|
|
451
|
-
endPoint = this.displayData.insertText(paragraphPosition, paragraphModel.insertTable.content);
|
|
452
|
-
this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
|
|
453
|
-
if (endPoint.row - paragraphPosition.row) {
|
|
454
|
-
this.displayData.updateNumberingsDataOnChange(endPoint.row);
|
|
455
|
-
}
|
|
456
|
-
this.selection.placeCursor(endPoint);
|
|
457
|
-
}
|
|
458
|
-
return endPoint;
|
|
459
|
-
}
|
|
460
|
-
addComponent(customElements, model, componentType) {
|
|
461
|
-
const customElement = this.customContentService.componentService.createComponent(componentType, {
|
|
462
|
-
content: model,
|
|
463
|
-
sessionId: this.sessionId,
|
|
464
|
-
generalProperties: this.generalProperties,
|
|
465
|
-
contentWidth: this.displayData.contentWidth
|
|
466
|
-
});
|
|
467
|
-
const newElementPosition = customElements.findIndex(x => x.instance.insertIndex > model.insertIndex);
|
|
468
|
-
if (newElementPosition >= 0) {
|
|
469
|
-
customElements.splice(newElementPosition, 0, customElement);
|
|
470
|
-
}
|
|
471
|
-
else {
|
|
472
|
-
customElements.push(customElement);
|
|
473
|
-
}
|
|
474
|
-
customElement.instance.initialize();
|
|
475
|
-
}
|
|
476
|
-
applyToolbarStyles() {
|
|
477
|
-
// undefined - value wasn't set
|
|
478
|
-
// null - collision (different values at the same time)
|
|
479
|
-
// value - value was set without collisions
|
|
480
|
-
let startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, this.selection.range.start);
|
|
481
|
-
let endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, this.selection.range.end);
|
|
482
|
-
if (startIndex !== endIndex) {
|
|
483
|
-
endIndex--;
|
|
484
|
-
}
|
|
485
|
-
else if (this.selection.cursor.column > 0) {
|
|
486
|
-
startIndex--;
|
|
487
|
-
endIndex--;
|
|
488
|
-
}
|
|
489
|
-
const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(x => x.paragraphStyle.numberingId
|
|
490
|
-
? NumberingHelper.getStyles(x.paragraphStyle, this.generalProperties.numberings)
|
|
491
|
-
: new NumberingParagraphStyleModel(x.paragraphStyle));
|
|
492
|
-
const styles = this.selection.isEmpty
|
|
493
|
-
? this.getStyleForCursor(startIndex)
|
|
494
|
-
: FormatStyleHelper.combineSection(this.model.formats, this.model.links, startIndex, endIndex).map(x => x.textStyle);
|
|
495
|
-
const result = {};
|
|
496
|
-
for (let style of [...styles, ...paragraphStyles]) {
|
|
497
|
-
for (let key of Object.keys(style)) {
|
|
498
|
-
if (result[key] === undefined) {
|
|
499
|
-
result[key] = style[key];
|
|
500
|
-
}
|
|
501
|
-
else if (result[key] !== style[key]) {
|
|
502
|
-
result[key] = null;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
this.editorService.styles = result;
|
|
507
|
-
}
|
|
508
|
-
getStyleForCursor(index) {
|
|
509
|
-
const link = this.model.links.find(x => x.startIndex <= index && x.endIndex > index);
|
|
510
|
-
if (link && !this.displayData.paragraphs.some(x => x.startIndex === index)) {
|
|
511
|
-
const indexInLink = index - link.startIndex;
|
|
512
|
-
const linkFormat = link.formats.find(x => x.startIndex <= indexInLink && x.endIndex >= indexInLink);
|
|
513
|
-
return [linkFormat.textStyle];
|
|
514
|
-
}
|
|
515
|
-
const format = FormatStyleHelper.getFormatAtIndex(this.model.formats, index);
|
|
516
|
-
return [format.textStyle];
|
|
517
|
-
}
|
|
518
|
-
restore(model) {
|
|
519
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, model.startIndex);
|
|
520
|
-
if (model.startIndex !== model.endIndex) {
|
|
521
|
-
this.removeByDocumentIndexes(model.startIndex, model.endIndex);
|
|
522
|
-
}
|
|
523
|
-
OperationsHelper.restore(this.model, model);
|
|
524
|
-
const endPoint = this.displayData.insertText(paragraphPosition, model.text);
|
|
525
|
-
const restoreEndIndex = model.startIndex + model.text.length;
|
|
526
|
-
this.restoreComponents(this.model.tables, this.customComponents.tables, NoderTableComponent, model.startIndex, restoreEndIndex);
|
|
527
|
-
this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.startIndex, restoreEndIndex);
|
|
528
|
-
this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.startIndex, restoreEndIndex);
|
|
529
|
-
this.restoreElementComponents(this.model.elements, model.startIndex, restoreEndIndex);
|
|
530
|
-
this.displayData.resetAllNumberingInfo(paragraphPosition.row);
|
|
531
|
-
this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
|
|
532
|
-
if (endPoint.row - paragraphPosition.row && this.type !== 'cell') {
|
|
533
|
-
this.displayData.updateNumberingsDataOnChange(endPoint.row + 1);
|
|
534
|
-
}
|
|
535
|
-
this.selection.placeCursor(endPoint);
|
|
536
|
-
this.applyToolbarStyles();
|
|
537
|
-
}
|
|
538
|
-
restoreComponents(models, components, componentType, restoreIndex, restoreEndIndex) {
|
|
539
|
-
for (const model of models) {
|
|
540
|
-
if (model.insertIndex < restoreIndex) {
|
|
541
|
-
continue;
|
|
542
|
-
}
|
|
543
|
-
else if (model.insertIndex >= restoreEndIndex) {
|
|
544
|
-
break;
|
|
545
|
-
}
|
|
546
|
-
this.addComponent(components, model, componentType);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
restoreElementComponents(elements, restoreIndex, restoreEndIndex) {
|
|
550
|
-
for (const model of elements) {
|
|
551
|
-
if (model.insertIndex < restoreIndex) {
|
|
552
|
-
continue;
|
|
553
|
-
}
|
|
554
|
-
else if (model.insertIndex >= restoreEndIndex) {
|
|
555
|
-
break;
|
|
556
|
-
}
|
|
557
|
-
const type = this.customContentService.findComponentType(model.type);
|
|
558
|
-
this.addComponent(this.customComponents.customElements, model, type);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
getLinkModel(cursor) {
|
|
562
|
-
const index = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, cursor);
|
|
563
|
-
return this.model.links.find(x => x.startIndex <= index && x.endIndex >= index);
|
|
564
|
-
}
|
|
565
|
-
insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
|
|
566
|
-
const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
567
|
-
this.displayData.resetNumberingInfoByTableCell(table);
|
|
568
|
-
OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
|
|
569
|
-
table.instance.updateTable();
|
|
570
|
-
}
|
|
571
|
-
insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
|
|
572
|
-
const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
573
|
-
this.displayData.resetNumberingInfoByTableCell(table);
|
|
574
|
-
OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.displayData.contentWidth);
|
|
575
|
-
table.instance.updateTable();
|
|
576
|
-
}
|
|
577
|
-
removeTableRows(insertIndex, startIndex, endIndex) {
|
|
578
|
-
const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
579
|
-
this.displayData.resetNumberingInfoByTableCell(table);
|
|
580
|
-
OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
|
|
581
|
-
table.instance.updateTable();
|
|
582
|
-
}
|
|
583
|
-
removeTableColumns(insertIndex, startIndex, endIndex) {
|
|
584
|
-
const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
585
|
-
this.displayData.resetNumberingInfoByTableCell(table);
|
|
586
|
-
OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.displayData.contentWidth);
|
|
587
|
-
table.instance.updateTable();
|
|
588
|
-
}
|
|
589
|
-
resizeTableColumns(resizeTableColumns) {
|
|
590
|
-
const table = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
|
|
591
|
-
this.displayData.resetNumberingInfoByTableCell(table);
|
|
592
|
-
OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
|
|
593
|
-
table.instance.updateTable();
|
|
594
|
-
}
|
|
595
|
-
restoreTable(insertIndex, table) {
|
|
596
|
-
const oldTable = JSON.parse(JSON.stringify(table));
|
|
597
|
-
OperationsHelper.restoreTable(this.model, insertIndex, oldTable);
|
|
598
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
599
|
-
tableComponent.instance.updateTable();
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBTXJGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUtsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQVNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxvQkFBb0IsRUFB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Q0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDdEcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb250ZW50SGVscGVyIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvY29udGVudC5oZWxwZXInO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50L2NvbnRlbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDdXJzb3JQYXJhZ3JhcGggfSBmcm9tICcuLi9wb3NpdGlvbmluZy9jdXJzb3ItcGFyYWdyYXBoJztcbmltcG9ydCB7IENVU1RPTV9FTEVNRU5UX01BUktFUiB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgQ3VzdG9tQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbXBvbmVudC5oZXBsZXInO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50JztcbmltcG9ydCB7IEN1c3RvbUNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY3VzdG9tLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaXNwbGF5RGF0YSB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2Rpc3BsYXktZGF0YSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZXh0ZXJuYWwtZWxlbWVudC9tb2RlbHMvZWxlbWVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZm9ybWF0Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm1hdC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgR2VuZXJhbFByb3BlcnRpZXNNb2RlbCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2dlbmVyYWwtcHJvcGVydGllcy5tb2RlbCc7XG5pbXBvcnQgeyBJQ3VzdG9tQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW1hZ2UtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRCcmVha01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtYnJlYWsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0RWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRJbWFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtaW1hZ2UubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0TGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtbGluay5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXBhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSVRvb2xiYXJTdHlsZXMgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS90b29sYmFyLXN0eWxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlua0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay1kYXRhLm1vZGVsJztcbmltcG9ydCB7IExpbmtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay5tb2RlbCc7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgTm9kZXJJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW1hZ2UvY29tcG9uZW50cy9pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZXJUYWJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgTnVtYmVyaW5nTGV2ZWxNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLWxldmVsLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9udW1iZXJpbmcubW9kZWwnO1xuaW1wb3J0IHsgTnVtYmVyaW5nUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy1wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uc0hlbHBlciB9IGZyb20gJy4uL29wZXJhdGlvbnMvb3BlcmF0aW9ucy1oZWxwZXIuaGVscGVyJztcbmltcG9ydCB7IFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9yYW5nZSc7XG5pbXBvcnQgeyBSZXBsYWNlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3JlcGxhY2UubW9kZWwnO1xuaW1wb3J0IHsgUmVzaXplVGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc2l6ZS10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS5tb2RlbCc7XG5pbXBvcnQgeyBTY3JvbGxCYXIgfSBmcm9tICcuLi9nYWRnZXRzL3Njcm9sbGJhcic7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICcuLi9wb3NpdGlvbmluZy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVW5pY29kZUhlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvdW5pY29kZS91bmljb2RlLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0U2Vzc2lvbiB7XG4gICAgdG9rZW5SZSA9IG5ldyBSZWdFeHAoJ15bJyArIFVuaWNvZGVIZWxwZXIud29yZENoYXJzICsgJ1xcXFwkX10rJywgJ2cnKTtcblxuICAgIG5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCdeKD86W14nICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXXxcXFxcc10pKycsICdnJyk7XG5cbiAgICBnZXQgc2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxCYXI/LnNjcm9sbFRvcCA/PyAwOyAvLyBvbmx5IG1haW4gc2Vzc2lvbiBpcyBzY3JvbGxhYmxlXG4gICAgfVxuXG4gICAgZ2V0IHNjcm9sbEJhckhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQmFyPy5lbGVtZW50LmNsaWVudEhlaWdodCA/PyAwOyAvLyBvbmx5IG1haW4gc2Vzc2lvbiBpcyBzY3JvbGxhYmxlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaXNwbGF5RGF0YTogRGlzcGxheURhdGEsXG4gICAgICAgIHB1YmxpYyBzZXNzaW9uSWQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbnRlbnRTZXJ2aWNlOiBDdXN0b21Db250ZW50U2VydmljZSxcbiAgICAgICAgcHVibGljIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICBwdWJsaWMgZ2VuZXJhbFByb3BlcnRpZXM6IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwsXG4gICAgICAgIHB1YmxpYyBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY3VzdG9tQ29tcG9uZW50czogSUN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgIHByaXZhdGUgdHlwZTogJ2NlbGwnIHwgJ2VkZ2UnIHwgJ21haW4nIHwgJ2NlbGxXaXRoaW5FZGdlJyxcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxCYXI/OiBTY3JvbGxCYXJcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBoc1tyb3ddLm5leHRMaW5lSW5kZXhlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzW3Jvd10ubmV4dExpbmVJbmRleGVzLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgZ2V0Um93Q2FjaGVJbmRleChjYWNoZUFycmF5OiBudW1iZXJbXSwgdmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSBjYWNoZUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZCA9IChzdGFydCArIGVuZCkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IGNhY2hlQXJyYXlbbWlkXTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID4gY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIGVuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhcnQgLSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgYHN0cmAgb24gdGhlIHNjcmVlbiB3aGlsZSBhc3N1bWluZyB0aGF0IHRoZSBzdHJpbmcgc3RhcnRzIGF0IHRoZSBmaXJzdCBjb2x1bW4gb24gdGhlIHNjcmVlbi5cbiAgICAgKiBUaGUgZmlyc3QgcG9zaXRpb24gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYHN0cmAgb24gc2NyZWVuLlxuICAgICAqIFRoZSBzZWNvbmQgdmFsdWUgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCBjb2x1bW4gdGhhdCB0aGlzIGZ1bmN0aW9uIHJlYWQgdW50aWwuXG4gICAgICovXG4gICAgZ2V0U3RyaW5nU2NyZWVuV2lkdGgoc3RyOiBzdHJpbmcsIG1heFNjcmVlbkNvbHVtbj86IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHNjcmVlbkNvbHVtbiA9IDA7XG4gICAgICAgIGxldCBjb2x1bW46IG51bWJlcjtcbiAgICAgICAgZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCBzdHIubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChzY3JlZW5Db2x1bW4gPiBtYXhTY3JlZW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbc2NyZWVuQ29sdW1uLCBjb2x1bW5dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RhcnRpbmcgcm93IGFuZCBjb2x1bW4sIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBSYW5nZWAgb2YgdGhlIGZpcnN0IHdvcmQgYm91bmRhcnkgaXQgZmluZHMuXG4gICAgICovXG4gICAgZ2V0V29yZFJhbmdlKHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFJhbmdlIHtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuICAgICAgICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoY29sdW1uID4gMCkge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uIC0gMSkubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaW5Ub2tlbikge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uKS5tYXRjaCh0aGlzLnRva2VuUmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZ2V4cDogUmVnRXhwO1xuICAgICAgICBpZiAoaW5Ub2tlbikge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy50b2tlblJlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eXFxzKyQvLnRlc3QobGluZS5zbGljZShjb2x1bW4gLSAxLCBjb2x1bW4gKyAxKSkpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IC9cXHMvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy5ub25Ub2tlblJlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gY29sdW1uO1xuICAgICAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0ID49IDAgJiYgbGluZS5jaGFyQXQoc3RhcnQpLm1hdGNoKHJlZ2V4cCkpO1xuXG4gICAgICAgICAgICBzdGFydCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVuZCA9IGNvbHVtbjtcbiAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZCkubWF0Y2gocmVnZXhwKSkge1xuICAgICAgICAgICAgZW5kKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBzdGFydCksIG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBlbmQpKTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5TGluZShyb3c6IG51bWJlciwgZW5kQ29sdW1uOiBudW1iZXIsIHN0YXJ0Q29sdW1uPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGVudCA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuXG4gICAgICAgIHJldHVybiBwYXJhZ3JhcGhDb250ZW50LnN1YnN0cmluZyhzdGFydENvbHVtbiB8fCAwLCBlbmRDb2x1bW4gfHwgcGFyYWdyYXBoQ29udGVudC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlzRWRnZU9yV2l0aGluRWRnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgfHwgdGhpcy5pc1dpdGhpbkVkZ2UoKTtcbiAgICB9XG5cbiAgICBpc0VkZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdlZGdlJztcbiAgICB9XG5cbiAgICBpc1dpdGhpbkVkZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdjZWxsV2l0aGluRWRnZSc7XG4gICAgfVxuXG4gICAgb25SZW5kZXJlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGdlT3JXaXRoaW5FZGdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5jaGFuZ2VkRWRnZSh0aGlzLnNlc3Npb25JZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm92aWRlVGV4dFN0eWxlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHM7XG4gICAgICAgIGxldCBpID0gY29tcG9uZW50cy5maW5kSW5kZXgoeCA9PiB4Lmluc3RhbmNlLmNvbnRlbnQuaW5zZXJ0SW5kZXggPj0gc3RhcnQpO1xuICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaiA9IHRoaXMubW9kZWwuZm9ybWF0cy5maW5kSW5kZXgoeCA9PiB4LmVuZEluZGV4ID49IGNvbXBvbmVudHNbaV0uaW5zdGFuY2UuY29udGVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGggJiYgY29tcG9uZW50c1tpXS5pbnN0YW5jZS5jb250ZW50Lmluc2VydEluZGV4IDw9IGVuZCkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMubW9kZWwuZm9ybWF0c1tqXS5lbmRJbmRleCA8IGNvbXBvbmVudHNbaV0uaW5zdGFuY2UuY29udGVudC5pbnNlcnRJbmRleCkge1xuICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHNbaV0uaW5zdGFuY2UucmVjZWl2ZVN0eWxlKHRoaXMubW9kZWwuZm9ybWF0c1tqXS50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24sIGVuZFBhcmFncmFwaFBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIHN0eWxlPzogVGV4dFN0eWxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQsIHN0eWxlKTtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEVsZW1lbnRNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50LmVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRFbGVtZW50KGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVha0J5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRCcmVha01vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRCcmVhayhlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuYnJlYWtUeXBlIGFzIEJyZWFrVHlwZXMpO1xuICAgIH1cblxuICAgIGluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRUYWJNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGFiKGVsZW1lbnRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0SW1hZ2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0SW1hZ2UoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmltYWdlRGF0YSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFibGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGFibGUoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpbnNlcnRMaW5rQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydExpbmtNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0TGluayhlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQubGlua0RhdGFNb2RlbCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFBhcmFncmFwaE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRQYXJhZ3JhcGgoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBhcHBseVRleHRTdHlsZShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseVRleHRTdHlsZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCwgdGV4dFN0eWxlKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuc2V0VGV4dFN0eWxlKHRleHRTdHlsZSk7XG4gICAgICAgIHRoaXMucHJvdmlkZVRleHRTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgYXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlQYXJhZ3JhcGhTdHlsZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICBhcHBseUVsZW1lbnRTdHlsZShtb2RlbDogQXBwbHlFbGVtZW50U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5RWxlbWVudFN0eWxlKHRoaXMubW9kZWwsIG1vZGVsKTtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IG1vZGVsLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgbW9kZWwuaW5zZXJ0SW5kZXgpLnJvdztcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoLCBwYXJhZ3JhcGgpO1xuICAgIH1cblxuICAgIGFkZE51bWJlcmluZyhsZXZlbHM6IE51bWJlcmluZ0xldmVsTW9kZWxbXSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYWRkTnVtYmVyaW5nKHRoaXMubW9kZWwsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgc3RhcnRJbmRleCwgZW5kSW5kZXgsIGxldmVscyk7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mbyA9IHt9O1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFyYWdyYXBoOyBpIDw9IGVuZFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5RGF0YS5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhpKS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOdW1iZXJpbmdzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlbW92ZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHN0YXJ0UGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQYXJhZ3JhcGgpO1xuXG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZU51bWJlcmluZ3MocGFyYWdyYXBoczogUGFyYWdyYXBoTW9kZWxbXSwgbnVtYmVyaW5nczogTnVtYmVyaW5nTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gcGFyYWdyYXBoc1swXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwYXJhZ3JhcGhzW3BhcmFncmFwaHMubGVuZ3RoIC0gMV0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBwYXJhZ3JhcGhzLCBudW1iZXJpbmdzKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8oc3RhcnRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgICAgICAgaWYgKHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICBhcHBseUltYWdlU3R5bGUoYXBwbHlJbWFnZTogQXBwbHlJbWFnZVN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBhcHBseUltYWdlLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UucmVzaXplKHsgd2lkdGg6IGFwcGx5SW1hZ2Uud2lkdGgsIGhlaWdodDogYXBwbHlJbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlJbWFnZVN0eWxlKHRoaXMubW9kZWwsIGFwcGx5SW1hZ2UpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZGlzcGxheURhdGEuaW5kZXhUb1Bvc2l0aW9uKGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgsIDApO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydC5yb3csIHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGV4dFN0eWxlcyhmb3JtYXRzOiBGb3JtYXRNb2RlbFtdLCBsaW5rRm9ybWF0czogRm9ybWF0TW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gZm9ybWF0c1swXS5zdGFydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGZvcm1hdHNbZm9ybWF0cy5sZW5ndGggLSAxXS5lbmRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGV4dFN0eWxlcyh0aGlzLm1vZGVsLCBmb3JtYXRzLCBsaW5rRm9ybWF0cyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgICAgIHRoaXMucHJvdmlkZVRleHRTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVBhcmFncmFwaFN0eWxlcyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHRoaXMubW9kZWwsIHBhcmFncmFwaHMpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZSh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSVRvb2xiYXJTdHlsZXMgPSB7IC4uLnRoaXMuZWRpdG9yU2VydmljZS5zdHlsZXMgfTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRleHRTdHlsZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGV4dFN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgcmFuZ2VgIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIElmIGByYW5nZWAgaXMgZW1wdHksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5tb2RpZmllZCB2YWx1ZSBvZiBgcmFuZ2Uuc3RhcnRgLlxuICAgICAqL1xuICAgIHJlbW92ZShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFydEluZGV4ZXMgPSBDb250ZW50SGVscGVyLmdldFNlbGVjdGVkUGFydERvY3VtZW50SW5kZXhlcyh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHJhbmdlKTtcblxuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlbW92ZVJhbmdlKHJhbmdlKTtcblxuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuXG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuZGVsZXRlKHRoaXMubW9kZWwsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4IC0gcGFydEluZGV4ZXMuc3RhcnRJbmRleCArIDEpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8ocmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5yb3cpO1xuICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKHJhbmdlLnN0YXJ0LnJvdyArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXBsYWNlKG1vZGVsOiBSZXBsYWNlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICB0aGlzLnJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKG1vZGVsLmRlbGV0ZS5zdGFydEluZGV4LCBtb2RlbC5kZWxldGUuc3RhcnRJbmRleCArIG1vZGVsLmRlbGV0ZS5jb3VudCk7XG4gICAgICAgIGxldCBlbmRQb2ludDogQ3Vyc29yUGFyYWdyYXBoO1xuICAgICAgICBpZiAobW9kZWwuaW5zZXJ0VGV4dCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGV4dC5pbnNlcnRJbmRleCwgbW9kZWwuaW5zZXJ0VGV4dC50ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRQYXJhZ3JhcGhCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0UGFyYWdyYXBoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRFbGVtZW50KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0RWxlbWVudEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRCcmVhaykge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEJyZWFrKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRUYWIpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUYWJCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFiKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbWFnZSkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEltYWdlQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEltYWdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRUYWJsZSkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYmxlQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRhYmxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRMaW5rKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0TGlua0J5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRMaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0KHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHRleHQ6IHN0cmluZywgY3Vyc29yU3R5bGU/OiBUZXh0U3R5bGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGN1cnNvclN0eWxlKSB7XG4gICAgICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFN0eWxlZFRleHQodGhpcy5tb2RlbCwgdGV4dCwgaW5zZXJ0SW5kZXgsIGN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cgJiYgdGhpcy50eXBlICE9PSAnY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50KHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGVsZW1lbnQ6IEVsZW1lbnREYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGluc2VydEVsZW1lbnQgPSBuZXcgSW5zZXJ0RWxlbWVudE1vZGVsKHsgZWxlbWVudDogbmV3IEVsZW1lbnRNb2RlbCh7IGluc2VydEluZGV4LCAuLi5lbGVtZW50IH0pIH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEVsZW1lbnQodGhpcy5tb2RlbCwgaW5zZXJ0RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5lbGVtZW50cy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5maW5kQ29tcG9uZW50VHlwZShtb2RlbC50eXBlKTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBtb2RlbCwgdHlwZSk7XG5cbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBicmVha1R5cGU6IEJyZWFrVHlwZXMpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGlzT25OZXdQYXJhZ3JhcGggPVxuICAgICAgICAgICAgYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLlBhZ2UgJiZcbiAgICAgICAgICAgIEJyZWFrSGVscGVyLmdldEJyZWFrVHlwZSh0aGlzLm1vZGVsLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIsIGluc2VydEluZGV4IC0gMSkgIT09IEJyZWFrVHlwZXMuUGFnZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlzT25OZXdQYXJhZ3JhcGggPyBgJHtORVdfTElORV9NQVJLVVB9JHtDVVNUT01fRUxFTUVOVF9NQVJLRVJ9YCA6IENVU1RPTV9FTEVNRU5UX01BUktFUjtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRCcmVhayh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgYnJlYWtUeXBlKTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGggJiYgZW5kUG9zaXRpb24ucm93IC0gcG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5nZXRQb3NpdGlvbkFmdGVyQnJlYWsoZW5kUG9zaXRpb24sIGJyZWFrVHlwZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGN1cnNvclBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFiKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGFiKHRoaXMubW9kZWwsIGluc2VydEluZGV4KTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFicy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgbW9kZWwsIE5vZGVyVGFiQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEltYWdlKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGltYWdlRGF0YTogSW1hZ2VEYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0SW1hZ2UodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIGltYWdlRGF0YSk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmltYWdlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBtb2RlbCwgTm9kZXJJbWFnZUNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydExpbmsocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgbGlua0RhdGE6IExpbmtEYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0TGluayh0aGlzLm1vZGVsLCBsaW5rRGF0YS50ZXh0LCBsaW5rRGF0YS5saW5rLCBpbnNlcnRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIGxpbmtEYXRhLnRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGUocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGFibGVNb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSB0YWJsZU1vZGVsLmluc2VydFRhYmxlSW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0YWJsZU1vZGVsLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydFBhcmFncmFwaChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBwYXJhZ3JhcGhNb2RlbDogSW5zZXJ0UGFyYWdyYXBoTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBPcGVyYXRpb25zSGVscGVyLmluc2VydFBhcmFncmFwaCh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcGFyYWdyYXBoTW9kZWwsIHRoaXMuZGlzcGxheURhdGEuY29udGVudFdpZHRoKTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbmRQb2ludDogQ3Vyc29yUGFyYWdyYXBoO1xuICAgICAgICBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGV4dCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KFxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgaWYgKGVuZFBvaW50LnJvdyAtIHBhcmFncmFwaFBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlLmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VJbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbWFnZUluc2VydEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoUG9zaXRpb24ucm93LCBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlLmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0VGFibGVJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICBpZiAoZW5kUG9pbnQucm93IC0gcGFyYWdyYXBoUG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGFkZENvbXBvbmVudDxUIGV4dGVuZHMgQmFzZU5vZGVyQ29tcG9uZW50PihjdXN0b21FbGVtZW50czogQ29tcG9uZW50UmVmPFQ+W10sIG1vZGVsOiBDdXN0b21Db250ZW50LCBjb21wb25lbnRUeXBlOiBUeXBlPFQ+KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmNvbXBvbmVudFNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1vZGVsLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICAgIGdlbmVyYWxQcm9wZXJ0aWVzOiB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgY29udGVudFdpZHRoOiB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudFBvc2l0aW9uID0gY3VzdG9tRWxlbWVudHMuZmluZEluZGV4KHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA+IG1vZGVsLmluc2VydEluZGV4KTtcbiAgICAgICAgaWYgKG5ld0VsZW1lbnRQb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5zcGxpY2UobmV3RWxlbWVudFBvc2l0aW9uLCAwLCBjdXN0b21FbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRzLnB1c2goY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VzdG9tRWxlbWVudC5pbnN0YW5jZS5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb29sYmFyU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICAvLyB1bmRlZmluZWQgLSB2YWx1ZSB3YXNuJ3Qgc2V0XG4gICAgICAgIC8vIG51bGwgLSBjb2xsaXNpb24gKGRpZmZlcmVudCB2YWx1ZXMgYXQgdGhlIHNhbWUgdGltZSlcbiAgICAgICAgLy8gdmFsdWUgLSB2YWx1ZSB3YXMgc2V0IHdpdGhvdXQgY29sbGlzaW9uc1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5lbmQpO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uY3Vyc29yLmNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU3R5bGVzID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoc0F0UmFuZ2UodGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKHggPT5cbiAgICAgICAgICAgIHgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWRcbiAgICAgICAgICAgICAgICA/IE51bWJlcmluZ0hlbHBlci5nZXRTdHlsZXMoeC5wYXJhZ3JhcGhTdHlsZSwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzKVxuICAgICAgICAgICAgICAgIDogbmV3IE51bWJlcmluZ1BhcmFncmFwaFN0eWxlTW9kZWwoeC5wYXJhZ3JhcGhTdHlsZSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5zZWxlY3Rpb24uaXNFbXB0eVxuICAgICAgICAgICAgPyB0aGlzLmdldFN0eWxlRm9yQ3Vyc29yKHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICA6IEZvcm1hdFN0eWxlSGVscGVyLmNvbWJpbmVTZWN0aW9uKHRoaXMubW9kZWwuZm9ybWF0cywgdGhpcy5tb2RlbC5saW5rcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IHgudGV4dFN0eWxlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVG9vbGJhclN0eWxlcyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBvZiBbLi4uc3R5bGVzLCAuLi5wYXJhZ3JhcGhTdHlsZXNdKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBzdHlsZVtrZXldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0W2tleV0gIT09IHN0eWxlW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc3R5bGVzID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldFN0eWxlRm9yQ3Vyc29yKGluZGV4OiBudW1iZXIpOiBUZXh0U3R5bGVNb2RlbFtdIHtcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMubW9kZWwubGlua3MuZmluZCh4ID0+IHguc3RhcnRJbmRleCA8PSBpbmRleCAmJiB4LmVuZEluZGV4ID4gaW5kZXgpO1xuICAgICAgICBpZiAobGluayAmJiAhdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLnNvbWUoeCA9PiB4LnN0YXJ0SW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhJbkxpbmsgPSBpbmRleCAtIGxpbmsuc3RhcnRJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtGb3JtYXQgPSBsaW5rLmZvcm1hdHMuZmluZCh4ID0+IHguc3RhcnRJbmRleCA8PSBpbmRleEluTGluayAmJiB4LmVuZEluZGV4ID49IGluZGV4SW5MaW5rKTtcbiAgICAgICAgICAgIHJldHVybiBbbGlua0Zvcm1hdC50ZXh0U3R5bGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIFtmb3JtYXQudGV4dFN0eWxlXTtcbiAgICB9XG5cbiAgICByZXN0b3JlKG1vZGVsOiBSZXN0b3JlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgbW9kZWwuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChtb2RlbC5zdGFydEluZGV4ICE9PSBtb2RlbC5lbmRJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVCeURvY3VtZW50SW5kZXhlcyhtb2RlbC5zdGFydEluZGV4LCBtb2RlbC5lbmRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmUodGhpcy5tb2RlbCwgbW9kZWwpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBtb2RlbC50ZXh0KTtcbiAgICAgICAgY29uc3QgcmVzdG9yZUVuZEluZGV4ID0gbW9kZWwuc3RhcnRJbmRleCArIG1vZGVsLnRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFibGVzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBOb2RlclRhYmxlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwuaW1hZ2VzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBOb2RlckltYWdlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFicywgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIE5vZGVyVGFiQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVFbGVtZW50Q29tcG9uZW50cyh0aGlzLm1vZGVsLmVsZW1lbnRzLCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuXG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBhcmFncmFwaFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgaWYgKGVuZFBvaW50LnJvdyAtIHBhcmFncmFwaFBvc2l0aW9uLnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVDb21wb25lbnRzPFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KFxuICAgICAgICBtb2RlbHM6IEN1c3RvbUNvbnRlbnRbXSxcbiAgICAgICAgY29tcG9uZW50czogQ29tcG9uZW50UmVmPEJhc2VOb2RlckNvbXBvbmVudD5bXSxcbiAgICAgICAgY29tcG9uZW50VHlwZTogVHlwZTxUPixcbiAgICAgICAgcmVzdG9yZUluZGV4OiBudW1iZXIsXG4gICAgICAgIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnRzLCBtb2RlbCwgY29tcG9uZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN0b3JlRWxlbWVudENvbXBvbmVudHMoZWxlbWVudHM6IEVsZW1lbnRNb2RlbFtdLCByZXN0b3JlSW5kZXg6IG51bWJlciwgcmVzdG9yZUVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExpbmtNb2RlbChjdXJzb3I6IEN1cnNvclBhcmFncmFwaCk6IExpbmtNb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGN1cnNvcik7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4LnN0YXJ0SW5kZXggPD0gaW5kZXggJiYgeC5lbmRJbmRleCA+PSBpbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0YWJsZS5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBjb2x1bW5zQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXROdW1iZXJpbmdJbmZvQnlUYWJsZUNlbGwodGFibGUpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyhcbiAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGNvbHVtbnNDb3VudCxcbiAgICAgICAgICAgIHRhcmdldEluZGV4LFxuICAgICAgICAgICAgaW5oZXJpdEluZGV4LFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZVJvd3ModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSByZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXNpemVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgcmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGFibGUoaW5zZXJ0SW5kZXg6IG51bWJlciwgdGFibGU6IFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkVGFibGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRhYmxlKSkgYXMgVGFibGVNb2RlbDtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGFibGUodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIG9sZFRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxufVxuIl19
|