barsa-sap-ui 2.2.73 → 2.2.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/barsa-sap-ui.mjs +756 -760
- package/fesm2022/barsa-sap-ui.mjs.map +1 -1
- package/lib/models/grid-data-provider.d.ts +1 -1
- package/lib/notification-popup.service.d.ts +1 -1
- package/lib/ui-grid-columns/ui-grid-columns.component.d.ts +1 -1
- package/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.d.ts +1 -1
- package/lib/ui-pictures-info/ui-pictures-info.component.d.ts +2 -2
- package/lib/ui-table-view/ui-table-view.component.d.ts +4 -4
- package/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.d.ts +1 -1
- package/lib/ul-notify-popup/ul-notify-popup.component.d.ts +1 -1
- package/lib/ulv-toolbar/ulv-toolbar.component.d.ts +2 -2
- package/package.json +3 -5
- package/esm2022/barsa-sap-ui.mjs +0 -5
- package/esm2022/lib/apply-conditional-formmatings.directive.mjs +0 -90
- package/esm2022/lib/avatar-size.pipe.mjs +0 -41
- package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +0 -41
- package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +0 -153
- package/esm2022/lib/barsa-bar-download-file/barsa-bar-download-file.component.mjs +0 -30
- package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +0 -23
- package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +0 -29
- package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +0 -24
- package/esm2022/lib/barsa-card-banner/barsa-card-banner.component.mjs +0 -38
- package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +0 -24
- package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +0 -31
- package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +0 -41
- package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +0 -24
- package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +0 -84
- package/esm2022/lib/barsa-chat/chat.model.mjs +0 -8
- package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +0 -13
- package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +0 -22
- package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +0 -117
- package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +0 -79
- package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +0 -22
- package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +0 -13
- package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +0 -15
- package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +0 -72
- package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +0 -23
- package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +0 -14
- package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +0 -14
- package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +0 -26
- package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +0 -71
- package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +0 -40
- package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +0 -61
- package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +0 -45
- package/esm2022/lib/barsa-form-layout-panel/barsa-form-layout-panel.component.mjs +0 -58
- package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +0 -58
- package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +0 -27
- package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +0 -94
- package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +0 -22
- package/esm2022/lib/barsa-img-skeleton/barsa-img-skeleton.component.mjs +0 -25
- package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +0 -37
- package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +0 -42
- package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +0 -30
- package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +0 -23
- package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +0 -43
- package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +0 -83
- package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +0 -57
- package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +0 -159
- package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +0 -17
- package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +0 -30
- package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +0 -14
- package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +0 -34
- package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +0 -46
- package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +0 -79
- package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +0 -30
- package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +0 -31
- package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +0 -28
- package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +0 -103
- package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +0 -26
- package/esm2022/lib/barsa-sap-ui-routing.module.mjs +0 -18
- package/esm2022/lib/barsa-sap-ui.module.mjs +0 -369
- package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +0 -30
- package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +0 -171
- package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +0 -18
- package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +0 -29
- package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +0 -230
- package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +0 -102
- package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +0 -60
- package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +0 -26
- package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +0 -23
- package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +0 -37
- package/esm2022/lib/barsa-theme/barsa-theme.component.mjs +0 -121
- package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +0 -419
- package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +0 -36
- package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +0 -153
- package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +0 -20
- package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +0 -248
- package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +0 -79
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -52
- package/esm2022/lib/captcha-field/captcha-field.component.mjs +0 -33
- package/esm2022/lib/card-item/card-item.component.mjs +0 -79
- package/esm2022/lib/card-view-content/card-view-content.component.mjs +0 -46
- package/esm2022/lib/col-renderer.directive.mjs +0 -47
- package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +0 -56
- package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +0 -61
- package/esm2022/lib/column-renderer/column-renderer.component.mjs +0 -108
- package/esm2022/lib/constants.mjs +0 -450
- package/esm2022/lib/contentDensity.directive.mjs +0 -25
- package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +0 -41
- package/esm2022/lib/device-info-field-base.mjs +0 -24
- package/esm2022/lib/dialog-handler.directive.mjs +0 -29
- package/esm2022/lib/download-files.directive.mjs +0 -34
- package/esm2022/lib/dynamic-page-size.pipe.mjs +0 -27
- package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +0 -44
- package/esm2022/lib/file-viewer/file-viewer.component.mjs +0 -47
- package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +0 -80
- package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +0 -40
- package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -175
- package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +0 -50
- package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +0 -62
- package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +0 -45
- package/esm2022/lib/form-wizard/form-wizard.component.mjs +0 -22
- package/esm2022/lib/fullscreen-dialog.directive.mjs +0 -60
- package/esm2022/lib/fullscreen-files.directive.mjs +0 -43
- package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +0 -220
- package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +0 -215
- package/esm2022/lib/global-search/global-search.component.mjs +0 -27
- package/esm2022/lib/global-search-module/global-search-module.component.mjs +0 -29
- package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +0 -25
- package/esm2022/lib/header-avatar/header-avatar.component.mjs +0 -18
- package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +0 -48
- package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -23
- package/esm2022/lib/index.mjs +0 -467
- package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +0 -32
- package/esm2022/lib/layout-actions/layout-actions.component.mjs +0 -70
- package/esm2022/lib/layout-control/layout-control.component.mjs +0 -320
- package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +0 -180
- package/esm2022/lib/list-item/list-item.component.mjs +0 -34
- package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +0 -42
- package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +0 -82
- package/esm2022/lib/ly-label/ly-label.component.mjs +0 -39
- package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +0 -83
- package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +0 -24
- package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +0 -24
- package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +0 -92
- package/esm2022/lib/ly-line/ly-line.component.mjs +0 -56
- package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +0 -22
- package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +0 -44
- package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +0 -49
- package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +0 -51
- package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +0 -43
- package/esm2022/lib/mask/mask.component.mjs +0 -22
- package/esm2022/lib/message-strip/message-strip.component.mjs +0 -29
- package/esm2022/lib/models/grid-data-provider.mjs +0 -121
- package/esm2022/lib/models/grid-view.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -2
- package/esm2022/lib/no-data/no-data.component.mjs +0 -30
- package/esm2022/lib/notification-item/notification-item.component.mjs +0 -57
- package/esm2022/lib/notification-item-actions/notification-item-actions.component.mjs +0 -79
- package/esm2022/lib/notification-popup.service.mjs +0 -92
- package/esm2022/lib/object-status-icon.pipe.mjs +0 -27
- package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +0 -18
- package/esm2022/lib/report-navigator/report-navigator.component.mjs +0 -75
- package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +0 -61
- package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +0 -35
- package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +0 -97
- package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +0 -88
- package/esm2022/lib/report-tree-base.mjs +0 -387
- package/esm2022/lib/report-view-renderer.directive.mjs +0 -395
- package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +0 -50
- package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +0 -84
- package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +0 -74
- package/esm2022/lib/sap-font-class.pipe.mjs +0 -30
- package/esm2022/lib/sap-font.pipe.mjs +0 -30
- package/esm2022/lib/sap-size.pipe.mjs +0 -28
- package/esm2022/lib/sap-ui-report-base.component.mjs +0 -819
- package/esm2022/lib/search-panel/search-panel.component.mjs +0 -63
- package/esm2022/lib/static-text/static-text.component.mjs +0 -15
- package/esm2022/lib/table-th.directive.mjs +0 -87
- package/esm2022/lib/title/title.component.mjs +0 -15
- package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +0 -44
- package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +0 -33
- package/esm2022/lib/ui-button/ui-button.component.mjs +0 -32
- package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +0 -54
- package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +0 -63
- package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +0 -43
- package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +0 -44
- package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +0 -50
- package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +0 -38
- package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +0 -191
- package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +0 -150
- package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +0 -111
- package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +0 -53
- package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +0 -138
- package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +0 -104
- package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +0 -33
- package/esm2022/lib/ui-graph/ui-graph.component.mjs +0 -17
- package/esm2022/lib/ui-grid/ui-grid.component.mjs +0 -26
- package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +0 -43
- package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +0 -66
- package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +0 -75
- package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +0 -58
- package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +0 -123
- package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +0 -16
- package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +0 -11
- package/esm2022/lib/ui-label/ui-label.component.mjs +0 -12
- package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +0 -405
- package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +0 -85
- package/esm2022/lib/ui-map/ui-map.component.mjs +0 -68
- package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +0 -124
- package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +0 -19
- package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +0 -14
- package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +0 -55
- package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +0 -450
- package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +0 -28
- package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +0 -37
- package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +0 -59
- package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +0 -117
- package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +0 -36
- package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +0 -56
- package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +0 -28
- package/esm2022/lib/ui-notification-view/ui-notification-view.component.mjs +0 -47
- package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +0 -33
- package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +0 -27
- package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +0 -21
- package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +0 -271
- package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +0 -103
- package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +0 -260
- package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +0 -48
- package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +0 -36
- package/esm2022/lib/ui-report-carousel-view/ui-report-carousel-view.component.mjs +0 -140
- package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +0 -66
- package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +0 -24
- package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +0 -55
- package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +0 -36
- package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +0 -20
- package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +0 -296
- package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +0 -50
- package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +0 -52
- package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +0 -48
- package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +0 -24
- package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +0 -50
- package/esm2022/lib/ui-tree/ui-tree.component.mjs +0 -115
- package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +0 -100
- package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +0 -23
- package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +0 -313
- package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +0 -25
- package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +0 -93
- package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +0 -119
- package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +0 -32
- package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +0 -48
- package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +0 -53
- package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +0 -116
- package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +0 -43
- package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +0 -196
- package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +0 -44
- package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +0 -84
- package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +0 -65
- package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +0 -116
- package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +0 -54
- package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +0 -177
- package/esm2022/lib/upload-file-status.pipe.mjs +0 -29
- package/esm2022/lib/util-chat-time-badge.pipe.mjs +0 -18
- package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +0 -23
- package/esm2022/lib/wizard-layout.directive.mjs +0 -104
- package/esm2022/public-api.mjs +0 -242
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, HostBinding, Input } from '@angular/core';
|
|
2
|
-
import { FieldBaseComponent, BarsaApi, UploadService, getValidExtension, FilesValidationHelper, ImageMimeType } from 'barsa-novin-ray-core';
|
|
3
|
-
import { of } from 'rxjs';
|
|
4
|
-
import { concatMap, exhaustMap, takeUntil, tap } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common";
|
|
7
|
-
import * as i2 from "@angular/forms";
|
|
8
|
-
import * as i3 from "barsa-novin-ray-core";
|
|
9
|
-
import * as i4 from "@fundamental-ngx/core/avatar";
|
|
10
|
-
import * as i5 from "@fundamental-ngx/core/button";
|
|
11
|
-
import * as i6 from "@fundamental-ngx/core/file-uploader";
|
|
12
|
-
import * as i7 from "@fundamental-ngx/core/toolbar";
|
|
13
|
-
import * as i8 from "@fundamental-ngx/core/slider";
|
|
14
|
-
import * as i9 from "../mask/mask.component";
|
|
15
|
-
export class UiPictureFileComponent extends FieldBaseComponent {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(...arguments);
|
|
18
|
-
this._editable = true;
|
|
19
|
-
this.files = [];
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
super.ngOnInit();
|
|
23
|
-
if (this.Setting?.IsReadOnly === true) {
|
|
24
|
-
this._editable = false;
|
|
25
|
-
}
|
|
26
|
-
this.uploadingState$ = this._uploadService.uploadingState$;
|
|
27
|
-
this.context.on({
|
|
28
|
-
DispalyImage: this._displayImage.bind(this)
|
|
29
|
-
});
|
|
30
|
-
const x = 45;
|
|
31
|
-
const layoutHeight = +BarsaApi.Common.Util.TryGetValue(this.layoutInfo, 'ControlBounds.height', x);
|
|
32
|
-
this.layoutHeight = layoutHeight < x ? 'cacl(var(--sapElement_Height) +10px)' : `${layoutHeight}px`;
|
|
33
|
-
this.imageUrl = this.context.imageUrl;
|
|
34
|
-
this.value = this.context._value;
|
|
35
|
-
this.validExtensions = getValidExtension(this.Setting.ValidExtensions) || ImageMimeType;
|
|
36
|
-
this.filesValidationHelper = new FilesValidationHelper(1, this.Setting.MaxFileSizeKb, this.Setting.MaxFileSizeKb);
|
|
37
|
-
}
|
|
38
|
-
ngOnDestroy() {
|
|
39
|
-
super.ngOnDestroy();
|
|
40
|
-
this.context.un('DisplayImage', this._displayImage);
|
|
41
|
-
}
|
|
42
|
-
onFileSelection(files) {
|
|
43
|
-
const isValid = this.filesValidationHelper.validateFiles(files);
|
|
44
|
-
if (isValid) {
|
|
45
|
-
this.uploadFile(files).pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
onFileDeleted(uploaderComponent) {
|
|
49
|
-
uploaderComponent.inputRef.nativeElement.value = '';
|
|
50
|
-
this.value = null;
|
|
51
|
-
this.fireContextEvent('Change', this.context, null);
|
|
52
|
-
}
|
|
53
|
-
onDownloadFile() {
|
|
54
|
-
BarsaApi.Common.File.OpenFile(this.value.FileId, false, this, true, false);
|
|
55
|
-
}
|
|
56
|
-
onRetry() {
|
|
57
|
-
this._upload(this.files);
|
|
58
|
-
}
|
|
59
|
-
onTerminate() {
|
|
60
|
-
this._uploadService.cancelation$.next();
|
|
61
|
-
this._cdr.detectChanges();
|
|
62
|
-
}
|
|
63
|
-
_displayImage(imageUrl, sizeMode, value) {
|
|
64
|
-
this.imageUrl = imageUrl;
|
|
65
|
-
this.value = value;
|
|
66
|
-
this.sizeMode = sizeMode;
|
|
67
|
-
}
|
|
68
|
-
_upload(files) {
|
|
69
|
-
of(true)
|
|
70
|
-
.pipe(takeUntil(this._onDestroy$), exhaustMap(() => this.uploadFile(files)))
|
|
71
|
-
.subscribe();
|
|
72
|
-
}
|
|
73
|
-
uploadFile(files) {
|
|
74
|
-
return this._uploadService.compressFiles$(files).pipe(concatMap((formData) => this._uploadService.upload(formData, this.Setting.ControlFieldDefId).pipe(tap((res) => {
|
|
75
|
-
if (Array.isArray(res)) {
|
|
76
|
-
const picture = res[0];
|
|
77
|
-
if (picture.ErrorMsg) {
|
|
78
|
-
BarsaApi.Bw.Msg.Error(picture.ErrorMsg);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const value = {
|
|
82
|
-
...picture,
|
|
83
|
-
FileId: picture.FileId
|
|
84
|
-
};
|
|
85
|
-
this.fireContextEvent('Change', this.context, value);
|
|
86
|
-
}
|
|
87
|
-
}))));
|
|
88
|
-
}
|
|
89
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPictureFileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
90
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UiPictureFileComponent, selector: "bsu-ui-picture-file", inputs: { imageUrl: "imageUrl", sizeMode: "sizeMode" }, host: { properties: { "class.editable": "this._editable" } }, providers: [UploadService], usesInheritance: true, ngImport: i0, template: "<div\r\n [style.max-height]=\"Setting.SizeMode === '2' ? null : layoutHeight\"\r\n [class.no-inlineEdit]=\"!inlineEdit\"\r\n [style.min-height.px]=\"!value && !inlineEdit ? null : 140\"\r\n [class.inlineEdit]=\"inlineEdit\"\r\n>\r\n @if (!((disableOrReadonly$ | async) === true || Setting.IsReadOnly === true)) {\r\n <div>\r\n <fd-toolbar [fdType]=\"'transparent'\" [clearBorder]=\"value && imageUrl ? false : true\">\r\n <fd-file-uploader\r\n #uploader\r\n fd-toolbar-item\r\n [style.display]=\"'none'\"\r\n [id]=\"id\"\r\n [name]=\"'uploader_' + id\"\r\n [placeholder]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonAriaLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [accept]=\"validExtensions\"\r\n [(ngModel)]=\"files\"\r\n [multiple]=\"false\"\r\n (selectedFilesChanged)=\"onFileSelection($event)\"\r\n ></fd-file-uploader>\r\n @if(value && !value?.IsDeleted){\r\n <button\r\n fd-button\r\n fd-toolbar-item\r\n glyph=\"print\"\r\n fdType=\"transparent\"\r\n printFiles\r\n [files]=\"[{ Id: '0', IsNew: true, IsDeleted: false, Type: 'image', mediaUrl: imageUrl }]\"\r\n ></button>\r\n <button\r\n fd-button\r\n fd-toolbar-item\r\n glyph=\"download\"\r\n fdType=\"transparent\"\r\n [name]=\"Setting.ControlFieldCaption + value.Ext\"\r\n [src]=\"imageUrl\"\r\n saveImage\r\n ></button>\r\n }\r\n <button\r\n class=\"delete\"\r\n fd-button\r\n fd-toolbar-item\r\n [disabled]=\"!this.value || value?.IsDeleted\"\r\n glyph=\"delete\"\r\n [fdType]=\"'transparent'\"\r\n (click)=\"onFileDeleted(uploader)\"\r\n ></button>\r\n <button\r\n fd-toolbar-item\r\n fd-button\r\n [disabled]=\"this.value && value?.IsDeleted !== true\"\r\n glyph=\"attachment\"\r\n [fdType]=\"'transparent'\"\r\n (click)=\"uploader.open()\"\r\n ></button>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n loadingTpl;\r\n context: {\r\n uploadingState: uploadingState$ | async\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n </fd-toolbar>\r\n </div>\r\n } @if (!inlineEdit) {\r\n <div\r\n [style.max-height.px]=\"Setting.SizeMode === '0' ? layoutInfo.ControlBounds.height : null\"\r\n [style.max-width.px]=\"Setting.SizeMode === '0' ? layoutInfo.ControlBounds.width : null\"\r\n [class.centerImage]=\"Setting.SizeMode === '3'\"\r\n >\r\n @if (value && imageUrl) {\r\n <bsu-mask [top]=\"'0px'\"></bsu-mask>\r\n } @if ((value && imageUrl) || Setting.HasDefaultPicture) {\r\n <img\r\n imgLazy\r\n [imgLazy]=\"imageUrl\"\r\n [src]=\"imageUrl\"\r\n [ngClass]=\"Setting.SizeMode === '1' ? 'cover' : 'contain'\"\r\n [style.height.px]=\"Setting.SizeMode !== '2' ? layoutInfo.ControlBounds.height : null\"\r\n />\r\n }\r\n </div>\r\n } @else {\r\n <fd-avatar [size]=\"'m'\" [image]=\"imageUrl\"></fd-avatar>\r\n }\r\n</div>\r\n<ng-template #loadingTpl let-uploadingState=\"uploadingState\">\r\n @if (uploadingState && uploadingState.state !== 'Complete' && uploadingState.uploading) {\r\n <fd-slider\r\n [(ngModel)]=\"uploadingState.progress\"\r\n [name]=\"'slider_' + id\"\r\n fd-toolbar-item\r\n [id]=\"id + '1'\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n >\r\n </fd-slider>\r\n @if (uploadingState.state === 'Uploading') {\r\n <button fd-toolbar-item fd-button glyph=\"stop\" fdType=\"transparent\" (click)=\"onTerminate()\"></button>\r\n } @if (uploadingState.state === 'Error') {\r\n <button fd-toolbar-item fd-button glyph=\"refresh\" [fdType]=\"'transparent'\" (click)=\"onRetry()\"></button>\r\n } }\r\n</ng-template>\r\n", styles: [":host{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;position:relative;overflow:hidden;margin-bottom:.25rem;margin-top:.1875rem}:host.editable{border:.0625rem solid var(--sapGroup_TitleBorderColor)}:host ::ng-deep .fd-slider__handle{display:none}:host ::ng-deep .delete button{border-color:transparent!important;background-color:transparent!important}img{width:100%}.pic-wrapper{background-repeat:no-repeat;background-position:center}.cover{max-width:100%;max-height:100%;min-height:100%;width:100%;height:100%;background-size:cover}.contain{max-width:100%;max-height:100%;min-height:100%;width:auto;height:100%;background-size:contain}.no-inlineEdit{width:100%;position:relative;display:flex;flex-direction:column}.inlineEdit{width:100%;position:relative;display:flex;flex-direction:row-reverse;align-items:flex-end;justify-content:flex-start}.centerImage{display:flex;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.ImageLazyDirective, selector: "[imgLazy]", inputs: ["auto", "threshold", "imgLazy"], outputs: ["imageLoaded"] }, { kind: "directive", type: i3.PrintFilesDirective, selector: "[printFiles]", inputs: ["files", "file", "isImageGallery", "component"] }, { kind: "directive", type: i3.SaveImageDirective, selector: "[saveImage]", inputs: ["name", "src"] }, { kind: "component", type: i4.AvatarComponent, selector: "fd-avatar", inputs: ["class", "id", "ariaLabel", "ariaLabelledby", "label", "size", "font", "glyph", "zoomGlyph", "circle", "transparent", "contain", "placeholder", "tile", "border", "colorAccent", "colorIndication", "random", "clickable", "valueState", "image", "alterIcon", "backupImage"], outputs: ["avatarClicked", "zoomGlyphClicked"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.FileUploaderComponent, selector: "fd-file-uploader", inputs: ["disabled", "required", "multiple", "accept", "dragndrop", "maxFileSize", "minFileSize", "id", "ariaLabel", "ariaLabelledBy", "placeholder", "buttonLabel", "buttonAriaLabel", "state", "fileLimit", "inputHidden", "width"], outputs: ["selectedFilesChanged", "selectedInvalidFiles", "onDragEnter", "onDragLeave"] }, { kind: "component", type: i7.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "headingLevel", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i7.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i8.SliderComponent, selector: "fd-slider", inputs: ["id", "class", "ariaLabelledBy", "ariaLabel", "min", "max", "step", "jump", "tickmarksBetweenLabels", "mode", "showTicks", "showTicksLabels", "customValues", "tooltipMode", "hideProgressBar", "disabled", "vertical", "value"] }, { kind: "component", type: i9.MaskComponent, selector: "bsu-mask", inputs: ["size", "top"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
91
|
-
}
|
|
92
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPictureFileComponent, decorators: [{
|
|
93
|
-
type: Component,
|
|
94
|
-
args: [{ selector: 'bsu-ui-picture-file', changeDetection: ChangeDetectionStrategy.OnPush, providers: [UploadService], standalone: false, template: "<div\r\n [style.max-height]=\"Setting.SizeMode === '2' ? null : layoutHeight\"\r\n [class.no-inlineEdit]=\"!inlineEdit\"\r\n [style.min-height.px]=\"!value && !inlineEdit ? null : 140\"\r\n [class.inlineEdit]=\"inlineEdit\"\r\n>\r\n @if (!((disableOrReadonly$ | async) === true || Setting.IsReadOnly === true)) {\r\n <div>\r\n <fd-toolbar [fdType]=\"'transparent'\" [clearBorder]=\"value && imageUrl ? false : true\">\r\n <fd-file-uploader\r\n #uploader\r\n fd-toolbar-item\r\n [style.display]=\"'none'\"\r\n [id]=\"id\"\r\n [name]=\"'uploader_' + id\"\r\n [placeholder]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonAriaLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [accept]=\"validExtensions\"\r\n [(ngModel)]=\"files\"\r\n [multiple]=\"false\"\r\n (selectedFilesChanged)=\"onFileSelection($event)\"\r\n ></fd-file-uploader>\r\n @if(value && !value?.IsDeleted){\r\n <button\r\n fd-button\r\n fd-toolbar-item\r\n glyph=\"print\"\r\n fdType=\"transparent\"\r\n printFiles\r\n [files]=\"[{ Id: '0', IsNew: true, IsDeleted: false, Type: 'image', mediaUrl: imageUrl }]\"\r\n ></button>\r\n <button\r\n fd-button\r\n fd-toolbar-item\r\n glyph=\"download\"\r\n fdType=\"transparent\"\r\n [name]=\"Setting.ControlFieldCaption + value.Ext\"\r\n [src]=\"imageUrl\"\r\n saveImage\r\n ></button>\r\n }\r\n <button\r\n class=\"delete\"\r\n fd-button\r\n fd-toolbar-item\r\n [disabled]=\"!this.value || value?.IsDeleted\"\r\n glyph=\"delete\"\r\n [fdType]=\"'transparent'\"\r\n (click)=\"onFileDeleted(uploader)\"\r\n ></button>\r\n <button\r\n fd-toolbar-item\r\n fd-button\r\n [disabled]=\"this.value && value?.IsDeleted !== true\"\r\n glyph=\"attachment\"\r\n [fdType]=\"'transparent'\"\r\n (click)=\"uploader.open()\"\r\n ></button>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n loadingTpl;\r\n context: {\r\n uploadingState: uploadingState$ | async\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n </fd-toolbar>\r\n </div>\r\n } @if (!inlineEdit) {\r\n <div\r\n [style.max-height.px]=\"Setting.SizeMode === '0' ? layoutInfo.ControlBounds.height : null\"\r\n [style.max-width.px]=\"Setting.SizeMode === '0' ? layoutInfo.ControlBounds.width : null\"\r\n [class.centerImage]=\"Setting.SizeMode === '3'\"\r\n >\r\n @if (value && imageUrl) {\r\n <bsu-mask [top]=\"'0px'\"></bsu-mask>\r\n } @if ((value && imageUrl) || Setting.HasDefaultPicture) {\r\n <img\r\n imgLazy\r\n [imgLazy]=\"imageUrl\"\r\n [src]=\"imageUrl\"\r\n [ngClass]=\"Setting.SizeMode === '1' ? 'cover' : 'contain'\"\r\n [style.height.px]=\"Setting.SizeMode !== '2' ? layoutInfo.ControlBounds.height : null\"\r\n />\r\n }\r\n </div>\r\n } @else {\r\n <fd-avatar [size]=\"'m'\" [image]=\"imageUrl\"></fd-avatar>\r\n }\r\n</div>\r\n<ng-template #loadingTpl let-uploadingState=\"uploadingState\">\r\n @if (uploadingState && uploadingState.state !== 'Complete' && uploadingState.uploading) {\r\n <fd-slider\r\n [(ngModel)]=\"uploadingState.progress\"\r\n [name]=\"'slider_' + id\"\r\n fd-toolbar-item\r\n [id]=\"id + '1'\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n >\r\n </fd-slider>\r\n @if (uploadingState.state === 'Uploading') {\r\n <button fd-toolbar-item fd-button glyph=\"stop\" fdType=\"transparent\" (click)=\"onTerminate()\"></button>\r\n } @if (uploadingState.state === 'Error') {\r\n <button fd-toolbar-item fd-button glyph=\"refresh\" [fdType]=\"'transparent'\" (click)=\"onRetry()\"></button>\r\n } }\r\n</ng-template>\r\n", styles: [":host{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;position:relative;overflow:hidden;margin-bottom:.25rem;margin-top:.1875rem}:host.editable{border:.0625rem solid var(--sapGroup_TitleBorderColor)}:host ::ng-deep .fd-slider__handle{display:none}:host ::ng-deep .delete button{border-color:transparent!important;background-color:transparent!important}img{width:100%}.pic-wrapper{background-repeat:no-repeat;background-position:center}.cover{max-width:100%;max-height:100%;min-height:100%;width:100%;height:100%;background-size:cover}.contain{max-width:100%;max-height:100%;min-height:100%;width:auto;height:100%;background-size:contain}.no-inlineEdit{width:100%;position:relative;display:flex;flex-direction:column}.inlineEdit{width:100%;position:relative;display:flex;flex-direction:row-reverse;align-items:flex-end;justify-content:flex-start}.centerImage{display:flex;justify-content:center}\n"] }]
|
|
95
|
-
}], propDecorators: { _editable: [{
|
|
96
|
-
type: HostBinding,
|
|
97
|
-
args: ['class.editable']
|
|
98
|
-
}], imageUrl: [{
|
|
99
|
-
type: Input
|
|
100
|
-
}], sizeMode: [{
|
|
101
|
-
type: Input
|
|
102
|
-
}] } });
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktcGljdHVyZS1maWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3VpLXBpY3R1cmUtZmlsZS91aS1waWN0dXJlLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWktcGljdHVyZS1maWxlL3VpLXBpY3R1cmUtZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRzFHLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGFBQWEsRUFFaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFVdkUsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjtJQVI5RDs7UUFTbUMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUdoRCxVQUFLLEdBQVcsRUFBRSxDQUFDO0tBMkZ0QjtJQXRGRyxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7UUFDM0QsSUFBSSxD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LENBQUMsTUFBTSxhQUNwQyxDQUFDLGFBQWEsQ0FBQyxjQUNkLEtBQUs7OEJBR2MsU0FBUztzQkFBdkMsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBQ3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBGaWVsZEJhc2VDb21wb25lbnQsXHJcbiAgICBCYXJzYUFwaSxcclxuICAgIFVwbG9hZFNlcnZpY2UsXHJcbiAgICBnZXRWYWxpZEV4dGVuc2lvbixcclxuICAgIEZpbGVzVmFsaWRhdGlvbkhlbHBlcixcclxuICAgIEltYWdlTWltZVR5cGUsXHJcbiAgICBJVXBsb2FkaW5nU3RhdGVcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcblxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIGV4aGF1c3RNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JzdS11aS1waWN0dXJlLWZpbGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VpLXBpY3R1cmUtZmlsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi91aS1waWN0dXJlLWZpbGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJvdmlkZXJzOiBbVXBsb2FkU2VydmljZV0sXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlQaWN0dXJlRmlsZUNvbXBvbmVudCBleHRlbmRzIEZpZWxkQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZWRpdGFibGUnKSBfZWRpdGFibGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgaW1hZ2VVcmw6IGFueTtcclxuICAgIEBJbnB1dCgpIHNpemVNb2RlOiBhbnk7XHJcbiAgICBmaWxlczogRmlsZVtdID0gW107XHJcbiAgICB1cGxvYWRpbmdTdGF0ZSQ6IE9ic2VydmFibGU8SVVwbG9hZGluZ1N0YXRlPjtcclxuICAgIHZhbGlkRXh0ZW5zaW9uczogYW55O1xyXG4gICAgZmlsZXNWYWxpZGF0aW9uSGVscGVyOiBGaWxlc1ZhbGlkYXRpb25IZWxwZXI7XHJcbiAgICBsYXlvdXRIZWlnaHQ6IHN0cmluZztcclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuU2V0dGluZz8uSXNSZWFkT25seSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lZGl0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwbG9hZGluZ1N0YXRlJCA9IHRoaXMuX3VwbG9hZFNlcnZpY2UudXBsb2FkaW5nU3RhdGUkO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5vbih7XHJcbiAgICAgICAgICAgIERpc3BhbHlJbWFnZTogdGhpcy5fZGlzcGxheUltYWdlLmJpbmQodGhpcylcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCB4ID0gNDU7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0SGVpZ2h0ID0gK0JhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMubGF5b3V0SW5mbywgJ0NvbnRyb2xCb3VuZHMuaGVpZ2h0JywgeCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRIZWlnaHQgPSBsYXlvdXRIZWlnaHQgPCB4ID8gJ2NhY2wodmFyKC0tc2FwRWxlbWVudF9IZWlnaHQpICsxMHB4KScgOiBgJHtsYXlvdXRIZWlnaHR9cHhgO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VVcmwgPSB0aGlzLmNvbnRleHQuaW1hZ2VVcmw7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udGV4dC5fdmFsdWU7XHJcbiAgICAgICAgdGhpcy52YWxpZEV4dGVuc2lvbnMgPSBnZXRWYWxpZEV4dGVuc2lvbih0aGlzLlNldHRpbmcuVmFsaWRFeHRlbnNpb25zKSB8fCBJbWFnZU1pbWVUeXBlO1xyXG4gICAgICAgIHRoaXMuZmlsZXNWYWxpZGF0aW9uSGVscGVyID0gbmV3IEZpbGVzVmFsaWRhdGlvbkhlbHBlcihcclxuICAgICAgICAgICAgMSxcclxuICAgICAgICAgICAgdGhpcy5TZXR0aW5nLk1heEZpbGVTaXplS2IsXHJcbiAgICAgICAgICAgIHRoaXMuU2V0dGluZy5NYXhGaWxlU2l6ZUtiXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdEaXNwbGF5SW1hZ2UnLCB0aGlzLl9kaXNwbGF5SW1hZ2UpO1xyXG4gICAgfVxyXG4gICAgb25GaWxlU2VsZWN0aW9uKGZpbGVzOiBGaWxlW10pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5maWxlc1ZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVGaWxlcyhmaWxlcyk7XHJcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlKGZpbGVzKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25GaWxlRGVsZXRlZCh1cGxvYWRlckNvbXBvbmVudDogRmlsZVVwbG9hZGVyQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgdXBsb2FkZXJDb21wb25lbnQuaW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlyZUNvbnRleHRFdmVudCgnQ2hhbmdlJywgdGhpcy5jb250ZXh0LCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRvd25sb2FkRmlsZSgpOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Db21tb24uRmlsZS5PcGVuRmlsZSh0aGlzLnZhbHVlLkZpbGVJZCwgZmFsc2UsIHRoaXMsIHRydWUsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblJldHJ5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3VwbG9hZCh0aGlzLmZpbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBvblRlcm1pbmF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91cGxvYWRTZXJ2aWNlLmNhbmNlbGF0aW9uJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2Rpc3BsYXlJbWFnZShpbWFnZVVybCwgc2l6ZU1vZGUsIHZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVVybCA9IGltYWdlVXJsO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNpemVNb2RlID0gc2l6ZU1vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBsb2FkKGZpbGVzOiBGaWxlW10pOiB2b2lkIHtcclxuICAgICAgICBvZih0cnVlKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgICAgIGV4aGF1c3RNYXAoKCkgPT4gdGhpcy51cGxvYWRGaWxlKGZpbGVzKSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGxvYWRGaWxlKGZpbGVzOiBGaWxlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRTZXJ2aWNlLmNvbXByZXNzRmlsZXMkKGZpbGVzKS5waXBlKFxyXG4gICAgICAgICAgICBjb25jYXRNYXAoKGZvcm1EYXRhOiBGb3JtRGF0YSkgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwbG9hZFNlcnZpY2UudXBsb2FkKGZvcm1EYXRhLCB0aGlzLlNldHRpbmcuQ29udHJvbEZpZWxkRGVmSWQpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGljdHVyZSA9IHJlc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaWN0dXJlLkVycm9yTXNnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKHBpY3R1cmUuRXJyb3JNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBpY3R1cmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlkOiBwaWN0dXJlLkZpbGVJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNvbnRleHRFdmVudCgnQ2hhbmdlJywgdGhpcy5jb250ZXh0LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJTZXR0aW5nLlNpemVNb2RlID09PSAnMicgPyBudWxsIDogbGF5b3V0SGVpZ2h0XCJcclxuICAgIFtjbGFzcy5uby1pbmxpbmVFZGl0XT1cIiFpbmxpbmVFZGl0XCJcclxuICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIiF2YWx1ZSAmJiAhaW5saW5lRWRpdCA/IG51bGwgOiAxNDBcIlxyXG4gICAgW2NsYXNzLmlubGluZUVkaXRdPVwiaW5saW5lRWRpdFwiXHJcbj5cclxuICAgIEBpZiAoISgoZGlzYWJsZU9yUmVhZG9ubHkkIHwgYXN5bmMpID09PSB0cnVlIHx8IFNldHRpbmcuSXNSZWFkT25seSA9PT0gdHJ1ZSkpIHtcclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGZkLXRvb2xiYXIgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCIgW2NsZWFyQm9yZGVyXT1cInZhbHVlICYmIGltYWdlVXJsID8gZmFsc2UgOiB0cnVlXCI+XHJcbiAgICAgICAgICAgIDxmZC1maWxlLXVwbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAjdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcclxuICAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCIndXBsb2FkZXJfJyArIGlkXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQXR0YWNoUGljdHVyZScgfCBiYmJUcmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgW2J1dHRvbkxhYmVsXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbYnV0dG9uQXJpYUxhYmVsXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbYWNjZXB0XT1cInZhbGlkRXh0ZW5zaW9uc1wiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbGVzXCJcclxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWxlc0NoYW5nZWQpPVwib25GaWxlU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICA+PC9mZC1maWxlLXVwbG9hZGVyPlxyXG4gICAgICAgICAgICBAaWYodmFsdWUgJiYgIXZhbHVlPy5Jc0RlbGV0ZWQpe1xyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICAgICAgZ2x5cGg9XCJwcmludFwiXHJcbiAgICAgICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICBwcmludEZpbGVzXHJcbiAgICAgICAgICAgICAgICBbZmlsZXNdPVwiW3sgSWQ6ICcwJywgSXNOZXc6IHRydWUsIElzRGVsZXRlZDogZmFsc2UsIFR5cGU6ICdpbWFnZScsIG1lZGlhVXJsOiBpbWFnZVVybCB9XVwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cclxuICAgICAgICAgICAgICAgIGdseXBoPVwiZG93bmxvYWRcIlxyXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgW25hbWVdPVwiU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uICsgdmFsdWUuRXh0XCJcclxuICAgICAgICAgICAgICAgIFtzcmNdPVwiaW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgc2F2ZUltYWdlXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0aGlzLnZhbHVlIHx8IHZhbHVlPy5Jc0RlbGV0ZWRcIlxyXG4gICAgICAgICAgICAgICAgZ2x5cGg9XCJkZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkZpbGVEZWxldGVkKHVwbG9hZGVyKVwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgZmQtdG9vbGJhci1pdGVtXHJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLnZhbHVlICYmIHZhbHVlPy5Jc0RlbGV0ZWQgIT09IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgZ2x5cGg9XCJhdHRhY2htZW50XCJcclxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBsb2FkZXIub3BlbigpXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdUcGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRpbmdTdGF0ZTogdXBsb2FkaW5nU3RhdGUkIHwgYXN5bmNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZmQtdG9vbGJhcj5cclxuICAgIDwvZGl2PlxyXG4gICAgfSBAaWYgKCFpbmxpbmVFZGl0KSB7XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwiU2V0dGluZy5TaXplTW9kZSA9PT0gJzAnID8gbGF5b3V0SW5mby5Db250cm9sQm91bmRzLmhlaWdodCA6IG51bGxcIlxyXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiU2V0dGluZy5TaXplTW9kZSA9PT0gJzAnID8gbGF5b3V0SW5mby5Db250cm9sQm91bmRzLndpZHRoIDogbnVsbFwiXHJcbiAgICAgICAgW2NsYXNzLmNlbnRlckltYWdlXT1cIlNldHRpbmcuU2l6ZU1vZGUgPT09ICczJ1wiXHJcbiAgICA+XHJcbiAgICAgICAgQGlmICh2YWx1ZSAmJiBpbWFnZVVybCkge1xyXG4gICAgICAgIDxic3UtbWFzayBbdG9wXT1cIicwcHgnXCI+PC9ic3UtbWFzaz5cclxuICAgICAgICB9IEBpZiAoKHZhbHVlICYmIGltYWdlVXJsKSB8fCBTZXR0aW5nLkhhc0RlZmF1bHRQaWN0dXJlKSB7XHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICBpbWdMYXp5XHJcbiAgICAgICAgICAgIFtpbWdMYXp5XT1cImltYWdlVXJsXCJcclxuICAgICAgICAgICAgW3NyY109XCJpbWFnZVVybFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlNldHRpbmcuU2l6ZU1vZGUgPT09ICcxJyA/ICdjb3ZlcicgOiAnY29udGFpbidcIlxyXG4gICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIlNldHRpbmcuU2l6ZU1vZGUgIT09ICcyJyA/IGxheW91dEluZm8uQ29udHJvbEJvdW5kcy5oZWlnaHQgOiBudWxsXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICA8ZmQtYXZhdGFyIFtzaXplXT1cIidtJ1wiIFtpbWFnZV09XCJpbWFnZVVybFwiPjwvZmQtYXZhdGFyPlxyXG4gICAgfVxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICNsb2FkaW5nVHBsIGxldC11cGxvYWRpbmdTdGF0ZT1cInVwbG9hZGluZ1N0YXRlXCI+XHJcbiAgICBAaWYgKHVwbG9hZGluZ1N0YXRlICYmIHVwbG9hZGluZ1N0YXRlLnN0YXRlICE9PSAnQ29tcGxldGUnICYmIHVwbG9hZGluZ1N0YXRlLnVwbG9hZGluZykge1xyXG4gICAgPGZkLXNsaWRlclxyXG4gICAgICAgIFsobmdNb2RlbCldPVwidXBsb2FkaW5nU3RhdGUucHJvZ3Jlc3NcIlxyXG4gICAgICAgIFtuYW1lXT1cIidzbGlkZXJfJyArIGlkXCJcclxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cclxuICAgICAgICBbaWRdPVwiaWQgKyAnMSdcIlxyXG4gICAgICAgIFttaW5dPVwiMFwiXHJcbiAgICAgICAgW21heF09XCIxMDBcIlxyXG4gICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgPlxyXG4gICAgPC9mZC1zbGlkZXI+XHJcbiAgICBAaWYgKHVwbG9hZGluZ1N0YXRlLnN0YXRlID09PSAnVXBsb2FkaW5nJykge1xyXG4gICAgPGJ1dHRvbiBmZC10b29sYmFyLWl0ZW0gZmQtYnV0dG9uIGdseXBoPVwic3RvcFwiIGZkVHlwZT1cInRyYW5zcGFyZW50XCIgKGNsaWNrKT1cIm9uVGVybWluYXRlKClcIj48L2J1dHRvbj5cclxuICAgIH0gQGlmICh1cGxvYWRpbmdTdGF0ZS5zdGF0ZSA9PT0gJ0Vycm9yJykge1xyXG4gICAgPGJ1dHRvbiBmZC10b29sYmFyLWl0ZW0gZmQtYnV0dG9uIGdseXBoPVwicmVmcmVzaFwiIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiIChjbGljayk9XCJvblJldHJ5KClcIj48L2J1dHRvbj5cclxuICAgIH0gfVxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Input, ViewChild, TemplateRef } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, of, Subject } from 'rxjs';
|
|
3
|
-
import { catchError, concatMap, takeUntil, tap } from 'rxjs/operators';
|
|
4
|
-
import { BarsaApi, UploadService, getDeviceIsMobile, FilesValidationHelper } from 'barsa-novin-ray-core';
|
|
5
|
-
import { DeviceInfoFieldBaseComponent } from '../device-info-field-base';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
import * as i2 from "barsa-novin-ray-core";
|
|
9
|
-
import * as i3 from "@fundamental-ngx/core/bar";
|
|
10
|
-
import * as i4 from "@fundamental-ngx/core/button";
|
|
11
|
-
import * as i5 from "@fundamental-ngx/core/card";
|
|
12
|
-
import * as i6 from "@fundamental-ngx/core/file-uploader";
|
|
13
|
-
import * as i7 from "@fundamental-ngx/core/layout-grid";
|
|
14
|
-
import * as i8 from "@fundamental-ngx/core/menu";
|
|
15
|
-
import * as i9 from "@fundamental-ngx/core/dialog";
|
|
16
|
-
import * as i10 from "@fundamental-ngx/cdk/utils";
|
|
17
|
-
import * as i11 from "@fundamental-ngx/core/title";
|
|
18
|
-
import * as i12 from "@fundamental-ngx/core/toolbar";
|
|
19
|
-
import * as i13 from "../mask/mask.component";
|
|
20
|
-
export class UiPicturesInfoComponent extends DeviceInfoFieldBaseComponent {
|
|
21
|
-
constructor() {
|
|
22
|
-
super(...arguments);
|
|
23
|
-
this.cancelation$ = new Subject();
|
|
24
|
-
this.mediaDataSource = new BehaviorSubject([]);
|
|
25
|
-
this.selectedIndex = -1;
|
|
26
|
-
this.selectedZoom = 'zoom1';
|
|
27
|
-
this._fileCountSource = new BehaviorSubject(0);
|
|
28
|
-
}
|
|
29
|
-
ngOnInit() {
|
|
30
|
-
this.fileCount$ = this._fileCountSource.asObservable();
|
|
31
|
-
this.mediaData$ = this.mediaDataSource.asObservable();
|
|
32
|
-
super.ngOnInit();
|
|
33
|
-
this.isMobile = getDeviceIsMobile();
|
|
34
|
-
this.uploadingState$ = this._uploadService.uploadingState$;
|
|
35
|
-
this.value$.subscribe((value) => this._setFileCount(value));
|
|
36
|
-
this.filesValidationHelper = new FilesValidationHelper(this.Setting.MaxPictureCount, this.Setting.MaxFileSizeKb, this.Setting.MaxTotalFileSizeKb);
|
|
37
|
-
this.maxFileCount = this.filesValidationHelper.maxFileCount;
|
|
38
|
-
this._prepareGallery(this.value);
|
|
39
|
-
this.context.on({
|
|
40
|
-
DisplayImages: this._displayImages.bind(this)
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
ngOnDestroy() {
|
|
44
|
-
super.ngOnDestroy();
|
|
45
|
-
this.context.un('DisplayImages', this._displayImages);
|
|
46
|
-
}
|
|
47
|
-
onRotate(imgEl, media2, index) {
|
|
48
|
-
const direction = 1;
|
|
49
|
-
const media = media2;
|
|
50
|
-
const bpId = media.FileId;
|
|
51
|
-
const angle = 90 * direction;
|
|
52
|
-
if (media.RotationAngle) {
|
|
53
|
-
media.RotationAngle = (media.RotationAngle + angle) % 360;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
media.RotationAngle = angle;
|
|
57
|
-
}
|
|
58
|
-
const w = imgEl.offsetWidth;
|
|
59
|
-
const h = imgEl.offsetHeight;
|
|
60
|
-
let margin = (w - h) / 2;
|
|
61
|
-
let scaleFactor = w / h;
|
|
62
|
-
if (media.scaleFactor) {
|
|
63
|
-
scaleFactor = 1;
|
|
64
|
-
media.scaleFactor = null;
|
|
65
|
-
margin = 0;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
media.scaleFactor = scaleFactor;
|
|
69
|
-
}
|
|
70
|
-
if (scaleFactor < 1) {
|
|
71
|
-
this._renderer2.setStyle(imgEl, 'transform', `rotate(${media.RotationAngle}deg) scale(${scaleFactor})`);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
this._renderer2.setStyle(imgEl, 'transform', `rotate(${media.RotationAngle}deg)`);
|
|
75
|
-
}
|
|
76
|
-
this._renderer2.setStyle(imgEl, 'margin-bottom', margin + 'px');
|
|
77
|
-
this._renderer2.setStyle(imgEl, 'margin-top', margin + 'px');
|
|
78
|
-
this.context.fireEvent('SettingsChange', this, {
|
|
79
|
-
FileId: bpId,
|
|
80
|
-
Angle: media.RotationAngle
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
onFullscreen(media, mediaData) {
|
|
84
|
-
const dialogConfig = {
|
|
85
|
-
data: { media, mediaData },
|
|
86
|
-
escKeyCloseable: false,
|
|
87
|
-
mobile: true,
|
|
88
|
-
verticalPadding: false
|
|
89
|
-
};
|
|
90
|
-
this._dialogService.open(this.dialogTemplate, dialogConfig);
|
|
91
|
-
}
|
|
92
|
-
onMedaiClick(gallery, media, index) {
|
|
93
|
-
gallery && gallery.querySelector('[id="' + String(index) + '"]')?.scrollIntoView(true);
|
|
94
|
-
}
|
|
95
|
-
onThumbnailClicked(imgIndex) {
|
|
96
|
-
this.selectedIndex = imgIndex;
|
|
97
|
-
this.gallery.nativeElement.querySelector('[id="' + String(imgIndex) + '"]')?.scrollIntoView(true);
|
|
98
|
-
}
|
|
99
|
-
onDelete(index) {
|
|
100
|
-
const selectedMedia = this.value[index];
|
|
101
|
-
this._deleteMedia(selectedMedia);
|
|
102
|
-
}
|
|
103
|
-
onScan() {
|
|
104
|
-
this._scanHelper(false);
|
|
105
|
-
}
|
|
106
|
-
onAdvanceScan() {
|
|
107
|
-
this._scanHelper(true);
|
|
108
|
-
}
|
|
109
|
-
onZoomIn() {
|
|
110
|
-
switch (this.selectedZoom) {
|
|
111
|
-
case 'zoom1':
|
|
112
|
-
this.selectedZoom = 'zoom1-5';
|
|
113
|
-
break;
|
|
114
|
-
case 'zoom1-5':
|
|
115
|
-
this.selectedZoom = 'zoom2';
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
onZoomOut() {
|
|
120
|
-
switch (this.selectedZoom) {
|
|
121
|
-
case 'zoom2':
|
|
122
|
-
this.selectedZoom = 'zoom1-5';
|
|
123
|
-
break;
|
|
124
|
-
case 'zoom1-5':
|
|
125
|
-
this.selectedZoom = 'zoom1';
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
onFillOriginal() {
|
|
130
|
-
this.fillWidth = false;
|
|
131
|
-
this.fillAll = false;
|
|
132
|
-
this.fillOriginal = true;
|
|
133
|
-
}
|
|
134
|
-
onFillWidth() {
|
|
135
|
-
this.fillWidth = true;
|
|
136
|
-
this.fillAll = false;
|
|
137
|
-
this.fillOriginal = false;
|
|
138
|
-
}
|
|
139
|
-
onFillAll() {
|
|
140
|
-
this.fillAll = true;
|
|
141
|
-
this.fillOriginal = false;
|
|
142
|
-
this.fillWidth = false;
|
|
143
|
-
}
|
|
144
|
-
onFileSelection(files) {
|
|
145
|
-
this.filesValidationHelper.validateFiles(files);
|
|
146
|
-
this.uploadToServer(files).pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
147
|
-
}
|
|
148
|
-
_deleteMedia(selectedMedia) {
|
|
149
|
-
const { Id, FileId } = selectedMedia;
|
|
150
|
-
let selectedId = Id;
|
|
151
|
-
if (!selectedId) {
|
|
152
|
-
selectedId = FileId;
|
|
153
|
-
}
|
|
154
|
-
const selectedPicIndex = this.value.findIndex((c) => c.Id === selectedId || c.FileId === selectedId);
|
|
155
|
-
this.value = this.value.filter((c) => c.Id !== selectedId && c.FileId !== selectedId);
|
|
156
|
-
this._prepareGallery(this.value);
|
|
157
|
-
if (this.value && this.value.length > 0) {
|
|
158
|
-
this.selectedIndex = 0;
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
this.selectedIndex = -1;
|
|
162
|
-
}
|
|
163
|
-
this.context.fireEvent('Change', {
|
|
164
|
-
FileId: selectedId,
|
|
165
|
-
IsDeleted: true,
|
|
166
|
-
OldIndex: selectedPicIndex
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
_scanHelper(isAdvanced) {
|
|
170
|
-
const scanner = new BarsaApi.Common.BarsaScanner({
|
|
171
|
-
ScannerAgentParams: this.context.ScannerAgentParams
|
|
172
|
-
});
|
|
173
|
-
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ScanResultReady, this._onScanResult_Ready, this);
|
|
174
|
-
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ScanError, this._onScan_Error, this);
|
|
175
|
-
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ShowWarrning, this._onScan_Warrning, this);
|
|
176
|
-
BarsaApi.Ul.LoadingMask.Mask(this.el.nativeElement);
|
|
177
|
-
scanner.Scan(isAdvanced);
|
|
178
|
-
}
|
|
179
|
-
_onScanResult_Ready(contents) {
|
|
180
|
-
this._uploadScan(contents);
|
|
181
|
-
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
182
|
-
}
|
|
183
|
-
_onScan_Warrning(text) {
|
|
184
|
-
if (typeof text === 'string') {
|
|
185
|
-
BarsaApi.Ul.MsgBox.Error(text);
|
|
186
|
-
}
|
|
187
|
-
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
188
|
-
}
|
|
189
|
-
_onScan_Error(err) {
|
|
190
|
-
if (typeof err === 'string') {
|
|
191
|
-
BarsaApi.Ul.MsgBox.Error(err);
|
|
192
|
-
}
|
|
193
|
-
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
194
|
-
}
|
|
195
|
-
_uploadScan(contents) {
|
|
196
|
-
if (contents && contents.length > 0) {
|
|
197
|
-
contents.forEach((content) => {
|
|
198
|
-
BarsaApi.Common.BarsaScanner.UploadScanContent(this.context.FieldDefId, content, () => {
|
|
199
|
-
// if (fileObj) this._onUploadWin_NewFileUpload(null, fileObj);
|
|
200
|
-
// debugger;
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
BarsaApi.Ul.MsgBox.Warning(this._bbbPipe.transform('ScanResultNotFound'));
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
_prepareGallery(value) {
|
|
209
|
-
const data = [];
|
|
210
|
-
value.forEach((item) => {
|
|
211
|
-
const mediaUrl = this._picFieldSrc.transform(item.FileId, 'BarsaPicture.Full', null);
|
|
212
|
-
const thumbnailUrl = this._picFieldSrc.transform(item.FileId, 'BarsaPicture.Thumbnail', null);
|
|
213
|
-
data.push({
|
|
214
|
-
Id: item.Id,
|
|
215
|
-
FileId: item.FileId,
|
|
216
|
-
title: item.FileName,
|
|
217
|
-
mediaType: 'image',
|
|
218
|
-
label: item.FileName,
|
|
219
|
-
mediaUrl: `${mediaUrl}&createDate=${item.CreateDate}`,
|
|
220
|
-
thumbnailUrl: `${thumbnailUrl}&createDate=${item.CreateDate}`,
|
|
221
|
-
alt: 'Failed to load ' + mediaUrl,
|
|
222
|
-
createDate: item.CreateDate
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
this.mediaDataSource.next(data);
|
|
226
|
-
}
|
|
227
|
-
uploadToServer(files) {
|
|
228
|
-
return this._uploadService.compressFiles$(files).pipe(concatMap((formData) => this._uploadService.upload(formData, this.Setting.ControlFieldDefId).pipe(tap((res) => {
|
|
229
|
-
if (Array.isArray(res)) {
|
|
230
|
-
this.updateValue(res);
|
|
231
|
-
}
|
|
232
|
-
}), catchError((err) => of(err)))));
|
|
233
|
-
}
|
|
234
|
-
_setFileCount(value) {
|
|
235
|
-
this._fileCountSource.next(value.filter((c) => !c.IsDeleted).length);
|
|
236
|
-
}
|
|
237
|
-
updateValue(newVal) {
|
|
238
|
-
this.value = [...this.value, ...newVal];
|
|
239
|
-
this._prepareGallery(this.value);
|
|
240
|
-
this.fireContextEvent('Change', newVal);
|
|
241
|
-
}
|
|
242
|
-
_displayImages(value) {
|
|
243
|
-
this.value = value;
|
|
244
|
-
}
|
|
245
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPicturesInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
246
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UiPicturesInfoComponent, selector: "bsu-ui-pictures-info", inputs: { value: "value" }, providers: [UploadService], viewQueries: [{ propertyName: "gallery", first: true, predicate: ["gallery"], descendants: true }, { propertyName: "dialogTemplate", first: true, predicate: ["dialogTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<fd-file-uploader\r\n #uploader\r\n [style.display]=\"'none'\"\r\n [id]=\"id\"\r\n [name]=\"'pictures_' + id\"\r\n [placeholder]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonAriaLabel]=\"'AttachPicture' | bbbTranslate\"\r\n accept=\".png,.jpg,.bpm,.jpeg,.gif,.png,.tif,.pdf\"\r\n [fileLimit]=\"maxFileCount === 0 ? 100 : maxFileCount\"\r\n [multiple]=\"maxFileCount === 0 || maxFileCount > 1\"\r\n (selectedFilesChanged)=\"onFileSelection($event)\"\r\n></fd-file-uploader>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"layoutGridTpl; context: { disableOrReadonly: disableOrReadonly$ | async }\"\r\n></ng-container>\r\n<ng-template #layoutGridTpl let-inDialog=\"inDialog\" let-gallery=\"gallery\" let-disableOrReadonly=\"disableOrReadonly\">\r\n <fd-layout-grid>\r\n @if (mediaData$ | async; as mediaData) {\r\n <div fdLayoutGridRow>\r\n @for (media of mediaData; track media; let i = $index) {\r\n <div [fdLayoutGridCol]=\"6\" [colMd]=\"3\" [colLg]=\"2\" [colXl]=\"2\" (click)=\"onMedaiClick(gallery, media, i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cardTpl;\r\n context: {\r\n $implicit: media,\r\n mediaData: mediaData,\r\n inDialog: inDialog,\r\n index: i,\r\n disableOrReadonly: disableOrReadonly\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n } @if (!inDialog && !disableOrReadonly) {\r\n <div [fdLayoutGridCol]=\"6\" [colMd]=\"3\" [colLg]=\"2\" [colXl]=\"2\">\r\n <ng-container *ngTemplateOutlet=\"newFile\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </fd-layout-grid>\r\n</ng-template>\r\n<ng-template\r\n #cardTpl\r\n let-media\r\n let-mediaData=\"mediaData\"\r\n let-inDialog=\"inDialog\"\r\n let-index=\"index\"\r\n let-disableOrReadonly=\"disableOrReadonly\"\r\n>\r\n <fd-card class=\"media\" [class.inDialog]=\"inDialog\">\r\n <fd-card-content style=\"text-align: center; height: 120px\">\r\n <img imgLazy [imgLazy]=\"media.thumbnailUrl\" [src]=\"media.thumbnailUrl\" #img />\r\n </fd-card-content>\r\n @if (!inDialog) {\r\n <fd-card-footer>\r\n <button\r\n glyph=\"print\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n [files]=\"[media]\"\r\n printFiles\r\n ></button>\r\n <button\r\n glyph=\"full-screen\"\r\n [title]=\"'FullScreen' | bbbTranslate\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onFullscreen(media, mediaData)\"\r\n ></button>\r\n\r\n <button fd-button [glyph]=\"'overflow'\" [fdType]=\"'transparent'\" [fdMenuTrigger]=\"menu\"></button>\r\n <fd-menu #menu>\r\n <li fd-menu-item [files]=\"mediaData\" printFiles>\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"print\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Print' | bbbTranslate }} {{ 'All' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item [name]=\"media.label\" [src]=\"media.mediaUrl\" saveImage>\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"download\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Download' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n @if (!disableOrReadonly) {\r\n <li fd-menu-item (click)=\"onRotate(img, media, index)\">\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"rotate\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Rotate' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item (click)=\"onDelete(index)\">\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"delete\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Delete' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n }\r\n </fd-menu>\r\n </fd-card-footer>\r\n }\r\n </fd-card>\r\n</ng-template>\r\n<ng-template #newFile>\r\n <div style=\"position: relative; height: 100%\">\r\n <fd-card>\r\n <fd-card-content style=\"display: flex; align-items: center; justify-content: center; min-height: 120px\">\r\n <button\r\n fd-button\r\n glyph=\"add-photo\"\r\n fdType=\"transparent\"\r\n [label]=\"'AttachFile' | bbbTranslate\"\r\n (click)=\"uploader.open()\"\r\n ></button>\r\n </fd-card-content>\r\n\r\n <fd-card-footer style=\"border-top: 1px solid #ccc\">\r\n <button fd-button [glyph]=\"'overflow'\" [fdType]=\"'transparent'\" [fdMenuTrigger]=\"menu\"></button>\r\n <fd-menu #menu>\r\n <li fd-menu-item (click)=\"onScan()\">\r\n <a fd-menu-interactive>\r\n <span fd-menu-title>{{ 'Scan' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item (click)=\"onAdvanceScan()\">\r\n <a fd-menu-interactive>\r\n <span fd-menu-title>{{ 'AdvancedScan' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </fd-menu>\r\n </fd-card-footer>\r\n </fd-card>\r\n @if ((uploadingState$ | async)?.uploading === true) {\r\n <bsu-mask></bsu-mask>\r\n }\r\n </div>\r\n</ng-template>\r\n<ng-template #dialogTemplate let-dialog let-dialogConfig=\"dialogConfig\">\r\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\" #dialogTpl class=\"vertical\">\r\n <fd-dialog-header>\r\n <ng-template fdkTemplate=\"header\">\r\n <div fd-bar-left>\r\n <fd-bar-element>\r\n <h1 fd-title>{{ Setting.ControlFieldCaptionTranslated }}</h1>\r\n </fd-bar-element>\r\n </div>\r\n <div fd-bar-right>\r\n <fd-button-bar\r\n ariaLabel=\"print\"\r\n [glyph]=\"'print'\"\r\n fdType=\"transparent\"\r\n [files]=\"dialog.data.mediaData\"\r\n printFiles\r\n ></fd-button-bar>\r\n @if (!dialogConfig.fullscreen) {\r\n <fd-button-bar\r\n ariaLabel=\"Fit image size\"\r\n [glyph]=\"'resize'\"\r\n [fdType]=\"fillWidth ? 'emphasized' : 'transparent'\"\r\n (click)=\"fillWidth = !fillWidth\"\r\n ></fd-button-bar>\r\n }\r\n <fd-button-bar ariaLabel=\"close\" glyph=\"decline\" (click)=\"dialog.close()\"></fd-button-bar>\r\n </div>\r\n </ng-template>\r\n </fd-dialog-header>\r\n <fd-dialog-body #fdbody>\r\n <div #gallery class=\"gallery inDialog\" style=\"flex: 1\">\r\n @for (media of dialog.data.mediaData; track media.FileId; let i = $index) {\r\n <div\r\n class=\"column big-imgs-box\"\r\n [class.fill-width]=\"fillWidth\"\r\n [class.fill-all]=\"fillAll\"\r\n [class.fill-original]=\"fillOriginal\"\r\n [ngClass]=\"selectedZoom\"\r\n >\r\n <fd-toolbar fdType=\"solid\" fdType=\"transparent\" [clearBorder]=\"true\">\r\n <fd-toolbar-spacer></fd-toolbar-spacer>\r\n <button fd-toolbar-item fd-button glyph=\"rotate\" (click)=\"onRotate(img, media, i)\"></button>\r\n <fd-toolbar-spacer></fd-toolbar-spacer>\r\n </fd-toolbar>\r\n <div class=\"pics\" [id]=\"i\">\r\n <bsu-mask></bsu-mask>\r\n <img #img imgLazy [imgLazy]=\"media.mediaUrl\" [src]=\"media.mediaUrl\" />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n @if ((deviceSize$ | async) !== 's') {\r\n <div class=\"thumbnail\" style=\"flex-shrink: 1\">\r\n <ng-cotainer\r\n *ngTemplateOutlet=\"\r\n layoutGridTpl;\r\n context: {\r\n inDialog: true,\r\n gallery: gallery,\r\n disableOrReadonly: disableOrReadonly$ | async\r\n }\r\n \"\r\n ></ng-cotainer>\r\n </div>\r\n }\r\n </fd-dialog-body>\r\n </fd-dialog>\r\n</ng-template>\r\n", styles: [":host{position:relative}:host ::ng-deep .delete button{border-color:transparent!important;background-color:transparent!important}.big-imgs-box{position:relative}.big-imgs-box>fd-toolbar{position:absolute;z-index:5;opacity:.5}.big-imgs-box>fd-toolbar:hover{opacity:1}fd-toolbar{width:100%}fd-dialog-footer{justify-content:center}.hatchBackground{min-height:100px}.gallery{display:flex;width:100%;height:400px;column-gap:1px;background-color:var(--sapField_Background, #fff)}.gallery ::-webkit-scrollbar{width:7px;height:7px}.gallery ::-webkit-scrollbar-track{box-shadow:inset 0 0 5px gray;border-radius:4px}.gallery ::-webkit-scrollbar-thumb{background:#555454;border-radius:4px}.gallery ::-webkit-scrollbar-thumb:hover{background:#2c2b2b}.gallery .column{overflow-y:scroll;display:flex;flex-direction:column;row-gap:3%;align-items:center}.gallery .column .pics{width:100%;display:flex;justify-content:center}.gallery .column .pics img{border-radius:5px}.gallery .column.small-imgs-box{flex:10%}.gallery .column.big-imgs-box{flex:90%}.gallery .selected{background-color:#fff;border:3px solid #0294d8;padding:10px}.gallery .fill-all .pics{height:100%}.gallery .fill-all img{width:100%!important;height:100%!important;object-fit:fill!important}.gallery .fill-original img{width:unset;height:unset}.gallery .zoom1 img{zoom:1}.gallery .zoom1-5 img{zoom:1.5}.gallery .zoom2 img{zoom:2}fd-dialog .gallery{overflow:auto}fd-dialog .gallery .column{overflow:initial}fd-dialog .gallery .pics{position:relative}fd-dialog fd-dialog-body{display:flex}fd-dialog.horizontal fd-dialog-body{flex-direction:column}fd-dialog.horizontal .gallery{flex-direction:row}fd-dialog.horizontal .thumbnail{border-top:1px solid #ccc;overflow-x:auto}fd-dialog.vertical fd-dialog-body{flex-direction:row-reverse}fd-dialog.vertical .gallery{flex-direction:column;height:100%}fd-dialog.vertical .thumbnail{border-left:1px solid #ccc;height:100%;width:200px;overflow-y:auto}fd-dialog.vertical .thumbnail ::ng-deep .fd-row>div{width:100%;min-width:100%}fd-card.media fd-card-footer button{border:none}fd-card.inDialog fd-card-header{padding-top:5px;padding-bottom:5px}.fd-col{min-width:165px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ImageLazyDirective, selector: "[imgLazy]", inputs: ["auto", "threshold", "imgLazy"], outputs: ["imageLoaded"] }, { kind: "directive", type: i2.PrintFilesDirective, selector: "[printFiles]", inputs: ["files", "file", "isImageGallery", "component"] }, { kind: "directive", type: i2.SaveImageDirective, selector: "[saveImage]", inputs: ["name", "src"] }, { kind: "directive", type: i3.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i3.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i3.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth"] }, { kind: "component", type: i3.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i5.CardComponent, selector: "fd-card", inputs: ["badge", "badgeIcon", "badgeColor", "badgeColorSecondary", "badgeStatus", "badgeAriaLabel", "secondBadge", "secondBadgeIcon", "secondBadgeColor", "secondBadgeColorSecondary", "secondBadgeStatus", "secondBadgeAriaLabel", "isLoading", "cardType", "id", "ariaRoledescription", "ariaDescription", "ariaLabel", "role", "interactive", "selected", "ariaPosinset", "ariaSetsize"], outputs: ["ariaPosinsetChange", "ariaSetsizeChange"] }, { kind: "component", type: i5.CardContentComponent, selector: "fd-card-content" }, { kind: "component", type: i5.CardFooterComponent, selector: "fd-card-footer" }, { kind: "directive", type: i5.CardFooterActionItemDirective, selector: "[fdCardFooterActionItem]" }, { kind: "component", type: i6.FileUploaderComponent, selector: "fd-file-uploader", inputs: ["disabled", "required", "multiple", "accept", "dragndrop", "maxFileSize", "minFileSize", "id", "ariaLabel", "ariaLabelledBy", "placeholder", "buttonLabel", "buttonAriaLabel", "state", "fileLimit", "inputHidden", "width"], outputs: ["selectedFilesChanged", "selectedInvalidFiles", "onDragEnter", "onDragLeave"] }, { kind: "component", type: i7.LayoutGridComponent, selector: "fd-layout-grid, [fdLayoutGrid]", inputs: ["class", "noGap", "noHorizontalGap", "noVerticalGap"] }, { kind: "directive", type: i7.LayoutGridColDirective, selector: "[fd-layout-grid-col], [fdLayoutGridCol]", inputs: ["fdLayoutGridCol", "colGrow", "colMd", "colLg", "colXl", "colOffset", "colOffsetMd", "colOffsetLg", "colOffsetXl", "class"] }, { kind: "directive", type: i7.LayoutGridRowDirective, selector: "[fd-layout-grid-row], [fdLayoutGridRow]" }, { kind: "component", type: i8.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "focusAutoCapture", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i8.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu", "parentSubmenu", "hasSeparator"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "component", type: i8.MenuInteractiveComponent, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i8.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "component", type: i8.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "submenuIndicator", "ariaHidden"] }, { kind: "directive", type: i8.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i9.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i9.DialogBodyComponent, selector: "fd-dialog-body", inputs: ["disablePaddings"] }, { kind: "component", type: i9.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "directive", type: i10.TemplateDirective, selector: "[fdkTemplate]", inputs: ["fdkTemplate"] }, { kind: "component", type: i11.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i12.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "headingLevel", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i12.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "directive", type: i12.ToolbarSpacerDirective, selector: "fd-toolbar-spacer", inputs: ["width", "class", "fixed"] }, { kind: "component", type: i13.MaskComponent, selector: "bsu-mask", inputs: ["size", "top"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
247
|
-
}
|
|
248
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPicturesInfoComponent, decorators: [{
|
|
249
|
-
type: Component,
|
|
250
|
-
args: [{ selector: 'bsu-ui-pictures-info', providers: [UploadService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<fd-file-uploader\r\n #uploader\r\n [style.display]=\"'none'\"\r\n [id]=\"id\"\r\n [name]=\"'pictures_' + id\"\r\n [placeholder]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonLabel]=\"'AttachPicture' | bbbTranslate\"\r\n [buttonAriaLabel]=\"'AttachPicture' | bbbTranslate\"\r\n accept=\".png,.jpg,.bpm,.jpeg,.gif,.png,.tif,.pdf\"\r\n [fileLimit]=\"maxFileCount === 0 ? 100 : maxFileCount\"\r\n [multiple]=\"maxFileCount === 0 || maxFileCount > 1\"\r\n (selectedFilesChanged)=\"onFileSelection($event)\"\r\n></fd-file-uploader>\r\n\r\n<ng-container\r\n *ngTemplateOutlet=\"layoutGridTpl; context: { disableOrReadonly: disableOrReadonly$ | async }\"\r\n></ng-container>\r\n<ng-template #layoutGridTpl let-inDialog=\"inDialog\" let-gallery=\"gallery\" let-disableOrReadonly=\"disableOrReadonly\">\r\n <fd-layout-grid>\r\n @if (mediaData$ | async; as mediaData) {\r\n <div fdLayoutGridRow>\r\n @for (media of mediaData; track media; let i = $index) {\r\n <div [fdLayoutGridCol]=\"6\" [colMd]=\"3\" [colLg]=\"2\" [colXl]=\"2\" (click)=\"onMedaiClick(gallery, media, i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cardTpl;\r\n context: {\r\n $implicit: media,\r\n mediaData: mediaData,\r\n inDialog: inDialog,\r\n index: i,\r\n disableOrReadonly: disableOrReadonly\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n } @if (!inDialog && !disableOrReadonly) {\r\n <div [fdLayoutGridCol]=\"6\" [colMd]=\"3\" [colLg]=\"2\" [colXl]=\"2\">\r\n <ng-container *ngTemplateOutlet=\"newFile\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </fd-layout-grid>\r\n</ng-template>\r\n<ng-template\r\n #cardTpl\r\n let-media\r\n let-mediaData=\"mediaData\"\r\n let-inDialog=\"inDialog\"\r\n let-index=\"index\"\r\n let-disableOrReadonly=\"disableOrReadonly\"\r\n>\r\n <fd-card class=\"media\" [class.inDialog]=\"inDialog\">\r\n <fd-card-content style=\"text-align: center; height: 120px\">\r\n <img imgLazy [imgLazy]=\"media.thumbnailUrl\" [src]=\"media.thumbnailUrl\" #img />\r\n </fd-card-content>\r\n @if (!inDialog) {\r\n <fd-card-footer>\r\n <button\r\n glyph=\"print\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n [files]=\"[media]\"\r\n printFiles\r\n ></button>\r\n <button\r\n glyph=\"full-screen\"\r\n [title]=\"'FullScreen' | bbbTranslate\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onFullscreen(media, mediaData)\"\r\n ></button>\r\n\r\n <button fd-button [glyph]=\"'overflow'\" [fdType]=\"'transparent'\" [fdMenuTrigger]=\"menu\"></button>\r\n <fd-menu #menu>\r\n <li fd-menu-item [files]=\"mediaData\" printFiles>\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"print\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Print' | bbbTranslate }} {{ 'All' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item [name]=\"media.label\" [src]=\"media.mediaUrl\" saveImage>\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"download\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Download' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n @if (!disableOrReadonly) {\r\n <li fd-menu-item (click)=\"onRotate(img, media, index)\">\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"rotate\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Rotate' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item (click)=\"onDelete(index)\">\r\n <a fd-menu-interactive>\r\n <fd-menu-addon position=\"before\" glyph=\"delete\"></fd-menu-addon>\r\n <span fd-menu-title>{{ 'Delete' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n }\r\n </fd-menu>\r\n </fd-card-footer>\r\n }\r\n </fd-card>\r\n</ng-template>\r\n<ng-template #newFile>\r\n <div style=\"position: relative; height: 100%\">\r\n <fd-card>\r\n <fd-card-content style=\"display: flex; align-items: center; justify-content: center; min-height: 120px\">\r\n <button\r\n fd-button\r\n glyph=\"add-photo\"\r\n fdType=\"transparent\"\r\n [label]=\"'AttachFile' | bbbTranslate\"\r\n (click)=\"uploader.open()\"\r\n ></button>\r\n </fd-card-content>\r\n\r\n <fd-card-footer style=\"border-top: 1px solid #ccc\">\r\n <button fd-button [glyph]=\"'overflow'\" [fdType]=\"'transparent'\" [fdMenuTrigger]=\"menu\"></button>\r\n <fd-menu #menu>\r\n <li fd-menu-item (click)=\"onScan()\">\r\n <a fd-menu-interactive>\r\n <span fd-menu-title>{{ 'Scan' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n <li fd-menu-item (click)=\"onAdvanceScan()\">\r\n <a fd-menu-interactive>\r\n <span fd-menu-title>{{ 'AdvancedScan' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </fd-menu>\r\n </fd-card-footer>\r\n </fd-card>\r\n @if ((uploadingState$ | async)?.uploading === true) {\r\n <bsu-mask></bsu-mask>\r\n }\r\n </div>\r\n</ng-template>\r\n<ng-template #dialogTemplate let-dialog let-dialogConfig=\"dialogConfig\">\r\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\" #dialogTpl class=\"vertical\">\r\n <fd-dialog-header>\r\n <ng-template fdkTemplate=\"header\">\r\n <div fd-bar-left>\r\n <fd-bar-element>\r\n <h1 fd-title>{{ Setting.ControlFieldCaptionTranslated }}</h1>\r\n </fd-bar-element>\r\n </div>\r\n <div fd-bar-right>\r\n <fd-button-bar\r\n ariaLabel=\"print\"\r\n [glyph]=\"'print'\"\r\n fdType=\"transparent\"\r\n [files]=\"dialog.data.mediaData\"\r\n printFiles\r\n ></fd-button-bar>\r\n @if (!dialogConfig.fullscreen) {\r\n <fd-button-bar\r\n ariaLabel=\"Fit image size\"\r\n [glyph]=\"'resize'\"\r\n [fdType]=\"fillWidth ? 'emphasized' : 'transparent'\"\r\n (click)=\"fillWidth = !fillWidth\"\r\n ></fd-button-bar>\r\n }\r\n <fd-button-bar ariaLabel=\"close\" glyph=\"decline\" (click)=\"dialog.close()\"></fd-button-bar>\r\n </div>\r\n </ng-template>\r\n </fd-dialog-header>\r\n <fd-dialog-body #fdbody>\r\n <div #gallery class=\"gallery inDialog\" style=\"flex: 1\">\r\n @for (media of dialog.data.mediaData; track media.FileId; let i = $index) {\r\n <div\r\n class=\"column big-imgs-box\"\r\n [class.fill-width]=\"fillWidth\"\r\n [class.fill-all]=\"fillAll\"\r\n [class.fill-original]=\"fillOriginal\"\r\n [ngClass]=\"selectedZoom\"\r\n >\r\n <fd-toolbar fdType=\"solid\" fdType=\"transparent\" [clearBorder]=\"true\">\r\n <fd-toolbar-spacer></fd-toolbar-spacer>\r\n <button fd-toolbar-item fd-button glyph=\"rotate\" (click)=\"onRotate(img, media, i)\"></button>\r\n <fd-toolbar-spacer></fd-toolbar-spacer>\r\n </fd-toolbar>\r\n <div class=\"pics\" [id]=\"i\">\r\n <bsu-mask></bsu-mask>\r\n <img #img imgLazy [imgLazy]=\"media.mediaUrl\" [src]=\"media.mediaUrl\" />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n @if ((deviceSize$ | async) !== 's') {\r\n <div class=\"thumbnail\" style=\"flex-shrink: 1\">\r\n <ng-cotainer\r\n *ngTemplateOutlet=\"\r\n layoutGridTpl;\r\n context: {\r\n inDialog: true,\r\n gallery: gallery,\r\n disableOrReadonly: disableOrReadonly$ | async\r\n }\r\n \"\r\n ></ng-cotainer>\r\n </div>\r\n }\r\n </fd-dialog-body>\r\n </fd-dialog>\r\n</ng-template>\r\n", styles: [":host{position:relative}:host ::ng-deep .delete button{border-color:transparent!important;background-color:transparent!important}.big-imgs-box{position:relative}.big-imgs-box>fd-toolbar{position:absolute;z-index:5;opacity:.5}.big-imgs-box>fd-toolbar:hover{opacity:1}fd-toolbar{width:100%}fd-dialog-footer{justify-content:center}.hatchBackground{min-height:100px}.gallery{display:flex;width:100%;height:400px;column-gap:1px;background-color:var(--sapField_Background, #fff)}.gallery ::-webkit-scrollbar{width:7px;height:7px}.gallery ::-webkit-scrollbar-track{box-shadow:inset 0 0 5px gray;border-radius:4px}.gallery ::-webkit-scrollbar-thumb{background:#555454;border-radius:4px}.gallery ::-webkit-scrollbar-thumb:hover{background:#2c2b2b}.gallery .column{overflow-y:scroll;display:flex;flex-direction:column;row-gap:3%;align-items:center}.gallery .column .pics{width:100%;display:flex;justify-content:center}.gallery .column .pics img{border-radius:5px}.gallery .column.small-imgs-box{flex:10%}.gallery .column.big-imgs-box{flex:90%}.gallery .selected{background-color:#fff;border:3px solid #0294d8;padding:10px}.gallery .fill-all .pics{height:100%}.gallery .fill-all img{width:100%!important;height:100%!important;object-fit:fill!important}.gallery .fill-original img{width:unset;height:unset}.gallery .zoom1 img{zoom:1}.gallery .zoom1-5 img{zoom:1.5}.gallery .zoom2 img{zoom:2}fd-dialog .gallery{overflow:auto}fd-dialog .gallery .column{overflow:initial}fd-dialog .gallery .pics{position:relative}fd-dialog fd-dialog-body{display:flex}fd-dialog.horizontal fd-dialog-body{flex-direction:column}fd-dialog.horizontal .gallery{flex-direction:row}fd-dialog.horizontal .thumbnail{border-top:1px solid #ccc;overflow-x:auto}fd-dialog.vertical fd-dialog-body{flex-direction:row-reverse}fd-dialog.vertical .gallery{flex-direction:column;height:100%}fd-dialog.vertical .thumbnail{border-left:1px solid #ccc;height:100%;width:200px;overflow-y:auto}fd-dialog.vertical .thumbnail ::ng-deep .fd-row>div{width:100%;min-width:100%}fd-card.media fd-card-footer button{border:none}fd-card.inDialog fd-card-header{padding-top:5px;padding-bottom:5px}.fd-col{min-width:165px}\n"] }]
|
|
251
|
-
}], propDecorators: { value: [{
|
|
252
|
-
type: Input
|
|
253
|
-
}], gallery: [{
|
|
254
|
-
type: ViewChild,
|
|
255
|
-
args: ['gallery']
|
|
256
|
-
}], dialogTemplate: [{
|
|
257
|
-
type: ViewChild,
|
|
258
|
-
args: ['dialogTemplate', { read: TemplateRef }]
|
|
259
|
-
}] } });
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktcGljdHVyZXMtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1zYXAtdWkvc3JjL2xpYi91aS1waWN0dXJlcy1pbmZvL3VpLXBpY3R1cmVzLWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWktcGljdHVyZXMtaW5mby91aS1waWN0dXJlcy1pbmZvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEVBQ1QsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJdkUsT0FBTyxFQUNILFFBQVEsRUFDUixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUV4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFVekUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLDRCQUE0QjtJQVJ6RTs7UUFxQkksaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBR25DLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsRUFBRSxDQUFDLENBQUM7UUFHbkQsa0JBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUluQixpQkFBWSxHQUFrQyxPQUFPLENBQUM7UUFLOUMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7S0ErUDdEO0lBN1BHLFFBQVE7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Q3BELHlqVEFtTkE7OzRGRG5MYSx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0ksc0JBQXNCLGFBR3JCLENBQUMsYUFBYSxDQUFDLG1CQUNULHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsS0FBSzs4QkFHUixLQUFLO3NCQUFiLEtBQUs7Z0JBUWdCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDZ0MsY0FBYztzQkFBakUsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBUZW1wbGF0ZVJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDb250ZW50RGVuc2l0eSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQmFyc2FBcGksXHJcbiAgICBVcGxvYWRTZXJ2aWNlLFxyXG4gICAgZ2V0RGV2aWNlSXNNb2JpbGUsXHJcbiAgICBGaWxlc1ZhbGlkYXRpb25IZWxwZXIsXHJcbiAgICBJVXBsb2FkaW5nU3RhdGVcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IERldmljZUluZm9GaWVsZEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9kZXZpY2UtaW5mby1maWVsZC1iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdic3UtdWktcGljdHVyZXMtaW5mbycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdWktcGljdHVyZXMtaW5mby5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi91aS1waWN0dXJlcy1pbmZvLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtVcGxvYWRTZXJ2aWNlXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc3RhbmRhbG9uZTogZmFsc2VcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpUGljdHVyZXNJbmZvQ29tcG9uZW50IGV4dGVuZHMgRGV2aWNlSW5mb0ZpZWxkQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIHZhbHVlOiB7XHJcbiAgICAgICAgSWQ6IHN0cmluZztcclxuICAgICAgICBGaWxlSWQ6IHN0cmluZztcclxuICAgICAgICBGaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgICAgIFdpZHRoOiBzdHJpbmc7XHJcbiAgICAgICAgSGVpZ2h0OiBzdHJpbmc7XHJcbiAgICAgICAgU2l6ZTogc3RyaW5nO1xyXG4gICAgfVtdO1xyXG4gICAgQFZpZXdDaGlsZCgnZ2FsbGVyeScpIGdhbGxlcnkhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2RpYWxvZ1RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBkaWFsb2dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICB1cGxvYWRpbmdTdGF0ZSQ6IE9ic2VydmFibGU8SVVwbG9hZGluZ1N0YXRlPjtcclxuICAgIGNhbmNlbGF0aW9uJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBjb250ZW50RGVuc2l0eSQ6IE9ic2VydmFibGU8Q29udGVudERlbnNpdHk+O1xyXG4gICAgZmlsZXM6IEZpbGVbXTtcclxuICAgIG1lZGlhRGF0YVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVkaWFbXT4oW10pO1xyXG4gICAgbWVkaWFEYXRhJDogT2JzZXJ2YWJsZTxNZWRpYVtdPjtcclxuICAgIGlzTW9iaWxlOiBhbnk7XHJcbiAgICBzZWxlY3RlZEluZGV4ID0gLTE7XHJcbiAgICBmaWxsV2lkdGg6IGJvb2xlYW47XHJcbiAgICBmaWxsQWxsOiBib29sZWFuO1xyXG4gICAgZmlsbE9yaWdpbmFsOiBib29sZWFuO1xyXG4gICAgc2VsZWN0ZWRab29tOiAnem9vbTEnIHwgJ3pvb20xLTUnIHwgJ3pvb20yJyA9ICd6b29tMSc7XHJcbiAgICBmaWxlc1ZhbGlkYXRpb25IZWxwZXI6IEZpbGVzVmFsaWRhdGlvbkhlbHBlcjtcclxuICAgIG1heEZpbGVDb3VudDogbnVtYmVyO1xyXG4gICAgZmlsZUNvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG5cclxuICAgIHByaXZhdGUgX2ZpbGVDb3VudFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZpbGVDb3VudCQgPSB0aGlzLl9maWxlQ291bnRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5tZWRpYURhdGEkID0gdGhpcy5tZWRpYURhdGFTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlID0gZ2V0RGV2aWNlSXNNb2JpbGUoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGluZ1N0YXRlJCA9IHRoaXMuX3VwbG9hZFNlcnZpY2UudXBsb2FkaW5nU3RhdGUkO1xyXG4gICAgICAgIHRoaXMudmFsdWUkLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMuX3NldEZpbGVDb3VudCh2YWx1ZSkpO1xyXG5cclxuICAgICAgICB0aGlzLmZpbGVzVmFsaWRhdGlvbkhlbHBlciA9IG5ldyBGaWxlc1ZhbGlkYXRpb25IZWxwZXIoXHJcbiAgICAgICAgICAgIHRoaXMuU2V0dGluZy5NYXhQaWN0dXJlQ291bnQsXHJcbiAgICAgICAgICAgIHRoaXMuU2V0dGluZy5NYXhGaWxlU2l6ZUtiLFxyXG4gICAgICAgICAgICB0aGlzLlNldHRpbmcuTWF4VG90YWxGaWxlU2l6ZUtiXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLm1heEZpbGVDb3VudCA9IHRoaXMuZmlsZXNWYWxpZGF0aW9uSGVscGVyLm1heEZpbGVDb3VudDtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZUdhbGxlcnkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uKHtcclxuICAgICAgICAgICAgRGlzcGxheUltYWdlczogdGhpcy5fZGlzcGxheUltYWdlcy5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignRGlzcGxheUltYWdlcycsIHRoaXMuX2Rpc3BsYXlJbWFnZXMpO1xyXG4gICAgfVxyXG4gICAgb25Sb3RhdGUoaW1nRWw6IEhUTUxJbWFnZUVsZW1lbnQsIG1lZGlhMjogTWVkaWEsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSAxO1xyXG4gICAgICAgIGNvbnN0IG1lZGlhOiBhbnkgPSBtZWRpYTI7XHJcbiAgICAgICAgY29uc3QgYnBJZCA9IG1lZGlhLkZpbGVJZDtcclxuICAgICAgICBjb25zdCBhbmdsZSA9IDkwICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGlmIChtZWRpYS5Sb3RhdGlvbkFuZ2xlKSB7XHJcbiAgICAgICAgICAgIG1lZGlhLlJvdGF0aW9uQW5nbGUgPSAobWVkaWEuUm90YXRpb25BbmdsZSArIGFuZ2xlKSAlIDM2MDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZWRpYS5Sb3RhdGlvbkFuZ2xlID0gYW5nbGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3ID0gaW1nRWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgY29uc3QgaCA9IGltZ0VsLm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgbWFyZ2luID0gKHcgLSBoKSAvIDI7XHJcbiAgICAgICAgbGV0IHNjYWxlRmFjdG9yID0gdyAvIGg7XHJcbiAgICAgICAgaWYgKG1lZGlhLnNjYWxlRmFjdG9yKSB7XHJcbiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICAgICAgbWVkaWEuc2NhbGVGYWN0b3IgPSBudWxsO1xyXG4gICAgICAgICAgICBtYXJnaW4gPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1lZGlhLnNjYWxlRmFjdG9yID0gc2NhbGVGYWN0b3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NhbGVGYWN0b3IgPCAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZShpbWdFbCwgJ3RyYW5zZm9ybScsIGByb3RhdGUoJHttZWRpYS5Sb3RhdGlvbkFuZ2xlfWRlZykgc2NhbGUoJHtzY2FsZUZhY3Rvcn0pYCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIyLnNldFN0eWxlKGltZ0VsLCAndHJhbnNmb3JtJywgYHJvdGF0ZSgke21lZGlhLlJvdGF0aW9uQW5nbGV9ZGVnKWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZW5kZXJlcjIuc2V0U3R5bGUoaW1nRWwsICdtYXJnaW4tYm90dG9tJywgbWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLnNldFN0eWxlKGltZ0VsLCAnbWFyZ2luLXRvcCcsIG1hcmdpbiArICdweCcpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1NldHRpbmdzQ2hhbmdlJywgdGhpcywge1xyXG4gICAgICAgICAgICBGaWxlSWQ6IGJwSWQsXHJcbiAgICAgICAgICAgIEFuZ2xlOiBtZWRpYS5Sb3RhdGlvbkFuZ2xlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvbkZ1bGxzY3JlZW4obWVkaWEsIG1lZGlhRGF0YSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YTogeyBtZWRpYSwgbWVkaWFEYXRhIH0sXHJcbiAgICAgICAgICAgIGVzY0tleUNsb3NlYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1vYmlsZTogdHJ1ZSxcclxuICAgICAgICAgICAgdmVydGljYWxQYWRkaW5nOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKHRoaXMuZGlhbG9nVGVtcGxhdGUsIGRpYWxvZ0NvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBvbk1lZGFpQ2xpY2soZ2FsbGVyeSwgbWVkaWEsIGluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgZ2FsbGVyeSAmJiBnYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJ1tpZD1cIicgKyBTdHJpbmcoaW5kZXgpICsgJ1wiXScpPy5zY3JvbGxJbnRvVmlldyh0cnVlKTtcclxuICAgIH1cclxuICAgIG9uVGh1bWJuYWlsQ2xpY2tlZChpbWdJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW1nSW5kZXg7XHJcbiAgICAgICAgdGhpcy5nYWxsZXJ5Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2lkPVwiJyArIFN0cmluZyhpbWdJbmRleCkgKyAnXCJdJyk/LnNjcm9sbEludG9WaWV3KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVsZXRlKGluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNZWRpYSA9IHRoaXMudmFsdWVbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuX2RlbGV0ZU1lZGlhKHNlbGVjdGVkTWVkaWEpO1xyXG4gICAgfVxyXG4gICAgb25TY2FuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NjYW5IZWxwZXIoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWR2YW5jZVNjYW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2NhbkhlbHBlcih0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblpvb21JbigpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRab29tKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3pvb20xJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRab29tID0gJ3pvb20xLTUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3pvb20xLTUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFpvb20gPSAnem9vbTInO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uWm9vbU91dCgpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRab29tKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3pvb20yJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRab29tID0gJ3pvb20xLTUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3pvb20xLTUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFpvb20gPSAnem9vbTEnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsbE9yaWdpbmFsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmlsbFdpZHRoID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWxsQWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWxsT3JpZ2luYWwgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsbFdpZHRoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmlsbFdpZHRoID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZpbGxBbGwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZpbGxPcmlnaW5hbCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRmlsbEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZpbGxBbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZmlsbE9yaWdpbmFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWxsV2lkdGggPSBmYWxzZTtcclxuICAgIH1cclxuICAgIG9uRmlsZVNlbGVjdGlvbihmaWxlczogRmlsZVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWxlc1ZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVGaWxlcyhmaWxlcyk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRUb1NlcnZlcihmaWxlcykucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9kZWxldGVNZWRpYShzZWxlY3RlZE1lZGlhKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBJZCwgRmlsZUlkIH0gPSBzZWxlY3RlZE1lZGlhO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZElkID0gSWQ7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZElkKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSWQgPSBGaWxlSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUGljSW5kZXggPSB0aGlzLnZhbHVlLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gc2VsZWN0ZWRJZCB8fCBjLkZpbGVJZCA9PT0gc2VsZWN0ZWRJZCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKChjKSA9PiBjLklkICE9PSBzZWxlY3RlZElkICYmIGMuRmlsZUlkICE9PSBzZWxlY3RlZElkKTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlR2FsbGVyeSh0aGlzLnZhbHVlKTtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnQ2hhbmdlJywge1xyXG4gICAgICAgICAgICBGaWxlSWQ6IHNlbGVjdGVkSWQsXHJcbiAgICAgICAgICAgIElzRGVsZXRlZDogdHJ1ZSxcclxuICAgICAgICAgICAgT2xkSW5kZXg6IHNlbGVjdGVkUGljSW5kZXhcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2NhbkhlbHBlcihpc0FkdmFuY2VkKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2Nhbm5lciA9IG5ldyBCYXJzYUFwaS5Db21tb24uQmFyc2FTY2FubmVyKHtcclxuICAgICAgICAgICAgU2Nhbm5lckFnZW50UGFyYW1zOiB0aGlzLmNvbnRleHQuU2Nhbm5lckFnZW50UGFyYW1zXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNjYW5uZXIub24oQmFyc2FBcGkuQ29tbW9uLkJhcnNhU2Nhbm5lci5FdmVudEVudW0uU2NhblJlc3VsdFJlYWR5LCB0aGlzLl9vblNjYW5SZXN1bHRfUmVhZHksIHRoaXMpO1xyXG4gICAgICAgIHNjYW5uZXIub24oQmFyc2FBcGkuQ29tbW9uLkJhcnNhU2Nhbm5lci5FdmVudEVudW0uU2NhbkVycm9yLCB0aGlzLl9vblNjYW5fRXJyb3IsIHRoaXMpO1xyXG4gICAgICAgIHNjYW5uZXIub24oQmFyc2FBcGkuQ29tbW9uLkJhcnNhU2Nhbm5lci5FdmVudEVudW0uU2hvd1dhcnJuaW5nLCB0aGlzLl9vblNjYW5fV2Fycm5pbmcsIHRoaXMpO1xyXG4gICAgICAgIEJhcnNhQXBpLlVsLkxvYWRpbmdNYXNrLk1hc2sodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICBzY2FubmVyLlNjYW4oaXNBZHZhbmNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9vblNjYW5SZXN1bHRfUmVhZHkoY29udGVudHMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91cGxvYWRTY2FuKGNvbnRlbnRzKTtcclxuICAgICAgICBCYXJzYUFwaS5VbC5Mb2FkaW5nTWFzay5Vbm1hc2sodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX29uU2Nhbl9XYXJybmluZyh0ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5Nc2dCb3guRXJyb3IodGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJhcnNhQXBpLlVsLkxvYWRpbmdNYXNrLlVubWFzayh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb25TY2FuX0Vycm9yKGVycik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5Nc2dCb3guRXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEJhcnNhQXBpLlVsLkxvYWRpbmdNYXNrLlVubWFzayh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBsb2FkU2Nhbihjb250ZW50cyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjb250ZW50cyAmJiBjb250ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLmZvckVhY2goKGNvbnRlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkNvbW1vbi5CYXJzYVNjYW5uZXIuVXBsb2FkU2NhbkNvbnRlbnQodGhpcy5jb250ZXh0LkZpZWxkRGVmSWQsIGNvbnRlbnQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZmlsZU9iaikgdGhpcy5fb25VcGxvYWRXaW5fTmV3RmlsZVVwbG9hZChudWxsLCBmaWxlT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5Nc2dCb3guV2FybmluZyh0aGlzLl9iYmJQaXBlLnRyYW5zZm9ybSgnU2NhblJlc3VsdE5vdEZvdW5kJykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXBhcmVHYWxsZXJ5KHZhbHVlOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRhdGE6IGFueVtdID0gW107XHJcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZWRpYVVybCA9IHRoaXMuX3BpY0ZpZWxkU3JjLnRyYW5zZm9ybShpdGVtLkZpbGVJZCwgJ0JhcnNhUGljdHVyZS5GdWxsJywgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRodW1ibmFpbFVybCA9IHRoaXMuX3BpY0ZpZWxkU3JjLnRyYW5zZm9ybShpdGVtLkZpbGVJZCwgJ0JhcnNhUGljdHVyZS5UaHVtYm5haWwnLCBudWxsKTtcclxuICAgICAgICAgICAgZGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIElkOiBpdGVtLklkLFxyXG4gICAgICAgICAgICAgICAgRmlsZUlkOiBpdGVtLkZpbGVJZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLkZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0uRmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICBtZWRpYVVybDogYCR7bWVkaWFVcmx9JmNyZWF0ZURhdGU9JHtpdGVtLkNyZWF0ZURhdGV9YCxcclxuICAgICAgICAgICAgICAgIHRodW1ibmFpbFVybDogYCR7dGh1bWJuYWlsVXJsfSZjcmVhdGVEYXRlPSR7aXRlbS5DcmVhdGVEYXRlfWAsXHJcbiAgICAgICAgICAgICAgICBhbHQ6ICdGYWlsZWQgdG8gbG9hZCAnICsgbWVkaWFVcmwsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVEYXRlOiBpdGVtLkNyZWF0ZURhdGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5tZWRpYURhdGFTb3VyY2UubmV4dChkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBsb2FkVG9TZXJ2ZXIoZmlsZXM6IEZpbGVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFNlcnZpY2UuY29tcHJlc3NGaWxlcyQoZmlsZXMpLnBpcGUoXHJcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoZm9ybURhdGEpID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGxvYWRTZXJ2aWNlLnVwbG9hZChmb3JtRGF0YSwgdGhpcy5TZXR0aW5nLkNvbnRyb2xGaWVsZERlZklkKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gb2YoZXJyKSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRGaWxlQ291bnQodmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9maWxlQ291bnRTb3VyY2UubmV4dCh2YWx1ZS5maWx0ZXIoKGMpID0+ICFjLklzRGVsZXRlZCkubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUobmV3VmFsOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgLi4ubmV3VmFsXTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlR2FsbGVyeSh0aGlzLnZhbHVlKTtcclxuICAgICAgICB0aGlzLmZpcmVDb250ZXh0RXZlbnQoJ0NoYW5nZScsIG5ld1ZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5SW1hZ2VzKFxyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgIElkOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIEZpbGVJZDogc3RyaW5nO1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBXaWR0aDogc3RyaW5nO1xyXG4gICAgICAgICAgICBIZWlnaHQ6IHN0cmluZztcclxuICAgICAgICAgICAgU2l6ZTogc3RyaW5nO1xyXG4gICAgICAgIH1bXVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWEge1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIHRodW1ibmFpbFVybDogc3RyaW5nO1xyXG4gICAgbWVkaWFUeXBlOiBzdHJpbmc7XHJcbiAgICBtZWRpYVVybDogc3RyaW5nO1xyXG4gICAgY2FwdGlvbkZpbGU/OiBzdHJpbmc7XHJcbiAgICBhdWRpb0Rlc2NGaWxlPzogc3RyaW5nO1xyXG4gICAgYWx0OiBzdHJpbmc7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgc2VsZWN0ZWQ/OiBib29sZWFuO1xyXG4gICAgb3ZlcmxheVJlcXVpcmVkPzogYm9vbGVhbjtcclxufVxyXG4iLCI8ZmQtZmlsZS11cGxvYWRlclxyXG4gICAgI3VwbG9hZGVyXHJcbiAgICBbc3R5bGUuZGlzcGxheV09XCInbm9uZSdcIlxyXG4gICAgW2lkXT1cImlkXCJcclxuICAgIFtuYW1lXT1cIidwaWN0dXJlc18nICsgaWRcIlxyXG4gICAgW3BsYWNlaG9sZGVyXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICBbYnV0dG9uTGFiZWxdPVwiJ0F0dGFjaFBpY3R1cmUnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgIFtidXR0b25BcmlhTGFiZWxdPVwiJ0F0dGFjaFBpY3R1cmUnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgIGFjY2VwdD1cIi5wbmcsLmpwZywuYnBtLC5qcGVnLC5naWYsLnBuZywudGlmLC5wZGZcIlxyXG4gICAgW2ZpbGVMaW1pdF09XCJtYXhGaWxlQ291bnQgPT09IDAgPyAxMDAgOiBtYXhGaWxlQ291bnRcIlxyXG4gICAgW211bHRpcGxlXT1cIm1heEZpbGVDb3VudCA9PT0gMCB8fCBtYXhGaWxlQ291bnQgPiAxXCJcclxuICAgIChzZWxlY3RlZEZpbGVzQ2hhbmdlZCk9XCJvbkZpbGVTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbj48L2ZkLWZpbGUtdXBsb2FkZXI+XHJcblxyXG48bmctY29udGFpbmVyXHJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cImxheW91dEdyaWRUcGw7IGNvbnRleHQ6IHsgZGlzYWJsZU9yUmVhZG9ubHk6IGRpc2FibGVPclJlYWRvbmx5JCB8IGFzeW5jIH1cIlxyXG4+PC9uZy1jb250YWluZXI+XHJcbjxuZy10ZW1wbGF0ZSAjbGF5b3V0R3JpZFRwbCBsZXQtaW5EaWFsb2c9XCJpbkRpYWxvZ1wiIGxldC1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGxldC1kaXNhYmxlT3JSZWFkb25seT1cImRpc2FibGVPclJlYWRvbmx5XCI+XHJcbiAgICA8ZmQtbGF5b3V0LWdyaWQ+XHJcbiAgICAgICAgQGlmIChtZWRpYURhdGEkIHwgYXN5bmM7IGFzIG1lZGlhRGF0YSkge1xyXG4gICAgICAgIDxkaXYgZmRMYXlvdXRHcmlkUm93PlxyXG4gICAgICAgICAgICBAZm9yIChtZWRpYSBvZiBtZWRpYURhdGE7IHRyYWNrIG1lZGlhOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICA8ZGl2IFtmZExheW91dEdyaWRDb2xdPVwiNlwiIFtjb2xNZF09XCIzXCIgW2NvbExnXT1cIjJcIiBbY29sWGxdPVwiMlwiIChjbGljayk9XCJvbk1lZGFpQ2xpY2soZ2FsbGVyeSwgbWVkaWEsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRwbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBtZWRpYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRGF0YTogbWVkaWFEYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaWFsb2c6IGluRGlhbG9nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlT3JSZWFkb25seTogZGlzYWJsZU9yUmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IEBpZiAoIWluRGlhbG9nICYmICFkaXNhYmxlT3JSZWFkb25seSkge1xyXG4gICAgICAgICAgICA8ZGl2IFtmZExheW91dEdyaWRDb2xdPVwiNlwiIFtjb2xNZF09XCIzXCIgW2NvbExnXT1cIjJcIiBbY29sWGxdPVwiMlwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5ld0ZpbGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICA8L2ZkLWxheW91dC1ncmlkPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGVcclxuICAgICNjYXJkVHBsXHJcbiAgICBsZXQtbWVkaWFcclxuICAgIGxldC1tZWRpYURhdGE9XCJtZWRpYURhdGFcIlxyXG4gICAgbGV0LWluRGlhbG9nPVwiaW5EaWFsb2dcIlxyXG4gICAgbGV0LWluZGV4PVwiaW5kZXhcIlxyXG4gICAgbGV0LWRpc2FibGVPclJlYWRvbmx5PVwiZGlzYWJsZU9yUmVhZG9ubHlcIlxyXG4+XHJcbiAgICA8ZmQtY2FyZCBjbGFzcz1cIm1lZGlhXCIgW2NsYXNzLmluRGlhbG9nXT1cImluRGlhbG9nXCI+XHJcbiAgICAgICAgPGZkLWNhcmQtY29udGVudCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgaGVpZ2h0OiAxMjBweFwiPlxyXG4gICAgICAgICAgICA8aW1nIGltZ0xhenkgW2ltZ0xhenldPVwibWVkaWEudGh1bWJuYWlsVXJsXCIgW3NyY109XCJtZWRpYS50aHVtYm5haWxVcmxcIiAjaW1nIC8+XHJcbiAgICAgICAgPC9mZC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgQGlmICghaW5EaWFsb2cpIHtcclxuICAgICAgICA8ZmQtY2FyZC1mb290ZXI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIGdseXBoPVwicHJpbnRcIlxyXG4gICAgICAgICAgICAgICAgKmZkQ2FyZEZvb3RlckFjdGlvbkl0ZW1cclxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgW2ZpbGVzXT1cIlttZWRpYV1cIlxyXG4gICAgICAgICAgICAgICAgcHJpbnRGaWxlc1xyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIGdseXBoPVwiZnVsbC1zY3JlZW5cIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidGdWxsU2NyZWVuJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAqZmRDYXJkRm9vdGVyQWN0aW9uSXRlbVxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GdWxsc2NyZWVuKG1lZGlhLCBtZWRpYURhdGEpXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiBmZC1idXR0b24gW2dseXBoXT1cIidvdmVyZmxvdydcIiBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIiBbZmRNZW51VHJpZ2dlcl09XCJtZW51XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxmZC1tZW51ICNtZW51PlxyXG4gICAgICAgICAgICAgICAgPGxpIGZkLW1lbnUtaXRlbSBbZmlsZXNdPVwibWVkaWFEYXRhXCIgcHJpbnRGaWxlcz5cclxuICAgICAgICAgICAgICAgICAgICA8YSBmZC1tZW51LWludGVyYWN0aXZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwicHJpbnRcIj48L2ZkLW1lbnUtYWRkb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLW1lbnUtdGl0bGU+e3sgJ1ByaW50JyB8IGJiYlRyYW5zbGF0ZSB9fSB7eyAnQWxsJyB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGZkLW1lbnUtaXRlbSBbbmFtZV09XCJtZWRpYS5sYWJlbFwiIFtzcmNdPVwibWVkaWEubWVkaWFVcmxcIiBzYXZlSW1hZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgZmQtbWVudS1pbnRlcmFjdGl2ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBnbHlwaD1cImRvd25sb2FkXCI+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7ICdEb3dubG9hZCcgfCBiYmJUcmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIEBpZiAoIWRpc2FibGVPclJlYWRvbmx5KSB7XHJcbiAgICAgICAgICAgICAgICA8bGkgZmQtbWVudS1pdGVtIChjbGljayk9XCJvblJvdGF0ZShpbWcsIG1lZGlhLCBpbmRleClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBmZC1tZW51LWludGVyYWN0aXZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwicm90YXRlXCI+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7ICdSb3RhdGUnIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgZmQtbWVudS1pdGVtIChjbGljayk9XCJvbkRlbGV0ZShpbmRleClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBmZC1tZW51LWludGVyYWN0aXZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwiZGVsZXRlXCI+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7ICdEZWxldGUnIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZmQtbWVudT5cclxuICAgICAgICA8L2ZkLWNhcmQtZm9vdGVyPlxyXG4gICAgICAgIH1cclxuICAgIDwvZmQtY2FyZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNuZXdGaWxlPlxyXG4gICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPGZkLWNhcmQ+XHJcbiAgICAgICAgICAgIDxmZC1jYXJkLWNvbnRlbnQgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWluLWhlaWdodDogMTIwcHhcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBnbHlwaD1cImFkZC1waG90b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQXR0YWNoRmlsZScgfCBiYmJUcmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGxvYWRlci5vcGVuKClcIlxyXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2ZkLWNhcmQtY29udGVudD5cclxuXHJcbiAgICAgICAgICAgIDxmZC1jYXJkLWZvb3RlciBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGZkLWJ1dHRvbiBbZ2x5cGhdPVwiJ292ZXJmbG93J1wiIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiIFtmZE1lbnVUcmlnZ2VyXT1cIm1lbnVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxmZC1tZW51ICNtZW51PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBmZC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uU2NhbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLW1lbnUtaW50ZXJhY3RpdmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7ICdTY2FuJyB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpIGZkLW1lbnUtaXRlbSAoY2xpY2spPVwib25BZHZhbmNlU2NhbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLW1lbnUtaW50ZXJhY3RpdmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7ICdBZHZhbmNlZFNjYW4nIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvZmQtbWVudT5cclxuICAgICAgICAgICAgPC9mZC1jYXJkLWZvb3Rlcj5cclxuICAgICAgICA8L2ZkLWNhcmQ+XHJcbiAgICAgICAgQGlmICgodXBsb2FkaW5nU3RhdGUkIHwgYXN5bmMpPy51cGxvYWRpbmcgPT09IHRydWUpIHtcclxuICAgICAgICA8YnN1LW1hc2s+PC9ic3UtbWFzaz5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dUZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIj5cclxuICAgIDxmZC1kaWFsb2cgW2RpYWxvZ0NvbmZpZ109XCJkaWFsb2dDb25maWdcIiBbZGlhbG9nUmVmXT1cImRpYWxvZ1wiICNkaWFsb2dUcGwgY2xhc3M9XCJ2ZXJ0aWNhbFwiPlxyXG4gICAgICAgIDxmZC1kaWFsb2ctaGVhZGVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgZmRrVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLWxlZnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJhci1lbGVtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDEgZmQtdGl0bGU+e3sgU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uVHJhbnNsYXRlZCB9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mZC1iYXItZWxlbWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBmZC1iYXItcmlnaHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwicHJpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2x5cGhdPVwiJ3ByaW50J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVzXT1cImRpYWxvZy5kYXRhLm1lZGlhRGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RmlsZXNcclxuICAgICAgICAgICAgICAgICAgICA+PC9mZC1idXR0b24tYmFyPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWRpYWxvZ0NvbmZpZy5mdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRml0IGltYWdlIHNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2x5cGhdPVwiJ3Jlc2l6ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmRUeXBlXT1cImZpbGxXaWR0aCA/ICdlbXBoYXNpemVkJyA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsbFdpZHRoID0gIWZpbGxXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZmQtYnV0dG9uLWJhcj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXIgYXJpYUxhYmVsPVwiY2xvc2VcIiBnbHlwaD1cImRlY2xpbmVcIiAoY2xpY2spPVwiZGlhbG9nLmNsb3NlKClcIj48L2ZkLWJ1dHRvbi1iYXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2ZkLWRpYWxvZy1oZWFkZXI+XHJcbiAgICAgICAgPGZkLWRpYWxvZy1ib2R5ICNmZGJvZHk+XHJcbiAgICAgICAgICAgIDxkaXYgI2dhbGxlcnkgY2xhc3M9XCJnYWxsZXJ5IGluRGlhbG9nXCIgc3R5bGU9XCJmbGV4OiAxXCI+XHJcbiAgICAgICAgICAgICAgICBAZm9yIChtZWRpYSBvZiBkaWFsb2cuZGF0YS5tZWRpYURhdGE7IHRyYWNrIG1lZGlhLkZpbGVJZDsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbiBiaWctaW1ncy1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maWxsLXdpZHRoXT1cImZpbGxXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZpbGwtYWxsXT1cImZpbGxBbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maWxsLW9yaWdpbmFsXT1cImZpbGxPcmlnaW5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRab29tXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZmQtdG9vbGJhciBmZFR5cGU9XCJzb2xpZFwiIGZkVHlwZT1cInRyYW5zcGFyZW50XCIgW2NsZWFyQm9yZGVyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkLXRvb2xiYXItc3BhY2VyPjwvZmQtdG9vbGJhci1zcGFjZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZmQtdG9vbGJhci1pdGVtIGZkLWJ1dHRvbiBnbHlwaD1cInJvdGF0ZVwiIChjbGljayk9XCJvblJvdGF0ZShpbWcsIG1lZGlhLCBpKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtdG9vbGJhci1zcGFjZXI+PC9mZC10b29sYmFyLXNwYWNlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ZkLXRvb2xiYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY3NcIiBbaWRdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnN1LW1hc2s+PC9ic3UtbWFzaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAjaW1nIGltZ0xhenkgW2ltZ0xhenldPVwibWVkaWEubWVkaWFVcmxcIiBbc3JjXT1cIm1lZGlhLm1lZGlhVXJsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGlmICgoZGV2aWNlU2l6ZSQgfCBhc3luYykgIT09ICdzJykge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgc3R5bGU9XCJmbGV4LXNocmluazogMVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvdGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0R3JpZFRwbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaWFsb2c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5OiBnYWxsZXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZU9yUmVhZG9ubHk6IGRpc2FibGVPclJlYWRvbmx5JCB8IGFzeW5jXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctY290YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cclxuICAgIDwvZmQtZGlhbG9nPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|