barsa-sap-ui 2.2.2 → 2.2.3
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/esm2022/barsa-sap-ui.mjs +5 -0
- package/esm2022/lib/apply-conditional-formmatings.directive.mjs +90 -0
- package/esm2022/lib/avatar-size.pipe.mjs +41 -0
- package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +41 -0
- package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +145 -0
- package/esm2022/lib/barsa-bar-download-file/barsa-bar-download-file.component.mjs +23 -0
- package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +23 -0
- package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +29 -0
- package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +24 -0
- package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +24 -0
- package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +31 -0
- package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +41 -0
- package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +24 -0
- package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +242 -0
- package/esm2022/lib/barsa-chat/chat.model.mjs +8 -0
- package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +13 -0
- package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +22 -0
- package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +66 -0
- package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +78 -0
- package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +22 -0
- package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +13 -0
- package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +15 -0
- package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +72 -0
- package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +23 -0
- package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +14 -0
- package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +14 -0
- package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +26 -0
- package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +71 -0
- package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +40 -0
- package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +61 -0
- package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +45 -0
- package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +58 -0
- package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +27 -0
- package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +94 -0
- package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +22 -0
- package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +37 -0
- package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +41 -0
- package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +29 -0
- package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +23 -0
- package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +43 -0
- package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +83 -0
- package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +57 -0
- package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +159 -0
- package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +17 -0
- package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +30 -0
- package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +14 -0
- package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +34 -0
- package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +46 -0
- package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +79 -0
- package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +30 -0
- package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +31 -0
- package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +28 -0
- package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +102 -0
- package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +26 -0
- package/esm2022/lib/barsa-sap-ui-routing.module.mjs +18 -0
- package/esm2022/lib/barsa-sap-ui.module.mjs +377 -0
- package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +29 -0
- package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +170 -0
- package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +18 -0
- package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +29 -0
- package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +222 -0
- package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +87 -0
- package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +60 -0
- package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +26 -0
- package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +23 -0
- package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +37 -0
- package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +418 -0
- package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +36 -0
- package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +153 -0
- package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +20 -0
- package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +216 -0
- package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +74 -0
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +50 -0
- package/esm2022/lib/captcha-field/captcha-field.component.mjs +28 -0
- package/esm2022/lib/card-item/card-item.component.mjs +74 -0
- package/esm2022/lib/card-view-content/card-view-content.component.mjs +46 -0
- package/esm2022/lib/col-renderer.directive.mjs +47 -0
- package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +56 -0
- package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +61 -0
- package/esm2022/lib/column-renderer/column-renderer.component.mjs +97 -0
- package/esm2022/lib/constants.mjs +450 -0
- package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +41 -0
- package/esm2022/lib/device-info-field-base.mjs +24 -0
- package/esm2022/lib/dialog-handler.directive.mjs +29 -0
- package/esm2022/lib/download-files.directive.mjs +34 -0
- package/esm2022/lib/dynamic-page-size.pipe.mjs +27 -0
- package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +44 -0
- package/esm2022/lib/file-viewer/file-viewer.component.mjs +47 -0
- package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +71 -0
- package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +37 -0
- package/esm2022/lib/form-dialog/form-dialog.component.mjs +171 -0
- package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +50 -0
- package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +62 -0
- package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +45 -0
- package/esm2022/lib/form-wizard/form-wizard.component.mjs +21 -0
- package/esm2022/lib/fullscreen-dialog.directive.mjs +60 -0
- package/esm2022/lib/fullscreen-files.directive.mjs +43 -0
- package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +217 -0
- package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +215 -0
- package/esm2022/lib/global-search/global-search.component.mjs +27 -0
- package/esm2022/lib/global-search-module/global-search-module.component.mjs +29 -0
- package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +25 -0
- package/esm2022/lib/header-avatar/header-avatar.component.mjs +18 -0
- package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +48 -0
- package/esm2022/lib/hyperlink/hyperlink.component.mjs +23 -0
- package/esm2022/lib/index.mjs +549 -0
- package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +32 -0
- package/esm2022/lib/layout-actions/layout-actions.component.mjs +70 -0
- package/esm2022/lib/layout-control/layout-control.component.mjs +302 -0
- package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +180 -0
- package/esm2022/lib/list-item/list-item.component.mjs +34 -0
- package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +42 -0
- package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +82 -0
- package/esm2022/lib/ly-label/ly-label.component.mjs +37 -0
- package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +83 -0
- package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +17 -0
- package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +24 -0
- package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +83 -0
- package/esm2022/lib/ly-line/ly-line.component.mjs +56 -0
- package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +22 -0
- package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +44 -0
- package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +44 -0
- package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +51 -0
- package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +43 -0
- package/esm2022/lib/mask/mask.component.mjs +22 -0
- package/esm2022/lib/message-strip/message-strip.component.mjs +28 -0
- package/esm2022/lib/models/grid-data-provider.mjs +114 -0
- package/esm2022/lib/models/grid-view.mjs +2 -0
- package/esm2022/lib/models/index.mjs +2 -0
- package/esm2022/lib/no-data/no-data.component.mjs +31 -0
- package/esm2022/lib/notification-item/notification-item.component.mjs +57 -0
- package/esm2022/lib/notification-item-actions/notification-item-actions.component.mjs +79 -0
- package/esm2022/lib/notification-popup.service.mjs +92 -0
- package/esm2022/lib/object-status-icon.pipe.mjs +27 -0
- package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +18 -0
- package/esm2022/lib/report-navigator/report-navigator.component.mjs +68 -0
- package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +60 -0
- package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +35 -0
- package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +97 -0
- package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +88 -0
- package/esm2022/lib/report-tree-base.mjs +387 -0
- package/esm2022/lib/report-view-renderer.directive.mjs +392 -0
- package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +50 -0
- package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +84 -0
- package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +72 -0
- package/esm2022/lib/sap-font-class.pipe.mjs +30 -0
- package/esm2022/lib/sap-font.pipe.mjs +30 -0
- package/esm2022/lib/sap-size.pipe.mjs +28 -0
- package/esm2022/lib/sap-ui-report-base.component.mjs +809 -0
- package/esm2022/lib/search-panel/search-panel.component.mjs +63 -0
- package/esm2022/lib/static-text/static-text.component.mjs +15 -0
- package/esm2022/lib/table-th.directive.mjs +87 -0
- package/esm2022/lib/title/title.component.mjs +15 -0
- package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +34 -0
- package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +33 -0
- package/esm2022/lib/ui-button/ui-button.component.mjs +32 -0
- package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +53 -0
- package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +58 -0
- package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +42 -0
- package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +39 -0
- package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +50 -0
- package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +38 -0
- package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +191 -0
- package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +150 -0
- package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +108 -0
- package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +53 -0
- package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +124 -0
- package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +103 -0
- package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +32 -0
- package/esm2022/lib/ui-graph/ui-graph.component.mjs +17 -0
- package/esm2022/lib/ui-grid/ui-grid.component.mjs +25 -0
- package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +43 -0
- package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +66 -0
- package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +75 -0
- package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +58 -0
- package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +123 -0
- package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +16 -0
- package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +11 -0
- package/esm2022/lib/ui-label/ui-label.component.mjs +12 -0
- package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +379 -0
- package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +84 -0
- package/esm2022/lib/ui-map/ui-map.component.mjs +68 -0
- package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +124 -0
- package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +19 -0
- package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +14 -0
- package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +55 -0
- package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +429 -0
- package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +28 -0
- package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +37 -0
- package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +59 -0
- package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +93 -0
- package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +36 -0
- package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +56 -0
- package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +28 -0
- package/esm2022/lib/ui-notification-view/ui-notification-view.component.mjs +47 -0
- package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +33 -0
- package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +27 -0
- package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +21 -0
- package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +268 -0
- package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +101 -0
- package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +261 -0
- package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +48 -0
- package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +36 -0
- package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +46 -0
- package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +24 -0
- package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +55 -0
- package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +36 -0
- package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +20 -0
- package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +296 -0
- package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +49 -0
- package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +52 -0
- package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +48 -0
- package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +24 -0
- package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +53 -0
- package/esm2022/lib/ui-tree/ui-tree.component.mjs +114 -0
- package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +100 -0
- package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +23 -0
- package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +310 -0
- package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +25 -0
- package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +93 -0
- package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +119 -0
- package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +32 -0
- package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +48 -0
- package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +53 -0
- package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +116 -0
- package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +43 -0
- package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +196 -0
- package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +44 -0
- package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +84 -0
- package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +65 -0
- package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +116 -0
- package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +54 -0
- package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +177 -0
- package/esm2022/lib/upload-file-status.pipe.mjs +29 -0
- package/esm2022/lib/util-chat-time-badge.pipe.mjs +18 -0
- package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +23 -0
- package/esm2022/lib/wizard-layout.directive.mjs +104 -0
- package/esm2022/public-api.mjs +236 -0
- package/fesm2022/barsa-sap-ui.mjs +4 -4
- package/fesm2022/barsa-sap-ui.mjs.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
this.filesValidationHelper.validateFiles(files);
|
|
44
|
+
this.uploadFile(files).pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
45
|
+
}
|
|
46
|
+
onFileDeleted(uploaderComponent) {
|
|
47
|
+
uploaderComponent.inputRef.nativeElement.value = '';
|
|
48
|
+
this.value = null;
|
|
49
|
+
this.fireContextEvent('Change', this.context, null);
|
|
50
|
+
}
|
|
51
|
+
onDownloadFile() {
|
|
52
|
+
BarsaApi.Common.File.OpenFile(this.value.FileId, false, this, true, false);
|
|
53
|
+
}
|
|
54
|
+
onRetry() {
|
|
55
|
+
this._upload(this.files);
|
|
56
|
+
}
|
|
57
|
+
onTerminate() {
|
|
58
|
+
this._uploadService.cancelation$.next();
|
|
59
|
+
this._cdr.detectChanges();
|
|
60
|
+
}
|
|
61
|
+
_displayImage(imageUrl, sizeMode, value) {
|
|
62
|
+
this.imageUrl = imageUrl;
|
|
63
|
+
this.value = value;
|
|
64
|
+
this.sizeMode = sizeMode;
|
|
65
|
+
}
|
|
66
|
+
_upload(files) {
|
|
67
|
+
of(true)
|
|
68
|
+
.pipe(takeUntil(this._onDestroy$), exhaustMap(() => this.uploadFile(files)))
|
|
69
|
+
.subscribe();
|
|
70
|
+
}
|
|
71
|
+
uploadFile(files) {
|
|
72
|
+
return this._uploadService.compressFiles$(files).pipe(concatMap((formData) => this._uploadService.upload(formData, this.Setting.ControlFieldDefId).pipe(tap((res) => {
|
|
73
|
+
if (Array.isArray(res)) {
|
|
74
|
+
const picture = res[0];
|
|
75
|
+
if (picture.ErrorMsg) {
|
|
76
|
+
BarsaApi.Bw.Msg.Error(picture.ErrorMsg);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const value = {
|
|
80
|
+
...picture,
|
|
81
|
+
FileId: picture.FileId
|
|
82
|
+
};
|
|
83
|
+
this.fireContextEvent('Change', this.context, value);
|
|
84
|
+
}
|
|
85
|
+
}))));
|
|
86
|
+
}
|
|
87
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPictureFileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
88
|
+
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 <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 <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 <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: "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 }); }
|
|
89
|
+
}
|
|
90
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPictureFileComponent, decorators: [{
|
|
91
|
+
type: Component,
|
|
92
|
+
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 <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 <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 <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"] }]
|
|
93
|
+
}], propDecorators: { _editable: [{
|
|
94
|
+
type: HostBinding,
|
|
95
|
+
args: ['class.editable']
|
|
96
|
+
}], imageUrl: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], sizeMode: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}] } });
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktcGljdHVyZS1maWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3VpLXBpY3R1cmUtZmlsZS91aS1waWN0dXJlLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWktcGljdHVyZS1maWxlL3VpLXBpY3R1cmUtZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRzFHLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGFBQWEsRUFFaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFVdkUsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjtJQVI5RDs7UUFTbUMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUdoRCxVQUFLLEdBQVcsRUFBRSxDQUFDO0tBeUZ0QjtJQXBGRyxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7UUFDM0QsSUFBSSxD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QVM7c0JBQXZDLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUNwQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlckNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgRmllbGRCYXNlQ29tcG9uZW50LFxyXG4gICAgQmFyc2FBcGksXHJcbiAgICBVcGxvYWRTZXJ2aWNlLFxyXG4gICAgZ2V0VmFsaWRFeHRlbnNpb24sXHJcbiAgICBGaWxlc1ZhbGlkYXRpb25IZWxwZXIsXHJcbiAgICBJbWFnZU1pbWVUeXBlLFxyXG4gICAgSVVwbG9hZGluZ1N0YXRlXHJcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBleGhhdXN0TWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdic3UtdWktcGljdHVyZS1maWxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91aS1waWN0dXJlLWZpbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdWktcGljdHVyZS1maWxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIHByb3ZpZGVyczogW1VwbG9hZFNlcnZpY2VdLFxyXG4gICAgc3RhbmRhbG9uZTogZmFsc2VcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpUGljdHVyZUZpbGVDb21wb25lbnQgZXh0ZW5kcyBGaWVsZEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmVkaXRhYmxlJykgX2VkaXRhYmxlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGltYWdlVXJsOiBhbnk7XHJcbiAgICBASW5wdXQoKSBzaXplTW9kZTogYW55O1xyXG4gICAgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gICAgdXBsb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPElVcGxvYWRpbmdTdGF0ZT47XHJcbiAgICB2YWxpZEV4dGVuc2lvbnM6IGFueTtcclxuICAgIGZpbGVzVmFsaWRhdGlvbkhlbHBlcjogRmlsZXNWYWxpZGF0aW9uSGVscGVyO1xyXG4gICAgbGF5b3V0SGVpZ2h0OiBzdHJpbmc7XHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIGlmICh0aGlzLlNldHRpbmc/LklzUmVhZE9ubHkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWRpdGFibGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGxvYWRpbmdTdGF0ZSQgPSB0aGlzLl91cGxvYWRTZXJ2aWNlLnVwbG9hZGluZ1N0YXRlJDtcclxuICAgICAgICB0aGlzLmNvbnRleHQub24oe1xyXG4gICAgICAgICAgICBEaXNwYWx5SW1hZ2U6IHRoaXMuX2Rpc3BsYXlJbWFnZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgeCA9IDQ1O1xyXG4gICAgICAgIGNvbnN0IGxheW91dEhlaWdodCA9ICtCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZSh0aGlzLmxheW91dEluZm8sICdDb250cm9sQm91bmRzLmhlaWdodCcsIHgpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0SGVpZ2h0ID0gbGF5b3V0SGVpZ2h0IDwgeCA/ICdjYWNsKHZhcigtLXNhcEVsZW1lbnRfSGVpZ2h0KSArMTBweCknIDogYCR7bGF5b3V0SGVpZ2h0fXB4YDtcclxuICAgICAgICB0aGlzLmltYWdlVXJsID0gdGhpcy5jb250ZXh0LmltYWdlVXJsO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRleHQuX3ZhbHVlO1xyXG4gICAgICAgIHRoaXMudmFsaWRFeHRlbnNpb25zID0gZ2V0VmFsaWRFeHRlbnNpb24odGhpcy5TZXR0aW5nLlZhbGlkRXh0ZW5zaW9ucykgfHwgSW1hZ2VNaW1lVHlwZTtcclxuICAgICAgICB0aGlzLmZpbGVzVmFsaWRhdGlvbkhlbHBlciA9IG5ldyBGaWxlc1ZhbGlkYXRpb25IZWxwZXIoXHJcbiAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgIHRoaXMuU2V0dGluZy5NYXhGaWxlU2l6ZUtiLFxyXG4gICAgICAgICAgICB0aGlzLlNldHRpbmcuTWF4RmlsZVNpemVLYlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignRGlzcGxheUltYWdlJywgdGhpcy5fZGlzcGxheUltYWdlKTtcclxuICAgIH1cclxuICAgIG9uRmlsZVNlbGVjdGlvbihmaWxlczogRmlsZVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWxlc1ZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVGaWxlcyhmaWxlcyk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlKGZpbGVzKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBvbkZpbGVEZWxldGVkKHVwbG9hZGVyQ29tcG9uZW50OiBGaWxlVXBsb2FkZXJDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICB1cGxvYWRlckNvbXBvbmVudC5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5maXJlQ29udGV4dEV2ZW50KCdDaGFuZ2UnLCB0aGlzLmNvbnRleHQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRG93bmxvYWRGaWxlKCk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkNvbW1vbi5GaWxlLk9wZW5GaWxlKHRoaXMudmFsdWUuRmlsZUlkLCBmYWxzZSwgdGhpcywgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmV0cnkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdXBsb2FkKHRoaXMuZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVGVybWluYXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3VwbG9hZFNlcnZpY2UuY2FuY2VsYXRpb24kLm5leHQoKTtcclxuICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfZGlzcGxheUltYWdlKGltYWdlVXJsLCBzaXplTW9kZSwgdmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmltYWdlVXJsID0gaW1hZ2VVcmw7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2l6ZU1vZGUgPSBzaXplTW9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGxvYWQoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xyXG4gICAgICAgIG9mKHRydWUpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxyXG4gICAgICAgICAgICAgICAgZXhoYXVzdE1hcCgoKSA9PiB0aGlzLnVwbG9hZEZpbGUoZmlsZXMpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwbG9hZEZpbGUoZmlsZXM6IEZpbGVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFNlcnZpY2UuY29tcHJlc3NGaWxlcyQoZmlsZXMpLnBpcGUoXHJcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoZm9ybURhdGE6IEZvcm1EYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBsb2FkU2VydmljZS51cGxvYWQoZm9ybURhdGEsIHRoaXMuU2V0dGluZy5Db250cm9sRmllbGREZWZJZCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWN0dXJlID0gcmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpY3R1cmUuRXJyb3JNc2cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5Nc2cuRXJyb3IocGljdHVyZS5FcnJvck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGljdHVyZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSWQ6IHBpY3R1cmUuRmlsZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ29udGV4dEV2ZW50KCdDaGFuZ2UnLCB0aGlzLmNvbnRleHQsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAgIFtzdHlsZS5tYXgtaGVpZ2h0XT1cIlNldHRpbmcuU2l6ZU1vZGUgPT09ICcyJyA/IG51bGwgOiBsYXlvdXRIZWlnaHRcIlxyXG4gICAgW2NsYXNzLm5vLWlubGluZUVkaXRdPVwiIWlubGluZUVkaXRcIlxyXG4gICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiIXZhbHVlICYmICFpbmxpbmVFZGl0ID8gbnVsbCA6IDE0MFwiXHJcbiAgICBbY2xhc3MuaW5saW5lRWRpdF09XCJpbmxpbmVFZGl0XCJcclxuPlxyXG4gICAgQGlmICghKChkaXNhYmxlT3JSZWFkb25seSQgfCBhc3luYykgPT09IHRydWUgfHwgU2V0dGluZy5Jc1JlYWRPbmx5ID09PSB0cnVlKSkge1xyXG4gICAgPGRpdj5cclxuICAgICAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIiBbY2xlYXJCb3JkZXJdPVwidmFsdWUgJiYgaW1hZ2VVcmwgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgICAgICAgICAgPGZkLWZpbGUtdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgICN1cGxvYWRlclxyXG4gICAgICAgICAgICAgICAgZmQtdG9vbGJhci1pdGVtXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCInbm9uZSdcIlxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIid1cGxvYWRlcl8nICsgaWRcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbYnV0dG9uTGFiZWxdPVwiJ0F0dGFjaFBpY3R1cmUnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtidXR0b25BcmlhTGFiZWxdPVwiJ0F0dGFjaFBpY3R1cmUnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgIFthY2NlcHRdPVwidmFsaWRFeHRlbnNpb25zXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpbGVzQ2hhbmdlZCk9XCJvbkZpbGVTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2ZkLWZpbGUtdXBsb2FkZXI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy52YWx1ZSAmJiB2YWx1ZT8uSXNEZWxldGVkICE9PSB0cnVlXCJcclxuICAgICAgICAgICAgICAgIGdseXBoPVwiYXR0YWNobWVudFwiXHJcbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZGVyLm9wZW4oKVwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdGhpcy52YWx1ZSB8fCB2YWx1ZT8uSXNEZWxldGVkXCJcclxuICAgICAgICAgICAgICAgIGdseXBoPVwiZGVsZXRlXCJcclxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaWxlRGVsZXRlZCh1cGxvYWRlcilcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ1RwbDtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZGluZ1N0YXRlOiB1cGxvYWRpbmdTdGF0ZSQgfCBhc3luY1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9mZC10b29sYmFyPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9IEBpZiAoIWlubGluZUVkaXQpIHtcclxuICAgIDxkaXZcclxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJTZXR0aW5nLlNpemVNb2RlID09PSAnMCcgPyBsYXlvdXRJbmZvLkNvbnRyb2xCb3VuZHMuaGVpZ2h0IDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJTZXR0aW5nLlNpemVNb2RlID09PSAnMCcgPyBsYXlvdXRJbmZvLkNvbnRyb2xCb3VuZHMud2lkdGggOiBudWxsXCJcclxuICAgICAgICBbY2xhc3MuY2VudGVySW1hZ2VdPVwiU2V0dGluZy5TaXplTW9kZSA9PT0gJzMnXCJcclxuICAgID5cclxuICAgICAgICBAaWYgKHZhbHVlICYmIGltYWdlVXJsKSB7XHJcbiAgICAgICAgPGJzdS1tYXNrIFt0b3BdPVwiJzBweCdcIj48L2JzdS1tYXNrPlxyXG4gICAgICAgIH0gQGlmICgodmFsdWUgJiYgaW1hZ2VVcmwpIHx8IFNldHRpbmcuSGFzRGVmYXVsdFBpY3R1cmUpIHtcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIGltZ0xhenlcclxuICAgICAgICAgICAgW2ltZ0xhenldPVwiaW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICBbc3JjXT1cImltYWdlVXJsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiU2V0dGluZy5TaXplTW9kZSA9PT0gJzEnID8gJ2NvdmVyJyA6ICdjb250YWluJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiU2V0dGluZy5TaXplTW9kZSAhPT0gJzInID8gbGF5b3V0SW5mby5Db250cm9sQm91bmRzLmhlaWdodCA6IG51bGxcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDxmZC1hdmF0YXIgW3NpemVdPVwiJ20nXCIgW2ltYWdlXT1cImltYWdlVXJsXCI+PC9mZC1hdmF0YXI+XHJcbiAgICB9XHJcbjwvZGl2PlxyXG48bmctdGVtcGxhdGUgI2xvYWRpbmdUcGwgbGV0LXVwbG9hZGluZ1N0YXRlPVwidXBsb2FkaW5nU3RhdGVcIj5cclxuICAgIEBpZiAodXBsb2FkaW5nU3RhdGUgJiYgdXBsb2FkaW5nU3RhdGUuc3RhdGUgIT09ICdDb21wbGV0ZScgJiYgdXBsb2FkaW5nU3RhdGUudXBsb2FkaW5nKSB7XHJcbiAgICA8ZmQtc2xpZGVyXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ1cGxvYWRpbmdTdGF0ZS5wcm9ncmVzc1wiXHJcbiAgICAgICAgW25hbWVdPVwiJ3NsaWRlcl8nICsgaWRcIlxyXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgIFtpZF09XCJpZCArICcxJ1wiXHJcbiAgICAgICAgW21pbl09XCIwXCJcclxuICAgICAgICBbbWF4XT1cIjEwMFwiXHJcbiAgICAgICAgW3N0ZXBdPVwiMVwiXHJcbiAgICA+XHJcbiAgICA8L2ZkLXNsaWRlcj5cclxuICAgIEBpZiAodXBsb2FkaW5nU3RhdGUuc3RhdGUgPT09ICdVcGxvYWRpbmcnKSB7XHJcbiAgICA8YnV0dG9uIGZkLXRvb2xiYXItaXRlbSBmZC1idXR0b24gZ2x5cGg9XCJzdG9wXCIgZmRUeXBlPVwidHJhbnNwYXJlbnRcIiAoY2xpY2spPVwib25UZXJtaW5hdGUoKVwiPjwvYnV0dG9uPlxyXG4gICAgfSBAaWYgKHVwbG9hZGluZ1N0YXRlLnN0YXRlID09PSAnRXJyb3InKSB7XHJcbiAgICA8YnV0dG9uIGZkLXRvb2xiYXItaXRlbSBmZC1idXR0b24gZ2x5cGg9XCJyZWZyZXNoXCIgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCIgKGNsaWNrKT1cIm9uUmV0cnkoKVwiPjwvYnV0dG9uPlxyXG4gICAgfSB9XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|
|
@@ -0,0 +1,261 @@
|
|
|
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/inline-help";
|
|
14
|
+
import * as i8 from "@fundamental-ngx/core/layout-grid";
|
|
15
|
+
import * as i9 from "@fundamental-ngx/core/menu";
|
|
16
|
+
import * as i10 from "@fundamental-ngx/core/dialog";
|
|
17
|
+
import * as i11 from "@fundamental-ngx/cdk/utils";
|
|
18
|
+
import * as i12 from "@fundamental-ngx/core/title";
|
|
19
|
+
import * as i13 from "@fundamental-ngx/core/toolbar";
|
|
20
|
+
import * as i14 from "../mask/mask.component";
|
|
21
|
+
export class UiPicturesInfoComponent extends DeviceInfoFieldBaseComponent {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.cancelation$ = new Subject();
|
|
25
|
+
this.mediaDataSource = new BehaviorSubject([]);
|
|
26
|
+
this.selectedIndex = -1;
|
|
27
|
+
this.selectedZoom = 'zoom1';
|
|
28
|
+
this._fileCountSource = new BehaviorSubject(0);
|
|
29
|
+
}
|
|
30
|
+
ngOnInit() {
|
|
31
|
+
this.fileCount$ = this._fileCountSource.asObservable();
|
|
32
|
+
this.mediaData$ = this.mediaDataSource.asObservable();
|
|
33
|
+
super.ngOnInit();
|
|
34
|
+
this.isMobile = getDeviceIsMobile();
|
|
35
|
+
this.uploadingState$ = this._uploadService.uploadingState$;
|
|
36
|
+
this.value$.subscribe((value) => this._setFileCount(value));
|
|
37
|
+
this.filesValidationHelper = new FilesValidationHelper(this.Setting.MaxPictureCount, this.Setting.MaxFileSizeKb, this.Setting.MaxTotalFileSizeKb);
|
|
38
|
+
this.maxFileCount = this.filesValidationHelper.maxFileCount;
|
|
39
|
+
this._prepareGallery(this.value);
|
|
40
|
+
this.context.on({
|
|
41
|
+
DisplayImages: this._displayImages.bind(this)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
super.ngOnDestroy();
|
|
46
|
+
this.context.un('DisplayImages', this._displayImages);
|
|
47
|
+
}
|
|
48
|
+
onRotate(imgEl, media2, index) {
|
|
49
|
+
const direction = 1;
|
|
50
|
+
const media = media2;
|
|
51
|
+
const bpId = media.FileId;
|
|
52
|
+
const angle = 90 * direction;
|
|
53
|
+
if (media.RotationAngle) {
|
|
54
|
+
media.RotationAngle = (media.RotationAngle + angle) % 360;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
media.RotationAngle = angle;
|
|
58
|
+
}
|
|
59
|
+
const w = imgEl.offsetWidth;
|
|
60
|
+
const h = imgEl.offsetHeight;
|
|
61
|
+
let margin = (w - h) / 2;
|
|
62
|
+
let scaleFactor = w / h;
|
|
63
|
+
if (media.scaleFactor) {
|
|
64
|
+
scaleFactor = 1;
|
|
65
|
+
media.scaleFactor = null;
|
|
66
|
+
margin = 0;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
media.scaleFactor = scaleFactor;
|
|
70
|
+
}
|
|
71
|
+
if (scaleFactor < 1) {
|
|
72
|
+
this._renderer2.setStyle(imgEl, 'transform', `rotate(${media.RotationAngle}deg) scale(${scaleFactor})`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this._renderer2.setStyle(imgEl, 'transform', `rotate(${media.RotationAngle}deg)`);
|
|
76
|
+
}
|
|
77
|
+
this._renderer2.setStyle(imgEl, 'margin-bottom', margin + 'px');
|
|
78
|
+
this._renderer2.setStyle(imgEl, 'margin-top', margin + 'px');
|
|
79
|
+
this.context.fireEvent('SettingsChange', this, {
|
|
80
|
+
FileId: bpId,
|
|
81
|
+
Angle: media.RotationAngle
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
onFullscreen(media, mediaData) {
|
|
85
|
+
const dialogConfig = {
|
|
86
|
+
data: { media, mediaData },
|
|
87
|
+
escKeyCloseable: false,
|
|
88
|
+
mobile: true,
|
|
89
|
+
verticalPadding: false
|
|
90
|
+
};
|
|
91
|
+
this._dialogService.open(this.dialogTemplate, dialogConfig);
|
|
92
|
+
}
|
|
93
|
+
onMedaiClick(gallery, media, index) {
|
|
94
|
+
gallery && gallery.querySelector('[id="' + String(index) + '"]')?.scrollIntoView(true);
|
|
95
|
+
}
|
|
96
|
+
onThumbnailClicked(imgIndex) {
|
|
97
|
+
this.selectedIndex = imgIndex;
|
|
98
|
+
this.gallery.nativeElement.querySelector('[id="' + String(imgIndex) + '"]')?.scrollIntoView(true);
|
|
99
|
+
}
|
|
100
|
+
onDelete(index) {
|
|
101
|
+
const selectedMedia = this.value[index];
|
|
102
|
+
this._deleteMedia(selectedMedia);
|
|
103
|
+
}
|
|
104
|
+
onScan() {
|
|
105
|
+
this._scanHelper(false);
|
|
106
|
+
}
|
|
107
|
+
onAdvanceScan() {
|
|
108
|
+
this._scanHelper(true);
|
|
109
|
+
}
|
|
110
|
+
onZoomIn() {
|
|
111
|
+
switch (this.selectedZoom) {
|
|
112
|
+
case 'zoom1':
|
|
113
|
+
this.selectedZoom = 'zoom1-5';
|
|
114
|
+
break;
|
|
115
|
+
case 'zoom1-5':
|
|
116
|
+
this.selectedZoom = 'zoom2';
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
onZoomOut() {
|
|
121
|
+
switch (this.selectedZoom) {
|
|
122
|
+
case 'zoom2':
|
|
123
|
+
this.selectedZoom = 'zoom1-5';
|
|
124
|
+
break;
|
|
125
|
+
case 'zoom1-5':
|
|
126
|
+
this.selectedZoom = 'zoom1';
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
onFillOriginal() {
|
|
131
|
+
this.fillWidth = false;
|
|
132
|
+
this.fillAll = false;
|
|
133
|
+
this.fillOriginal = true;
|
|
134
|
+
}
|
|
135
|
+
onFillWidth() {
|
|
136
|
+
this.fillWidth = true;
|
|
137
|
+
this.fillAll = false;
|
|
138
|
+
this.fillOriginal = false;
|
|
139
|
+
}
|
|
140
|
+
onFillAll() {
|
|
141
|
+
this.fillAll = true;
|
|
142
|
+
this.fillOriginal = false;
|
|
143
|
+
this.fillWidth = false;
|
|
144
|
+
}
|
|
145
|
+
onFileSelection(files) {
|
|
146
|
+
this.filesValidationHelper.validateFiles(files);
|
|
147
|
+
this.uploadToServer(files).pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
148
|
+
}
|
|
149
|
+
_deleteMedia(selectedMedia) {
|
|
150
|
+
const { Id, FileId } = selectedMedia;
|
|
151
|
+
let selectedId = Id;
|
|
152
|
+
if (!selectedId) {
|
|
153
|
+
selectedId = FileId;
|
|
154
|
+
}
|
|
155
|
+
const selectedPicIndex = this.value.findIndex((c) => c.Id === selectedId || c.FileId === selectedId);
|
|
156
|
+
this.value = this.value.filter((c) => c.Id !== selectedId && c.FileId !== selectedId);
|
|
157
|
+
this._prepareGallery(this.value);
|
|
158
|
+
if (this.value && this.value.length > 0) {
|
|
159
|
+
this.selectedIndex = 0;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
this.selectedIndex = -1;
|
|
163
|
+
}
|
|
164
|
+
this.context.fireEvent('Change', {
|
|
165
|
+
FileId: selectedId,
|
|
166
|
+
IsDeleted: true,
|
|
167
|
+
OldIndex: selectedPicIndex
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
_scanHelper(isAdvanced) {
|
|
171
|
+
const scanner = new BarsaApi.Common.BarsaScanner({
|
|
172
|
+
ScannerAgentParams: this.context.ScannerAgentParams
|
|
173
|
+
});
|
|
174
|
+
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ScanResultReady, this._onScanResult_Ready, this);
|
|
175
|
+
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ScanError, this._onScan_Error, this);
|
|
176
|
+
scanner.on(BarsaApi.Common.BarsaScanner.EventEnum.ShowWarrning, this._onScan_Warrning, this);
|
|
177
|
+
BarsaApi.Ul.LoadingMask.Mask(this.el.nativeElement);
|
|
178
|
+
scanner.Scan(isAdvanced);
|
|
179
|
+
}
|
|
180
|
+
_onScanResult_Ready(contents) {
|
|
181
|
+
this._uploadScan(contents);
|
|
182
|
+
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
183
|
+
}
|
|
184
|
+
_onScan_Warrning(text) {
|
|
185
|
+
if (typeof text === 'string') {
|
|
186
|
+
BarsaApi.Ul.MsgBox.Error(text);
|
|
187
|
+
}
|
|
188
|
+
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
189
|
+
}
|
|
190
|
+
_onScan_Error(err) {
|
|
191
|
+
if (typeof err === 'string') {
|
|
192
|
+
BarsaApi.Ul.MsgBox.Error(err);
|
|
193
|
+
}
|
|
194
|
+
BarsaApi.Ul.LoadingMask.Unmask(this.el.nativeElement);
|
|
195
|
+
}
|
|
196
|
+
_uploadScan(contents) {
|
|
197
|
+
if (contents && contents.length > 0) {
|
|
198
|
+
contents.forEach((content) => {
|
|
199
|
+
BarsaApi.Common.BarsaScanner.UploadScanContent(this.context.FieldDefId, content, () => {
|
|
200
|
+
// if (fileObj) this._onUploadWin_NewFileUpload(null, fileObj);
|
|
201
|
+
// debugger;
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
BarsaApi.Ul.MsgBox.Warning(this._bbbPipe.transform('ScanResultNotFound'));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
_prepareGallery(value) {
|
|
210
|
+
const data = [];
|
|
211
|
+
value.forEach((item) => {
|
|
212
|
+
const mediaUrl = this._picFieldSrc.transform(item.FileId, 'BarsaPicture.Full', null);
|
|
213
|
+
const thumbnailUrl = this._picFieldSrc.transform(item.FileId, 'BarsaPicture.Thumbnail', null);
|
|
214
|
+
data.push({
|
|
215
|
+
Id: item.Id,
|
|
216
|
+
FileId: item.FileId,
|
|
217
|
+
title: item.FileName,
|
|
218
|
+
mediaType: 'image',
|
|
219
|
+
label: item.FileName,
|
|
220
|
+
mediaUrl: `${mediaUrl}&createDate=${item.CreateDate}`,
|
|
221
|
+
thumbnailUrl: `${thumbnailUrl}&createDate=${item.CreateDate}`,
|
|
222
|
+
alt: 'Failed to load ' + mediaUrl,
|
|
223
|
+
createDate: item.CreateDate
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
this.mediaDataSource.next(data);
|
|
227
|
+
}
|
|
228
|
+
uploadToServer(files) {
|
|
229
|
+
return this._uploadService.compressFiles$(files).pipe(concatMap((formData) => this._uploadService.upload(formData, this.Setting.ControlFieldDefId).pipe(tap((res) => {
|
|
230
|
+
if (Array.isArray(res)) {
|
|
231
|
+
this.updateValue(res);
|
|
232
|
+
}
|
|
233
|
+
}), catchError((err) => of(err)))));
|
|
234
|
+
}
|
|
235
|
+
_setFileCount(value) {
|
|
236
|
+
this._fileCountSource.next(value.filter((c) => !c.IsDeleted).length);
|
|
237
|
+
}
|
|
238
|
+
updateValue(newVal) {
|
|
239
|
+
this.value = [...this.value, ...newVal];
|
|
240
|
+
this._prepareGallery(this.value);
|
|
241
|
+
this.fireContextEvent('Change', newVal);
|
|
242
|
+
}
|
|
243
|
+
_displayImages(value) {
|
|
244
|
+
this.value = value;
|
|
245
|
+
}
|
|
246
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPicturesInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
247
|
+
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 *ngTemplateOutlet=\"layoutGridTpl\"></ng-container>\r\n<ng-template #layoutGridTpl let-inDialog=\"inDialog\" let-gallery=\"gallery\">\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: { $implicit: media, mediaData: this.mediaData, inDialog: this.inDialog, index: i }\r\n \"\r\n ></ng-container>\r\n </div>\r\n } @if (!inDialog && (disableOrReadonly$ | async) === true ? false : true) {\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 #cardTpl let-media let-mediaData=\"mediaData\" let-inDialog=\"inDialog\" let-index=\"index\">\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=\"message-information\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n [fd-inline-help]=\"media.title\"\r\n [triggers]=\"['click']\"\r\n [closeOnOutsideClick]=\"true\"\r\n ></button>\r\n <button *fdCardFooterActionItem fd-button glyph=\"rotate\" (click)=\"onRotate(img, media, index)\"></button>\r\n\r\n <button\r\n glyph=\"full-screen\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onFullscreen(media, mediaData)\"\r\n ></button>\r\n @if ((disableOrReadonly$ | async) === true ? false : true) {\r\n <button\r\n glyph=\"delete\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onDelete(index)\"\r\n ></button>\r\n }\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 @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=\"layoutGridTpl; context: { inDialog: true, gallery: this.gallery }\"\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: 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: "directive", type: i7.InlineHelpDirective, selector: "[fd-inline-help]:not([fd-inline-help-template]), [fd-inline-help-template]:not([fd-inline-help])", inputs: ["triggers", "noArrow", "closeOnEscapeKey", "closeOnOutsideClick", "fd-inline-help"] }, { kind: "component", type: i8.LayoutGridComponent, selector: "fd-layout-grid, [fdLayoutGrid]", inputs: ["class", "noGap", "noHorizontalGap", "noVerticalGap"] }, { kind: "directive", type: i8.LayoutGridColDirective, selector: "[fd-layout-grid-col], [fdLayoutGridCol]", inputs: ["fdLayoutGridCol", "colGrow", "colMd", "colLg", "colXl", "colOffset", "colOffsetMd", "colOffsetLg", "colOffsetXl", "class"] }, { kind: "directive", type: i8.LayoutGridRowDirective, selector: "[fd-layout-grid-row], [fdLayoutGridRow]" }, { kind: "component", type: i9.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "focusAutoCapture", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i9.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu", "parentSubmenu", "hasSeparator"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "component", type: i9.MenuInteractiveComponent, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i9.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "directive", type: i9.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i10.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i10.DialogBodyComponent, selector: "fd-dialog-body", inputs: ["disablePaddings"] }, { kind: "component", type: i10.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "directive", type: i11.TemplateDirective, selector: "[fdkTemplate]", inputs: ["fdkTemplate"] }, { kind: "component", type: i12.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i13.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "headingLevel", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i13.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "directive", type: i13.ToolbarSpacerDirective, selector: "fd-toolbar-spacer", inputs: ["width", "class", "fixed"] }, { kind: "component", type: i14.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 }); }
|
|
248
|
+
}
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiPicturesInfoComponent, decorators: [{
|
|
250
|
+
type: Component,
|
|
251
|
+
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 *ngTemplateOutlet=\"layoutGridTpl\"></ng-container>\r\n<ng-template #layoutGridTpl let-inDialog=\"inDialog\" let-gallery=\"gallery\">\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: { $implicit: media, mediaData: this.mediaData, inDialog: this.inDialog, index: i }\r\n \"\r\n ></ng-container>\r\n </div>\r\n } @if (!inDialog && (disableOrReadonly$ | async) === true ? false : true) {\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 #cardTpl let-media let-mediaData=\"mediaData\" let-inDialog=\"inDialog\" let-index=\"index\">\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=\"message-information\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n [fd-inline-help]=\"media.title\"\r\n [triggers]=\"['click']\"\r\n [closeOnOutsideClick]=\"true\"\r\n ></button>\r\n <button *fdCardFooterActionItem fd-button glyph=\"rotate\" (click)=\"onRotate(img, media, index)\"></button>\r\n\r\n <button\r\n glyph=\"full-screen\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onFullscreen(media, mediaData)\"\r\n ></button>\r\n @if ((disableOrReadonly$ | async) === true ? false : true) {\r\n <button\r\n glyph=\"delete\"\r\n *fdCardFooterActionItem\r\n fd-button\r\n fdType=\"transparent\"\r\n (click)=\"onDelete(index)\"\r\n ></button>\r\n }\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 @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=\"layoutGridTpl; context: { inDialog: true, gallery: this.gallery }\"\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"] }]
|
|
252
|
+
}], propDecorators: { value: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], gallery: [{
|
|
255
|
+
type: ViewChild,
|
|
256
|
+
args: ['gallery']
|
|
257
|
+
}], dialogTemplate: [{
|
|
258
|
+
type: ViewChild,
|
|
259
|
+
args: ['dialogTemplate', { read: TemplateRef }]
|
|
260
|
+
}] } });
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktcGljdHVyZXMtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1zYXAtdWkvc3JjL2xpYi91aS1waWN0dXJlcy1pbmZvL3VpLXBpY3R1cmVzLWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWktcGljdHVyZXMtaW5mby91aS1waWN0dXJlcy1pbmZvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEVBQ1QsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJdkUsT0FBTyxFQUNILFFBQVEsRUFDUixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUV4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBVXpFLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSw0QkFBNEI7SUFSekU7O1FBcUJJLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUduQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR25ELGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFJbkIsaUJBQVksR0FBa0MsT0FBTyxDQUFDO1FBSzlDLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO0tBK1A3RDtJQTdQRyxRQUFR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MUNwRCxzOU9BbUtBOzs0RkRuSWEsdUJBQXVCO2tCQVJuQyxTQUFTOytCQUNJLHNCQUFzQixhQUdyQixDQUFDLGFBQWEsQ0FBQyxtQkFDVCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLEtBQUs7OEJBR1IsS0FBSztzQkFBYixLQUFLO2dCQVFnQixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ2dDLGNBQWM7c0JBQWpFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVGVtcGxhdGVSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBjb25jYXRNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ29udGVudERlbnNpdHkgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEJhcnNhQXBpLFxyXG4gICAgVXBsb2FkU2VydmljZSxcclxuICAgIGdldERldmljZUlzTW9iaWxlLFxyXG4gICAgRmlsZXNWYWxpZGF0aW9uSGVscGVyLFxyXG4gICAgSVVwbG9hZGluZ1N0YXRlXHJcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBEZXZpY2VJbmZvRmllbGRCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGV2aWNlLWluZm8tZmllbGQtYmFzZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LXVpLXBpY3R1cmVzLWluZm8nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VpLXBpY3R1cmVzLWluZm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdWktcGljdHVyZXMtaW5mby5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbVXBsb2FkU2VydmljZV0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaVBpY3R1cmVzSW5mb0NvbXBvbmVudCBleHRlbmRzIERldmljZUluZm9GaWVsZEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBASW5wdXQoKSB2YWx1ZToge1xyXG4gICAgICAgIElkOiBzdHJpbmc7XHJcbiAgICAgICAgRmlsZUlkOiBzdHJpbmc7XHJcbiAgICAgICAgRmlsZU5hbWU6IHN0cmluZztcclxuICAgICAgICBXaWR0aDogc3RyaW5nO1xyXG4gICAgICAgIEhlaWdodDogc3RyaW5nO1xyXG4gICAgICAgIFNpemU6IHN0cmluZztcclxuICAgIH1bXTtcclxuICAgIEBWaWV3Q2hpbGQoJ2dhbGxlcnknKSBnYWxsZXJ5ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgICBAVmlld0NoaWxkKCdkaWFsb2dUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgZGlhbG9nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgdXBsb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPElVcGxvYWRpbmdTdGF0ZT47XHJcbiAgICBjYW5jZWxhdGlvbiQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgY29udGVudERlbnNpdHkkOiBPYnNlcnZhYmxlPENvbnRlbnREZW5zaXR5PjtcclxuICAgIGZpbGVzOiBGaWxlW107XHJcbiAgICBtZWRpYURhdGFTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhW10+KFtdKTtcclxuICAgIG1lZGlhRGF0YSQ6IE9ic2VydmFibGU8TWVkaWFbXT47XHJcbiAgICBpc01vYmlsZTogYW55O1xyXG4gICAgc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgZmlsbFdpZHRoOiBib29sZWFuO1xyXG4gICAgZmlsbEFsbDogYm9vbGVhbjtcclxuICAgIGZpbGxPcmlnaW5hbDogYm9vbGVhbjtcclxuICAgIHNlbGVjdGVkWm9vbTogJ3pvb20xJyB8ICd6b29tMS01JyB8ICd6b29tMicgPSAnem9vbTEnO1xyXG4gICAgZmlsZXNWYWxpZGF0aW9uSGVscGVyOiBGaWxlc1ZhbGlkYXRpb25IZWxwZXI7XHJcbiAgICBtYXhGaWxlQ291bnQ6IG51bWJlcjtcclxuICAgIGZpbGVDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuXHJcbiAgICBwcml2YXRlIF9maWxlQ291bnRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWxlQ291bnQkID0gdGhpcy5fZmlsZUNvdW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMubWVkaWFEYXRhJCA9IHRoaXMubWVkaWFEYXRhU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5pc01vYmlsZSA9IGdldERldmljZUlzTW9iaWxlKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRpbmdTdGF0ZSQgPSB0aGlzLl91cGxvYWRTZXJ2aWNlLnVwbG9hZGluZ1N0YXRlJDtcclxuICAgICAgICB0aGlzLnZhbHVlJC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLl9zZXRGaWxlQ291bnQodmFsdWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWxlc1ZhbGlkYXRpb25IZWxwZXIgPSBuZXcgRmlsZXNWYWxpZGF0aW9uSGVscGVyKFxyXG4gICAgICAgICAgICB0aGlzLlNldHRpbmcuTWF4UGljdHVyZUNvdW50LFxyXG4gICAgICAgICAgICB0aGlzLlNldHRpbmcuTWF4RmlsZVNpemVLYixcclxuICAgICAgICAgICAgdGhpcy5TZXR0aW5nLk1heFRvdGFsRmlsZVNpemVLYlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5tYXhGaWxlQ291bnQgPSB0aGlzLmZpbGVzVmFsaWRhdGlvbkhlbHBlci5tYXhGaWxlQ291bnQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVHYWxsZXJ5KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5vbih7XHJcbiAgICAgICAgICAgIERpc3BsYXlJbWFnZXM6IHRoaXMuX2Rpc3BsYXlJbWFnZXMuYmluZCh0aGlzKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ0Rpc3BsYXlJbWFnZXMnLCB0aGlzLl9kaXNwbGF5SW1hZ2VzKTtcclxuICAgIH1cclxuICAgIG9uUm90YXRlKGltZ0VsOiBIVE1MSW1hZ2VFbGVtZW50LCBtZWRpYTI6IE1lZGlhLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gMTtcclxuICAgICAgICBjb25zdCBtZWRpYTogYW55ID0gbWVkaWEyO1xyXG4gICAgICAgIGNvbnN0IGJwSWQgPSBtZWRpYS5GaWxlSWQ7XHJcbiAgICAgICAgY29uc3QgYW5nbGUgPSA5MCAqIGRpcmVjdGlvbjtcclxuICAgICAgICBpZiAobWVkaWEuUm90YXRpb25BbmdsZSkge1xyXG4gICAgICAgICAgICBtZWRpYS5Sb3RhdGlvbkFuZ2xlID0gKG1lZGlhLlJvdGF0aW9uQW5nbGUgKyBhbmdsZSkgJSAzNjA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWVkaWEuUm90YXRpb25BbmdsZSA9IGFuZ2xlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdyA9IGltZ0VsLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGggPSBpbWdFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IG1hcmdpbiA9ICh3IC0gaCkgLyAyO1xyXG4gICAgICAgIGxldCBzY2FsZUZhY3RvciA9IHcgLyBoO1xyXG4gICAgICAgIGlmIChtZWRpYS5zY2FsZUZhY3Rvcikge1xyXG4gICAgICAgICAgICBzY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgICAgIG1lZGlhLnNjYWxlRmFjdG9yID0gbnVsbDtcclxuICAgICAgICAgICAgbWFyZ2luID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZWRpYS5zY2FsZUZhY3RvciA9IHNjYWxlRmFjdG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjYWxlRmFjdG9yIDwgMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlcjIuc2V0U3R5bGUoaW1nRWwsICd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7bWVkaWEuUm90YXRpb25BbmdsZX1kZWcpIHNjYWxlKCR7c2NhbGVGYWN0b3J9KWApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZShpbWdFbCwgJ3RyYW5zZm9ybScsIGByb3RhdGUoJHttZWRpYS5Sb3RhdGlvbkFuZ2xlfWRlZylgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLnNldFN0eWxlKGltZ0VsLCAnbWFyZ2luLWJvdHRvbScsIG1hcmdpbiArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZShpbWdFbCwgJ21hcmdpbi10b3AnLCBtYXJnaW4gKyAncHgnKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdTZXR0aW5nc0NoYW5nZScsIHRoaXMsIHtcclxuICAgICAgICAgICAgRmlsZUlkOiBicElkLFxyXG4gICAgICAgICAgICBBbmdsZTogbWVkaWEuUm90YXRpb25BbmdsZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgb25GdWxsc2NyZWVuKG1lZGlhLCBtZWRpYURhdGEpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHsgbWVkaWEsIG1lZGlhRGF0YSB9LFxyXG4gICAgICAgICAgICBlc2NLZXlDbG9zZWFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtb2JpbGU6IHRydWUsXHJcbiAgICAgICAgICAgIHZlcnRpY2FsUGFkZGluZzogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbih0aGlzLmRpYWxvZ1RlbXBsYXRlLCBkaWFsb2dDb25maWcpO1xyXG4gICAgfVxyXG4gICAgb25NZWRhaUNsaWNrKGdhbGxlcnksIG1lZGlhLCBpbmRleCk6IHZvaWQge1xyXG4gICAgICAgIGdhbGxlcnkgJiYgZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCdbaWQ9XCInICsgU3RyaW5nKGluZGV4KSArICdcIl0nKT8uc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBvblRodW1ibmFpbENsaWNrZWQoaW1nSW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGltZ0luZGV4O1xyXG4gICAgICAgIHRoaXMuZ2FsbGVyeS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZD1cIicgKyBTdHJpbmcoaW1nSW5kZXgpICsgJ1wiXScpPy5zY3JvbGxJbnRvVmlldyh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZShpbmRleCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTWVkaWEgPSB0aGlzLnZhbHVlW2luZGV4XTtcclxuICAgICAgICB0aGlzLl9kZWxldGVNZWRpYShzZWxlY3RlZE1lZGlhKTtcclxuICAgIH1cclxuICAgIG9uU2NhbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zY2FuSGVscGVyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkdmFuY2VTY2FuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NjYW5IZWxwZXIodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25ab29tSW4oKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkWm9vbSkge1xyXG4gICAgICAgICAgICBjYXNlICd6b29tMSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkWm9vbSA9ICd6b29tMS01JztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd6b29tMS01JzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRab29tID0gJ3pvb20yJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblpvb21PdXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkWm9vbSkge1xyXG4gICAgICAgICAgICBjYXNlICd6b29tMic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkWm9vbSA9ICd6b29tMS01JztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd6b29tMS01JzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRab29tID0gJ3pvb20xJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkZpbGxPcmlnaW5hbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZpbGxXaWR0aCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlsbEFsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlsbE9yaWdpbmFsID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbGxXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZpbGxXaWR0aCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5maWxsQWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWxsT3JpZ2luYWwgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbGxBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWxsQWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZpbGxPcmlnaW5hbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlsbFdpZHRoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBvbkZpbGVTZWxlY3Rpb24oZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmlsZXNWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlRmlsZXMoZmlsZXMpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkVG9TZXJ2ZXIoZmlsZXMpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZGVsZXRlTWVkaWEoc2VsZWN0ZWRNZWRpYSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgSWQsIEZpbGVJZCB9ID0gc2VsZWN0ZWRNZWRpYTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRJZCA9IElkO1xyXG4gICAgICAgIGlmICghc2VsZWN0ZWRJZCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZElkID0gRmlsZUlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFBpY0luZGV4ID0gdGhpcy52YWx1ZS5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IHNlbGVjdGVkSWQgfHwgYy5GaWxlSWQgPT09IHNlbGVjdGVkSWQpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigoYykgPT4gYy5JZCAhPT0gc2VsZWN0ZWRJZCAmJiBjLkZpbGVJZCAhPT0gc2VsZWN0ZWRJZCk7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZUdhbGxlcnkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ0NoYW5nZScsIHtcclxuICAgICAgICAgICAgRmlsZUlkOiBzZWxlY3RlZElkLFxyXG4gICAgICAgICAgICBJc0RlbGV0ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIE9sZEluZGV4OiBzZWxlY3RlZFBpY0luZGV4XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3NjYW5IZWxwZXIoaXNBZHZhbmNlZCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjYW5uZXIgPSBuZXcgQmFyc2FBcGkuQ29tbW9uLkJhcnNhU2Nhbm5lcih7XHJcbiAgICAgICAgICAgIFNjYW5uZXJBZ2VudFBhcmFtczogdGhpcy5jb250ZXh0LlNjYW5uZXJBZ2VudFBhcmFtc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzY2FubmVyLm9uKEJhcnNhQXBpLkNvbW1vbi5CYXJzYVNjYW5uZXIuRXZlbnRFbnVtLlNjYW5SZXN1bHRSZWFkeSwgdGhpcy5fb25TY2FuUmVzdWx0X1JlYWR5LCB0aGlzKTtcclxuICAgICAgICBzY2FubmVyLm9uKEJhcnNhQXBpLkNvbW1vbi5CYXJzYVNjYW5uZXIuRXZlbnRFbnVtLlNjYW5FcnJvciwgdGhpcy5fb25TY2FuX0Vycm9yLCB0aGlzKTtcclxuICAgICAgICBzY2FubmVyLm9uKEJhcnNhQXBpLkNvbW1vbi5CYXJzYVNjYW5uZXIuRXZlbnRFbnVtLlNob3dXYXJybmluZywgdGhpcy5fb25TY2FuX1dhcnJuaW5nLCB0aGlzKTtcclxuICAgICAgICBCYXJzYUFwaS5VbC5Mb2FkaW5nTWFzay5NYXNrKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgc2Nhbm5lci5TY2FuKGlzQWR2YW5jZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb25TY2FuUmVzdWx0X1JlYWR5KGNvbnRlbnRzKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdXBsb2FkU2Nhbihjb250ZW50cyk7XHJcbiAgICAgICAgQmFyc2FBcGkuVWwuTG9hZGluZ01hc2suVW5tYXNrKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9vblNjYW5fV2Fycm5pbmcodGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuVWwuTXNnQm94LkVycm9yKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCYXJzYUFwaS5VbC5Mb2FkaW5nTWFzay5Vbm1hc2sodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX29uU2Nhbl9FcnJvcihlcnIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuVWwuTXNnQm94LkVycm9yKGVycik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBCYXJzYUFwaS5VbC5Mb2FkaW5nTWFzay5Vbm1hc2sodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwbG9hZFNjYW4oY29udGVudHMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb250ZW50cy5mb3JFYWNoKChjb250ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Db21tb24uQmFyc2FTY2FubmVyLlVwbG9hZFNjYW5Db250ZW50KHRoaXMuY29udGV4dC5GaWVsZERlZklkLCBjb250ZW50LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGZpbGVPYmopIHRoaXMuX29uVXBsb2FkV2luX05ld0ZpbGVVcGxvYWQobnVsbCwgZmlsZU9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuVWwuTXNnQm94Lldhcm5pbmcodGhpcy5fYmJiUGlwZS50cmFuc2Zvcm0oJ1NjYW5SZXN1bHROb3RGb3VuZCcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9wcmVwYXJlR2FsbGVyeSh2YWx1ZTogYW55W10pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkYXRhOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWVkaWFVcmwgPSB0aGlzLl9waWNGaWVsZFNyYy50cmFuc2Zvcm0oaXRlbS5GaWxlSWQsICdCYXJzYVBpY3R1cmUuRnVsbCcsIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zdCB0aHVtYm5haWxVcmwgPSB0aGlzLl9waWNGaWVsZFNyYy50cmFuc2Zvcm0oaXRlbS5GaWxlSWQsICdCYXJzYVBpY3R1cmUuVGh1bWJuYWlsJywgbnVsbCk7XHJcbiAgICAgICAgICAgIGRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBJZDogaXRlbS5JZCxcclxuICAgICAgICAgICAgICAgIEZpbGVJZDogaXRlbS5GaWxlSWQsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS5GaWxlTmFtZSxcclxuICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBpdGVtLkZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgbWVkaWFVcmw6IGAke21lZGlhVXJsfSZjcmVhdGVEYXRlPSR7aXRlbS5DcmVhdGVEYXRlfWAsXHJcbiAgICAgICAgICAgICAgICB0aHVtYm5haWxVcmw6IGAke3RodW1ibmFpbFVybH0mY3JlYXRlRGF0ZT0ke2l0ZW0uQ3JlYXRlRGF0ZX1gLFxyXG4gICAgICAgICAgICAgICAgYWx0OiAnRmFpbGVkIHRvIGxvYWQgJyArIG1lZGlhVXJsLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlRGF0ZTogaXRlbS5DcmVhdGVEYXRlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubWVkaWFEYXRhU291cmNlLm5leHQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwbG9hZFRvU2VydmVyKGZpbGVzOiBGaWxlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRTZXJ2aWNlLmNvbXByZXNzRmlsZXMkKGZpbGVzKS5waXBlKFxyXG4gICAgICAgICAgICBjb25jYXRNYXAoKGZvcm1EYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBsb2FkU2VydmljZS51cGxvYWQoZm9ybURhdGEsIHRoaXMuU2V0dGluZy5Db250cm9sRmllbGREZWZJZCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IG9mKGVycikpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0RmlsZUNvdW50KHZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZmlsZUNvdW50U291cmNlLm5leHQodmFsdWUuZmlsdGVyKChjKSA9PiAhYy5Jc0RlbGV0ZWQpLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVZhbHVlKG5ld1ZhbDogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIC4uLm5ld1ZhbF07XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZUdhbGxlcnkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5maXJlQ29udGV4dEV2ZW50KCdDaGFuZ2UnLCBuZXdWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGlzcGxheUltYWdlcyhcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBJZDogc3RyaW5nO1xyXG4gICAgICAgICAgICBGaWxlSWQ6IHN0cmluZztcclxuICAgICAgICAgICAgRmlsZU5hbWU6IHN0cmluZztcclxuICAgICAgICAgICAgV2lkdGg6IHN0cmluZztcclxuICAgICAgICAgICAgSGVpZ2h0OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIFNpemU6IHN0cmluZztcclxuICAgICAgICB9W11cclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhIHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICB0aHVtYm5haWxVcmw6IHN0cmluZztcclxuICAgIG1lZGlhVHlwZTogc3RyaW5nO1xyXG4gICAgbWVkaWFVcmw6IHN0cmluZztcclxuICAgIGNhcHRpb25GaWxlPzogc3RyaW5nO1xyXG4gICAgYXVkaW9EZXNjRmlsZT86IHN0cmluZztcclxuICAgIGFsdDogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcclxuICAgIG92ZXJsYXlSZXF1aXJlZD86IGJvb2xlYW47XHJcbn1cclxuIiwiPGZkLWZpbGUtdXBsb2FkZXJcclxuICAgICN1cGxvYWRlclxyXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcclxuICAgIFtpZF09XCJpZFwiXHJcbiAgICBbbmFtZV09XCIncGljdHVyZXNfJyArIGlkXCJcclxuICAgIFtwbGFjZWhvbGRlcl09XCInQXR0YWNoUGljdHVyZScgfCBiYmJUcmFuc2xhdGVcIlxyXG4gICAgW2J1dHRvbkxhYmVsXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICBbYnV0dG9uQXJpYUxhYmVsXT1cIidBdHRhY2hQaWN0dXJlJyB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICBhY2NlcHQ9XCIucG5nLC5qcGcsLmJwbSwuanBlZywuZ2lmLC5wbmcsLnRpZiwucGRmXCJcclxuICAgIFtmaWxlTGltaXRdPVwibWF4RmlsZUNvdW50ID09PSAwID8gMTAwIDogbWF4RmlsZUNvdW50XCJcclxuICAgIFttdWx0aXBsZV09XCJtYXhGaWxlQ291bnQgPT09IDAgfHwgbWF4RmlsZUNvdW50ID4gMVwiXHJcbiAgICAoc2VsZWN0ZWRGaWxlc0NoYW5nZWQpPVwib25GaWxlU2VsZWN0aW9uKCRldmVudClcIlxyXG4+PC9mZC1maWxlLXVwbG9hZGVyPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxheW91dEdyaWRUcGxcIj48L25nLWNvbnRhaW5lcj5cclxuPG5nLXRlbXBsYXRlICNsYXlvdXRHcmlkVHBsIGxldC1pbkRpYWxvZz1cImluRGlhbG9nXCIgbGV0LWdhbGxlcnk9XCJnYWxsZXJ5XCI+XHJcbiAgICA8ZmQtbGF5b3V0LWdyaWQ+XHJcbiAgICAgICAgQGlmIChtZWRpYURhdGEkIHwgYXN5bmM7IGFzIG1lZGlhRGF0YSkge1xyXG4gICAgICAgIDxkaXYgZmRMYXlvdXRHcmlkUm93PlxyXG4gICAgICAgICAgICBAZm9yIChtZWRpYSBvZiBtZWRpYURhdGE7IHRyYWNrIG1lZGlhOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICA8ZGl2IFtmZExheW91dEdyaWRDb2xdPVwiNlwiIFtjb2xNZF09XCIzXCIgW2NvbExnXT1cIjJcIiBbY29sWGxdPVwiMlwiIChjbGljayk9XCJvbk1lZGFpQ2xpY2soZ2FsbGVyeSwgbWVkaWEsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRwbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IG1lZGlhLCBtZWRpYURhdGE6IHRoaXMubWVkaWFEYXRhLCBpbkRpYWxvZzogdGhpcy5pbkRpYWxvZywgaW5kZXg6IGkgfVxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IEBpZiAoIWluRGlhbG9nICYmIChkaXNhYmxlT3JSZWFkb25seSQgfCBhc3luYykgPT09IHRydWUgPyBmYWxzZSA6IHRydWUpIHtcclxuICAgICAgICAgICAgPGRpdiBbZmRMYXlvdXRHcmlkQ29sXT1cIjZcIiBbY29sTWRdPVwiM1wiIFtjb2xMZ109XCIyXCIgW2NvbFhsXT1cIjJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuZXdGaWxlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgPC9mZC1sYXlvdXQtZ3JpZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjYXJkVHBsIGxldC1tZWRpYSBsZXQtbWVkaWFEYXRhPVwibWVkaWFEYXRhXCIgbGV0LWluRGlhbG9nPVwiaW5EaWFsb2dcIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxyXG4gICAgPGZkLWNhcmQgY2xhc3M9XCJtZWRpYVwiIFtjbGFzcy5pbkRpYWxvZ109XCJpbkRpYWxvZ1wiPlxyXG4gICAgICAgIDxmZC1jYXJkLWNvbnRlbnQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGhlaWdodDogMTIwcHhcIj5cclxuICAgICAgICAgICAgPGltZyBpbWdMYXp5IFtpbWdMYXp5XT1cIm1lZGlhLnRodW1ibmFpbFVybFwiIFtzcmNdPVwibWVkaWEudGh1bWJuYWlsVXJsXCIgI2ltZyAvPlxyXG4gICAgICAgIDwvZmQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgIEBpZiAoIWluRGlhbG9nKSB7XHJcbiAgICAgICAgPGZkLWNhcmQtZm9vdGVyPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBnbHlwaD1cIm1lc3NhZ2UtaW5mb3JtYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgKmZkQ2FyZEZvb3RlckFjdGlvbkl0ZW1cclxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgW2ZkLWlubGluZS1oZWxwXT1cIm1lZGlhLnRpdGxlXCJcclxuICAgICAgICAgICAgICAgIFt0cmlnZ2Vyc109XCJbJ2NsaWNrJ11cIlxyXG4gICAgICAgICAgICAgICAgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqZmRDYXJkRm9vdGVyQWN0aW9uSXRlbSBmZC1idXR0b24gZ2x5cGg9XCJyb3RhdGVcIiAoY2xpY2spPVwib25Sb3RhdGUoaW1nLCBtZWRpYSwgaW5kZXgpXCI+PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBnbHlwaD1cImZ1bGwtc2NyZWVuXCJcclxuICAgICAgICAgICAgICAgICpmZENhcmRGb290ZXJBY3Rpb25JdGVtXHJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkZ1bGxzY3JlZW4obWVkaWEsIG1lZGlhRGF0YSlcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIEBpZiAoKGRpc2FibGVPclJlYWRvbmx5JCB8IGFzeW5jKSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZSkge1xyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBnbHlwaD1cImRlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAqZmRDYXJkRm9vdGVyQWN0aW9uSXRlbVxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUoaW5kZXgpXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9mZC1jYXJkLWZvb3Rlcj5cclxuICAgICAgICB9XHJcbiAgICA8L2ZkLWNhcmQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjbmV3RmlsZT5cclxuICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDogMTAwJVwiPlxyXG4gICAgICAgIDxmZC1jYXJkPlxyXG4gICAgICAgICAgICA8ZmQtY2FyZC1jb250ZW50IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEyMHB4XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGg9XCJhZGQtcGhvdG9cIlxyXG4gICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0F0dGFjaEZpbGUnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBsb2FkZXIub3BlbigpXCJcclxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9mZC1jYXJkLWNvbnRlbnQ+XHJcblxyXG4gICAgICAgICAgICA8ZmQtY2FyZC1mb290ZXIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI2NjY1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBmZC1idXR0b24gW2dseXBoXT1cIidvdmVyZmxvdydcIiBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIiBbZmRNZW51VHJpZ2dlcl09XCJtZW51XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZmQtbWVudSAjbWVudT5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbWVudS1pdGVtIChjbGljayk9XCJvblNjYW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBmZC1tZW51LWludGVyYWN0aXZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbWVudS10aXRsZT57eyAnU2NhbicgfCBiYmJUcmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBmZC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQWR2YW5jZVNjYW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBmZC1tZW51LWludGVyYWN0aXZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbWVudS10aXRsZT57eyAnQWR2YW5jZWRTY2FuJyB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L2ZkLW1lbnU+XHJcbiAgICAgICAgICAgIDwvZmQtY2FyZC1mb290ZXI+XHJcbiAgICAgICAgPC9mZC1jYXJkPlxyXG4gICAgICAgIEBpZiAoKHVwbG9hZGluZ1N0YXRlJCB8IGFzeW5jKT8udXBsb2FkaW5nID09PSB0cnVlKSB7XHJcbiAgICAgICAgPGJzdS1tYXNrPjwvYnN1LW1hc2s+XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nVGVtcGxhdGUgbGV0LWRpYWxvZyBsZXQtZGlhbG9nQ29uZmlnPVwiZGlhbG9nQ29uZmlnXCI+XHJcbiAgICA8ZmQtZGlhbG9nIFtkaWFsb2dDb25maWddPVwiZGlhbG9nQ29uZmlnXCIgW2RpYWxvZ1JlZl09XCJkaWFsb2dcIiAjZGlhbG9nVHBsIGNsYXNzPVwidmVydGljYWxcIj5cclxuICAgICAgICA8ZmQtZGlhbG9nLWhlYWRlcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZka1RlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1sZWZ0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxmZC1iYXItZWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGZkLXRpdGxlPnt7IFNldHRpbmcuQ29udHJvbEZpZWxkQ2FwdGlvblRyYW5zbGF0ZWQgfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLXJpZ2h0PlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWRpYWxvZ0NvbmZpZy5mdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRml0IGltYWdlIHNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2x5cGhdPVwiJ3Jlc2l6ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmRUeXBlXT1cImZpbGxXaWR0aCA/ICdlbXBoYXNpemVkJyA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsbFdpZHRoID0gIWZpbGxXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZmQtYnV0dG9uLWJhcj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXIgYXJpYUxhYmVsPVwiY2xvc2VcIiBnbHlwaD1cImRlY2xpbmVcIiAoY2xpY2spPVwiZGlhbG9nLmNsb3NlKClcIj48L2ZkLWJ1dHRvbi1iYXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2ZkLWRpYWxvZy1oZWFkZXI+XHJcbiAgICAgICAgPGZkLWRpYWxvZy1ib2R5ICNmZGJvZHk+XHJcbiAgICAgICAgICAgIDxkaXYgI2dhbGxlcnkgY2xhc3M9XCJnYWxsZXJ5IGluRGlhbG9nXCIgc3R5bGU9XCJmbGV4OiAxXCI+XHJcbiAgICAgICAgICAgICAgICBAZm9yIChtZWRpYSBvZiBkaWFsb2cuZGF0YS5tZWRpYURhdGE7IHRyYWNrIG1lZGlhLkZpbGVJZDsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbiBiaWctaW1ncy1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maWxsLXdpZHRoXT1cImZpbGxXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZpbGwtYWxsXT1cImZpbGxBbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maWxsLW9yaWdpbmFsXT1cImZpbGxPcmlnaW5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRab29tXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZmQtdG9vbGJhciBmZFR5cGU9XCJzb2xpZFwiIGZkVHlwZT1cInRyYW5zcGFyZW50XCIgW2NsZWFyQm9yZGVyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkLXRvb2xiYXItc3BhY2VyPjwvZmQtdG9vbGJhci1zcGFjZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZmQtdG9vbGJhci1pdGVtIGZkLWJ1dHRvbiBnbHlwaD1cInJvdGF0ZVwiIChjbGljayk9XCJvblJvdGF0ZShpbWcsIG1lZGlhLCBpKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtdG9vbGJhci1zcGFjZXI+PC9mZC10b29sYmFyLXNwYWNlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ZkLXRvb2xiYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY3NcIiBbaWRdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnN1LW1hc2s+PC9ic3UtbWFzaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAjaW1nIGltZ0xhenkgW2ltZ0xhenldPVwibWVkaWEubWVkaWFVcmxcIiBbc3JjXT1cIm1lZGlhLm1lZGlhVXJsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGlmICgoZGV2aWNlU2l6ZSQgfCBhc3luYykgIT09ICdzJykge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgc3R5bGU9XCJmbGV4LXNocmluazogMVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvdGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYXlvdXRHcmlkVHBsOyBjb250ZXh0OiB7IGluRGlhbG9nOiB0cnVlLCBnYWxsZXJ5OiB0aGlzLmdhbGxlcnkgfVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb3RhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2ZkLWRpYWxvZy1ib2R5PlxyXG4gICAgPC9mZC1kaWFsb2c+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|