@yuuvis/client-framework 1.0.3 → 2.0.0-beta.10
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/actions/lib/actions/delete-action/delete/delete.component.d.ts +3 -3
- package/actions/lib/actions/delete-action/delete-action.d.ts +1 -1
- package/actions/lib/actions.service.d.ts +7 -3
- package/actions/lib/components/contextmenu/contextmenu.component.d.ts +3 -1
- package/autocomplete/README.md +3 -0
- package/autocomplete/index.d.ts +3 -0
- package/autocomplete/lib/autocomplete.component.d.ts +72 -0
- package/autocomplete/lib/autocomplete.interface.d.ts +4 -0
- package/autocomplete/lib/autocomplete.module.d.ts +7 -0
- package/common/index.d.ts +4 -4
- package/common/lib/common.module.d.ts +19 -0
- package/common/lib/common.utils.d.ts +2 -0
- package/common/lib/components/confirm/confirm.component.d.ts +7 -0
- package/common/lib/components/confirm/confirm.interface.d.ts +7 -0
- package/common/lib/components/confirm/confirm.service.d.ts +9 -0
- package/common/lib/components/dialog/dialog.component.d.ts +6 -0
- package/common/lib/components/dialog/dialog.options.d.ts +7 -0
- package/common/lib/components/index.d.ts +5 -0
- package/common/lib/directives/autofocus-child.directive.d.ts +13 -0
- package/common/lib/directives/autofocus-delayed.directive.d.ts +18 -0
- package/common/lib/directives/drag-scroll.directive.d.ts +20 -0
- package/common/lib/directives/index.d.ts +8 -4
- package/common/lib/directives/noop-value-accessor.directive.d.ts +2 -2
- package/common/lib/mat-form-field.abstract.d.ts +41 -0
- package/common/lib/services/index.d.ts +1 -1
- package/common/lib/services/layout-settings/layout-settings.service.d.ts +18 -0
- package/datepicker/README.md +3 -0
- package/datepicker/index.d.ts +5 -0
- package/datepicker/lib/calendar/calendar.component.d.ts +72 -0
- package/datepicker/lib/date-input/date-input-element/date-input-element.component.d.ts +43 -0
- package/datepicker/lib/date-input/date-input-hour-element/date-input-hour-element.component.d.ts +11 -0
- package/datepicker/lib/date-input/date-input.component.d.ts +61 -0
- package/datepicker/lib/datepicker-calendar/datepicker-calendar-trigger.component.d.ts +7 -0
- package/datepicker/lib/datepicker-calendar/datepicker-calendar.component.d.ts +12 -0
- package/datepicker/lib/datepicker.component.d.ts +80 -0
- package/datepicker/lib/datepicker.interface.d.ts +34 -0
- package/datepicker/lib/datepicker.module.d.ts +9 -0
- package/datepicker/lib/datepicker.service.d.ts +46 -0
- package/datepicker/lib/datepicker.utils.d.ts +23 -0
- package/datepicker/lib/time-input/time-input.component.d.ts +36 -0
- package/datepicker/lib/time-input/time-input.interface.d.ts +6 -0
- package/fesm2022/yuuvis-client-framework-actions.mjs +147 -105
- package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-app-bar.mjs +7 -8
- package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-autocomplete.mjs +210 -0
- package/fesm2022/yuuvis-client-framework-autocomplete.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-clipboard.mjs +9 -9
- package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-common.mjs +853 -780
- package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-datepicker.mjs +1688 -0
- package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-forms.mjs +945 -1157
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-icons.mjs +85 -12
- package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-list.mjs +81 -45
- package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-master-details.mjs +112 -0
- package/fesm2022/yuuvis-client-framework-master-details.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs +60 -0
- package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs +125 -100
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-details.mjs +49 -59
- package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs +188 -77
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-form.mjs +99 -184
- package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-preview.mjs +12 -12
- package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-summary.mjs +46 -42
- package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-overflow-menu.mjs +126 -0
- package/fesm2022/yuuvis-client-framework-overflow-menu.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-pagination.mjs +7 -9
- package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-panel.mjs +8 -7
- package/fesm2022/yuuvis-client-framework-panel.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-popout.mjs +212 -0
- package/fesm2022/yuuvis-client-framework-popout.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-renderer.mjs +99 -72
- package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs +29 -112
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-simple-search.mjs +40 -21
- package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-split-view.mjs +188 -0
- package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +100 -93
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tree.mjs +15 -15
- package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-upload-progress.mjs +16 -21
- package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework.mjs +4 -4
- package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
- package/forms/index.d.ts +7 -1
- package/forms/lib/elements/catalog/catalog.component.d.ts +17 -56
- package/forms/lib/elements/data-grid/edit-table-data/edit-data.component.d.ts +5 -4
- package/forms/lib/elements/datetime/datetime.component.d.ts +19 -10
- package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +12 -27
- package/forms/lib/elements/index.d.ts +0 -1
- package/forms/lib/elements/number/number.component.d.ts +21 -30
- package/forms/lib/elements/number-range/number-range.component.d.ts +12 -7
- package/forms/lib/elements/organization/organization.component.d.ts +23 -51
- package/forms/lib/elements/range-select-date/range-select-date.component.d.ts +12 -7
- package/forms/lib/elements/range-select-filesize/range-select-filesize.component.d.ts +12 -7
- package/forms/lib/elements/string/string.component.d.ts +15 -20
- package/forms/lib/forms.module.d.ts +8 -11
- package/icons/index.d.ts +1 -0
- package/icons/lib/icon.component.d.ts +20 -0
- package/lib/assets/i18n/de.json +7 -23
- package/lib/assets/i18n/en.json +10 -26
- package/list/index.d.ts +1 -0
- package/list/lib/list-item.directive.d.ts +5 -4
- package/list/lib/list.component.d.ts +6 -3
- package/list/lib/list.module.d.ts +8 -0
- package/master-details/README.md +3 -0
- package/master-details/index.d.ts +2 -0
- package/master-details/lib/master-details.component.d.ts +58 -0
- package/master-details/lib/master-details.interface.d.ts +7 -0
- package/master-details/lib/master-details.module.d.ts +7 -0
- package/metadata-form/index.d.ts +4 -1
- package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +4 -17
- package/metadata-form/lib/metadata-form-field/metadata-form-field.interface.d.ts +11 -0
- package/metadata-form/lib/object-metadata-element-error.directive.d.ts +13 -0
- package/metadata-form/lib/object-metadata-element-label.directive.d.ts +10 -0
- package/metadata-form/lib/object-metadata-element-template.directive.d.ts +3 -3
- package/metadata-form-defaults/README.md +3 -0
- package/metadata-form-defaults/index.d.ts +2 -0
- package/metadata-form-defaults/lib/metadata-form-defaults.module.d.ts +7 -0
- package/object-details/lib/object-audit/object-audit.component.d.ts +3 -9
- package/object-details/lib/object-details.component.d.ts +0 -2
- package/object-details/lib/object-metadata/object-metadata.component.d.ts +4 -3
- package/object-details/lib/retention-badge/retention-badge.component.d.ts +0 -3
- package/object-flavor/index.d.ts +1 -0
- package/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.d.ts +1 -2
- package/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.d.ts +3 -2
- package/object-flavor/lib/default-apply-flavor/default-apply-flavor.component.d.ts +19 -0
- package/object-flavor/lib/flavor-chip/flavor-chip.component.d.ts +1 -1
- package/object-flavor/lib/object-flavor/object-flavor.component.d.ts +3 -6
- package/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.d.ts +0 -1
- package/object-form/index.d.ts +1 -1
- package/object-form/lib/object-form-element/object-form-element.component.d.ts +2 -2
- package/object-form/lib/object-form-group/object-form-group.component.d.ts +1 -3
- package/object-form/lib/object-form.component.d.ts +2 -2
- package/object-form/lib/object-form.interface.d.ts +0 -44
- package/object-form/lib/object-form.module.d.ts +7 -0
- package/object-form/lib/object-form.service.d.ts +1 -2
- package/object-form/lib/object-form.utils.d.ts +1 -1
- package/object-summary/lib/object-summary/object-summary.component.d.ts +13 -15
- package/overflow-menu/README.md +3 -0
- package/overflow-menu/index.d.ts +3 -0
- package/overflow-menu/lib/overflow-menu.component.d.ts +31 -0
- package/overflow-menu/lib/overflow-menu.interface.d.ts +9 -0
- package/overflow-menu/lib/overflow-menu.module.d.ts +7 -0
- package/package.json +41 -67
- package/popout/README.md +3 -0
- package/popout/index.d.ts +3 -0
- package/popout/lib/popout.component.d.ts +58 -0
- package/popout/lib/popout.interface.d.ts +17 -0
- package/popout/lib/popout.module.d.ts +7 -0
- package/renderer/lib/property-renderer/abstract.renderer.d.ts +4 -4
- package/renderer/lib/property-renderer/icon.renderer.component.d.ts +2 -0
- package/renderer/lib/renderer.directive.d.ts +4 -3
- package/sequence-list/index.d.ts +0 -1
- package/sequence-list/lib/sequence-list.component.d.ts +0 -4
- package/simple-search/index.d.ts +0 -1
- package/simple-search/lib/simple-search/simple-search.component.d.ts +6 -10
- package/split-view/README.md +3 -0
- package/split-view/index.d.ts +4 -0
- package/split-view/lib/split-area.directive.d.ts +16 -0
- package/split-view/lib/split-view.component.d.ts +76 -0
- package/split-view/lib/split-view.interface.d.ts +10 -0
- package/split-view/lib/split-view.module.d.ts +8 -0
- package/styles/client-framework.scss +21 -67
- package/tile-list/lib/tile/tile.component.d.ts +1 -2
- package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +0 -1
- package/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.d.ts +1 -2
- package/tile-list/lib/tile-config/tile-config.component.d.ts +0 -3
- package/tile-list/lib/tile-list/tile-list.component.d.ts +5 -5
- package/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.d.ts +0 -5
- package/upload-progress/lib/upload-progress/upload-progress.component.d.ts +0 -4
- package/common/lib/components/focus-indicator/focus-indicator.component.d.ts +0 -7
- package/common/lib/components/token-input/token-input.component.d.ts +0 -55
- package/common/lib/components/token-input/token-input.interface.d.ts +0 -8
- package/common/lib/services/error-messages/error-messages.service.d.ts +0 -7
- package/esm2022/actions/index.mjs +0 -7
- package/esm2022/actions/lib/actions/copy-action/copy-action.mjs +0 -31
- package/esm2022/actions/lib/actions/cut-action/cut-action.mjs +0 -30
- package/esm2022/actions/lib/actions/delete-action/delete/delete.component.mjs +0 -67
- package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +0 -38
- package/esm2022/actions/lib/actions/download-action/download-action.mjs +0 -33
- package/esm2022/actions/lib/actions.icon.mjs +0 -8
- package/esm2022/actions/lib/actions.interface.mjs +0 -19
- package/esm2022/actions/lib/actions.module.mjs +0 -16
- package/esm2022/actions/lib/actions.service.mjs +0 -89
- package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +0 -27
- package/esm2022/actions/yuuvis-client-framework-actions.mjs +0 -5
- package/esm2022/app-bar/index.mjs +0 -2
- package/esm2022/app-bar/lib/app-bar.component.mjs +0 -89
- package/esm2022/app-bar/yuuvis-client-framework-app-bar.mjs +0 -5
- package/esm2022/clipboard/index.mjs +0 -2
- package/esm2022/clipboard/lib/clipboard.component.mjs +0 -48
- package/esm2022/clipboard/yuuvis-client-framework-clipboard.mjs +0 -5
- package/esm2022/common/index.mjs +0 -7
- package/esm2022/common/lib/components/focus-indicator/focus-indicator.component.mjs +0 -41
- package/esm2022/common/lib/components/token-input/token-input.component.mjs +0 -324
- package/esm2022/common/lib/components/token-input/token-input.interface.mjs +0 -2
- package/esm2022/common/lib/directives/busy-overlay.directive.mjs +0 -88
- package/esm2022/common/lib/directives/click-double.directive.mjs +0 -61
- package/esm2022/common/lib/directives/container-size.directive.mjs +0 -56
- package/esm2022/common/lib/directives/drag-select.directive.mjs +0 -114
- package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.directive.mjs +0 -153
- package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.interface.mjs +0 -2
- package/esm2022/common/lib/directives/focus-within.directive.mjs +0 -81
- package/esm2022/common/lib/directives/index.mjs +0 -9
- package/esm2022/common/lib/directives/light-dismiss.directive.mjs +0 -44
- package/esm2022/common/lib/directives/longpress.directive.mjs +0 -36
- package/esm2022/common/lib/directives/noop-value-accessor.directive.mjs +0 -42
- package/esm2022/common/lib/services/error-messages/error-messages.service.mjs +0 -68
- package/esm2022/common/lib/services/index.mjs +0 -2
- package/esm2022/common/yuuvis-client-framework-common.mjs +0 -5
- package/esm2022/forms/index.mjs +0 -24
- package/esm2022/forms/lib/elements/catalog/catalog.component.mjs +0 -118
- package/esm2022/forms/lib/elements/data-grid/data-grid/data-grid.component.mjs +0 -172
- package/esm2022/forms/lib/elements/data-grid/edit-table-data/edit-data.component.mjs +0 -95
- package/esm2022/forms/lib/elements/data-grid/model/data-grid.interface.mjs +0 -9
- package/esm2022/forms/lib/elements/datetime/datetime.component.mjs +0 -82
- package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +0 -166
- package/esm2022/forms/lib/elements/index.mjs +0 -11
- package/esm2022/forms/lib/elements/number/number.component.mjs +0 -195
- package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +0 -176
- package/esm2022/forms/lib/elements/organization/organization.component.mjs +0 -286
- package/esm2022/forms/lib/elements/range-select-date/date-range-picker/date-range-picker.component.mjs +0 -38
- package/esm2022/forms/lib/elements/range-select-date/range-select-date.component.mjs +0 -181
- package/esm2022/forms/lib/elements/range-select-date/range-select-date.interface.mjs +0 -2
- package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.component.mjs +0 -98
- package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.interface.mjs +0 -2
- package/esm2022/forms/lib/elements/string/string.component.mjs +0 -261
- package/esm2022/forms/lib/form-input/form-input.component.mjs +0 -88
- package/esm2022/forms/lib/forms.module.mjs +0 -58
- package/esm2022/forms/yuuvis-client-framework-forms.mjs +0 -5
- package/esm2022/icons/index.mjs +0 -4
- package/esm2022/icons/lib/icon.service.mjs +0 -59
- package/esm2022/icons/lib/icons.mjs +0 -32
- package/esm2022/icons/lib/object-type-icon/object-type-icon.component.mjs +0 -29
- package/esm2022/icons/yuuvis-client-framework-icons.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/lib/yuuvis-client-framework.module.mjs +0 -15
- package/esm2022/list/index.mjs +0 -3
- package/esm2022/list/lib/list-item.directive.mjs +0 -72
- package/esm2022/list/lib/list.component.mjs +0 -135
- package/esm2022/list/yuuvis-client-framework-list.mjs +0 -5
- package/esm2022/metadata-form/index.mjs +0 -4
- package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +0 -32
- package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +0 -99
- package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +0 -83
- package/esm2022/metadata-form/lib/object-metadata-element-template.directive.mjs +0 -52
- package/esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs +0 -5
- package/esm2022/object-details/index.mjs +0 -8
- package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +0 -195
- package/esm2022/object-details/lib/object-details-shell/object-details-shell.component.mjs +0 -127
- package/esm2022/object-details/lib/object-details.component.mjs +0 -61
- package/esm2022/object-details/lib/object-metadata/form-section-group.pipe.mjs +0 -17
- package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +0 -202
- package/esm2022/object-details/lib/object-metadata/object-metadata.interface.mjs +0 -2
- package/esm2022/object-details/lib/retention-badge/retention-badge.component.mjs +0 -27
- package/esm2022/object-details/yuuvis-client-framework-object-details.mjs +0 -5
- package/esm2022/object-flavor/index.mjs +0 -6
- package/esm2022/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.mjs +0 -25
- package/esm2022/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.mjs +0 -21
- package/esm2022/object-flavor/lib/flavor-chip/flavor-chip.component.mjs +0 -35
- package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +0 -93
- package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +0 -43
- package/esm2022/object-flavor/yuuvis-client-framework-object-flavor.mjs +0 -5
- package/esm2022/object-form/index.mjs +0 -5
- package/esm2022/object-form/lib/form-scripting.api.interface.mjs +0 -2
- package/esm2022/object-form/lib/form-scripting.service.mjs +0 -160
- package/esm2022/object-form/lib/object-form-element/object-form-element.component.mjs +0 -87
- package/esm2022/object-form/lib/object-form-extension.interface.mjs +0 -36
- package/esm2022/object-form/lib/object-form-group/object-form-group.component.mjs +0 -85
- package/esm2022/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.mjs +0 -23
- package/esm2022/object-form/lib/object-form-script/object-form-script.service.mjs +0 -115
- package/esm2022/object-form/lib/object-form-script/object-form-scripting-scope.mjs +0 -251
- package/esm2022/object-form/lib/object-form-translate.service.mjs +0 -73
- package/esm2022/object-form/lib/object-form.component.mjs +0 -628
- package/esm2022/object-form/lib/object-form.interface.mjs +0 -9
- package/esm2022/object-form/lib/object-form.model.mjs +0 -20
- package/esm2022/object-form/lib/object-form.service.mjs +0 -130
- package/esm2022/object-form/lib/object-form.utils.mjs +0 -55
- package/esm2022/object-form/lib/object-form.validation.mjs +0 -48
- package/esm2022/object-form/yuuvis-client-framework-object-form.mjs +0 -5
- package/esm2022/object-preview/index.mjs +0 -3
- package/esm2022/object-preview/lib/components/index.mjs +0 -3
- package/esm2022/object-preview/lib/components/object-email-preview/object-email-preview.component.mjs +0 -45
- package/esm2022/object-preview/lib/components/object-preview/object-preview.component.mjs +0 -78
- package/esm2022/object-preview/lib/services/object-preview.service.mjs +0 -119
- package/esm2022/object-preview/yuuvis-client-framework-object-preview.mjs +0 -5
- package/esm2022/object-summary/index.mjs +0 -5
- package/esm2022/object-summary/lib/multi-object-summary/multi-object-summary.component.mjs +0 -33
- package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +0 -275
- package/esm2022/object-summary/lib/object-summary-data/object-summary-data.component.mjs +0 -80
- package/esm2022/object-summary/lib/object-summary.module.mjs +0 -15
- package/esm2022/object-summary/yuuvis-client-framework-object-summary.mjs +0 -5
- package/esm2022/pagination/index.mjs +0 -3
- package/esm2022/pagination/lib/pagination.component.mjs +0 -46
- package/esm2022/pagination/lib/pagination.interface.mjs +0 -2
- package/esm2022/pagination/yuuvis-client-framework-pagination.mjs +0 -5
- package/esm2022/panel/index.mjs +0 -2
- package/esm2022/panel/lib/panel.component.mjs +0 -20
- package/esm2022/panel/yuuvis-client-framework-panel.mjs +0 -5
- package/esm2022/renderer/index.mjs +0 -11
- package/esm2022/renderer/lib/property-renderer/abstract.renderer.mjs +0 -29
- package/esm2022/renderer/lib/property-renderer/datetime.renderer.mjs +0 -13
- package/esm2022/renderer/lib/property-renderer/decimal.renderer.component.mjs +0 -12
- package/esm2022/renderer/lib/property-renderer/filesize.renderer.component.mjs +0 -28
- package/esm2022/renderer/lib/property-renderer/icon.renderer.component.mjs +0 -23
- package/esm2022/renderer/lib/property-renderer/integer.renderer.component.mjs +0 -12
- package/esm2022/renderer/lib/property-renderer/organization.renderer.mjs +0 -19
- package/esm2022/renderer/lib/property-renderer/string.renderer.component.mjs +0 -12
- package/esm2022/renderer/lib/property-renderer/unknown.renderer.mjs +0 -12
- package/esm2022/renderer/lib/renderer.directive.mjs +0 -51
- package/esm2022/renderer/lib/services/renderer/renderer.interface.mjs +0 -2
- package/esm2022/renderer/lib/services/renderer/renderer.service.mjs +0 -84
- package/esm2022/renderer/yuuvis-client-framework-renderer.mjs +0 -5
- package/esm2022/sequence-list/index.mjs +0 -4
- package/esm2022/sequence-list/lib/due-date-picker/due-date-picker.component.mjs +0 -99
- package/esm2022/sequence-list/lib/sequence-list.component.mjs +0 -141
- package/esm2022/sequence-list/lib/sequence-list.interface.mjs +0 -2
- package/esm2022/sequence-list/yuuvis-client-framework-sequence-list.mjs +0 -5
- package/esm2022/simple-search/index.mjs +0 -3
- package/esm2022/simple-search/lib/simple-search/simple-search.component.mjs +0 -111
- package/esm2022/simple-search/lib/simple-search/simple-search.interface.mjs +0 -2
- package/esm2022/simple-search/yuuvis-client-framework-simple-search.mjs +0 -5
- package/esm2022/tile-list/index.mjs +0 -11
- package/esm2022/tile-list/lib/tile/tile.component.mjs +0 -53
- package/esm2022/tile-list/lib/tile-config/action-select/action-select.component.mjs +0 -25
- package/esm2022/tile-list/lib/tile-config/icon-select/icon-select.component.mjs +0 -33
- package/esm2022/tile-list/lib/tile-config/property-select/property-select.component.mjs +0 -91
- package/esm2022/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.mjs +0 -66
- package/esm2022/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.mjs +0 -46
- package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +0 -156
- package/esm2022/tile-list/lib/tile-extension/directive/tile-extension.directive.mjs +0 -37
- package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +0 -42
- package/esm2022/tile-list/lib/tile-extension/tile-extension.service.mjs +0 -35
- package/esm2022/tile-list/lib/tile-list/tile-list.component.mjs +0 -510
- package/esm2022/tile-list/lib/tile-list/tile-list.interface.mjs +0 -2
- package/esm2022/tile-list/yuuvis-client-framework-tile-list.mjs +0 -5
- package/esm2022/token-search/index.mjs +0 -3
- package/esm2022/token-search/token-search.component.mjs +0 -78
- package/esm2022/token-search/token-search.interface.mjs +0 -2
- package/esm2022/token-search/yuuvis-client-framework-token-search.mjs +0 -5
- package/esm2022/tree/index.mjs +0 -3
- package/esm2022/tree/lib/tree-node/tree-node.component.mjs +0 -65
- package/esm2022/tree/lib/tree.component.mjs +0 -148
- package/esm2022/tree/lib/tree.interface.mjs +0 -2
- package/esm2022/tree/lib/tree.service.mjs +0 -95
- package/esm2022/tree/yuuvis-client-framework-tree.mjs +0 -5
- package/esm2022/upload-progress/index.mjs +0 -2
- package/esm2022/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.mjs +0 -49
- package/esm2022/upload-progress/lib/upload-progress/upload-progress.component.mjs +0 -37
- package/esm2022/upload-progress/yuuvis-client-framework-upload-progress.mjs +0 -5
- package/esm2022/user-avatar/index.mjs +0 -3
- package/esm2022/user-avatar/lib/user-avatar.component.mjs +0 -69
- package/esm2022/user-avatar/lib/user-avatar.module.mjs +0 -24
- package/esm2022/user-avatar/yuuvis-client-framework-user-avatar.mjs +0 -5
- package/esm2022/yuuvis-client-framework.mjs +0 -5
- package/fesm2022/yuuvis-client-framework-token-search.mjs +0 -85
- package/fesm2022/yuuvis-client-framework-token-search.mjs.map +0 -1
- package/fesm2022/yuuvis-client-framework-user-avatar.mjs +0 -96
- package/fesm2022/yuuvis-client-framework-user-avatar.mjs.map +0 -1
- package/forms/lib/form-input/form-input.component.d.ts +0 -48
- package/object-form/lib/object-form-translate.service.d.ts +0 -15
- package/object-form/lib/object-form.model.d.ts +0 -18
- package/sequence-list/lib/due-date-picker/due-date-picker.component.d.ts +0 -28
- package/simple-search/lib/simple-search/simple-search.interface.d.ts +0 -4
- package/token-search/README.md +0 -3
- package/token-search/index.d.ts +0 -2
- package/token-search/token-search.component.d.ts +0 -22
- package/token-search/token-search.interface.d.ts +0 -4
- package/user-avatar/README.md +0 -3
- package/user-avatar/index.d.ts +0 -2
- package/user-avatar/lib/user-avatar.component.d.ts +0 -44
- package/user-avatar/lib/user-avatar.module.d.ts +0 -8
- /package/{metadata-form → metadata-form-defaults}/lib/metadata-default-templates/metadata-default-templates.component.d.ts +0 -0
|
@@ -1,628 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Component, effect, ElementRef, inject, input, output, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { ReactiveFormsModule, Validators } from '@angular/forms';
|
|
5
|
-
import { Situation, SystemService, UserService, Utils } from '@yuuvis/client-core';
|
|
6
|
-
import { debounceTime, of } from 'rxjs';
|
|
7
|
-
import { FormScriptingApiService } from './form-scripting.service';
|
|
8
|
-
import { ObjectFormGroupComponent } from './object-form-group/object-form-group.component';
|
|
9
|
-
import { ObjectFormScriptService } from './object-form-script/object-form-script.service';
|
|
10
|
-
import { ObjectFormScriptingScope } from './object-form-script/object-form-scripting-scope';
|
|
11
|
-
import { ObjectFormControlWrapper } from './object-form.interface';
|
|
12
|
-
import { ObjectFormControl, ObjectFormGroup } from './object-form.model';
|
|
13
|
-
import { ObjectFormService } from './object-form.service';
|
|
14
|
-
import { ObjectFormUtils } from './object-form.utils';
|
|
15
|
-
import { FormValidation } from './object-form.validation';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@angular/forms";
|
|
18
|
-
export class ObjectFormComponent {
|
|
19
|
-
#elementRef;
|
|
20
|
-
#systemService;
|
|
21
|
-
#formScriptService;
|
|
22
|
-
#formHelperService;
|
|
23
|
-
#userService;
|
|
24
|
-
#cdRef;
|
|
25
|
-
#formScriptingApiService;
|
|
26
|
-
#skipTranslationsFor;
|
|
27
|
-
#namePrefix;
|
|
28
|
-
#formOptionsEffect;
|
|
29
|
-
#elementExtensionsEffect;
|
|
30
|
-
#scriptModel;
|
|
31
|
-
#scriptingScope;
|
|
32
|
-
#subscriptions;
|
|
33
|
-
// local store for all the form control references
|
|
34
|
-
#formControls;
|
|
35
|
-
#initialValidators;
|
|
36
|
-
constructor() {
|
|
37
|
-
this.#elementRef = inject(ElementRef);
|
|
38
|
-
this.#systemService = inject(SystemService);
|
|
39
|
-
this.#formScriptService = inject(ObjectFormScriptService);
|
|
40
|
-
this.#formHelperService = inject(ObjectFormService);
|
|
41
|
-
this.#userService = inject(UserService);
|
|
42
|
-
this.#cdRef = inject(ChangeDetectorRef);
|
|
43
|
-
this.#formScriptingApiService = inject(FormScriptingApiService);
|
|
44
|
-
this.#skipTranslationsFor = ['core', 'data'];
|
|
45
|
-
this.#namePrefix = 'fg_';
|
|
46
|
-
this.gCount = 0;
|
|
47
|
-
this.id = Utils.uuid();
|
|
48
|
-
this.formOptions = input();
|
|
49
|
-
this.#formOptionsEffect = effect(() => {
|
|
50
|
-
this.#init(this.formOptions());
|
|
51
|
-
});
|
|
52
|
-
this.inert = input();
|
|
53
|
-
this.elementExtensions = input([]);
|
|
54
|
-
this.#elementExtensionsEffect = effect(() => {
|
|
55
|
-
this.#formHelperService.setElementExtensions(this.elementExtensions());
|
|
56
|
-
});
|
|
57
|
-
/**
|
|
58
|
-
* There are special scenarios where forms are within a form themselves.
|
|
59
|
-
* Setting this property to true, will handle the current form in a
|
|
60
|
-
* slightly different way when it comes to form scripting.
|
|
61
|
-
*/
|
|
62
|
-
this.isInnerTableForm = input();
|
|
63
|
-
/**
|
|
64
|
-
* triggered when the forms state has been changed
|
|
65
|
-
*/
|
|
66
|
-
this.statusChanged = output();
|
|
67
|
-
/**
|
|
68
|
-
* handler to be executed after the form has been set up
|
|
69
|
-
*/
|
|
70
|
-
this.onFormReady = output();
|
|
71
|
-
this.#scriptModel = {};
|
|
72
|
-
this.#subscriptions = [];
|
|
73
|
-
// local store for all the form control references
|
|
74
|
-
this.#formControls = {};
|
|
75
|
-
this.#initialValidators = {};
|
|
76
|
-
/**
|
|
77
|
-
* This method will be called each time the script changes its internal model.
|
|
78
|
-
* It is used to transfer the script changes to the actual form model.
|
|
79
|
-
*
|
|
80
|
-
* To ensure the right context, we define an instance method as callback for the scripting scope
|
|
81
|
-
* @see: https://blog.johnnyreilly.com/2014/04/typescript-instance-methods.html
|
|
82
|
-
*
|
|
83
|
-
* @param formControlName
|
|
84
|
-
* @param change
|
|
85
|
-
*/
|
|
86
|
-
this.#onScriptingModelChanged = (formControlName, change, formId) => {
|
|
87
|
-
if (!this.form || (formId && this.id !== formId))
|
|
88
|
-
return;
|
|
89
|
-
// find the target control
|
|
90
|
-
const fc = this.#formControls[formControlName];
|
|
91
|
-
if (fc) {
|
|
92
|
-
// change only allowed properties
|
|
93
|
-
switch (change.name) {
|
|
94
|
-
case 'value': {
|
|
95
|
-
if (Array.isArray(change.newValue)) {
|
|
96
|
-
this.#processArrayValueChange(fc, change);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
fc._eoFormElement.value = change.newValue;
|
|
100
|
-
if (fc.value !== change.newValue) {
|
|
101
|
-
fc.patchValue(change.newValue);
|
|
102
|
-
fc.updateValueAndValidity();
|
|
103
|
-
fc.markAsDirty();
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
this.form.markAsDirty();
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
case 'required': {
|
|
110
|
-
fc._eoFormElement.required = change.newValue;
|
|
111
|
-
// apply new validators
|
|
112
|
-
// @see: https://scotch.io/tutorials/how-to-implement-conditional-validation-in-angular-2-model-driven-forms
|
|
113
|
-
fc.setValidators(Validators.compose(this.#getValidators(fc._eoFormElement).concat([this.#initialValidators[fc._eoFormElement.name]])));
|
|
114
|
-
// need to mark form control as touched because otherwise form validation will not show
|
|
115
|
-
// error messages
|
|
116
|
-
fc.markAsTouched();
|
|
117
|
-
fc.updateValueAndValidity();
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
case 'readonly': {
|
|
121
|
-
fc._eoFormElement.readonly = change.newValue;
|
|
122
|
-
if (change.newValue === true) {
|
|
123
|
-
fc.disable();
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
fc.enable();
|
|
127
|
-
}
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
case 'error': {
|
|
131
|
-
fc._eoFormElement.error = change.newValue;
|
|
132
|
-
fc.markAsTouched();
|
|
133
|
-
fc.updateValueAndValidity();
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
136
|
-
// new onrowedit function was applied by the script
|
|
137
|
-
case 'onrowedit': {
|
|
138
|
-
fc._eoFormElement.onrowedit = change.newValue;
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
// new onchange function was applied by the script
|
|
142
|
-
case 'onchange': {
|
|
143
|
-
fc._eoFormElement.onchange = change.newValue;
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
this.#cdRef.detectChanges();
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
this.#formScriptingApiService.formId = this.id;
|
|
151
|
-
this.#formScriptingApiService.api.events
|
|
152
|
-
.on(FormScriptingApiService.EVENT_MODEL_CHANGED)
|
|
153
|
-
.pipe(takeUntilDestroyed())
|
|
154
|
-
.subscribe((event) => event.data && this.#onScriptingModelChanged(event.data.formControlName, event.data.change, event.data.formId));
|
|
155
|
-
this.#formScriptingApiService.formId = this.id;
|
|
156
|
-
}
|
|
157
|
-
// initialize the form based on the provided form options
|
|
158
|
-
#init(fo) {
|
|
159
|
-
this.form = undefined;
|
|
160
|
-
if (!fo)
|
|
161
|
-
return;
|
|
162
|
-
setTimeout(() => {
|
|
163
|
-
this.#initialValidators = {};
|
|
164
|
-
this.unsubscribeAll();
|
|
165
|
-
this.#buildReactiveForm(fo);
|
|
166
|
-
}, 0);
|
|
167
|
-
}
|
|
168
|
-
#initScriptingScope(formOptions, dataFormModel) {
|
|
169
|
-
const { data, actions, objects, context } = (formOptions || {});
|
|
170
|
-
if (this.#scriptingScope) {
|
|
171
|
-
this.#scriptingScope.setModel(this.#scriptModel);
|
|
172
|
-
/** provide access to actions (used inside of BPM-Forms) */
|
|
173
|
-
this.#scriptingScope.actions = actions;
|
|
174
|
-
/** provide access to additional objects (used for example in BPM-Start-Forms to
|
|
175
|
-
* add data of DMS-Objects to start the process for)
|
|
176
|
-
*/
|
|
177
|
-
this.#scriptingScope.objects = objects || [];
|
|
178
|
-
this.#scriptingScope.context = context || { id: '', title: '', objectTypeId: '' };
|
|
179
|
-
/** provide readonly access to initial form data (which may also contain values that
|
|
180
|
-
* are not rendered as form elements (invisible values))
|
|
181
|
-
*/
|
|
182
|
-
this.#scriptingScope.data = data;
|
|
183
|
-
/** by default, scripting scopes are applied to forms. But table elements create their own scope
|
|
184
|
-
* for editing rows. Being one of those inner forms should not run the form script again, but
|
|
185
|
-
* instead just provide the observing abilities of the scripting scope.
|
|
186
|
-
*/
|
|
187
|
-
if (!this.isInnerTableForm() && dataFormModel) {
|
|
188
|
-
const scriptName = dataFormModel.name + '_' + dataFormModel.situation;
|
|
189
|
-
console.debug('executing form script ' + scriptName);
|
|
190
|
-
this.#formScriptService.runFormScript(this.#scriptingScope, dataFormModel.script, scriptName);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
focusForm() {
|
|
195
|
-
this.#elementRef.nativeElement.querySelector('input').focus();
|
|
196
|
-
}
|
|
197
|
-
getGroup(id) {
|
|
198
|
-
return this.form?.get(id);
|
|
199
|
-
}
|
|
200
|
-
setFormData(data) {
|
|
201
|
-
const fo = this.formOptions();
|
|
202
|
-
if (!fo)
|
|
203
|
-
return;
|
|
204
|
-
fo.data = data;
|
|
205
|
-
setTimeout(() => this.#init(fo), 0);
|
|
206
|
-
}
|
|
207
|
-
patchValue(data) {
|
|
208
|
-
Object.keys(data).forEach((key) => {
|
|
209
|
-
this.#onScriptingModelChanged(key, {
|
|
210
|
-
name: 'value',
|
|
211
|
-
newValue: data[key]
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Extracts the values from the form model. Each form value is represented by one
|
|
217
|
-
* property on the result object holding the fields value. The keys (properties) are the `name`
|
|
218
|
-
* properties of the form element.
|
|
219
|
-
*
|
|
220
|
-
* How values are extracted is influenced by the forms situation.
|
|
221
|
-
*
|
|
222
|
-
* @return object of key value pairs
|
|
223
|
-
*/
|
|
224
|
-
getFormData() {
|
|
225
|
-
return this.#formToData();
|
|
226
|
-
}
|
|
227
|
-
getFormElements() {
|
|
228
|
-
const formElements = {};
|
|
229
|
-
Object.keys(this.#formControls).forEach((k) => {
|
|
230
|
-
formElements[k] = this.#formControls[k].__eoFormElement;
|
|
231
|
-
});
|
|
232
|
-
return formElements;
|
|
233
|
-
}
|
|
234
|
-
setFormPristine() {
|
|
235
|
-
if (!this.form)
|
|
236
|
-
return;
|
|
237
|
-
this.form.markAsPristine();
|
|
238
|
-
}
|
|
239
|
-
// reset the form to its initial state
|
|
240
|
-
resetForm() {
|
|
241
|
-
const fo = this.formOptions();
|
|
242
|
-
if (!fo)
|
|
243
|
-
return;
|
|
244
|
-
this.setFormData(fo.data);
|
|
245
|
-
this.#emitFormChangedEvent();
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Returns the observed model that was passed to the current form script running. If there is
|
|
249
|
-
* no form script, this method will return NULL.
|
|
250
|
-
* @returns
|
|
251
|
-
*/
|
|
252
|
-
getObservedScriptModel() {
|
|
253
|
-
return this.#scriptingScope ? this.#scriptingScope.getModel() : null;
|
|
254
|
-
}
|
|
255
|
-
// Create a reactive form from the enaio form model
|
|
256
|
-
#buildReactiveForm(formOptions) {
|
|
257
|
-
this.#scriptingScope = undefined;
|
|
258
|
-
this.#scriptModel = {};
|
|
259
|
-
this.#formControls = {};
|
|
260
|
-
const formModel = this.#dataToForm(formOptions.formModel, formOptions.data);
|
|
261
|
-
if (!formModel) {
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
// if a script is available, we'll init the form scripting for the
|
|
265
|
-
// current form
|
|
266
|
-
if (this.isInnerTableForm() || (formModel.script && formModel.script.length > 0)) {
|
|
267
|
-
console.debug('adding form scripting scope');
|
|
268
|
-
this.#scriptingScope = new ObjectFormScriptingScope(formModel.situation, this.#onScriptingModelChanged, this.#formScriptingApiService.getApi(), this.isInnerTableForm());
|
|
269
|
-
this.#scriptingScope.objectId = this.formOptions().objectId;
|
|
270
|
-
}
|
|
271
|
-
const form = new ObjectFormGroup({});
|
|
272
|
-
if (formModel?.elements[0]?.elements) {
|
|
273
|
-
this.#addFormControl(form, formModel.elements[0], 'core');
|
|
274
|
-
}
|
|
275
|
-
if (formModel?.elements[1]?.elements) {
|
|
276
|
-
this.#addFormControl(form, formModel.elements[1], 'data');
|
|
277
|
-
}
|
|
278
|
-
this.form = form;
|
|
279
|
-
this.#formScriptingApiService.registerActiveForm(this);
|
|
280
|
-
console.log('form', form);
|
|
281
|
-
setTimeout(() => {
|
|
282
|
-
if (!this.form)
|
|
283
|
-
return;
|
|
284
|
-
this.initValidators(this.form);
|
|
285
|
-
this.#subscriptions.push(this.form.valueChanges.pipe(debounceTime(500)).subscribe(() => this.#emitFormChangedEvent()));
|
|
286
|
-
this.#initScriptingScope(formOptions, formModel);
|
|
287
|
-
this.onFormReady.emit();
|
|
288
|
-
this.#emitFormChangedEvent(false);
|
|
289
|
-
}, 300);
|
|
290
|
-
}
|
|
291
|
-
initValidators(form) {
|
|
292
|
-
if (this.form) {
|
|
293
|
-
for (const key of Object.keys(form.controls)) {
|
|
294
|
-
const control = form.controls[key];
|
|
295
|
-
if (control.controls) {
|
|
296
|
-
this.initValidators(control);
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
this.#initialValidators[control._eoFormElement.name] = control.validator;
|
|
300
|
-
control.setValidators(Validators.compose(this.#getValidators(control._eoFormElement).concat([this.#initialValidators[control._eoFormElement.name]])));
|
|
301
|
-
control.updateValueAndValidity();
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
#emitFormChangedEvent(compare = true) {
|
|
307
|
-
// check if indexdata has been changed
|
|
308
|
-
const currentFormData = this.getFormData();
|
|
309
|
-
const idxChange = compare ? JSON.stringify(this.formData) !== JSON.stringify(currentFormData) : false;
|
|
310
|
-
this.formData = currentFormData;
|
|
311
|
-
if (this.form) {
|
|
312
|
-
this.statusChanged.emit({
|
|
313
|
-
invalid: this.form.invalid,
|
|
314
|
-
dirty: this.form.dirty,
|
|
315
|
-
data: this.formData,
|
|
316
|
-
indexdataChanged: idxChange
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* This method will be called each time the script changes its internal model.
|
|
322
|
-
* It is used to transfer the script changes to the actual form model.
|
|
323
|
-
*
|
|
324
|
-
* To ensure the right context, we define an instance method as callback for the scripting scope
|
|
325
|
-
* @see: https://blog.johnnyreilly.com/2014/04/typescript-instance-methods.html
|
|
326
|
-
*
|
|
327
|
-
* @param formControlName
|
|
328
|
-
* @param change
|
|
329
|
-
*/
|
|
330
|
-
#onScriptingModelChanged;
|
|
331
|
-
#processArrayValueChange(fc, change) {
|
|
332
|
-
const newVal = change.newValue;
|
|
333
|
-
const targetType = fc._eoFormElement.type;
|
|
334
|
-
// for some types we have to ensure that meta data are provided as well
|
|
335
|
-
switch (targetType) {
|
|
336
|
-
case 'ORGANIZATION': {
|
|
337
|
-
this.#getDataMeta(fc._eoFormElement, newVal).subscribe((m) => {
|
|
338
|
-
fc._eoFormElement.dataMeta = m;
|
|
339
|
-
});
|
|
340
|
-
break;
|
|
341
|
-
}
|
|
342
|
-
case 'TABLE': {
|
|
343
|
-
const dataToBeProcessed = {};
|
|
344
|
-
fc._eoFormElement.elements.forEach((e) => {
|
|
345
|
-
if (e.type === 'ORGANIZATION' || e.type === 'CODESYSTEM') {
|
|
346
|
-
dataToBeProcessed[e.name] = e;
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
if (Object.keys(dataToBeProcessed).length) {
|
|
350
|
-
newVal.forEach((rowData) => {
|
|
351
|
-
Object.keys(rowData).forEach((key) => {
|
|
352
|
-
if (dataToBeProcessed[key]) {
|
|
353
|
-
this.#getDataMeta(dataToBeProcessed[key], rowData[key]).subscribe((m) => {
|
|
354
|
-
if (m) {
|
|
355
|
-
rowData[key + '_meta'] = m;
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
delete rowData[key + '_meta'];
|
|
359
|
-
}
|
|
360
|
-
this.#updateArrayValue(fc, newVal);
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
this.#updateArrayValue(fc, newVal);
|
|
370
|
-
}
|
|
371
|
-
#updateArrayValue(fc, newValue) {
|
|
372
|
-
fc._eoFormElement.value = [].concat(newValue);
|
|
373
|
-
fc.patchValue([].concat(newValue));
|
|
374
|
-
fc.updateValueAndValidity();
|
|
375
|
-
fc.markAsDirty();
|
|
376
|
-
}
|
|
377
|
-
#getDataMeta(formElement, newValue) {
|
|
378
|
-
if (newValue) {
|
|
379
|
-
switch (formElement.type) {
|
|
380
|
-
case 'ORGANIZATION': {
|
|
381
|
-
return this.#userService.getUserById(newValue);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
return of(null);
|
|
386
|
-
}
|
|
387
|
-
#patchFormValue(formValue) {
|
|
388
|
-
let value;
|
|
389
|
-
if (Array.isArray(formValue)) {
|
|
390
|
-
value = [];
|
|
391
|
-
// copy by value for arrays of objects (e.g. table data)
|
|
392
|
-
formValue.forEach((o) => value.push(JSON.parse(JSON.stringify(o))));
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
value = formValue;
|
|
396
|
-
}
|
|
397
|
-
return value;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Recursive method adding a new FormControl (group or control) to a parent form group
|
|
401
|
-
*
|
|
402
|
-
* @param parentGroup - the parent group to add the control to
|
|
403
|
-
* @param formElement - the enaio form model element to create the child control from
|
|
404
|
-
* @param [useName] - use this name instead of the one from the model
|
|
405
|
-
*/
|
|
406
|
-
#addFormControl(parentGroup, formElement, useName) {
|
|
407
|
-
const fo = this.formOptions();
|
|
408
|
-
if (!fo)
|
|
409
|
-
return;
|
|
410
|
-
let ctrl;
|
|
411
|
-
let name;
|
|
412
|
-
// add a form group
|
|
413
|
-
if (formElement.type === 'o2mGroup' || formElement.type === 'o2mGroupStack') {
|
|
414
|
-
// do not add groups that are empty
|
|
415
|
-
const isRootGroup = formElement.name && (formElement.name !== 'data' || formElement.name !== 'core');
|
|
416
|
-
if (!isRootGroup && (!formElement.elements || formElement.elements.length === 0)) {
|
|
417
|
-
console.error('Found empty form group', formElement);
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
ctrl = new ObjectFormGroup({});
|
|
421
|
-
ctrl._eoFormGroup = {
|
|
422
|
-
layout: formElement.layout,
|
|
423
|
-
type: formElement.type
|
|
424
|
-
};
|
|
425
|
-
if (formElement.name) {
|
|
426
|
-
if (this.#skipTranslationsFor.includes(formElement.name)) {
|
|
427
|
-
ctrl._eoFormGroup.label = formElement.name;
|
|
428
|
-
}
|
|
429
|
-
else if (!formElement.label) {
|
|
430
|
-
// no label, so try to translate the technical name
|
|
431
|
-
ctrl._eoFormGroup.label = this.#systemService.getLocalizedResource(`${formElement.name}_label`) || formElement.name;
|
|
432
|
-
}
|
|
433
|
-
else {
|
|
434
|
-
// there is a label so we take this one
|
|
435
|
-
ctrl._eoFormGroup.label = formElement.label;
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
if (useName === 'core' || useName === 'data') {
|
|
439
|
-
ctrl._eoFormGroup.label = useName;
|
|
440
|
-
}
|
|
441
|
-
for (const e of formElement.elements) {
|
|
442
|
-
this.#addFormControl(ctrl, e);
|
|
443
|
-
}
|
|
444
|
-
name = useName || 'fg' + this.gCount++;
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
// add form control
|
|
448
|
-
// To be able to integrate recursive form controls into the main form,
|
|
449
|
-
// we have to wrap them in a form group
|
|
450
|
-
ctrl = new ObjectFormControlWrapper({});
|
|
451
|
-
ctrl._eoFormControlWrapper = {
|
|
452
|
-
// the name of the wrapped FormControl
|
|
453
|
-
controlName: formElement.name,
|
|
454
|
-
situation: fo.formModel.situation
|
|
455
|
-
};
|
|
456
|
-
// do not set a reference as the form controls value
|
|
457
|
-
// otherwise we could not reset the form
|
|
458
|
-
const value = formElement?.value
|
|
459
|
-
? this.#patchFormValue(formElement?.value)
|
|
460
|
-
: !Utils.isEmpty(formElement?.defaultvalue) && fo.formModel.situation === Situation.CREATE
|
|
461
|
-
? this.#patchFormValue(formElement?.defaultvalue)
|
|
462
|
-
: formElement?.value;
|
|
463
|
-
// create the actual form control
|
|
464
|
-
const controlDisabled = fo.disabled || !!formElement.readonly;
|
|
465
|
-
const formControl = new ObjectFormControl({
|
|
466
|
-
value,
|
|
467
|
-
disabled: controlDisabled
|
|
468
|
-
});
|
|
469
|
-
// if form element has a 'label' property it will be shown as is ...
|
|
470
|
-
if (!formElement.label) {
|
|
471
|
-
// ... if there is no label but a 'labelKey' property we are going to localize that key ...
|
|
472
|
-
if (formElement.labelkey) {
|
|
473
|
-
formElement.label = this.#systemService.getLocalizedResource(`${formElement.labelkey}_label`) || formElement.labelkey;
|
|
474
|
-
formElement.description = this.#systemService.getLocalizedResource(`${formElement.labelkey}_description`);
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
// ... no 'label' and also no 'labelKey' means that we are showing technical name instead
|
|
478
|
-
formElement.label = formElement.name;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
formElement.readonly = controlDisabled;
|
|
482
|
-
// we are using an internal type to distinguish between the components
|
|
483
|
-
// to be used to render certain form elements
|
|
484
|
-
formElement._internalType = this.#systemService.getInternalFormElementType(formElement.type, formElement.classifications);
|
|
485
|
-
formControl._eoFormElement = formElement;
|
|
486
|
-
this.#formControls[formElement.name] = formControl;
|
|
487
|
-
if (formElement.type === 'TABLE') {
|
|
488
|
-
// Add 'onrowedit' property even if it's not set.
|
|
489
|
-
// This is required because otherwise mobX-Observer would not recognize
|
|
490
|
-
// changes to this property applied by the form script
|
|
491
|
-
if (!Object.keys(formControl._eoFormElement).includes('onrowedit')) {
|
|
492
|
-
formControl._eoFormElement.onrowedit = null;
|
|
493
|
-
}
|
|
494
|
-
if (this.#scriptingScope && formControl._eoFormElement.value) {
|
|
495
|
-
// having a scripting scope and table rows means that we need to set empty
|
|
496
|
-
// columns to NULL, because otherwise mobX won't be able to track those values
|
|
497
|
-
const valueFields = formControl._eoFormElement.elements.map((e) => e.name);
|
|
498
|
-
formControl._eoFormElement.value.forEach((rowValue) => {
|
|
499
|
-
valueFields.forEach((valueField) => {
|
|
500
|
-
if (!Object.keys(rowValue).includes(valueField)) {
|
|
501
|
-
rowValue[valueField] = null;
|
|
502
|
-
}
|
|
503
|
-
});
|
|
504
|
-
});
|
|
505
|
-
// update form controls value as well to reflect the observed value
|
|
506
|
-
formControl.patchValue(formControl._eoFormElement.value, {
|
|
507
|
-
onlySelf: true,
|
|
508
|
-
emitEvent: false,
|
|
509
|
-
emitModelToViewChange: false,
|
|
510
|
-
emitViewToModelChange: false
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
if (formElement._internalType === 'string:organization') {
|
|
515
|
-
formControl._eoFormElement.setFilter = (filterObject) => {
|
|
516
|
-
formControl._eoFormElement.filter = filterObject;
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
ObjectFormUtils.updateFormElement(formElement);
|
|
520
|
-
// remove empty descriptions
|
|
521
|
-
const desc = formControl._eoFormElement.description;
|
|
522
|
-
if (desc && desc.trim().length === 0) {
|
|
523
|
-
formControl._eoFormElement.description = null;
|
|
524
|
-
}
|
|
525
|
-
// add the form element to the script model that will be injected into
|
|
526
|
-
// the forms scripting scope later on
|
|
527
|
-
this.#scriptModel[formElement.name] = formControl._eoFormElement;
|
|
528
|
-
// apply change listener to the form control, that will trigger
|
|
529
|
-
// the form elements onChange listener
|
|
530
|
-
const controlWatch = ctrl.valueChanges.pipe(debounceTime(500));
|
|
531
|
-
this.#subscriptions.push(controlWatch.subscribe((v) => {
|
|
532
|
-
if (this.#scriptingScope) {
|
|
533
|
-
this.#scriptingScope.modelChanged(v);
|
|
534
|
-
}
|
|
535
|
-
}));
|
|
536
|
-
ctrl.addControl(formElement.name, formControl);
|
|
537
|
-
name = this.#namePrefix + formElement.name;
|
|
538
|
-
}
|
|
539
|
-
parentGroup.addControl(name, ctrl);
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* Build validators for the given form element to be attached to
|
|
543
|
-
* a reactive formControl.
|
|
544
|
-
*
|
|
545
|
-
* @param formElement - form element object
|
|
546
|
-
*/
|
|
547
|
-
#getValidators(formElement) {
|
|
548
|
-
const fo = this.formOptions();
|
|
549
|
-
const elmValidators = FormValidation.getValidators(formElement, fo?.formModel.situation);
|
|
550
|
-
// add custom validator for script enabled forms
|
|
551
|
-
if (this.#scriptingScope) {
|
|
552
|
-
elmValidators.push(FormValidation.customScriptingValidation);
|
|
553
|
-
}
|
|
554
|
-
return elmValidators;
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* Extract the values from the form
|
|
558
|
-
*/
|
|
559
|
-
#formToData() {
|
|
560
|
-
const fo = this.formOptions();
|
|
561
|
-
return fo && this.form ? this.#formHelperService.extractFormData(this.form, fo.formModel.situation, fo.data, this.isInnerTableForm()) : {};
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Merge data into a form model.
|
|
565
|
-
*
|
|
566
|
-
* @param model - form model
|
|
567
|
-
* @param data - data object or array of SearchFilter objects in case of a search form
|
|
568
|
-
*/
|
|
569
|
-
#dataToForm(model, data) {
|
|
570
|
-
if (model && data) {
|
|
571
|
-
this.#setElementValues(model.elements, data);
|
|
572
|
-
}
|
|
573
|
-
return model;
|
|
574
|
-
}
|
|
575
|
-
// recursive method for adding values to model elements
|
|
576
|
-
#setElementValues(elements, data) {
|
|
577
|
-
elements?.forEach((element) => {
|
|
578
|
-
if (this.#hasValue(data, element)) {
|
|
579
|
-
element.value = this.#getValue(data, element);
|
|
580
|
-
}
|
|
581
|
-
else {
|
|
582
|
-
delete element.value;
|
|
583
|
-
}
|
|
584
|
-
if (element.type !== 'TABLE' && element.elements && element.elements.length > 0) {
|
|
585
|
-
this.#setElementValues(element.elements, data);
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
#hasValue(data, element) {
|
|
590
|
-
// differ between array of SearchFilters and a form data object
|
|
591
|
-
if (Array.isArray(data)) {
|
|
592
|
-
return !!data.find((filter) => filter.property === element.id);
|
|
593
|
-
}
|
|
594
|
-
else {
|
|
595
|
-
return Object.keys(data).includes(element.name);
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
#getValue(data, element) {
|
|
599
|
-
return data[element.name];
|
|
600
|
-
}
|
|
601
|
-
ngOnDestroy() {
|
|
602
|
-
this.unsubscribeAll();
|
|
603
|
-
this.#formScriptingApiService.unregisterActiveForm(this);
|
|
604
|
-
}
|
|
605
|
-
ngAfterViewInit() {
|
|
606
|
-
this.#cdRef.detectChanges();
|
|
607
|
-
}
|
|
608
|
-
// unsubscribe from all value change listeners for the current form
|
|
609
|
-
// to avoid memory leaks. This method will also be called every time
|
|
610
|
-
// a new form is rendered to get rid of the old form element subscriptions
|
|
611
|
-
unsubscribeAll() {
|
|
612
|
-
if (this.#subscriptions.length) {
|
|
613
|
-
console.debug('unsubscribed from ' + this.#subscriptions.length + ' value change listeners.');
|
|
614
|
-
this.#subscriptions.forEach((s) => s.unsubscribe());
|
|
615
|
-
this.#subscriptions = [];
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
619
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ObjectFormComponent, isStandalone: true, selector: "yuv-object-form", inputs: { formOptions: { classPropertyName: "formOptions", publicName: "formOptions", isSignal: true, isRequired: false, transformFunction: null }, inert: { classPropertyName: "inert", publicName: "inert", isSignal: true, isRequired: false, transformFunction: null }, elementExtensions: { classPropertyName: "elementExtensions", publicName: "elementExtensions", isSignal: true, isRequired: false, transformFunction: null }, isInnerTableForm: { classPropertyName: "isInnerTableForm", publicName: "isInnerTableForm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { statusChanged: "statusChanged", onFormReady: "onFormReady" }, host: { properties: { "attr.inert": "inert() ? true : null" }, classAttribute: "yuv-object-form" }, providers: [ObjectFormService, ObjectFormScriptService, FormScriptingApiService], ngImport: i0, template: "@let fo = formOptions();\n@if (fo && form) {\n <div class=\"yuv-object-form\" [formGroup]=\"form\">\n <div class=\"form-element-wrap core\">\n <yuv-object-form-group [group]=\"getGroup('core')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n <div class=\"form-element-wrap data\">\n <yuv-object-form-group [group]=\"getGroup('data')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n </div>\n}\n", styles: [".yuv-object-form>.core{padding:calc(var(--app-pane-padding) / 2)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack{background:transparent;border:0}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>yuv-object-form-group>.o2mGroup{background-color:var(--panel-background-lightgrey);border-top:1px solid rgba(0,0,0,.1);padding:var(--app-pane-padding)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>p-tabview>.p-tabview>.p-tabview-panels{background-color:var(--panel-background-lightgrey)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: ObjectFormGroupComponent, selector: "yuv-object-form-group", inputs: ["situation", "group", "noGroupLabels"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
620
|
-
}
|
|
621
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectFormComponent, decorators: [{
|
|
622
|
-
type: Component,
|
|
623
|
-
args: [{ selector: 'yuv-object-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, ObjectFormGroupComponent], providers: [ObjectFormService, ObjectFormScriptService, FormScriptingApiService], encapsulation: ViewEncapsulation.None, host: {
|
|
624
|
-
class: 'yuv-object-form',
|
|
625
|
-
'[attr.inert]': 'inert() ? true : null'
|
|
626
|
-
}, template: "@let fo = formOptions();\n@if (fo && form) {\n <div class=\"yuv-object-form\" [formGroup]=\"form\">\n <div class=\"form-element-wrap core\">\n <yuv-object-form-group [group]=\"getGroup('core')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n <div class=\"form-element-wrap data\">\n <yuv-object-form-group [group]=\"getGroup('data')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n </div>\n}\n", styles: [".yuv-object-form>.core{padding:calc(var(--app-pane-padding) / 2)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack{background:transparent;border:0}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>yuv-object-form-group>.o2mGroup{background-color:var(--panel-background-lightgrey);border-top:1px solid rgba(0,0,0,.1);padding:var(--app-pane-padding)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>p-tabview>.p-tabview>.p-tabview-panels{background-color:var(--panel-background-lightgrey)}\n"] }]
|
|
627
|
-
}], ctorParameters: () => [] });
|
|
628
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9vYmplY3QtZm9ybS9zcmMvbGliL29iamVjdC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvb2JqZWN0LWZvcm0vc3JjL2xpYi9vYmplY3QtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxZQUFZLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQTBCLHdCQUF3QixFQUE0QyxNQUFNLHlCQUF5QixD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QWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUsaUJBQWlCO3dCQUN4QixjQUFjLEVBQUUsdUJBQXVCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BueC9kZXZraXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBvdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNpdHVhdGlvbiwgU3lzdGVtU2VydmljZSwgVXNlclNlcnZpY2UsIFV0aWxzIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLXNjcmlwdGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElPYmplY3RGb3JtRWxlbWVudEV4dGVuc2lvbiB9IGZyb20gJy4vb2JqZWN0LWZvcm0tZXh0ZW5zaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL29iamVjdC1mb3JtLWdyb3VwL29iamVjdC1mb3JtLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYmplY3RGb3JtU2NyaXB0U2VydmljZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdC5zZXJ2aWNlJztcbmltcG9ydCB7IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdGluZy1zY29wZSc7XG5pbXBvcnQgeyBGb3JtU3RhdHVzQ2hhbmdlZEV2ZW50LCBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIsIE9iamVjdEZvcm1Nb2RlbENoYW5nZSwgT2JqZWN0Rm9ybU9wdGlvbnMgfSBmcm9tICcuL29iamVjdC1mb3JtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtQ29udHJvbCwgT2JqZWN0Rm9ybUdyb3VwIH0gZnJvbSAnLi9vYmplY3QtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBPYmplY3RGb3JtU2VydmljZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtVXRpbHMgfSBmcm9tICcuL29iamVjdC1mb3JtLnV0aWxzJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uIH0gZnJvbSAnLi9vYmplY3QtZm9ybS52YWxpZGF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW9iamVjdC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgT2JqZWN0Rm9ybUdyb3VwQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbT2JqZWN0Rm9ybVNlcnZpY2UsIE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlLCBGb3JtU2NyaXB0aW5nQXBpU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9vYmplY3QtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vYmplY3QtZm9ybS5jb21wb25lbnQuc2NzcycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ3l1di1vYmplY3QtZm9ybScsXG4gICAgJ1thdHRyLmluZXJ0XSc6ICdpbmVydCgpID8gdHJ1ZSA6IG51bGwnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gICNlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAjc3lzdGVtU2VydmljZSA9IGluamVjdChTeXN0ZW1TZXJ2aWNlKTtcbiAgI2Zvcm1TY3JpcHRTZXJ2aWNlID0gaW5qZWN0KE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlKTtcbiAgI2Zvcm1IZWxwZXJTZXJ2aWNlID0gaW5qZWN0KE9iamVjdEZvcm1TZXJ2aWNlKTtcbiAgI3VzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcbiAgI2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgI2Zvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlID0gaW5qZWN0KEZvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlKTtcblxuICAjc2tpcFRyYW5zbGF0aW9uc0ZvciA9IFsnY29yZScsICdkYXRhJ107XG4gICNuYW1lUHJlZml4ID0gJ2ZnXyc7XG4gIGdDb3VudCA9IDA7XG5cbiAgaWQgPSBVdGlscy51dWlkKCk7XG5cbiAgZm8/OiBPYmplY3RGb3JtT3B0aW9ucztcbiAgZm9ybU9wdGlvbnMgPSBpbnB1dDxPYmplY3RGb3JtT3B0aW9ucz4oKTtcbiAgI2Zvcm1PcHRpb25zRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICB0aGlzLiNpbml0KHRoaXMuZm9ybU9wdGlvbnMoKSk7XG4gIH0pO1xuXG4gIGluZXJ0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgZWxlbWVudEV4dGVuc2lvbnMgPSBpbnB1dDxJT2JqZWN0Rm9ybUVsZW1lbnRFeHRlbnNpb25bXT4oW10pO1xuICAjZWxlbWVudEV4dGVuc2lvbnNFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMuI2Zvcm1IZWxwZXJTZXJ2aWNlLnNldEVsZW1lbnRFeHRlbnNpb25zKHRoaXMuZWxlbWVudEV4dGVuc2lvbnMoKSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGVyZSBhcmUgc3BlY2lhbCBzY2VuYXJpb3Mgd2hlcmUgZm9ybXMgYXJlIHdpdGhpbiBhIGZvcm0gdGhlbXNlbHZlcy5cbiAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHdpbGwgaGFuZGxlIHRoZSBjdXJyZW50IGZvcm0gaW4gYVxuICAgKiBzbGlnaHRseSBkaWZmZXJlbnQgd2F5IHdoZW4gaXQgY29tZXMgdG8gZm9ybSBzY3JpcHRpbmcuXG4gICAqL1xuICBpc0lubmVyVGFibGVGb3JtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gdGhlIGZvcm1zIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWRcbiAgICovXG4gIHN0YXR1c0NoYW5nZWQgPSBvdXRwdXQ8Rm9ybVN0YXR1c0NoYW5nZWRFdmVudD4oKTtcblxuICAvKipcbiAgICogaGFuZGxlciB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgZm9ybSBoYXMgYmVlbiBzZXQgdXBcbiAgICovXG4gIG9uRm9ybVJlYWR5ID0gb3V0cHV0KCk7XG5cbiAgLy8gdGhlIGFjdHVhbCBmb3JtIGluc3RhbmNlXG4gIGZvcm0/OiBPYmplY3RGb3JtR3JvdXA7XG4gIC8vIHByb3BlcnR5IGZvciBob2xkaW5nIHRoZSBmb3JtcyBkYXRhIHVzZWQgZm9yIGNvbXBhcmlzb24gd2hlbiBhIGZvcm0tY2hhbmdlZC1ldmVudFxuICAvLyBpcyBmZXRjaGVkIHRvIGluZGljYXRlIHdoZXIgb3Igbm90IHRoZSBpbmRleGRhdGEgd2VyZSBjaGFuZ2VkIG9yIGp1c3QgdGhlIHByb3BlcnRpZXNcbiAgLy8gb2YgdGhlIGZvcm0gZWxlbWVudHMgKGVnLiBmb3JtIHNjcmlwdCBzZXR0aW5nIGZpZWxkcyB0byByZWFkb25seSlcbiAgZm9ybURhdGE6IGFueTtcbiAgI3NjcmlwdE1vZGVsOiBhbnkgPSB7fTtcbiAgI3NjcmlwdGluZ1Njb3BlPzogT2JqZWN0Rm9ybVNjcmlwdGluZ1Njb3BlO1xuICAjc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBsb2NhbCBzdG9yZSBmb3IgYWxsIHRoZSBmb3JtIGNvbnRyb2wgcmVmZXJlbmNlc1xuICAjZm9ybUNvbnRyb2xzOiBhbnkgPSB7fTtcbiAgI2luaXRpYWxWYWxpZGF0b3JzOiBhbnkgPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5mb3JtSWQgPSB0aGlzLmlkO1xuICAgIHRoaXMuI2Zvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlLmFwaS5ldmVudHNcbiAgICAgIC5vbihGb3JtU2NyaXB0aW5nQXBpU2VydmljZS5FVkVOVF9NT0RFTF9DSEFOR0VEKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gZXZlbnQuZGF0YSAmJiB0aGlzLiNvblNjcmlwdGluZ01vZGVsQ2hhbmdlZChldmVudC5kYXRhLmZvcm1Db250cm9sTmFtZSwgZXZlbnQuZGF0YS5jaGFuZ2UsIGV2ZW50LmRhdGEuZm9ybUlkKSk7XG5cbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5mb3JtSWQgPSB0aGlzLmlkO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZm9ybSBvcHRpb25zXG4gICNpbml0KGZvOiBPYmplY3RGb3JtT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZm9ybSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWZvKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNpbml0aWFsVmFsaWRhdG9ycyA9IHt9O1xuICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgdGhpcy4jYnVpbGRSZWFjdGl2ZUZvcm0oZm8pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgI2luaXRTY3JpcHRpbmdTY29wZShmb3JtT3B0aW9uczogT2JqZWN0Rm9ybU9wdGlvbnMsIGRhdGFGb3JtTW9kZWw6IGFueSkge1xuICAgIGNvbnN0IHsgZGF0YSwgYWN0aW9ucywgb2JqZWN0cywgY29udGV4dCB9ID0gKGZvcm1PcHRpb25zIHx8IHt9KSBhcyBPYmplY3RGb3JtT3B0aW9ucztcblxuICAgIGlmICh0aGlzLiNzY3JpcHRpbmdTY29wZSkge1xuICAgICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUuc2V0TW9kZWwodGhpcy4jc2NyaXB0TW9kZWwpO1xuICAgICAgLyoqIHByb3ZpZGUgYWNjZXNzIHRvIGFjdGlvbnMgKHVzZWQgaW5zaWRlIG9mIEJQTS1Gb3JtcykgKi9cbiAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLmFjdGlvbnMgPSBhY3Rpb25zO1xuICAgICAgLyoqIHByb3ZpZGUgYWNjZXNzIHRvIGFkZGl0aW9uYWwgb2JqZWN0cyAodXNlZCBmb3IgZXhhbXBsZSBpbiBCUE0tU3RhcnQtRm9ybXMgdG9cbiAgICAgICAqIGFkZCBkYXRhIG9mIERNUy1PYmplY3RzIHRvIHN0YXJ0IHRoZSBwcm9jZXNzIGZvcilcbiAgICAgICAqL1xuICAgICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUub2JqZWN0cyA9IG9iamVjdHMgfHwgW107XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZS5jb250ZXh0ID0gY29udGV4dCB8fCB7IGlkOiAnJywgdGl0bGU6ICcnLCBvYmplY3RUeXBlSWQ6ICcnIH07XG4gICAgICAvKiogcHJvdmlkZSByZWFkb25seSBhY2Nlc3MgdG8gaW5pdGlhbCBmb3JtIGRhdGEgKHdoaWNoIG1heSBhbHNvIGNvbnRhaW4gdmFsdWVzIHRoYXRcbiAgICAgICAqIGFyZSBub3QgcmVuZGVyZWQgYXMgZm9ybSBlbGVtZW50cyAoaW52aXNpYmxlIHZhbHVlcykpXG4gICAgICAgKi9cbiAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLmRhdGEgPSBkYXRhO1xuXG4gICAgICAvKiogYnkgZGVmYXVsdCwgc2NyaXB0aW5nIHNjb3BlcyBhcmUgYXBwbGllZCB0byBmb3Jtcy4gQnV0IHRhYmxlIGVsZW1lbnRzIGNyZWF0ZSB0aGVpciBvd24gc2NvcGVcbiAgICAgICAqIGZvciBlZGl0aW5nIHJvd3MuIEJlaW5nIG9uZSBvZiB0aG9zZSBpbm5lciBmb3JtcyBzaG91bGQgbm90IHJ1biB0aGUgZm9ybSBzY3JpcHQgYWdhaW4sIGJ1dFxuICAgICAgICogaW5zdGVhZCBqdXN0IHByb3ZpZGUgdGhlIG9ic2VydmluZyBhYmlsaXRpZXMgb2YgdGhlIHNjcmlwdGluZyBzY29wZS5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLmlzSW5uZXJUYWJsZUZvcm0oKSAmJiBkYXRhRm9ybU1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdE5hbWUgPSBkYXRhRm9ybU1vZGVsLm5hbWUgKyAnXycgKyBkYXRhRm9ybU1vZGVsLnNpdHVhdGlvbjtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZXhlY3V0aW5nIGZvcm0gc2NyaXB0ICcgKyBzY3JpcHROYW1lKTtcbiAgICAgICAgdGhpcy4jZm9ybVNjcmlwdFNlcnZpY2UucnVuRm9ybVNjcmlwdCh0aGlzLiNzY3JpcHRpbmdTY29wZSwgZGF0YUZvcm1Nb2RlbC5zY3JpcHQsIHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzRm9ybSgpIHtcbiAgICB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICB9XG5cbiAgZ2V0R3JvdXAoaWQ6IHN0cmluZyk6IE9iamVjdEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybT8uZ2V0KGlkKSBhcyBPYmplY3RGb3JtR3JvdXA7XG4gIH1cblxuICBzZXRGb3JtRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcbiAgICBmby5kYXRhID0gZGF0YTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuI2luaXQoZm8pLCAwKTtcbiAgfVxuXG4gIHBhdGNoVmFsdWUoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuI29uU2NyaXB0aW5nTW9kZWxDaGFuZ2VkKGtleSwge1xuICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICBuZXdWYWx1ZTogZGF0YVtrZXldXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgdmFsdWVzIGZyb20gdGhlIGZvcm0gbW9kZWwuIEVhY2ggZm9ybSB2YWx1ZSBpcyByZXByZXNlbnRlZCBieSBvbmVcbiAgICogcHJvcGVydHkgb24gdGhlIHJlc3VsdCBvYmplY3QgaG9sZGluZyB0aGUgZmllbGRzIHZhbHVlLiBUaGUga2V5cyAocHJvcGVydGllcykgYXJlIHRoZSBgbmFtZWBcbiAgICogcHJvcGVydGllcyBvZiB0aGUgZm9ybSBlbGVtZW50LlxuICAgKlxuICAgKiBIb3cgdmFsdWVzIGFyZSBleHRyYWN0ZWQgaXMgaW5mbHVlbmNlZCBieSB0aGUgZm9ybXMgc2l0dWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIG9iamVjdCBvZiBrZXkgdmFsdWUgcGFpcnNcbiAgICovXG4gIGdldEZvcm1EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNmb3JtVG9EYXRhKCk7XG4gIH1cblxuICBnZXRGb3JtRWxlbWVudHMoKSB7XG4gICAgY29uc3QgZm9ybUVsZW1lbnRzOiBhbnkgPSB7fTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLiNmb3JtQ29udHJvbHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgIGZvcm1FbGVtZW50c1trXSA9IHRoaXMuI2Zvcm1Db250cm9sc1trXS5fX2VvRm9ybUVsZW1lbnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1FbGVtZW50cztcbiAgfVxuXG4gIHNldEZvcm1QcmlzdGluZSgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICB9XG5cbiAgLy8gcmVzZXQgdGhlIGZvcm0gdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgcmVzZXRGb3JtKCkge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcbiAgICB0aGlzLnNldEZvcm1EYXRhKGZvLmRhdGEpO1xuICAgIHRoaXMuI2VtaXRGb3JtQ2hhbmdlZEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2JzZXJ2ZWQgbW9kZWwgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBjdXJyZW50IGZvcm0gc2NyaXB0IHJ1bm5pbmcuIElmIHRoZXJlIGlzXG4gICAqIG5vIGZvcm0gc2NyaXB0LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBOVUxMLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0T2JzZXJ2ZWRTY3JpcHRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2NyaXB0aW5nU2NvcGUgPyB0aGlzLiNzY3JpcHRpbmdTY29wZS5nZXRNb2RlbCgpIDogbnVsbDtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHJlYWN0aXZlIGZvcm0gZnJvbSB0aGUgZW5haW8gZm9ybSBtb2RlbFxuICAjYnVpbGRSZWFjdGl2ZUZvcm0oZm9ybU9wdGlvbnM6IE9iamVjdEZvcm1PcHRpb25zKSB7XG4gICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jc2NyaXB0TW9kZWwgPSB7fTtcbiAgICB0aGlzLiNmb3JtQ29udHJvbHMgPSB7fTtcbiAgICBjb25zdCBmb3JtTW9kZWwgPSB0aGlzLiNkYXRhVG9Gb3JtKGZvcm1PcHRpb25zLmZvcm1Nb2RlbCwgZm9ybU9wdGlvbnMuZGF0YSk7XG5cbiAgICBpZiAoIWZvcm1Nb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiBhIHNjcmlwdCBpcyBhdmFpbGFibGUsIHdlJ2xsIGluaXQgdGhlIGZvcm0gc2NyaXB0aW5nIGZvciB0aGVcbiAgICAvLyBjdXJyZW50IGZvcm1cbiAgICBpZiAodGhpcy5pc0lubmVyVGFibGVGb3JtKCkgfHwgKGZvcm1Nb2RlbC5zY3JpcHQgJiYgZm9ybU1vZGVsLnNjcmlwdC5sZW5ndGggPiAwKSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnYWRkaW5nIGZvcm0gc2NyaXB0aW5nIHNjb3BlJyk7XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZSA9IG5ldyBPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGUoXG4gICAgICAgIGZvcm1Nb2RlbC5zaXR1YXRpb24sXG4gICAgICAgIHRoaXMuI29uU2NyaXB0aW5nTW9kZWxDaGFuZ2VkLFxuICAgICAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5nZXRBcGkoKSxcbiAgICAgICAgdGhpcy5pc0lubmVyVGFibGVGb3JtKClcbiAgICAgICk7XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZS5vYmplY3RJZCA9IHRoaXMuZm9ybU9wdGlvbnMoKSEub2JqZWN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybSA9IG5ldyBPYmplY3RGb3JtR3JvdXAoe30pO1xuICAgIGlmIChmb3JtTW9kZWw/LmVsZW1lbnRzWzBdPy5lbGVtZW50cykge1xuICAgICAgdGhpcy4jYWRkRm9ybUNvbnRyb2woZm9ybSwgZm9ybU1vZGVsLmVsZW1lbnRzWzBdLCAnY29yZScpO1xuICAgIH1cbiAgICBpZiAoZm9ybU1vZGVsPy5lbGVtZW50c1sxXT8uZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuI2FkZEZvcm1Db250cm9sKGZvcm0sIGZvcm1Nb2RlbC5lbGVtZW50c1sxXSwgJ2RhdGEnKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5yZWdpc3RlckFjdGl2ZUZvcm0odGhpcyk7XG4gICAgY29uc29sZS5sb2coJ2Zvcm0nLCBmb3JtKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRWYWxpZGF0b3JzKHRoaXMuZm9ybSk7XG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnB1c2godGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg1MDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy4jZW1pdEZvcm1DaGFuZ2VkRXZlbnQoKSkpO1xuXG4gICAgICB0aGlzLiNpbml0U2NyaXB0aW5nU2NvcGUoZm9ybU9wdGlvbnMsIGZvcm1Nb2RlbCk7XG5cbiAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdCgpO1xuICAgICAgdGhpcy4jZW1pdEZvcm1DaGFuZ2VkRXZlbnQoZmFsc2UpO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICBpbml0VmFsaWRhdG9ycyhmb3JtOiBhbnkpIHtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuICAgICAgICBpZiAoY29udHJvbC5jb250cm9scykge1xuICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvcnMoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jaW5pdGlhbFZhbGlkYXRvcnNbY29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IGNvbnRyb2wudmFsaWRhdG9yO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UodGhpcy4jZ2V0VmFsaWRhdG9ycyhjb250cm9sLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoW3RoaXMuI2luaXRpYWxWYWxpZGF0b3JzW2NvbnRyb2wuX2VvRm9ybUVsZW1lbnQubmFtZV1dKSkpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRGb3JtQ2hhbmdlZEV2ZW50KGNvbXBhcmUgPSB0cnVlKSB7XG4gICAgLy8gY2hlY2sgaWYgaW5kZXhkYXRhIGhhcyBiZWVuIGNoYW5nZWRcbiAgICBjb25zdCBjdXJyZW50Rm9ybURhdGEgPSB0aGlzLmdldEZvcm1EYXRhKCk7XG4gICAgY29uc3QgaWR4Q2hhbmdlID0gY29tcGFyZSA/IEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybURhdGEpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybURhdGEpIDogZmFsc2U7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGN1cnJlbnRGb3JtRGF0YTtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLnN0YXR1c0NoYW5nZWQuZW1pdCh7XG4gICAgICAgIGludmFsaWQ6IHRoaXMuZm9ybS5pbnZhbGlkLFxuICAgICAgICBkaXJ0eTogdGhpcy5mb3JtLmRpcnR5LFxuICAgICAgICBkYXRhOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICBpbmRleGRhdGFDaGFuZ2VkOiBpZHhDaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHNjcmlwdCBjaGFuZ2VzIGl0cyBpbnRlcm5hbCBtb2RlbC5cbiAgICogSXQgaXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgc2NyaXB0IGNoYW5nZXMgdG8gdGhlIGFjdHVhbCBmb3JtIG1vZGVsLlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhlIHJpZ2h0IGNvbnRleHQsIHdlIGRlZmluZSBhbiBpbnN0YW5jZSBtZXRob2QgYXMgY2FsbGJhY2sgZm9yIHRoZSBzY3JpcHRpbmcgc2NvcGVcbiAgICogQHNlZTogaHR0cHM6Ly9ibG9nLmpvaG5ueXJlaWxseS5jb20vMjAxNC8wNC90eXBlc2NyaXB0LWluc3RhbmNlLW1ldGhvZHMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUNvbnRyb2xOYW1lXG4gICAqIEBwYXJhbSBjaGFuZ2VcbiAgICovXG4gICNvblNjcmlwdGluZ01vZGVsQ2hhbmdlZCA9IChmb3JtQ29udHJvbE5hbWU6IHN0cmluZywgY2hhbmdlOiBPYmplY3RGb3JtTW9kZWxDaGFuZ2UsIGZvcm1JZD86IHN0cmluZykgPT4ge1xuICAgIGlmICghdGhpcy5mb3JtIHx8IChmb3JtSWQgJiYgdGhpcy5pZCAhPT0gZm9ybUlkKSkgcmV0dXJuO1xuICAgIC8vIGZpbmQgdGhlIHRhcmdldCBjb250cm9sXG4gICAgY29uc3QgZmM6IE9iamVjdEZvcm1Db250cm9sID0gdGhpcy4jZm9ybUNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgT2JqZWN0Rm9ybUNvbnRyb2w7XG4gICAgaWYgKGZjKSB7XG4gICAgICAvLyBjaGFuZ2Ugb25seSBhbGxvd2VkIHByb3BlcnRpZXNcbiAgICAgIHN3aXRjaCAoY2hhbmdlLm5hbWUpIHtcbiAgICAgICAgY2FzZSAndmFsdWUnOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzc0FycmF5VmFsdWVDaGFuZ2UoZmMsIGNoYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKGZjLnZhbHVlICE9PSBjaGFuZ2UubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgZmMucGF0Y2hWYWx1ZShjaGFuZ2UubmV3VmFsdWUpO1xuICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgIGZjLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnJlcXVpcmVkID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIC8vIGFwcGx5IG5ldyB2YWxpZGF0b3JzXG4gICAgICAgICAgLy8gQHNlZTogaHR0cHM6Ly9zY290Y2guaW8vdHV0b3JpYWxzL2hvdy10by1pbXBsZW1lbnQtY29uZGl0aW9uYWwtdmFsaWRhdGlvbi1pbi1hbmd1bGFyLTItbW9kZWwtZHJpdmVuLWZvcm1zXG4gICAgICAgICAgZmMuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UodGhpcy4jZ2V0VmFsaWRhdG9ycyhmYy5fZW9Gb3JtRWxlbWVudCkuY29uY2F0KFt0aGlzLiNpbml0aWFsVmFsaWRhdG9yc1tmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXV0pKSk7XG4gICAgICAgICAgLy8gbmVlZCB0byBtYXJrIGZvcm0gY29udHJvbCBhcyB0b3VjaGVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGZvcm0gdmFsaWRhdGlvbiB3aWxsIG5vdCBzaG93XG4gICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICBmYy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlYWRvbmx5Jzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnJlYWRvbmx5ID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIGlmIChjaGFuZ2UubmV3VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZjLmRpc2FibGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmMuZW5hYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmVycm9yID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIGZjLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV3IG9ucm93ZWRpdCBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgIGNhc2UgJ29ucm93ZWRpdCc6IHtcbiAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5vbnJvd2VkaXQgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV3IG9uY2hhbmdlIGZ1bmN0aW9uIHdhcyBhcHBsaWVkIGJ5IHRoZSBzY3JpcHRcbiAgICAgICAgY2FzZSAnb25jaGFuZ2UnOiB7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQub25jaGFuZ2UgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgI3Byb2Nlc3NBcnJheVZhbHVlQ2hhbmdlKGZjOiBhbnksIGNoYW5nZTogYW55KSB7XG4gICAgY29uc3QgbmV3VmFsID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBmYy5fZW9Gb3JtRWxlbWVudC50eXBlO1xuICAgIC8vIGZvciBzb21lIHR5cGVzIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBwcm92aWRlZCBhcyB3ZWxsXG4gICAgc3dpdGNoICh0YXJnZXRUeXBlKSB7XG4gICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgIHRoaXMuI2dldERhdGFNZXRhKGZjLl9lb0Zvcm1FbGVtZW50LCBuZXdWYWwpLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhID0gbTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVEFCTEUnOiB7XG4gICAgICAgIGNvbnN0IGRhdGFUb0JlUHJvY2Vzc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5lbGVtZW50cy5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZS50eXBlID09PSAnT1JHQU5JWkFUSU9OJyB8fCBlLnR5cGUgPT09ICdDT0RFU1lTVEVNJykge1xuICAgICAgICAgICAgZGF0YVRvQmVQcm9jZXNzZWRbZS5uYW1lXSA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGFUb0JlUHJvY2Vzc2VkKS5sZW5ndGgpIHtcbiAgICAgICAgICBuZXdWYWwuZm9yRWFjaCgocm93RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dEYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGFUb0JlUHJvY2Vzc2VkW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNnZXREYXRhTWV0YShkYXRhVG9CZVByb2Nlc3NlZFtrZXldLCByb3dEYXRhW2tleV0pLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtrZXkgKyAnX21ldGEnXSA9IG07XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm93RGF0YVtrZXkgKyAnX21ldGEnXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUFycmF5VmFsdWUoZmMsIG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiN1cGRhdGVBcnJheVZhbHVlKGZjLCBuZXdWYWwpO1xuICB9XG5cbiAgI3VwZGF0ZUFycmF5VmFsdWUoZmM6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gW10uY29uY2F0KG5ld1ZhbHVlKTtcbiAgICBmYy5wYXRjaFZhbHVlKFtdLmNvbmNhdChuZXdWYWx1ZSkpO1xuICAgIGZjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICBmYy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgI2dldERhdGFNZXRhKGZvcm1FbGVtZW50OiBhbnksIG5ld1ZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgc3dpdGNoIChmb3JtRWxlbWVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ09SR0FOSVpBVElPTic6IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy4jdXNlclNlcnZpY2UuZ2V0VXNlckJ5SWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gICNwYXRjaEZvcm1WYWx1ZShmb3JtVmFsdWU6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBbXTtcbiAgICAgIC8vIGNvcHkgYnkgdmFsdWUgZm9yIGFycmF5cyBvZiBvYmplY3RzIChlLmcuIHRhYmxlIGRhdGEpXG4gICAgICBmb3JtVmFsdWUuZm9yRWFjaCgobykgPT4gdmFsdWUucHVzaChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBtZXRob2QgYWRkaW5nIGEgbmV3IEZvcm1Db250cm9sIChncm91cCBvciBjb250cm9sKSB0byBhIHBhcmVudCBmb3JtIGdyb3VwXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRHcm91cCAtIHRoZSBwYXJlbnQgZ3JvdXAgdG8gYWRkIHRoZSBjb250cm9sIHRvXG4gICAqIEBwYXJhbSBmb3JtRWxlbWVudCAtIHRoZSBlbmFpbyBmb3JtIG1vZGVsIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSBjaGlsZCBjb250cm9sIGZyb21cbiAgICogQHBhcmFtIFt1c2VOYW1lXSAtIHVzZSB0aGlzIG5hbWUgaW5zdGVhZCBvZiB0aGUgb25lIGZyb20gdGhlIG1vZGVsXG4gICAqL1xuICAjYWRkRm9ybUNvbnRyb2wocGFyZW50R3JvdXA6IE9iamVjdEZvcm1Hcm91cCwgZm9ybUVsZW1lbnQ6IGFueSwgdXNlTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcblxuICAgIGxldCBjdHJsO1xuICAgIGxldCBuYW1lO1xuXG4gICAgLy8gYWRkIGEgZm9ybSBncm91cFxuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnbzJtR3JvdXAnIHx8IGZvcm1FbGVtZW50LnR5cGUgPT09ICdvMm1Hcm91cFN0YWNrJykge1xuICAgICAgLy8gZG8gbm90IGFkZCBncm91cHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIGNvbnN0IGlzUm9vdEdyb3VwID0gZm9ybUVsZW1lbnQubmFtZSAmJiAoZm9ybUVsZW1lbnQubmFtZSAhPT0gJ2RhdGEnIHx8IGZvcm1FbGVtZW50Lm5hbWUgIT09ICdjb3JlJyk7XG4gICAgICBpZiAoIWlzUm9vdEdyb3VwICYmICghZm9ybUVsZW1lbnQuZWxlbWVudHMgfHwgZm9ybUVsZW1lbnQuZWxlbWVudHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGb3VuZCBlbXB0eSBmb3JtIGdyb3VwJywgZm9ybUVsZW1lbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN0cmwgPSBuZXcgT2JqZWN0Rm9ybUdyb3VwKHt9KTtcbiAgICAgIGN0cmwuX2VvRm9ybUdyb3VwID0ge1xuICAgICAgICBsYXlvdXQ6IGZvcm1FbGVtZW50LmxheW91dCxcbiAgICAgICAgdHlwZTogZm9ybUVsZW1lbnQudHlwZVxuICAgICAgfTtcblxuICAgICAgaWYgKGZvcm1FbGVtZW50Lm5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuI3NraXBUcmFuc2xhdGlvbnNGb3IuaW5jbHVkZXMoZm9ybUVsZW1lbnQubmFtZSkpIHtcbiAgICAgICAgICBjdHJsLl9lb0Zvcm1Hcm91cC5sYWJlbCA9IGZvcm1FbGVtZW50Lm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWZvcm1FbGVtZW50LmxhYmVsKSB7XG4gICAgICAgICAgLy8gbm8gbGFiZWwsIHNvIHRyeSB0byB0cmFuc2xhdGUgdGhlIHRlY2huaWNhbCBuYW1lXG4gICAgICAgICAgY3RybC5fZW9Gb3JtR3JvdXAubGFiZWwgPSB0aGlzLiNzeXN0ZW1TZXJ2aWNlLmdldExvY2FsaXplZFJlc291cmNlKGAke2Zvcm1FbGVtZW50Lm5hbWV9X2xhYmVsYCkgfHwgZm9ybUVsZW1lbnQubmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGVyZSBpcyBhIGxhYmVsIHNvIHdlIHRha2UgdGhpcyBvbmVcbiAgICAgICAgICBjdHJsLl9lb0Zvcm1Hcm91cC5sYWJlbCA9IGZvcm1FbGVtZW50LmxhYmVsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VOYW1lID09PSAnY29yZScgfHwgdXNlTmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgIGN0cmwuX2VvRm9ybUdyb3VwLmxhYmVsID0gdXNlTmFtZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlIG9mIGZvcm1FbGVtZW50LmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuI2FkZEZvcm1Db250cm9sKGN0cmwsIGUpO1xuICAgICAgfVxuICAgICAgbmFtZSA9IHVzZU5hbWUgfHwgJ2ZnJyArIHRoaXMuZ0NvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkZCBmb3JtIGNvbnRyb2xcbiAgICAgIC8vIFRvIGJlIGFibGUgdG8gaW50ZWdyYXRlIHJlY3Vyc2l2ZSBmb3JtIGNvbnRyb2xzIGludG8gdGhlIG1haW4gZm9ybSxcbiAgICAgIC8vIHdlIGhhdmUgdG8gd3JhcCB0aGVtIGluIGEgZm9ybSBncm91cFxuICAgICAgY3RybCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgICAgY3RybC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIEZvcm1Db250cm9sXG4gICAgICAgIGNvbnRyb2xOYW1lOiBmb3JtRWxlbWVudC5uYW1lLFxuICAgICAgICBzaXR1YXRpb246IGZvLmZvcm1Nb2RlbC5zaXR1YXRpb25cbiAgICAgIH07XG5cbiAgICAgIC8vIGRvIG5vdCBzZXQgYSByZWZlcmVuY2UgYXMgdGhlIGZvcm0gY29udHJvbHMgdmFsdWVcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBjb3VsZCBub3QgcmVzZXQgdGhlIGZvcm1cbiAgICAgIGNvbnN0IHZhbHVlID0gZm9ybUVsZW1lbnQ/LnZhbHVlXG4gICAgICAgID8gdGhpcy4jcGF0Y2hGb3JtVmFsdWUoZm9ybUVsZW1lbnQ/LnZhbHVlKVxuICAgICAgICA6ICFVdGlscy5pc0VtcHR5KGZvcm1FbGVtZW50Py5kZWZhdWx0dmFsdWUpICYmIGZvLmZvcm1Nb2RlbC5zaXR1YXRpb24gPT09IFNpdHVhdGlvbi5DUkVBVEVcbiAgICAgICAgICA/IHRoaXMuI3BhdGNoRm9ybVZhbHVlKGZvcm1FbGVtZW50Py5kZWZhdWx0dmFsdWUpXG4gICAgICAgICAgOiBmb3JtRWxlbWVudD8udmFsdWU7XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGZvcm0gY29udHJvbFxuICAgICAgY29uc3QgY29udHJvbERpc2FibGVkID0gZm8uZGlzYWJsZWQgfHwgISFmb3JtRWxlbWVudC5yZWFkb25seTtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gbmV3IE9iamVjdEZvcm1Db250cm9sKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBpZiBmb3JtIGVsZW1lbnQgaGFzIGEgJ2xhYmVsJyBwcm9wZXJ0eSBpdCB3aWxsIGJlIHNob3duIGFzIGlzIC4uLlxuICAgICAgaWYgKCFmb3JtRWxlbWVudC5sYWJlbCkge1xuICAgICAgICAvLyAuLi4gaWYgdGhlcmUgaXMgbm8gbGFiZWwgYnV0IGEgJ2xhYmVsS2V5JyBwcm9wZXJ0eSB3ZSBhcmUgZ29pbmcgdG8gbG9jYWxpemUgdGhhdCBrZXkgLi4uXG4gICAgICAgIGlmIChmb3JtRWxlbWVudC5sYWJlbGtleSkge1xuICAgICAgICAgIGZvcm1FbGVtZW50LmxhYmVsID0gdGhpcy4jc3lzdGVtU2VydmljZS5nZXRMb2NhbGl6ZWRSZXNvdXJjZShgJHtmb3JtRWxlbWVudC5sYWJlbGtleX1fbGFiZWxgKSB8fCBmb3JtRWxlbWVudC5sYWJlbGtleTtcbiAgICAgICAgICBmb3JtRWxlbWVudC5kZXNjcmlwdGlvbiA9IHRoaXMuI3N5c3RlbVNlcnZpY2UuZ2V0TG9jYWxpemVkUmVzb3VyY2UoYCR7Zm9ybUVsZW1lbnQubGFiZWxrZXl9X2Rlc2NyaXB0aW9uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gLi4uIG5vICdsYWJlbCcgYW5kIGFsc28gbm8gJ2xhYmVsS2V5JyBtZWFucyB0aGF0IHdlIGFyZSBzaG93aW5nIHRlY2huaWNhbCBuYW1lIGluc3RlYWRcbiAgICAgICAgICBmb3JtRWxlbWVudC5sYWJlbCA9IGZvcm1FbGVtZW50Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvcm1FbGVtZW50LnJlYWRvbmx5ID0gY29udHJvbERpc2FibGVkO1xuICAgICAgLy8gd2UgYXJlIHVzaW5nIGFuIGludGVybmFsIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgY29tcG9uZW50c1xuICAgICAgLy8gdG8gYmUgdXNlZCB0byByZW5kZXIgY2VydGFpbiBmb3JtIGVsZW1lbnRzXG4gICAgICBmb3JtRWxlbWVudC5faW50ZXJuYWxUeXBlID0gdGhpcy4jc3lzdGVtU2VydmljZS5nZXRJbnRlcm5hbEZvcm1FbGVtZW50VHlwZShmb3JtRWxlbWVudC50eXBlLCBmb3JtRWxlbWVudC5jbGFzc2lmaWNhdGlvbnMpO1xuXG4gICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgdGhpcy4jZm9ybUNvbnRyb2xzW2Zvcm1FbGVtZW50Lm5hbWVdID0gZm9ybUNvbnRyb2w7XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgIC8vIEFkZCAnb25yb3dlZGl0JyBwcm9wZXJ0eSBldmVuIGlmIGl0J3Mgbm90IHNldC5cbiAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBtb2JYLU9ic2VydmVyIHdvdWxkIG5vdCByZWNvZ25pemVcbiAgICAgICAgLy8gY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IGFwcGxpZWQgYnkgdGhlIGZvcm0gc2NyaXB0XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQpLmluY2x1ZGVzKCdvbnJvd2VkaXQnKSkge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lm9ucm93ZWRpdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUgJiYgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAvLyBoYXZpbmcgYSBzY3JpcHRpbmcgc2NvcGUgYW5kIHRhYmxlIHJvd3MgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNldCBlbXB0eVxuICAgICAgICAgIC8vIGNvbHVtbnMgdG8gTlVMTCwgYmVjYXVzZSBvdGhlcndpc2UgbW9iWCB3b24ndCBiZSBhYmxlIHRvIHRyYWNrIHRob3NlIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IHZhbHVlRmllbGRzID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZWxlbWVudHMubWFwKChlOiBhbnkpID0+IGUubmFtZSk7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQudmFsdWUuZm9yRWFjaCgocm93VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdmFsdWVGaWVsZHMuZm9yRWFjaCgodmFsdWVGaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMocm93VmFsdWUpLmluY2x1ZGVzKHZhbHVlRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgcm93VmFsdWVbdmFsdWVGaWVsZF0gPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyB1cGRhdGUgZm9ybSBjb250cm9scyB2YWx1ZSBhcyB3ZWxsIHRvIHJlZmxlY3QgdGhlIG9ic2VydmVkIHZhbHVlXG4gICAgICAgICAgZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC52YWx1ZSwge1xuICAgICAgICAgICAgb25seVNlbGY6IHRydWUsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGVtaXRWaWV3VG9Nb2RlbENoYW5nZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQuX2ludGVybmFsVHlwZSA9PT0gJ3N0cmluZzpvcmdhbml6YXRpb24nKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnNldEZpbHRlciA9IChmaWx0ZXJPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmZpbHRlciA9IGZpbHRlck9iamVjdDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0Rm9ybVV0aWxzLnVwZGF0ZUZvcm1FbGVtZW50KGZvcm1FbGVtZW50KTtcblxuICAgICAgLy8gcmVtb3ZlIGVtcHR5IGRlc2NyaXB0aW9uc1xuICAgICAgY29uc3QgZGVzYyA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmb3JtIGVsZW1lbnQgdG8gdGhlIHNjcmlwdCBtb2RlbCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAgLy8gdGhlIGZvcm1zIHNjcmlwdGluZyBzY29wZSBsYXRlciBvblxuICAgICAgdGhpcy4jc2NyaXB0TW9kZWxbZm9ybUVsZW1lbnQubmFtZV0gPSBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudDtcblxuICAgICAgLy8gYXBwbHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBmb3JtIGNvbnRyb2wsIHRoYXQgd2lsbCB0cmlnZ2VyXG4gICAgICAvLyB0aGUgZm9ybSBlbGVtZW50cyBvbkNoYW5nZSBsaXN0ZW5lclxuICAgICAgY29uc3QgY29udHJvbFdhdGNoID0gY3RybC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNTAwKSk7XG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbnRyb2xXYXRjaC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLm1vZGVsQ2hhbmdlZCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjdHJsLmFkZENvbnRyb2woZm9ybUVsZW1lbnQubmFtZSwgZm9ybUNvbnRyb2wpO1xuICAgICAgbmFtZSA9IHRoaXMuI25hbWVQcmVmaXggKyBmb3JtRWxlbWVudC5uYW1lO1xuICAgIH1cbiAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKG5hbWUsIGN0cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHZhbGlkYXRvcnMgZm9yIHRoZSBnaXZlbiBmb3JtIGVsZW1lbnQgdG8gYmUgYXR0YWNoZWQgdG9cbiAgICogYSByZWFjdGl2ZSBmb3JtQ29udHJvbC5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1FbGVtZW50IC0gZm9ybSBlbGVtZW50IG9iamVjdFxuICAgKi9cbiAgI2dldFZhbGlkYXRvcnMoZm9ybUVsZW1lbnQ6IGFueSk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGNvbnN0IGVsbVZhbGlkYXRvcnMgPSBGb3JtVmFsaWRhdGlvbi5nZXRWYWxpZGF0b3JzKGZvcm1FbGVtZW50LCBmbz8uZm9ybU1vZGVsLnNpdHVhdGlvbik7XG5cbiAgICAvLyBhZGQgY3VzdG9tIHZhbGlkYXRvciBmb3Igc2NyaXB0IGVuYWJsZWQgZm9ybXNcbiAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgIGVsbVZhbGlkYXRvcnMucHVzaChGb3JtVmFsaWRhdGlvbi5jdXN0b21TY3JpcHRpbmdWYWxpZGF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxtVmFsaWRhdG9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZm9ybVxuICAgKi9cbiAgI2Zvcm1Ub0RhdGEoKSB7XG4gICAgY29uc3QgZm8gPSB0aGlzLmZvcm1PcHRpb25zKCk7XG4gICAgcmV0dXJuIGZvICYmIHRoaXMuZm9ybSA/IHRoaXMuI2Zvcm1IZWxwZXJTZXJ2aWNlLmV4dHJhY3RGb3JtRGF0YSh0aGlzLmZvcm0sIGZvLmZvcm1Nb2RlbC5zaXR1YXRpb24sIGZvLmRhdGEsIHRoaXMuaXNJbm5lclRhYmxlRm9ybSgpKSA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGRhdGEgaW50byBhIGZvcm0gbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIGRhdGEgLSBkYXRhIG9iamVjdCBvciBhcnJheSBvZiBTZWFyY2hGaWx0ZXIgb2JqZWN0cyBpbiBjYXNlIG9mIGEgc2VhcmNoIGZvcm1cbiAgICovXG4gICNkYXRhVG9Gb3JtKG1vZGVsOiBhbnksIGRhdGE6IGFueSkge1xuICAgIGlmIChtb2RlbCAmJiBkYXRhKSB7XG4gICAgICB0aGlzLiNzZXRFbGVtZW50VmFsdWVzKG1vZGVsLmVsZW1lbnRzLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlIG1ldGhvZCBmb3IgYWRkaW5nIHZhbHVlcyB0byBtb2RlbCBlbGVtZW50c1xuICAjc2V0RWxlbWVudFZhbHVlcyhlbGVtZW50czogYW55W10sIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLiNoYXNWYWx1ZShkYXRhLCBlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0gdGhpcy4jZ2V0VmFsdWUoZGF0YSwgZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZWxlbWVudC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LnR5cGUgIT09ICdUQUJMRScgJiYgZWxlbWVudC5lbGVtZW50cyAmJiBlbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy4jc2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LmVsZW1lbnRzLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICNoYXNWYWx1ZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZWxlbWVudDogYW55KSB7XG4gICAgLy8gZGlmZmVyIGJldHdlZW4gYXJyYXkgb2YgU2VhcmNoRmlsdGVycyBhbmQgYSBmb3JtIGRhdGEgb2JqZWN0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiAhIWRhdGEuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIucHJvcGVydHkgPT09IGVsZW1lbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSkuaW5jbHVkZXMoZWxlbWVudC5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAjZ2V0VmFsdWUoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiBkYXRhW2VsZW1lbnQubmFtZV07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgdGhpcy4jZm9ybVNjcmlwdGluZ0FwaVNlcnZpY2UudW5yZWdpc3RlckFjdGl2ZUZvcm0odGhpcyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy4jY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgdmFsdWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgdGhlIGN1cnJlbnQgZm9ybVxuICAvLyB0byBhdm9pZCBtZW1vcnkgbGVha3MuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBiZSBjYWxsZWQgZXZlcnkgdGltZVxuICAvLyBhIG5ldyBmb3JtIGlzIHJlbmRlcmVkIHRvIGdldCByaWQgb2YgdGhlIG9sZCBmb3JtIGVsZW1lbnQgc3Vic2NyaXB0aW9uc1xuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgIGlmICh0aGlzLiNzdWJzY3JpcHRpb25zLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygndW5zdWJzY3JpYmVkIGZyb20gJyArIHRoaXMuI3N1YnNjcmlwdGlvbnMubGVuZ3RoICsgJyB2YWx1ZSBjaGFuZ2UgbGlzdGVuZXJzLicpO1xuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbiAgfVxufVxuIiwiQGxldCBmbyA9IGZvcm1PcHRpb25zKCk7XG5AaWYgKGZvICYmIGZvcm0pIHtcbiAgPGRpdiBjbGFzcz1cInl1di1vYmplY3QtZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWVsZW1lbnQtd3JhcCBjb3JlXCI+XG4gICAgICA8eXV2LW9iamVjdC1mb3JtLWdyb3VwIFtncm91cF09XCJnZXRHcm91cCgnY29yZScpXCIgW3NpdHVhdGlvbl09XCJmby5mb3JtTW9kZWwuc2l0dWF0aW9uXCI+PC95dXYtb2JqZWN0LWZvcm0tZ3JvdXA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZWxlbWVudC13cmFwIGRhdGFcIj5cbiAgICAgIDx5dXYtb2JqZWN0LWZvcm0tZ3JvdXAgW2dyb3VwXT1cImdldEdyb3VwKCdkYXRhJylcIiBbc2l0dWF0aW9uXT1cImZvLmZvcm1Nb2RlbC5zaXR1YXRpb25cIj48L3l1di1vYmplY3QtZm9ybS1ncm91cD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=
|