@trudb/tru-common-lib 0.0.725 → 0.0.728
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/{esm2020 → esm2022}/lib/assets/tru-icon-module.mjs +32 -32
- package/{esm2020 → esm2022}/lib/assets/tru-search-icon-module.mjs +36 -36
- package/{esm2020 → esm2022}/lib/base-classes/tru-component-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-control-component-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-control-base.mjs +17 -17
- package/esm2022/lib/base-classes/tru-edit-control-config-base.mjs +6 -0
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-parent-control-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-pkey-control-config-base.mjs +3 -3
- package/esm2022/lib/base-classes/tru-entity-base.mjs +14 -0
- package/esm2022/lib/base-classes/tru-list-control-config-base.mjs +6 -0
- package/{esm2020 → esm2022}/lib/base-classes/tru-property-config-base.mjs +14 -15
- package/{esm2020 → esm2022}/lib/base-classes/tru-search-config-base.mjs +3 -3
- package/esm2022/lib/base-classes/tru-search-control-base.mjs +45 -0
- package/esm2022/lib/base-classes/tru-search-control-config-base.mjs +5 -0
- package/esm2022/lib/base-classes/tru-search-control-range-base.mjs +45 -0
- package/esm2022/lib/base-classes/tru-table-config-base.mjs +12 -0
- package/{esm2020 → esm2022}/lib/base-views/detail/tru-detail-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/detail/tru-detail-view-base.mjs +83 -0
- package/esm2022/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +25 -0
- package/esm2022/lib/base-views/search/services/tru-search-view-event-handler.mjs +25 -0
- package/{esm2020 → esm2022}/lib/base-views/search/tru-search-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/search/tru-search-view-base.mjs +68 -0
- package/{esm2020 → esm2022}/lib/base-views/search-result/tru-search-result-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/search-result/tru-search-result-view-base.mjs +54 -0
- package/{esm2020 → esm2022}/lib/classes/tru-choice.mjs +2 -2
- package/esm2022/lib/classes/tru-context-filter-choice.mjs +11 -0
- package/esm2022/lib/classes/tru-context-filter.mjs +16 -0
- package/esm2022/lib/classes/tru-data-change-parser.mjs +287 -0
- package/esm2022/lib/classes/tru-data-change.mjs +5 -0
- package/{esm2020 → esm2022}/lib/classes/tru-formula-eval.mjs +156 -156
- package/esm2022/lib/classes/tru-merge-data-set.mjs +11 -0
- package/esm2022/lib/classes/tru-merge-data.mjs +20 -0
- package/{esm2020 → esm2022}/lib/classes/tru-name-value.mjs +2 -2
- package/esm2022/lib/classes/tru-predicate.mjs +47 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-cloud-file.mjs +4 -4
- package/esm2022/lib/classes/tru-property-config-date.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-decimal.mjs +9 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-file.mjs +6 -8
- package/esm2022/lib/classes/tru-property-config-foreign-key.mjs +8 -0
- package/esm2022/lib/classes/tru-property-config-integer.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-password.mjs +6 -0
- package/esm2022/lib/classes/tru-property-config-percentage.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-scientific.mjs +7 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-text-choices.mjs +6 -8
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-text.mjs +8 -10
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-usa-address.mjs +6 -8
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-zip-code.mjs +6 -8
- package/esm2022/lib/classes/tru-query-predicate-manager.mjs +49 -0
- package/{esm2020 → esm2022}/lib/components/confirm-dialog/tru-confirm-dialog-module.mjs +20 -20
- package/esm2022/lib/components/confirm-dialog/tru-confirm-dialog.mjs +59 -0
- package/{esm2020 → esm2022}/lib/components/data-grid/classes/tru-data-grid-config.mjs +1 -1
- package/{esm2020 → esm2022}/lib/components/data-grid/enums/tru-data-grid-types.mjs +6 -6
- package/esm2022/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +40 -0
- package/esm2022/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +27 -0
- package/esm2022/lib/components/data-grid/tru-data-grid-module.mjs +67 -0
- package/esm2022/lib/components/data-grid/tru-data-grid.mjs +382 -0
- package/{esm2020 → esm2022}/lib/components/desktop/classes/tru-desktop-title.mjs +2 -2
- package/esm2022/lib/components/desktop/classes/tru-desktop-view-config.mjs +21 -0
- package/{esm2020 → esm2022}/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.mjs +19 -19
- package/esm2022/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +122 -0
- package/{esm2020 → esm2022}/lib/components/desktop/menubar/tru-desktop-menubar-module.mjs +56 -56
- package/esm2022/lib/components/desktop/menubar/tru-desktop-menubar.mjs +36 -0
- package/esm2022/lib/components/desktop/services/tru-desktop-manager.mjs +86 -0
- package/esm2022/lib/components/desktop/services/tru-desktop-service.mjs +108 -0
- package/esm2022/lib/components/desktop/services/tru-window-action-event-handler.mjs +25 -0
- package/esm2022/lib/components/desktop/services/tru-window-event-args.mjs +24 -0
- package/esm2022/lib/components/desktop/services/tru-window-event-handler.mjs +42 -0
- package/{esm2020 → esm2022}/lib/components/desktop/statusbar/tru-desktop-statusbar-module.mjs +19 -19
- package/esm2022/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +20 -0
- package/{esm2020 → esm2022}/lib/components/desktop/taskbar/tru-desktop-taskbar-module.mjs +21 -21
- package/esm2022/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +41 -0
- package/{esm2020 → esm2022}/lib/components/desktop/tru-desktop-module.mjs +72 -72
- package/esm2022/lib/components/desktop/tru-desktop.mjs +737 -0
- package/{esm2020 → esm2022}/lib/components/desktop/view/tru-desktop-view-module.mjs +19 -19
- package/esm2022/lib/components/desktop/view/tru-desktop-view.mjs +29 -0
- package/{esm2020 → esm2022}/lib/components/desktop/viewport/tru-desktop-viewport-module.mjs +20 -20
- package/esm2022/lib/components/desktop/viewport/tru-desktop-viewport.mjs +117 -0
- package/{esm2020 → esm2022}/lib/components/desktop/window/tru-desktop-window-module.mjs +58 -58
- package/esm2022/lib/components/desktop/window/tru-desktop-window.mjs +467 -0
- package/{esm2020 → esm2022}/lib/components/export-dialog/tru-export-dialog-module.mjs +20 -20
- package/esm2022/lib/components/export-dialog/tru-export-dialog.mjs +61 -0
- package/{esm2020 → esm2022}/lib/components/layout/column/tru-column-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/column/tru-column.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/layout/form/tru-form-module.mjs +19 -19
- package/esm2022/lib/components/layout/form/tru-form.mjs +35 -0
- package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/layout/row/tru-row-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/row/tru-row.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-config.mjs +7 -7
- package/esm2022/lib/components/login/classes/tru-auth-jwt-strategy.mjs +63 -0
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-login-request.mjs +5 -3
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-logout-request.mjs +4 -3
- package/esm2022/lib/components/login/classes/tru-auth-session-strategy.mjs +21 -0
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-strategy-provider.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-token.mjs +11 -8
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-user-request.mjs +4 -3
- package/esm2022/lib/components/login/services/tru-auth-cache.mjs +20 -0
- package/esm2022/lib/components/login/services/tru-auth-interceptor.mjs +46 -0
- package/esm2022/lib/components/login/services/tru-auth.mjs +87 -0
- package/esm2022/lib/components/login/tru-login-module.mjs +46 -0
- package/esm2022/lib/components/login/tru-login.mjs +59 -0
- package/{esm2020 → esm2022}/lib/components/password-dialog/tru-password-dialog-module.mjs +20 -20
- package/esm2022/lib/components/password-dialog/tru-password-dialog.mjs +53 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/button/tru-toolbar-button-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/button/tru-toolbar-button.mjs +40 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/classes/tru-toolbar-dropdown-option.mjs +1 -1
- package/{esm2020 → esm2022}/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.mjs +44 -44
- package/esm2022/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +26 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.mjs +36 -36
- package/esm2022/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +45 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.mjs +19 -19
- package/esm2022/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +17 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.mjs +19 -19
- package/esm2022/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +26 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/tru-toolbar-menu-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/menu/tru-toolbar-menu.mjs +33 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/toolbar/text/tru-toolbar-text-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/text/tru-toolbar-text.mjs +27 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar-module.mjs +73 -73
- package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar.mjs +20 -21
- package/{esm2020 → esm2022}/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.mjs +36 -36
- package/esm2022/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +38 -0
- package/esm2022/lib/components/validation-dialog/tru-validation-dialog-config.mjs +25 -0
- package/{esm2020 → esm2022}/lib/components/validation-dialog/tru-validation-dialog-module.mjs +19 -19
- package/esm2022/lib/components/validation-dialog/tru-validation-dialog.mjs +83 -0
- package/{esm2020 → esm2022}/lib/directives/breeze-validator/tru-breeze-validator-module.mjs +19 -19
- package/esm2022/lib/directives/breeze-validator/tru-breeze-validator.mjs +107 -0
- package/{esm2020 → esm2022}/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.mjs +19 -19
- package/esm2022/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +155 -0
- package/{esm2020 → esm2022}/lib/directives/select-panel/tru-mat-select-panel-module.mjs +19 -19
- package/esm2022/lib/directives/select-panel/tru-mat-select-panel.mjs +69 -0
- package/{esm2020 → esm2022}/lib/interfaces/tru-value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/material.module.mjs +192 -192
- package/esm2022/lib/services/tru-app-environment.mjs +113 -0
- package/esm2022/lib/services/tru-breeze-context-factory.mjs +84 -0
- package/esm2022/lib/services/tru-breeze-metadata-provider.mjs +21 -0
- package/esm2022/lib/services/tru-component-lookup.mjs +23 -0
- package/esm2022/lib/services/tru-connection-hub.mjs +52 -0
- package/esm2022/lib/services/tru-context-filters.mjs +28 -0
- package/esm2022/lib/services/tru-data-context.mjs +263 -0
- package/esm2022/lib/services/tru-entity-accessor.mjs +292 -0
- package/esm2022/lib/services/tru-model-property-lookup.mjs +21 -0
- package/{esm2020 → esm2022}/lib/services/tru-predicate-map.mjs +11 -11
- package/esm2022/lib/services/tru-search-result-view-manager.mjs +18 -0
- package/esm2022/lib/services/tru-sort.mjs +113 -0
- package/esm2022/lib/services/tru-table-registry.mjs +15 -0
- package/esm2022/lib/services/tru-text-manager.mjs +148 -0
- package/esm2022/lib/services/tru-ui-notification.mjs +107 -0
- package/esm2022/lib/services/tru-user.mjs +62 -0
- package/esm2022/lib/services/tru-util.mjs +76 -0
- package/{esm2020 → esm2022}/lib/tru-common-module.mjs +16 -16
- package/{esm2020 → esm2022}/public-api.mjs +144 -144
- package/{esm2020 → esm2022}/trudb-tru-common-lib.mjs +4 -4
- package/fesm2022/trudb-tru-common-lib.mjs +6932 -0
- package/fesm2022/trudb-tru-common-lib.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/assets/tru-icon-module.d.ts +11 -11
- package/lib/assets/tru-search-icon-module.d.ts +11 -11
- package/lib/base-classes/tru-component-config-base.d.ts +3 -3
- package/lib/base-classes/tru-control-component-config-base.d.ts +20 -20
- package/lib/base-classes/tru-edit-control-base.d.ts +10 -10
- package/lib/base-classes/tru-edit-control-config-base.d.ts +21 -21
- package/lib/base-classes/tru-edit-parent-control-config-base.d.ts +9 -9
- package/lib/base-classes/tru-edit-pkey-control-config-base.d.ts +11 -11
- package/lib/base-classes/tru-entity-base.d.ts +14 -14
- package/lib/base-classes/tru-list-control-config-base.d.ts +21 -21
- package/lib/base-classes/tru-property-config-base.d.ts +13 -13
- package/lib/base-classes/tru-search-config-base.d.ts +9 -9
- package/lib/base-classes/tru-search-control-base.d.ts +21 -21
- package/lib/base-classes/tru-search-control-config-base.d.ts +13 -13
- package/lib/base-classes/tru-search-control-range-base.d.ts +25 -25
- package/lib/base-classes/tru-table-config-base.d.ts +11 -11
- package/lib/base-views/detail/tru-detail-view-base-module.d.ts +9 -9
- package/lib/base-views/detail/tru-detail-view-base.d.ts +32 -32
- package/lib/base-views/search/services/tru-search-view-control-event-handler.d.ts +12 -12
- package/lib/base-views/search/services/tru-search-view-event-handler.d.ts +11 -11
- package/lib/base-views/search/tru-search-view-base-module.d.ts +9 -9
- package/lib/base-views/search/tru-search-view-base.d.ts +36 -36
- package/lib/base-views/search-result/tru-search-result-view-base-module.d.ts +9 -9
- package/lib/base-views/search-result/tru-search-result-view-base.d.ts +25 -25
- package/lib/classes/tru-choice.d.ts +8 -8
- package/lib/classes/tru-context-filter-choice.d.ts +6 -6
- package/lib/classes/tru-context-filter.d.ts +10 -10
- package/lib/classes/tru-data-change-parser.d.ts +33 -33
- package/lib/classes/tru-data-change.d.ts +4 -4
- package/lib/classes/tru-formula-eval.d.ts +31 -31
- package/lib/classes/tru-merge-data-set.d.ts +7 -7
- package/lib/classes/tru-merge-data.d.ts +9 -9
- package/lib/classes/tru-name-value.d.ts +9 -9
- package/lib/classes/tru-predicate.d.ts +8 -8
- package/lib/classes/tru-property-config-cloud-file.d.ts +4 -4
- package/lib/classes/tru-property-config-date.d.ts +6 -6
- package/lib/classes/tru-property-config-decimal.d.ts +8 -8
- package/lib/classes/tru-property-config-file.d.ts +5 -5
- package/lib/classes/tru-property-config-foreign-key.d.ts +7 -7
- package/lib/classes/tru-property-config-integer.d.ts +6 -6
- package/lib/classes/tru-property-config-password.d.ts +5 -5
- package/lib/classes/tru-property-config-percentage.d.ts +6 -6
- package/lib/classes/tru-property-config-scientific.d.ts +6 -6
- package/lib/classes/tru-property-config-text-choices.d.ts +5 -5
- package/lib/classes/tru-property-config-text.d.ts +7 -7
- package/lib/classes/tru-property-config-usa-address.d.ts +5 -5
- package/lib/classes/tru-property-config-zip-code.d.ts +5 -5
- package/lib/classes/tru-query-predicate-manager.d.ts +26 -26
- package/lib/components/confirm-dialog/tru-confirm-dialog-module.d.ts +10 -10
- package/lib/components/confirm-dialog/tru-confirm-dialog.d.ts +28 -28
- package/lib/components/data-grid/classes/tru-data-grid-config.d.ts +7 -7
- package/lib/components/data-grid/enums/tru-data-grid-types.d.ts +5 -5
- package/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.d.ts +13 -13
- package/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.d.ts +13 -13
- package/lib/components/data-grid/tru-data-grid-module.d.ts +15 -15
- package/lib/components/data-grid/tru-data-grid.d.ts +67 -67
- package/lib/components/desktop/classes/tru-desktop-title.d.ts +4 -4
- package/lib/components/desktop/classes/tru-desktop-view-config.d.ts +16 -16
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.d.ts +9 -9
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable.d.ts +32 -32
- package/lib/components/desktop/menubar/tru-desktop-menubar-module.d.ts +17 -17
- package/lib/components/desktop/menubar/tru-desktop-menubar.d.ts +15 -15
- package/lib/components/desktop/services/tru-desktop-manager.d.ts +33 -33
- package/lib/components/desktop/services/tru-desktop-service.d.ts +95 -95
- package/lib/components/desktop/services/tru-window-action-event-handler.d.ts +12 -12
- package/lib/components/desktop/services/tru-window-event-args.d.ts +17 -17
- package/lib/components/desktop/services/tru-window-event-handler.d.ts +20 -20
- package/lib/components/desktop/statusbar/tru-desktop-statusbar-module.d.ts +9 -9
- package/lib/components/desktop/statusbar/tru-desktop-statusbar.d.ts +10 -10
- package/lib/components/desktop/taskbar/tru-desktop-taskbar-module.d.ts +11 -11
- package/lib/components/desktop/taskbar/tru-desktop-taskbar.d.ts +15 -15
- package/lib/components/desktop/tru-desktop-module.d.ts +20 -20
- package/lib/components/desktop/tru-desktop.d.ts +337 -337
- package/lib/components/desktop/view/tru-desktop-view-module.d.ts +9 -9
- package/lib/components/desktop/view/tru-desktop-view.d.ts +14 -14
- package/lib/components/desktop/viewport/tru-desktop-viewport-module.d.ts +10 -10
- package/lib/components/desktop/viewport/tru-desktop-viewport.d.ts +48 -48
- package/lib/components/desktop/window/tru-desktop-window-module.d.ts +17 -17
- package/lib/components/desktop/window/tru-desktop-window.d.ts +189 -189
- package/lib/components/export-dialog/tru-export-dialog-module.d.ts +10 -10
- package/lib/components/export-dialog/tru-export-dialog.d.ts +26 -26
- package/lib/components/layout/column/tru-column-module.d.ts +9 -9
- package/lib/components/layout/column/tru-column.d.ts +6 -6
- package/lib/components/layout/form/tru-form-module.d.ts +9 -9
- package/lib/components/layout/form/tru-form.d.ts +10 -10
- package/lib/components/layout/group-box/tru-group-box-module.d.ts +9 -9
- package/lib/components/layout/group-box/tru-group-box.d.ts +6 -6
- package/lib/components/layout/row/tru-row-module.d.ts +9 -9
- package/lib/components/layout/row/tru-row.d.ts +6 -6
- package/lib/components/login/classes/tru-auth-config.d.ts +16 -16
- package/lib/components/login/classes/tru-auth-jwt-strategy.d.ts +15 -15
- package/lib/components/login/classes/tru-auth-login-request.d.ts +4 -4
- package/lib/components/login/classes/tru-auth-logout-request.d.ts +3 -3
- package/lib/components/login/classes/tru-auth-session-strategy.d.ts +13 -13
- package/lib/components/login/classes/tru-auth-strategy-provider.d.ts +9 -9
- package/lib/components/login/classes/tru-auth-token.d.ts +6 -6
- package/lib/components/login/classes/tru-auth-user-request.d.ts +3 -3
- package/lib/components/login/services/tru-auth-cache.d.ts +11 -11
- package/lib/components/login/services/tru-auth-interceptor.d.ts +16 -16
- package/lib/components/login/services/tru-auth.d.ts +29 -29
- package/lib/components/login/tru-login-module.d.ts +11 -11
- package/lib/components/login/tru-login.d.ts +21 -21
- package/lib/components/password-dialog/tru-password-dialog-module.d.ts +10 -10
- package/lib/components/password-dialog/tru-password-dialog.d.ts +24 -23
- package/lib/components/toolbar/button/tru-toolbar-button-module.d.ts +11 -11
- package/lib/components/toolbar/button/tru-toolbar-button.d.ts +16 -16
- package/lib/components/toolbar/classes/tru-toolbar-dropdown-option.d.ts +4 -4
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.d.ts +14 -14
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter.d.ts +13 -13
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.d.ts +12 -12
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown.d.ts +18 -18
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.d.ts +9 -9
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.d.ts +7 -7
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.d.ts +9 -9
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.d.ts +8 -8
- package/lib/components/toolbar/menu/tru-toolbar-menu-module.d.ts +11 -11
- package/lib/components/toolbar/menu/tru-toolbar-menu.d.ts +10 -10
- package/lib/components/toolbar/separator/tru-toolbar-separator-module.d.ts +9 -9
- package/lib/components/toolbar/separator/tru-toolbar-separator.d.ts +6 -6
- package/lib/components/toolbar/text/tru-toolbar-text-module.d.ts +11 -11
- package/lib/components/toolbar/text/tru-toolbar-text.d.ts +12 -12
- package/lib/components/toolbar/tru-toolbar-module.d.ts +16 -16
- package/lib/components/toolbar/tru-toolbar.d.ts +9 -9
- package/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.d.ts +12 -12
- package/lib/components/toolbar/user-profile/tru-toolbar-user-profile.d.ts +17 -17
- package/lib/components/validation-dialog/tru-validation-dialog-config.d.ts +13 -13
- package/lib/components/validation-dialog/tru-validation-dialog-module.d.ts +9 -9
- package/lib/components/validation-dialog/tru-validation-dialog.d.ts +20 -20
- package/lib/directives/breeze-validator/tru-breeze-validator-module.d.ts +9 -9
- package/lib/directives/breeze-validator/tru-breeze-validator.d.ts +27 -27
- package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.d.ts +9 -9
- package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.d.ts +40 -40
- package/lib/directives/select-panel/tru-mat-select-panel-module.d.ts +9 -9
- package/lib/directives/select-panel/tru-mat-select-panel.d.ts +17 -17
- package/lib/interfaces/tru-value.d.ts +6 -6
- package/lib/material.module.d.ts +50 -50
- package/lib/services/tru-app-environment.d.ts +57 -57
- package/lib/services/tru-breeze-context-factory.d.ts +32 -32
- package/lib/services/tru-breeze-metadata-provider.d.ts +9 -9
- package/lib/services/tru-component-lookup.d.ts +9 -9
- package/lib/services/tru-connection-hub.d.ts +18 -18
- package/lib/services/tru-context-filters.d.ts +10 -10
- package/lib/services/tru-data-context.d.ts +42 -42
- package/lib/services/tru-entity-accessor.d.ts +46 -46
- package/lib/services/tru-model-property-lookup.d.ts +10 -10
- package/lib/services/tru-predicate-map.d.ts +6 -6
- package/lib/services/tru-search-result-view-manager.d.ts +10 -10
- package/lib/services/tru-sort.d.ts +56 -56
- package/lib/services/tru-table-registry.d.ts +8 -8
- package/lib/services/tru-text-manager.d.ts +68 -68
- package/lib/services/tru-ui-notification.d.ts +36 -36
- package/lib/services/tru-user.d.ts +29 -29
- package/lib/services/tru-util.d.ts +14 -14
- package/lib/tru-common-module.d.ts +6 -6
- package/package.json +5 -11
- package/public-api.d.ts +117 -117
- package/esm2020/lib/base-classes/tru-edit-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-entity-base.mjs +0 -13
- package/esm2020/lib/base-classes/tru-list-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-search-control-base.mjs +0 -47
- package/esm2020/lib/base-classes/tru-search-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-search-control-range-base.mjs +0 -47
- package/esm2020/lib/base-classes/tru-table-config-base.mjs +0 -13
- package/esm2020/lib/base-views/detail/tru-detail-view-base.mjs +0 -76
- package/esm2020/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +0 -27
- package/esm2020/lib/base-views/search/services/tru-search-view-event-handler.mjs +0 -27
- package/esm2020/lib/base-views/search/tru-search-view-base.mjs +0 -63
- package/esm2020/lib/base-views/search-result/tru-search-result-view-base.mjs +0 -51
- package/esm2020/lib/classes/tru-context-filter-choice.mjs +0 -8
- package/esm2020/lib/classes/tru-context-filter.mjs +0 -16
- package/esm2020/lib/classes/tru-data-change-parser.mjs +0 -277
- package/esm2020/lib/classes/tru-data-change.mjs +0 -7
- package/esm2020/lib/classes/tru-merge-data-set.mjs +0 -12
- package/esm2020/lib/classes/tru-merge-data.mjs +0 -17
- package/esm2020/lib/classes/tru-predicate.mjs +0 -47
- package/esm2020/lib/classes/tru-property-config-date.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-decimal.mjs +0 -11
- package/esm2020/lib/classes/tru-property-config-foreign-key.mjs +0 -10
- package/esm2020/lib/classes/tru-property-config-integer.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-password.mjs +0 -8
- package/esm2020/lib/classes/tru-property-config-percentage.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-scientific.mjs +0 -9
- package/esm2020/lib/classes/tru-query-predicate-manager.mjs +0 -49
- package/esm2020/lib/components/confirm-dialog/tru-confirm-dialog.mjs +0 -45
- package/esm2020/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +0 -39
- package/esm2020/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +0 -26
- package/esm2020/lib/components/data-grid/tru-data-grid-module.mjs +0 -67
- package/esm2020/lib/components/data-grid/tru-data-grid.mjs +0 -370
- package/esm2020/lib/components/desktop/classes/tru-desktop-view-config.mjs +0 -21
- package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +0 -109
- package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar.mjs +0 -34
- package/esm2020/lib/components/desktop/services/tru-desktop-manager.mjs +0 -84
- package/esm2020/lib/components/desktop/services/tru-desktop-service.mjs +0 -116
- package/esm2020/lib/components/desktop/services/tru-window-action-event-handler.mjs +0 -27
- package/esm2020/lib/components/desktop/services/tru-window-event-args.mjs +0 -26
- package/esm2020/lib/components/desktop/services/tru-window-event-handler.mjs +0 -44
- package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +0 -18
- package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +0 -40
- package/esm2020/lib/components/desktop/tru-desktop.mjs +0 -731
- package/esm2020/lib/components/desktop/view/tru-desktop-view.mjs +0 -25
- package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport.mjs +0 -113
- package/esm2020/lib/components/desktop/window/tru-desktop-window.mjs +0 -457
- package/esm2020/lib/components/export-dialog/tru-export-dialog.mjs +0 -57
- package/esm2020/lib/components/layout/form/tru-form.mjs +0 -34
- package/esm2020/lib/components/login/classes/tru-auth-jwt-strategy.mjs +0 -65
- package/esm2020/lib/components/login/classes/tru-auth-session-strategy.mjs +0 -19
- package/esm2020/lib/components/login/services/tru-auth-cache.mjs +0 -22
- package/esm2020/lib/components/login/services/tru-auth-interceptor.mjs +0 -43
- package/esm2020/lib/components/login/services/tru-auth.mjs +0 -81
- package/esm2020/lib/components/login/tru-login-module.mjs +0 -46
- package/esm2020/lib/components/login/tru-login.mjs +0 -58
- package/esm2020/lib/components/password-dialog/tru-password-dialog.mjs +0 -44
- package/esm2020/lib/components/toolbar/button/tru-toolbar-button.mjs +0 -41
- package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +0 -24
- package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +0 -43
- package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +0 -16
- package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +0 -26
- package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu.mjs +0 -33
- package/esm2020/lib/components/toolbar/text/tru-toolbar-text.mjs +0 -28
- package/esm2020/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +0 -35
- package/esm2020/lib/components/validation-dialog/tru-validation-dialog-config.mjs +0 -21
- package/esm2020/lib/components/validation-dialog/tru-validation-dialog.mjs +0 -79
- package/esm2020/lib/directives/breeze-validator/tru-breeze-validator.mjs +0 -100
- package/esm2020/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +0 -151
- package/esm2020/lib/directives/select-panel/tru-mat-select-panel.mjs +0 -66
- package/esm2020/lib/services/tru-app-environment.mjs +0 -94
- package/esm2020/lib/services/tru-breeze-context-factory.mjs +0 -79
- package/esm2020/lib/services/tru-breeze-metadata-provider.mjs +0 -22
- package/esm2020/lib/services/tru-component-lookup.mjs +0 -25
- package/esm2020/lib/services/tru-connection-hub.mjs +0 -48
- package/esm2020/lib/services/tru-context-filters.mjs +0 -29
- package/esm2020/lib/services/tru-data-context.mjs +0 -258
- package/esm2020/lib/services/tru-entity-accessor.mjs +0 -287
- package/esm2020/lib/services/tru-model-property-lookup.mjs +0 -22
- package/esm2020/lib/services/tru-search-result-view-manager.mjs +0 -17
- package/esm2020/lib/services/tru-sort.mjs +0 -114
- package/esm2020/lib/services/tru-table-registry.mjs +0 -16
- package/esm2020/lib/services/tru-text-manager.mjs +0 -134
- package/esm2020/lib/services/tru-ui-notification.mjs +0 -103
- package/esm2020/lib/services/tru-user.mjs +0 -63
- package/esm2020/lib/services/tru-util.mjs +0 -77
- package/fesm2015/trudb-tru-common-lib.mjs +0 -6799
- package/fesm2015/trudb-tru-common-lib.mjs.map +0 -1
- package/fesm2020/trudb-tru-common-lib.mjs +0 -6776
- package/fesm2020/trudb-tru-common-lib.mjs.map +0 -1
|
@@ -0,0 +1,737 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { TruDesktopService } from './services/tru-desktop-service';
|
|
3
|
+
import { TruDesktopViewConfig } from './classes/tru-desktop-view-config';
|
|
4
|
+
import { TruDesktopViewport } from './viewport/tru-desktop-viewport';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./services/tru-desktop-service";
|
|
7
|
+
import * as i2 from "../../services/tru-text-manager";
|
|
8
|
+
import * as i3 from "./services/tru-window-event-handler";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "./menubar/tru-desktop-menubar";
|
|
11
|
+
import * as i6 from "./taskbar/tru-desktop-taskbar";
|
|
12
|
+
import * as i7 from "./viewport/tru-desktop-viewport";
|
|
13
|
+
export class TruDesktop {
|
|
14
|
+
desktopService;
|
|
15
|
+
textManager;
|
|
16
|
+
truWindowEventHandler;
|
|
17
|
+
options;
|
|
18
|
+
viewportComponent;
|
|
19
|
+
constructor(desktopService, textManager, truWindowEventHandler) {
|
|
20
|
+
this.desktopService = desktopService;
|
|
21
|
+
this.textManager = textManager;
|
|
22
|
+
this.truWindowEventHandler = truWindowEventHandler;
|
|
23
|
+
this.desktop = this.desktopService.createDesktop();
|
|
24
|
+
}
|
|
25
|
+
minimizeAll = false;
|
|
26
|
+
desktop;
|
|
27
|
+
minWindowCascadePosition = 40;
|
|
28
|
+
maxWindowCascadePosition = 100;
|
|
29
|
+
lastWindowCascadePosition = { top: this.minWindowCascadePosition, left: this.minWindowCascadePosition };
|
|
30
|
+
shiftPressed = false;
|
|
31
|
+
altPressed = false;
|
|
32
|
+
xPressed = false;
|
|
33
|
+
keyboardMap = ["", "", "", "CANCEL", "", "", "HELP", "", "BACK_SPACE", "TAB", "", "", "CLEAR", "ENTER", "RETURN", "", "SHIFT", "CONTROL", "ALT", "PAUSE", "CAPS_LOCK", "KANA", "EISU", "JUNJA", "FINAL", "HANJA", "", "ESCAPE", "CONVERT", "NONCONVERT", "ACCEPT", "MODECHANGE", "SPACE", "PAGE_UP", "PAGE_DOWN", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "PRINTSCREEN", "INSERT", "DELETE", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "COLON", "SEMICOLON", "LESS_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "AT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "WIN", "", "CONTEXT_MENU", "", "SLEEP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", "", "NUM_LOCK", "SCROLL_LOCK", "WIN_OEM_FJ_JISHO", "WIN_OEM_FJ_MASSHOU", "WIN_OEM_FJ_TOUROKU", "WIN_OEM_FJ_LOYA", "WIN_OEM_FJ_ROYA", "", "", "", "", "", "", "", "", "", "CIRCUMFLEX", "EXCLAMATION", "DOUBLE_QUOTE", "HASH", "DOLLAR", "PERCENT", "AMPERSAND", "UNDERSCORE", "OPEN_PAREN", "CLOSE_PAREN", "ASTERISK", "PLUS", "PIPE", "HYPHEN_MINUS", "OPEN_CURLY_BRACKET", "CLOSE_CURLY_BRACKET", "TILDE", "", "", "", "", "VOLUME_MUTE", "VOLUME_DOWN", "VOLUME_UP", "", "", "", "", "COMMA", "", "PERIOD", "SLASH", "BACK_QUOTE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OPEN_BRACKET", "BACK_SLASH", "CLOSE_BRACKET", "QUOTE", "", "META", "ALTGR", "", "WIN_ICO_HELP", "WIN_ICO_00", "", "WIN_ICO_CLEAR", "", "", "WIN_OEM_RESET", "WIN_OEM_JUMP", "WIN_OEM_PA1", "WIN_OEM_PA2", "WIN_OEM_PA3", "WIN_OEM_WSCTRL", "WIN_OEM_CUSEL", "WIN_OEM_ATTN", "WIN_OEM_FINISH", "WIN_OEM_COPY", "WIN_OEM_AUTO", "WIN_OEM_ENLW", "WIN_OEM_BACKTAB", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "", "PA1", "WIN_OEM_CLEAR", ""];
|
|
34
|
+
logoUrl = null;
|
|
35
|
+
/**
|
|
36
|
+
* @tru.doc function
|
|
37
|
+
* @name truDesktopComponent.getDesktop
|
|
38
|
+
* @module tru.desktop
|
|
39
|
+
*
|
|
40
|
+
* @description
|
|
41
|
+
* Return an object of desktop.
|
|
42
|
+
*
|
|
43
|
+
* @returns {object} desktop.
|
|
44
|
+
*/
|
|
45
|
+
getDesktop = () => {
|
|
46
|
+
return this.desktop;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* @tru.doc function
|
|
50
|
+
* @name truDesktopComponent.getOptions
|
|
51
|
+
* @module tru.desktop
|
|
52
|
+
*
|
|
53
|
+
* @description
|
|
54
|
+
* Return an object of desktop options.
|
|
55
|
+
*
|
|
56
|
+
* @returns {object} options.
|
|
57
|
+
*/
|
|
58
|
+
getOptions = () => {
|
|
59
|
+
return this.options;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* @tru.doc function
|
|
63
|
+
* @name truDesktopComponent.getWindows
|
|
64
|
+
* @module tru.desktop
|
|
65
|
+
*
|
|
66
|
+
* @description
|
|
67
|
+
* Return an array of windows.
|
|
68
|
+
*
|
|
69
|
+
* @returns {array} windows.
|
|
70
|
+
*/
|
|
71
|
+
getWindows = () => {
|
|
72
|
+
return this.windows;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* @tru.doc function
|
|
76
|
+
* @name truDesktopComponent.getNextMaxZIndex
|
|
77
|
+
* @module tru.desktop
|
|
78
|
+
*
|
|
79
|
+
* @description
|
|
80
|
+
* Iterates through all window objects in the windows array to find the max z-index
|
|
81
|
+
* and increases the value found by 1.
|
|
82
|
+
*
|
|
83
|
+
* @returns {int}
|
|
84
|
+
*/
|
|
85
|
+
getNextMaxZIndex = () => {
|
|
86
|
+
var max = 0;
|
|
87
|
+
var tmp;
|
|
88
|
+
for (var i = this.windows.length - 1; i >= 0; i--) {
|
|
89
|
+
tmp = this.windows[i].zIndex;
|
|
90
|
+
if (tmp > max)
|
|
91
|
+
max = tmp;
|
|
92
|
+
}
|
|
93
|
+
return ++max;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* @tru.doc function
|
|
97
|
+
* @name truDesktopComponent.clearActive
|
|
98
|
+
* @module tru.desktop
|
|
99
|
+
*
|
|
100
|
+
* @description
|
|
101
|
+
* Iterates through all window objects in the windows
|
|
102
|
+
* and sets the active property to false.
|
|
103
|
+
*
|
|
104
|
+
*/
|
|
105
|
+
clearActive = () => {
|
|
106
|
+
this.windows.forEach((window) => {
|
|
107
|
+
window.active = false;
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* @tru.doc function
|
|
112
|
+
* @name truDesktopComponent.getActiveWindow
|
|
113
|
+
* @module tru.desktop
|
|
114
|
+
*
|
|
115
|
+
* @description
|
|
116
|
+
* Gets the active window.
|
|
117
|
+
*
|
|
118
|
+
* @returns {object} view object.
|
|
119
|
+
*/
|
|
120
|
+
getActiveWindow = () => {
|
|
121
|
+
var activeWindow = null;
|
|
122
|
+
this.windows.forEach((wdw) => {
|
|
123
|
+
if (wdw.active === true) {
|
|
124
|
+
activeWindow = wdw;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return activeWindow;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* @tru.doc function
|
|
131
|
+
* @name truDesktopComponent.getActiveView
|
|
132
|
+
* @module tru.desktop
|
|
133
|
+
*
|
|
134
|
+
* @description
|
|
135
|
+
* Gets the active view.
|
|
136
|
+
*
|
|
137
|
+
* @returns {object} view object.
|
|
138
|
+
*/
|
|
139
|
+
getActiveView = (wdw) => {
|
|
140
|
+
var activeView = null;
|
|
141
|
+
wdw.views.forEach((view) => {
|
|
142
|
+
if (view.active$.getValue() === true) {
|
|
143
|
+
activeView = view;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return activeView;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* @tru.doc function
|
|
150
|
+
* @name truDesktopComponent.allWindowsAreMinimized
|
|
151
|
+
* @module tru.desktop
|
|
152
|
+
*
|
|
153
|
+
* @description
|
|
154
|
+
* Iterates through windows to determine if all are minimized.
|
|
155
|
+
*
|
|
156
|
+
*/
|
|
157
|
+
allWindowsAreMinimized = () => {
|
|
158
|
+
var allMinimized = true;
|
|
159
|
+
this.windows.forEach((window) => {
|
|
160
|
+
if (!window.minimized) {
|
|
161
|
+
allMinimized = false;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return allMinimized;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* @tru.doc function
|
|
168
|
+
* @name truDesktopComponent.hideShowAll
|
|
169
|
+
* @module tru.desktop
|
|
170
|
+
*
|
|
171
|
+
* @description
|
|
172
|
+
* Hides/shows all windows
|
|
173
|
+
*
|
|
174
|
+
*/
|
|
175
|
+
hideShowAll = () => {
|
|
176
|
+
this.minimizeAll = this.allWindowsAreMinimized() ? false : !this.minimizeAll;
|
|
177
|
+
this.windows.forEach((wdw) => {
|
|
178
|
+
if (wdw.outOfBounds)
|
|
179
|
+
this.recover(wdw);
|
|
180
|
+
wdw.active = false;
|
|
181
|
+
wdw.minimized = this.minimizeAll;
|
|
182
|
+
});
|
|
183
|
+
this.activateForemostWindow();
|
|
184
|
+
return this.minimizeAll;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* @tru.doc function
|
|
188
|
+
* @name truDesktopComponent.findWindowViewDirective
|
|
189
|
+
* @module tru.desktop
|
|
190
|
+
*
|
|
191
|
+
* @description
|
|
192
|
+
* Looks for previously open window with a view directive
|
|
193
|
+
*
|
|
194
|
+
*/
|
|
195
|
+
findWindowViewDirective = (windowViewDirective) => {
|
|
196
|
+
for (let i = 0; i < this.windows.length; i++) {
|
|
197
|
+
for (let j = 0; j < this.windows[i].views.length; j++) {
|
|
198
|
+
if (this.windows[i].views[0].viewDirective === windowViewDirective)
|
|
199
|
+
return this.windows[i];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* @tru.doc function
|
|
206
|
+
* @name truDesktopComponent.openWindow
|
|
207
|
+
* @module tru.desktop
|
|
208
|
+
*
|
|
209
|
+
* @description
|
|
210
|
+
* Displays a new window. All window properties defined by the application developer will be
|
|
211
|
+
* overlaid here before displaying the window
|
|
212
|
+
*
|
|
213
|
+
*/
|
|
214
|
+
openWindow = (windowConfigOverlays, singleInstance) => {
|
|
215
|
+
let activeWindow = this.getActiveWindow();
|
|
216
|
+
if (activeWindow && activeWindow.isModal) {
|
|
217
|
+
activeWindow.invalidOperation = true;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (singleInstance) {
|
|
221
|
+
let window = this.findWindowViewDirective(windowConfigOverlays.views[0].viewDirective);
|
|
222
|
+
if (window) {
|
|
223
|
+
this.updateWindowState(window);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (windowConfigOverlays.isModal) {
|
|
228
|
+
let heightOffset = (parseInt(windowConfigOverlays.height, 10) / 2) + 30;
|
|
229
|
+
let widthOffset = (parseInt(windowConfigOverlays.width, 10) / 2);
|
|
230
|
+
windowConfigOverlays.top = 'calc(50% - ' + heightOffset + 'px )';
|
|
231
|
+
windowConfigOverlays.left = 'calc(50% - ' + widthOffset + 'px )';
|
|
232
|
+
}
|
|
233
|
+
this.clearActive();
|
|
234
|
+
let configuredWindow = this.configureWindow(windowConfigOverlays);
|
|
235
|
+
configuredWindow.views = this.configureViews(windowConfigOverlays, configuredWindow);
|
|
236
|
+
if (!configuredWindow.isModal) {
|
|
237
|
+
configuredWindow.cascadeWindow = false;
|
|
238
|
+
this.savePosition(configuredWindow);
|
|
239
|
+
this.maximize(configuredWindow);
|
|
240
|
+
this.windows.push(configuredWindow);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
this.windows.push(configuredWindow);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* @tru.doc function
|
|
248
|
+
* @name truDesktopComponent.configureWindow
|
|
249
|
+
* @module tru.desktop
|
|
250
|
+
*
|
|
251
|
+
* @description
|
|
252
|
+
* Creates a new window instance.
|
|
253
|
+
*
|
|
254
|
+
*/
|
|
255
|
+
configureWindow = (windowConfigOverlays) => {
|
|
256
|
+
var windowConfigInstance = Object.assign({}, this.desktop.windowConfig);
|
|
257
|
+
windowConfigInstance.savedPosition = Object.create({ top: 0, left: 0, right: 0, bottom: 0, height: 0, width: 0 });
|
|
258
|
+
windowConfigInstance.zIndex = this.getNextMaxZIndex();
|
|
259
|
+
//windowConfigInstance.globals = Object.assign({}, $rootScope.$eval(this.options.globals));
|
|
260
|
+
return Object.assign(windowConfigInstance, windowConfigOverlays);
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* @tru.doc function
|
|
264
|
+
* @name truDesktopComponent.configureViews
|
|
265
|
+
* @module tru.desktop
|
|
266
|
+
*
|
|
267
|
+
* @description
|
|
268
|
+
* Creates one or more view instances
|
|
269
|
+
*
|
|
270
|
+
*/
|
|
271
|
+
configureViews = (windowConfigOverlays, configuredWindow) => {
|
|
272
|
+
let configuredViews = [];
|
|
273
|
+
windowConfigOverlays.views.forEach((view) => {
|
|
274
|
+
let configuredView = new TruDesktopViewConfig();
|
|
275
|
+
configuredView.componentName = view.componentName;
|
|
276
|
+
configuredView.entities = view.entities;
|
|
277
|
+
configuredView.entityIndex = view.entityIndex;
|
|
278
|
+
configuredView.isDirty = view.isDirty;
|
|
279
|
+
configuredView.isEditing = view.isEditing;
|
|
280
|
+
configuredView.isInvalid = view.isValid;
|
|
281
|
+
configuredView.openAsDetaiView = view.openAsDetailView;
|
|
282
|
+
//viewConfigInstance.globals = this.options.globals;
|
|
283
|
+
//let configuredView = Object.assign(viewConfigInstance, view);
|
|
284
|
+
configuredView.window = configuredWindow;
|
|
285
|
+
configuredViews.push(configuredView);
|
|
286
|
+
});
|
|
287
|
+
return configuredViews;
|
|
288
|
+
};
|
|
289
|
+
/**
|
|
290
|
+
* @tru.doc function
|
|
291
|
+
* @name truDesktopComponent.closeWindow
|
|
292
|
+
* @module tru.desktop
|
|
293
|
+
*
|
|
294
|
+
* @description
|
|
295
|
+
* Remove a window {object} from the windows array.
|
|
296
|
+
*
|
|
297
|
+
* @returns {boolean} returns true if window was closed, false if not closed.
|
|
298
|
+
*/
|
|
299
|
+
closeWindow = (wdw) => {
|
|
300
|
+
if (!this.options.allowDirtyClose && wdw.isDirty) {
|
|
301
|
+
alert("Unsaved Changes. Save changes before closing window.");
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
if (!this.options.allowInvalidClose && wdw.isInvalid) {
|
|
305
|
+
alert("Data is invalid. Correct Invalid data before closing window.");
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
if (this.options.canCloseFn !== undefined) {
|
|
309
|
+
if (this.options.canCloseFn(wdw)) {
|
|
310
|
+
this.windows.splice(this.windows.indexOf(wdw), 1);
|
|
311
|
+
this.activateForemostWindow();
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
;
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.windows.splice(this.windows.indexOf(wdw), 1);
|
|
318
|
+
this.activateForemostWindow();
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
};
|
|
323
|
+
/**
|
|
324
|
+
* @tru.doc function
|
|
325
|
+
* @name truDesktopComponent.activateForemostWindow
|
|
326
|
+
* @module tru.desktop
|
|
327
|
+
*
|
|
328
|
+
* @description
|
|
329
|
+
* Set the foremost window to an active state
|
|
330
|
+
*
|
|
331
|
+
*/
|
|
332
|
+
activateForemostWindow = () => {
|
|
333
|
+
var foremost = undefined;
|
|
334
|
+
for (var i = 0; i < this.windows.length; i++) {
|
|
335
|
+
if ((foremost === undefined || this.windows[i].zIndex > foremost.zIndex) && !this.windows[i].minimized && !this.windows[i].outOfBounds)
|
|
336
|
+
foremost = this.windows[i];
|
|
337
|
+
}
|
|
338
|
+
if (foremost)
|
|
339
|
+
foremost.active = true;
|
|
340
|
+
};
|
|
341
|
+
/**
|
|
342
|
+
* @tru.doc function
|
|
343
|
+
* @name truDesktopComponent.activateNextWindow
|
|
344
|
+
* @module tru.desktop
|
|
345
|
+
*
|
|
346
|
+
* @description
|
|
347
|
+
* Set the next window to an active state
|
|
348
|
+
*
|
|
349
|
+
*/
|
|
350
|
+
activateNextWindow = (activeWindowLocation) => {
|
|
351
|
+
if (this.windows.length <= 1)
|
|
352
|
+
return;
|
|
353
|
+
var backend = this.windows.slice(activeWindowLocation);
|
|
354
|
+
var frontend = this.windows.slice(0, activeWindowLocation - 1);
|
|
355
|
+
var sorted = backend.concat(frontend);
|
|
356
|
+
var nextWindow = undefined;
|
|
357
|
+
for (var i = 0; i < sorted.length; i++) {
|
|
358
|
+
if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
|
|
359
|
+
nextWindow = sorted[i];
|
|
360
|
+
}
|
|
361
|
+
if (nextWindow) {
|
|
362
|
+
this.clearActive();
|
|
363
|
+
nextWindow.zIndex = this.getNextMaxZIndex();
|
|
364
|
+
nextWindow.active = true;
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
/**
|
|
368
|
+
* @tru.doc function
|
|
369
|
+
* @name truDesktopComponent.activatePreviousWindow
|
|
370
|
+
* @module tru.desktop
|
|
371
|
+
*
|
|
372
|
+
* @description
|
|
373
|
+
* Set the previous window to an active state
|
|
374
|
+
*
|
|
375
|
+
*/
|
|
376
|
+
activatePreviousWindow = (activeWindowLocation) => {
|
|
377
|
+
if (this.windows.length <= 1)
|
|
378
|
+
return;
|
|
379
|
+
var backend = this.windows.slice(activeWindowLocation);
|
|
380
|
+
var frontend = this.windows.slice(0, activeWindowLocation - 1);
|
|
381
|
+
var sorted = backend.concat(frontend);
|
|
382
|
+
var nextWindow = undefined;
|
|
383
|
+
for (var i = sorted.length - 1; i >= 0; i--) {
|
|
384
|
+
if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
|
|
385
|
+
nextWindow = sorted[i];
|
|
386
|
+
}
|
|
387
|
+
if (nextWindow) {
|
|
388
|
+
this.clearActive();
|
|
389
|
+
nextWindow.zIndex = this.getNextMaxZIndex();
|
|
390
|
+
nextWindow.active = true;
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* @tru.doc function
|
|
395
|
+
* @name truDesktopComponent.minimize
|
|
396
|
+
* @module tru.desktop
|
|
397
|
+
*
|
|
398
|
+
* @description
|
|
399
|
+
* Visually removes window from the viewport.
|
|
400
|
+
*
|
|
401
|
+
*/
|
|
402
|
+
minimize = (window) => {
|
|
403
|
+
this.savePosition(window);
|
|
404
|
+
window.active = false;
|
|
405
|
+
window.minimized = true;
|
|
406
|
+
this.activateForemostWindow();
|
|
407
|
+
};
|
|
408
|
+
/**
|
|
409
|
+
* @tru.doc function
|
|
410
|
+
* @name truDesktopComponent.maximize
|
|
411
|
+
* @module tru.desktop
|
|
412
|
+
*
|
|
413
|
+
* @description
|
|
414
|
+
* Positions window such that it fills the whole viewport.
|
|
415
|
+
*
|
|
416
|
+
*/
|
|
417
|
+
maximize = (window) => {
|
|
418
|
+
window.top = 0;
|
|
419
|
+
window.left = 0;
|
|
420
|
+
window.right = 0;
|
|
421
|
+
window.bottom = 0;
|
|
422
|
+
window.height = 'auto';
|
|
423
|
+
window.width = '100%';
|
|
424
|
+
window.maximized = 'fill';
|
|
425
|
+
};
|
|
426
|
+
/**
|
|
427
|
+
* @tru.doc function
|
|
428
|
+
* @name truDesktopComponent.maximizeLeft
|
|
429
|
+
* @module tru.desktop
|
|
430
|
+
*
|
|
431
|
+
* @description
|
|
432
|
+
* Positions window such that it fills the left portion viewport.
|
|
433
|
+
*
|
|
434
|
+
*/
|
|
435
|
+
maximizeLeft = (window) => {
|
|
436
|
+
window.split = true;
|
|
437
|
+
window.top = 0;
|
|
438
|
+
window.left = 0;
|
|
439
|
+
window.bottom = 0;
|
|
440
|
+
window.width = '50%';
|
|
441
|
+
window.height = 'auto';
|
|
442
|
+
window.maximized = 'left';
|
|
443
|
+
};
|
|
444
|
+
/**
|
|
445
|
+
* @tru.doc function
|
|
446
|
+
* @name truDesktopComponent.maximizeRight
|
|
447
|
+
* @module tru.desktop
|
|
448
|
+
*
|
|
449
|
+
* @description
|
|
450
|
+
* Positions window such that it fills the right portion viewport.
|
|
451
|
+
*
|
|
452
|
+
*/
|
|
453
|
+
maximizeRight = (window) => {
|
|
454
|
+
window.top = 0;
|
|
455
|
+
window.left = '50%';
|
|
456
|
+
window.right = 0;
|
|
457
|
+
window.bottom = 0;
|
|
458
|
+
window.width = '50%';
|
|
459
|
+
window.height = 'auto';
|
|
460
|
+
window.maximized = 'right';
|
|
461
|
+
};
|
|
462
|
+
/**
|
|
463
|
+
* @tru.doc function
|
|
464
|
+
* @name truDesktopComponent.recover
|
|
465
|
+
* @module tru.desktop
|
|
466
|
+
*
|
|
467
|
+
* @description
|
|
468
|
+
* Brings window back into view when it has escaped the viewport.
|
|
469
|
+
*
|
|
470
|
+
*/
|
|
471
|
+
recover = (window) => {
|
|
472
|
+
window.active = true;
|
|
473
|
+
window.outOfBounds = false;
|
|
474
|
+
window.minimized = false;
|
|
475
|
+
window.zIndex = this.getNextMaxZIndex();
|
|
476
|
+
this.cascadeWindow(window);
|
|
477
|
+
this.clearActive();
|
|
478
|
+
this.activateForemostWindow();
|
|
479
|
+
};
|
|
480
|
+
/**
|
|
481
|
+
* @tru.doc function
|
|
482
|
+
* @name truDesktopComponent.restore
|
|
483
|
+
* @module tru.desktop
|
|
484
|
+
*
|
|
485
|
+
* @description
|
|
486
|
+
*
|
|
487
|
+
*/
|
|
488
|
+
restore = (wdw) => {
|
|
489
|
+
if (wdw.maximized === 'fill') {
|
|
490
|
+
this.maximize(wdw);
|
|
491
|
+
}
|
|
492
|
+
else if (wdw.maximized === 'left') {
|
|
493
|
+
this.maximizeLeft(wdw);
|
|
494
|
+
}
|
|
495
|
+
else if (wdw.maximized === 'right') {
|
|
496
|
+
this.maximizeRight(wdw);
|
|
497
|
+
}
|
|
498
|
+
this.updateWindowState(wdw);
|
|
499
|
+
};
|
|
500
|
+
/**
|
|
501
|
+
* @tru.doc function
|
|
502
|
+
* @name truDesktopComponent.bringToFront
|
|
503
|
+
* @module tru.desktop
|
|
504
|
+
*
|
|
505
|
+
* @description
|
|
506
|
+
*
|
|
507
|
+
*/
|
|
508
|
+
updateWindowState = (wdw) => {
|
|
509
|
+
if (wdw.outOfBounds) {
|
|
510
|
+
this.recover(wdw);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
if (wdw.maximized === 'fill') {
|
|
514
|
+
this.maximize(wdw);
|
|
515
|
+
}
|
|
516
|
+
else if (wdw.maximized === 'left') {
|
|
517
|
+
this.maximizeLeft(wdw);
|
|
518
|
+
}
|
|
519
|
+
else if (wdw.maximized === 'right') {
|
|
520
|
+
this.maximizeRight(wdw);
|
|
521
|
+
}
|
|
522
|
+
this.clearActive();
|
|
523
|
+
wdw.active = true;
|
|
524
|
+
wdw.minimized = false;
|
|
525
|
+
wdw.zIndex = this.getNextMaxZIndex();
|
|
526
|
+
};
|
|
527
|
+
/**
|
|
528
|
+
* @tru.doc function
|
|
529
|
+
* @name truDesktopComponent.restoreSavedPosition
|
|
530
|
+
* @module tru.desktop
|
|
531
|
+
*
|
|
532
|
+
* @description
|
|
533
|
+
* Set the windows last know position to the current position.
|
|
534
|
+
*
|
|
535
|
+
*/
|
|
536
|
+
restoreSavedPosition = (wdw) => {
|
|
537
|
+
this.clearActive();
|
|
538
|
+
wdw.top = wdw.savedPosition.top;
|
|
539
|
+
wdw.left = wdw.savedPosition.left;
|
|
540
|
+
wdw.right = wdw.savedPosition.right;
|
|
541
|
+
wdw.bottom = wdw.savedPosition.bottom;
|
|
542
|
+
wdw.height = wdw.savedPosition.height;
|
|
543
|
+
wdw.width = wdw.savedPosition.width;
|
|
544
|
+
wdw.maximized = undefined;
|
|
545
|
+
wdw.minimized = undefined;
|
|
546
|
+
wdw.active = true;
|
|
547
|
+
wdw.minimized = false;
|
|
548
|
+
wdw.zIndex = this.getNextMaxZIndex();
|
|
549
|
+
};
|
|
550
|
+
/**
|
|
551
|
+
* @tru.doc function
|
|
552
|
+
* @name truDesktopComponent.savePosition
|
|
553
|
+
* @module tru.desktop
|
|
554
|
+
*
|
|
555
|
+
* @description
|
|
556
|
+
* Save the windows last know position.
|
|
557
|
+
*
|
|
558
|
+
*/
|
|
559
|
+
savePosition = (wdw) => {
|
|
560
|
+
wdw.savedPosition.top = wdw.top;
|
|
561
|
+
wdw.savedPosition.left = wdw.left;
|
|
562
|
+
wdw.savedPosition.right = wdw.right;
|
|
563
|
+
wdw.savedPosition.bottom = wdw.bottom;
|
|
564
|
+
wdw.savedPosition.height = wdw.height;
|
|
565
|
+
wdw.savedPosition.width = wdw.width;
|
|
566
|
+
};
|
|
567
|
+
/**
|
|
568
|
+
* @tru.doc function
|
|
569
|
+
* @name truDesktopComponent.closeWindow
|
|
570
|
+
* @module tru.desktop
|
|
571
|
+
*
|
|
572
|
+
* @description
|
|
573
|
+
* Moves a window to the next cascade position.
|
|
574
|
+
*
|
|
575
|
+
*/
|
|
576
|
+
cascadeWindow = (window) => {
|
|
577
|
+
if (!this.options.enableWindowCascading || window.isModal)
|
|
578
|
+
return;
|
|
579
|
+
this.lastWindowCascadePosition.top += 10;
|
|
580
|
+
this.lastWindowCascadePosition.left += 10;
|
|
581
|
+
if (this.lastWindowCascadePosition.top > this.maxWindowCascadePosition)
|
|
582
|
+
this.lastWindowCascadePosition.top = this.minWindowCascadePosition;
|
|
583
|
+
if (this.lastWindowCascadePosition.left > this.maxWindowCascadePosition)
|
|
584
|
+
this.lastWindowCascadePosition.left = this.minWindowCascadePosition;
|
|
585
|
+
window.top = this.lastWindowCascadePosition.top + 'px';
|
|
586
|
+
window.left = this.lastWindowCascadePosition.left + 'px';
|
|
587
|
+
};
|
|
588
|
+
/**
|
|
589
|
+
* @tru.doc function
|
|
590
|
+
* @name truDesktopComponent.getKeyCode
|
|
591
|
+
* @module tru.desktop
|
|
592
|
+
*
|
|
593
|
+
* @description
|
|
594
|
+
*
|
|
595
|
+
*/
|
|
596
|
+
getKeySequence = (event) => {
|
|
597
|
+
var keys = [];
|
|
598
|
+
if (event.shiftKey)
|
|
599
|
+
keys.push('shift');
|
|
600
|
+
if (event.ctrlKey)
|
|
601
|
+
keys.push('ctrl');
|
|
602
|
+
if (event.altKey)
|
|
603
|
+
keys.push('alt');
|
|
604
|
+
if (event.metaKey)
|
|
605
|
+
keys.push('meta');
|
|
606
|
+
var keyCode = event.keyCode || event.which;
|
|
607
|
+
if (keyCode)
|
|
608
|
+
keys.push(this.keyboardMap[keyCode].toLowerCase());
|
|
609
|
+
return keys.join('+');
|
|
610
|
+
};
|
|
611
|
+
/**
|
|
612
|
+
* @tru.doc event
|
|
613
|
+
* @module tru.desktop
|
|
614
|
+
*
|
|
615
|
+
* @description
|
|
616
|
+
*
|
|
617
|
+
*/
|
|
618
|
+
onKeyDown = (event) => {
|
|
619
|
+
var keySequence = this.getKeySequence(event);
|
|
620
|
+
if (keySequence === 'alt+m') { //Maximize
|
|
621
|
+
var activeWindow = this.getActiveWindow();
|
|
622
|
+
if (activeWindow === null)
|
|
623
|
+
return;
|
|
624
|
+
if (!activeWindow.maximized) {
|
|
625
|
+
this.savePosition(activeWindow);
|
|
626
|
+
this.maximize(activeWindow);
|
|
627
|
+
}
|
|
628
|
+
else if (activeWindow.maximized === 'right' || activeWindow.maximized === 'left')
|
|
629
|
+
this.maximize(activeWindow);
|
|
630
|
+
else
|
|
631
|
+
this.restoreSavedPosition(activeWindow);
|
|
632
|
+
event.preventDefault();
|
|
633
|
+
}
|
|
634
|
+
if (keySequence === 'alt+n') { //Minimize
|
|
635
|
+
var activeWindow = this.getActiveWindow();
|
|
636
|
+
if (activeWindow === null || activeWindow.minimized)
|
|
637
|
+
return;
|
|
638
|
+
this.minimize(activeWindow);
|
|
639
|
+
event.preventDefault();
|
|
640
|
+
}
|
|
641
|
+
if (keySequence === 'alt+w') { //Cycles Forward
|
|
642
|
+
var index = this.windows.indexOf(this.getActiveWindow());
|
|
643
|
+
this.activateNextWindow(index + 1);
|
|
644
|
+
event.preventDefault();
|
|
645
|
+
}
|
|
646
|
+
if (keySequence === 'shift+alt+w') { //Cycles Backward
|
|
647
|
+
var index = this.windows.indexOf(this.getActiveWindow());
|
|
648
|
+
this.activatePreviousWindow(index + 1);
|
|
649
|
+
event.preventDefault();
|
|
650
|
+
}
|
|
651
|
+
if (keySequence === 'shift+alt+x' && !(this.shiftPressed && this.altPressed && this.xPressed)) { //Close
|
|
652
|
+
var activeWindow = this.getActiveWindow();
|
|
653
|
+
if (!activeWindow)
|
|
654
|
+
return;
|
|
655
|
+
this.closeWindow(activeWindow);
|
|
656
|
+
event.preventDefault();
|
|
657
|
+
}
|
|
658
|
+
if (keySequence === 'alt+d') { //Toggle Desktop
|
|
659
|
+
//this.desktopShown = this.hideShowAll();
|
|
660
|
+
event.preventDefault();
|
|
661
|
+
}
|
|
662
|
+
if (event.shiftKey)
|
|
663
|
+
this.shiftPressed = true;
|
|
664
|
+
if (event.altKey)
|
|
665
|
+
this.altPressed = true;
|
|
666
|
+
if (event.keyCode === 88)
|
|
667
|
+
this.xPressed = true;
|
|
668
|
+
};
|
|
669
|
+
onKeyUp = (event) => {
|
|
670
|
+
if (event.shiftKey)
|
|
671
|
+
this.shiftPressed = false;
|
|
672
|
+
if (event.altKey)
|
|
673
|
+
this.altPressed = false;
|
|
674
|
+
if (event.keyCode === 88)
|
|
675
|
+
this.xPressed = false;
|
|
676
|
+
};
|
|
677
|
+
/**
|
|
678
|
+
* @tru.doc function
|
|
679
|
+
* @name truDesktopComponent.handleSelectAttempt
|
|
680
|
+
* @module tru.desktop
|
|
681
|
+
*
|
|
682
|
+
* @description
|
|
683
|
+
* Prevents the user from highlight desktop elements.
|
|
684
|
+
*
|
|
685
|
+
*/
|
|
686
|
+
handleSelectAttempt = (e) => {
|
|
687
|
+
var nodeName = e.target.nodeName.toLowerCase();
|
|
688
|
+
if (nodeName === 'input' || nodeName === 'textarea' || nodeName === 'select')
|
|
689
|
+
return true;
|
|
690
|
+
if (window.event) {
|
|
691
|
+
e.preventDefault();
|
|
692
|
+
}
|
|
693
|
+
return true;
|
|
694
|
+
};
|
|
695
|
+
windows = [];
|
|
696
|
+
ngOnInit() {
|
|
697
|
+
this.logoUrl = this.options.logoUrl;
|
|
698
|
+
this.options = Object.assign(this.desktop.options, this.options);
|
|
699
|
+
this.options.viewportTop = this.options.menubarConfig !== undefined ? this.options.menubarHeight + 1 : 0;
|
|
700
|
+
this.truWindowEventHandler.onOpen().subscribe((windiowEvent) => {
|
|
701
|
+
this.openWindow(windiowEvent, false);
|
|
702
|
+
});
|
|
703
|
+
document.onselectstart = this.handleSelectAttempt;
|
|
704
|
+
window.addEventListener('keydown', this.onKeyDown);
|
|
705
|
+
window.addEventListener('keyup', this.onKeyUp);
|
|
706
|
+
window.onbeforeunload = (e) => {
|
|
707
|
+
let hasChanges = this.viewportComponent.windowComponents.filter((w) => { return w.hasChanges() ? true : false; });
|
|
708
|
+
if (hasChanges.length) {
|
|
709
|
+
e = e || window.event;
|
|
710
|
+
var msg = this.textManager.msgConfirmExitWithChangesPending;
|
|
711
|
+
// For IE and Firefox
|
|
712
|
+
if (e) {
|
|
713
|
+
e.returnValue = msg;
|
|
714
|
+
}
|
|
715
|
+
// For Safari / chrome
|
|
716
|
+
return msg;
|
|
717
|
+
}
|
|
718
|
+
return false;
|
|
719
|
+
};
|
|
720
|
+
}
|
|
721
|
+
ngOnDestroy() {
|
|
722
|
+
window.removeEventListener('keydown', this.onKeyDown);
|
|
723
|
+
window.removeEventListener('keyup', this.onKeyUp);
|
|
724
|
+
}
|
|
725
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDesktop, deps: [{ token: i1.TruDesktopService }, { token: i2.TruTextManager }, { token: i3.TruWindowEventHandler }], target: i0.ɵɵFactoryTarget.Component });
|
|
726
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TruDesktop, selector: "tru-desktop", inputs: { options: "options" }, providers: [TruDesktopService], viewQueries: [{ propertyName: "viewportComponent", first: true, predicate: TruDesktopViewport, descendants: true }], ngImport: i0, template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"], dependencies: [{ kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.TruDesktopMenubar, selector: "tru-desktop-menubar", inputs: ["desktopCtrl"] }, { kind: "component", type: i6.TruDesktopTaskbar, selector: "tru-desktop-taskbar", inputs: ["windows", "desktopCtrl"] }, { kind: "component", type: i7.TruDesktopViewport, selector: "tru-desktop-viewport", inputs: ["windows", "desktopCtrl"] }] });
|
|
727
|
+
}
|
|
728
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDesktop, decorators: [{
|
|
729
|
+
type: Component,
|
|
730
|
+
args: [{ selector: 'tru-desktop', providers: [TruDesktopService], template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"] }]
|
|
731
|
+
}], ctorParameters: () => [{ type: i1.TruDesktopService }, { type: i2.TruTextManager }, { type: i3.TruWindowEventHandler }], propDecorators: { options: [{
|
|
732
|
+
type: Input
|
|
733
|
+
}], viewportComponent: [{
|
|
734
|
+
type: ViewChild,
|
|
735
|
+
args: [TruDesktopViewport]
|
|
736
|
+
}] } });
|
|
737
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRlc2t0b3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnUtY29tbW9uLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZGVza3RvcC90cnUtZGVza3RvcC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kZXNrdG9wL3RydS1kZXNrdG9wLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFRckUsTUFBTSxPQUFPLFVBQVU7SUFLWDtJQUNBO0lBQ0E7SUFORCxPQUFPLENBQU07SUFDaUIsaUJBQWlCLENBQXNCO0lBRTlFLFlBQ1UsY0FBaUMsRUFDakMsV0FBMkIsRUFDM0IscUJBQTRDO1FBRjVDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDM0IsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsT0FBTyxDQUFNO0lBQ2Isd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztJQUMvQix5QkFBeUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3hHLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxF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IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcnVXaW5kb3dFdmVudEFyZ3MgfSBmcm9tICcuL3NlcnZpY2VzL3RydS13aW5kb3ctZXZlbnQtYXJncyc7XHJcbmltcG9ydCB7IFRydVdpbmRvd0V2ZW50SGFuZGxlciB9IGZyb20gJy4vc2VydmljZXMvdHJ1LXdpbmRvdy1ldmVudC1oYW5kbGVyJztcbmltcG9ydCB7IFRydURlc2t0b3BTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cnUtZGVza3RvcC1zZXJ2aWNlJztcbmltcG9ydCB7IFRydURlc2t0b3BWaWV3Q29uZmlnIH0gZnJvbSAnLi9jbGFzc2VzL3RydS1kZXNrdG9wLXZpZXctY29uZmlnJztcclxuaW1wb3J0IHsgVHJ1VGV4dE1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtdGV4dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVHJ1RGVza3RvcFdpbmRvdyB9IGZyb20gJy4vd2luZG93L3RydS1kZXNrdG9wLXdpbmRvdyc7XHJcbmltcG9ydCB7IFRydURlc2t0b3BWaWV3cG9ydCB9IGZyb20gJy4vdmlld3BvcnQvdHJ1LWRlc2t0b3Atdmlld3BvcnQnO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RydS1kZXNrdG9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RydS1kZXNrdG9wLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cnUtZGVza3RvcC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbVHJ1RGVza3RvcFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFRydURlc2t0b3AgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XG4gIEBWaWV3Q2hpbGQoVHJ1RGVza3RvcFZpZXdwb3J0KSBwcml2YXRlIHZpZXdwb3J0Q29tcG9uZW50ITogVHJ1RGVza3RvcFZpZXdwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGVza3RvcFNlcnZpY2U6IFRydURlc2t0b3BTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGV4dE1hbmFnZXI6IFRydVRleHRNYW5hZ2VyLFxuICAgIHByaXZhdGUgdHJ1V2luZG93RXZlbnRIYW5kbGVyOiBUcnVXaW5kb3dFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLmRlc2t0b3AgPSB0aGlzLmRlc2t0b3BTZXJ2aWNlLmNyZWF0ZURlc2t0b3AoKTtcbiAgfVxyXG5cbiAgbWluaW1pemVBbGwgPSBmYWxzZTtcbiAgZGVza3RvcDogYW55O1xuICBtaW5XaW5kb3dDYXNjYWRlUG9zaXRpb24gPSA0MDtcbiAgbWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uID0gMTAwO1xuICBsYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uID0geyB0b3A6IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uLCBsZWZ0OiB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbiB9O1xuICBzaGlmdFByZXNzZWQgPSBmYWxzZTtcbiAgYWx0UHJlc3NlZCA9IGZhbHNlO1xuICB4UHJlc3NlZCA9IGZhbHNlO1xuICBrZXlib2FyZE1hcCA9IFtcIlwiLCBcIlwiLCBcIlwiLCBcIkNBTkNFTFwiLCBcIlwiLCBcIlwiLCBcIkhFTFBcIiwgXCJcIiwgXCJCQUNLX1NQQUNFXCIsIFwiVEFCXCIsIFwiXCIsIFwiXCIsIFwiQ0xFQVJcIiwgXCJFTlRFUlwiLCBcIlJFVFVSTlwiLCBcIlwiLCBcIlNISUZUXCIsIFwiQ09OVFJPTFwiLCBcIkFMVFwiLCBcIlBBVVNFXCIsIFwiQ0FQU19MT0NLXCIsIFwiS0FOQVwiLCBcIkVJU1VcIiwgXCJKVU5KQVwiLCBcIkZJTkFMXCIsIFwiSEFOSkFcIiwgXCJcIiwgXCJFU0NBUEVcIiwgXCJDT05WRVJUXCIsIFwiTk9OQ09OVkVSVFwiLCBcIkFDQ0VQVFwiLCBcIk1PREVDSEFOR0VcIiwgXCJTUEFDRVwiLCBcIlBBR0VfVVBcIiwgXCJQQUdFX0RPV05cIiwgXCJFTkRcIiwgXCJIT01FXCIsIFwiTEVGVFwiLCBcIlVQXCIsIFwiUklHSFRcIiwgXCJET1dOXCIsIFwiU0VMRUNUXCIsIFwiUFJJTlRcIiwgXCJFWEVDVVRFXCIsIFwiUFJJTlRTQ1JFRU5cIiwgXCJJTlNFUlRcIiwgXCJERUxFVEVcIiwgXCJcIiwgXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiQ09MT05cIiwgXCJTRU1JQ09MT05cIiwgXCJMRVNTX1RIQU5cIiwgXCJFUVVBTFNcIiwgXCJHUkVBVEVSX1RIQU5cIiwgXCJRVUVTVElPTl9NQVJLXCIsIFwiQVRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcIldJTlwiLCBcIlwiLCBcIkNPTlRFWFRfTUVOVVwiLCBcIlwiLCBcIlNMRUVQXCIsIFwiTlVNUEFEMFwiLCBcIk5VTVBBRDFcIiwgXCJOVU1QQUQyXCIsIFwiTlVNUEFEM1wiLCBcIk5VTVBBRDRcIiwgXCJOVU1QQUQ1XCIsIFwiTlVNUEFENlwiLCBcIk5VTVBBRDdcIiwgXCJOVU1QQUQ4XCIsIFwiTlVNUEFEOVwiLCBcIk1VTFRJUExZXCIsIFwiQUREXCIsIFwiU0VQQVJBVE9SXCIsIFwiU1VCVFJBQ1RcIiwgXCJERUNJTUFMXCIsIFwiRElWSURFXCIsIFwiRjFcIiwgXCJGMlwiLCBcIkYzXCIsIFwiRjRcIiwgXCJGNVwiLCBcIkY2XCIsIFwiRjdcIiwgXCJGOFwiLCBcIkY5XCIsIFwiRjEwXCIsIFwiRjExXCIsIFwiRjEyXCIsIFwiRjEzXCIsIFwiRjE0XCIsIFwiRjE1XCIsIFwiRjE2XCIsIFwiRjE3XCIsIFwiRjE4XCIsIFwiRjE5XCIsIFwiRjIwXCIsIFwiRjIxXCIsIFwiRjIyXCIsIFwiRjIzXCIsIFwiRjI0XCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiTlVNX0xPQ0tcIiwgXCJTQ1JPTExfTE9DS1wiLCBcIldJTl9PRU1fRkpfSklTSE9cIiwgXCJXSU5fT0VNX0ZKX01BU1NIT1VcIiwgXCJXSU5fT0VNX0ZKX1RPVVJPS1VcIiwgXCJXSU5fT0VNX0ZKX0xPWUFcIiwgXCJXSU5fT0VNX0ZKX1JPWUFcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJDSVJDVU1GTEVYXCIsIFwiRVhDTEFNQVRJT05cIiwgXCJET1VCTEVfUVVPVEVcIiwgXCJIQVNIXCIsIFwiRE9MTEFSXCIsIFwiUEVSQ0VOVFwiLCBcIkFNUEVSU0FORFwiLCBcIlVOREVSU0NPUkVcIiwgXCJPUEVOX1BBUkVOXCIsIFwiQ0xPU0VfUEFSRU5cIiwgXCJBU1RFUklTS1wiLCBcIlBMVVNcIiwgXCJQSVBFXCIsIFwiSFlQSEVOX01JTlVTXCIsIFwiT1BFTl9DVVJMWV9CUkFDS0VUXCIsIFwiQ0xPU0VfQ1VSTFlfQlJBQ0tFVFwiLCBcIlRJTERFXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiVk9MVU1FX01VVEVcIiwgXCJWT0xVTUVfRE9XTlwiLCBcIlZPTFVNRV9VUFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIkNPTU1BXCIsIFwiXCIsIFwiUEVSSU9EXCIsIFwiU0xBU0hcIiwgXCJCQUNLX1FVT1RFXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiT1BFTl9CUkFDS0VUXCIsIFwiQkFDS19TTEFTSFwiLCBcIkNMT1NFX0JSQUNLRVRcIiwgXCJRVU9URVwiLCBcIlwiLCBcIk1FVEFcIiwgXCJBTFRHUlwiLCBcIlwiLCBcIldJTl9JQ09fSEVMUFwiLCBcIldJTl9JQ09fMDBcIiwgXCJcIiwgXCJXSU5fSUNPX0NMRUFSXCIsIFwiXCIsIFwiXCIsIFwiV0lOX09FTV9SRVNFVFwiLCBcIldJTl9PRU1fSlVNUFwiLCBcIldJTl9PRU1fUEExXCIsIFwiV0lOX09FTV9QQTJcIiwgXCJXSU5fT0VNX1BBM1wiLCBcIldJTl9PRU1fV1NDVFJMXCIsIFwiV0lOX09FTV9DVVNFTFwiLCBcIldJTl9PRU1fQVRUTlwiLCBcIldJTl9PRU1fRklOSVNIXCIsIFwiV0lOX09FTV9DT1BZXCIsIFwiV0lOX09FTV9BVVRPXCIsIFwiV0lOX09FTV9FTkxXXCIsIFwiV0lOX09FTV9CQUNLVEFCXCIsIFwiQVRUTlwiLCBcIkNSU0VMXCIsIFwiRVhTRUxcIiwgXCJFUkVPRlwiLCBcIlBMQVlcIiwgXCJaT09NXCIsIFwiXCIsIFwiUEExXCIsIFwiV0lOX09FTV9DTEVBUlwiLCBcIlwiXTtcbiAgbG9nb1VybCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0RGVza3RvcFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIGRlc2t0b3AuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGRlc2t0b3AuXG4gICAqL1xuICBnZXREZXNrdG9wID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmRlc2t0b3A7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0T3B0aW9uc1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIGRlc2t0b3Agb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gb3B0aW9ucy5cbiAgICovXG4gIGdldE9wdGlvbnMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRXaW5kb3dzXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiB3aW5kb3dzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YXJyYXl9IHdpbmRvd3MuXG4gICAqL1xuICBnZXRXaW5kb3dzID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLndpbmRvd3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0TmV4dE1heFpJbmRleFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB3aW5kb3cgb2JqZWN0cyBpbiB0aGUgd2luZG93cyBhcnJheSB0byBmaW5kIHRoZSBtYXggei1pbmRleFxuICAgKiBhbmQgaW5jcmVhc2VzIHRoZSB2YWx1ZSBmb3VuZCBieSAxLlxuICAgKlxuICAgKiBAcmV0dXJucyB7aW50fVxuICAgKi9cbiAgZ2V0TmV4dE1heFpJbmRleCA9ICgpID0+IHtcbiAgICB2YXIgbWF4ID0gMDtcbiAgICB2YXIgdG1wO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLndpbmRvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRtcCA9IHRoaXMud2luZG93c1tpXS56SW5kZXg7XG4gICAgICBpZiAodG1wID4gbWF4KSBtYXggPSB0bXA7XG4gICAgfVxuICAgIHJldHVybiArK21heDtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jbGVhckFjdGl2ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB3aW5kb3cgb2JqZWN0cyBpbiB0aGUgd2luZG93c1xuICAgKiBhbmQgc2V0cyB0aGUgYWN0aXZlIHByb3BlcnR5IHRvIGZhbHNlLlxuICAgKlxuICAgKi9cbiAgY2xlYXJBY3RpdmUgPSAoKSA9PiB7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdpbmRvdzogYW55KSA9PiB7XG4gICAgICB3aW5kb3cuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0QWN0aXZlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdldHMgdGhlIGFjdGl2ZSB3aW5kb3cuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IHZpZXcgb2JqZWN0LlxuICAgKi9cbiAgZ2V0QWN0aXZlV2luZG93ID0gKCk6IGFueSA9PiB7XG4gICAgdmFyIGFjdGl2ZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdkdzogYW55KSA9PiB7XG4gICAgICBpZiAod2R3LmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3RpdmVXaW5kb3cgPSB3ZHc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZVdpbmRvdztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRBY3RpdmVWaWV3XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdldHMgdGhlIGFjdGl2ZSB2aWV3LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSB2aWV3IG9iamVjdC5cbiAgICovXG4gIGdldEFjdGl2ZVZpZXcgPSAod2R3OiBhbnkpID0+IHtcbiAgICB2YXIgYWN0aXZlVmlldyA9IG51bGw7XG4gICAgd2R3LnZpZXdzLmZvckVhY2goKHZpZXc6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXcuYWN0aXZlJC5nZXRWYWx1ZSgpID09PSB0cnVlKSB7XG4gICAgICAgIGFjdGl2ZVZpZXcgPSB2aWV3O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVWaWV3O1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFsbFdpbmRvd3NBcmVNaW5pbWl6ZWRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCB3aW5kb3dzIHRvIGRldGVybWluZSBpZiBhbGwgYXJlIG1pbmltaXplZC5cbiAgICpcbiAgICovXG4gIGFsbFdpbmRvd3NBcmVNaW5pbWl6ZWQgPSAoKSA9PiB7XG4gICAgdmFyIGFsbE1pbmltaXplZCA9IHRydWU7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdpbmRvdzogYW55KSA9PiB7XG4gICAgICBpZiAoIXdpbmRvdy5taW5pbWl6ZWQpIHtcbiAgICAgICAgYWxsTWluaW1pemVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbE1pbmltaXplZDtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5oaWRlU2hvd0FsbFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBIaWRlcy9zaG93cyBhbGwgd2luZG93c1xuICAgKlxuICAgKi9cbiAgaGlkZVNob3dBbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5taW5pbWl6ZUFsbCA9IHRoaXMuYWxsV2luZG93c0FyZU1pbmltaXplZCgpID8gZmFsc2UgOiAhdGhpcy5taW5pbWl6ZUFsbDtcbiAgICB0aGlzLndpbmRvd3MuZm9yRWFjaCgod2R3OiBhbnkpID0+IHtcbiAgICAgIGlmICh3ZHcub3V0T2ZCb3VuZHMpIHRoaXMucmVjb3Zlcih3ZHcpO1xuICAgICAgd2R3LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgd2R3Lm1pbmltaXplZCA9IHRoaXMubWluaW1pemVBbGw7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgcmV0dXJuIHRoaXMubWluaW1pemVBbGw7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmZpbmRXaW5kb3dWaWV3RGlyZWN0aXZlXHJcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogTG9va3MgZm9yIHByZXZpb3VzbHkgb3BlbiB3aW5kb3cgd2l0aCBhIHZpZXcgZGlyZWN0aXZlXHJcbiAgICpcclxuICAgKi9cclxuICBmaW5kV2luZG93Vmlld0RpcmVjdGl2ZSA9ICh3aW5kb3dWaWV3RGlyZWN0aXZlOiBhbnkpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53aW5kb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy53aW5kb3dzW2ldLnZpZXdzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2luZG93c1tpXS52aWV3c1swXS52aWV3RGlyZWN0aXZlID09PSB3aW5kb3dWaWV3RGlyZWN0aXZlKVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMud2luZG93c1tpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5vcGVuV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc3BsYXlzIGEgbmV3IHdpbmRvdy4gQWxsIHdpbmRvdyBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB3aWxsIGJlXG4gICAqIG92ZXJsYWlkIGhlcmUgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIHdpbmRvd1xuICAgKlxuICAgKi9cbiAgb3BlbldpbmRvdyA9ICh3aW5kb3dDb25maWdPdmVybGF5czogYW55LCBzaW5nbGVJbnN0YW5jZTogYW55KSA9PiB7XG4gICAgbGV0IGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XHJcbiAgICBpZiAoYWN0aXZlV2luZG93ICYmIGFjdGl2ZVdpbmRvdy5pc01vZGFsKSB7XHJcbiAgICAgIGFjdGl2ZVdpbmRvdy5pbnZhbGlkT3BlcmF0aW9uID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xyXG4gICAgICBsZXQgd2luZG93ID0gdGhpcy5maW5kV2luZG93Vmlld0RpcmVjdGl2ZSh3aW5kb3dDb25maWdPdmVybGF5cy52aWV3c1swXS52aWV3RGlyZWN0aXZlKTtcclxuICAgICAgaWYgKHdpbmRvdykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlV2luZG93U3RhdGUod2luZG93KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93Q29uZmlnT3ZlcmxheXMuaXNNb2RhbCkge1xyXG4gICAgICBsZXQgaGVpZ2h0T2Zmc2V0ID0gKHBhcnNlSW50KHdpbmRvd0NvbmZpZ092ZXJsYXlzLmhlaWdodCwgMTApIC8gMikgKyAzMDtcclxuICAgICAgbGV0IHdpZHRoT2Zmc2V0ID0gKHBhcnNlSW50KHdpbmRvd0NvbmZpZ092ZXJsYXlzLndpZHRoLCAxMCkgLyAyKTtcclxuICAgICAgd2luZG93Q29uZmlnT3ZlcmxheXMudG9wID0gJ2NhbGMoNTAlIC0gJyArIGhlaWdodE9mZnNldCArICdweCApJztcclxuICAgICAgd2luZG93Q29uZmlnT3ZlcmxheXMubGVmdCA9ICdjYWxjKDUwJSAtICcgKyB3aWR0aE9mZnNldCArICdweCApJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICBsZXQgY29uZmlndXJlZFdpbmRvdyA9IHRoaXMuY29uZmlndXJlV2luZG93KHdpbmRvd0NvbmZpZ092ZXJsYXlzKTtcclxuICAgIGNvbmZpZ3VyZWRXaW5kb3cudmlld3MgPSB0aGlzLmNvbmZpZ3VyZVZpZXdzKHdpbmRvd0NvbmZpZ092ZXJsYXlzLCBjb25maWd1cmVkV2luZG93KTtcclxuICAgIGlmICghY29uZmlndXJlZFdpbmRvdy5pc01vZGFsKSB7XHJcbiAgICAgIGNvbmZpZ3VyZWRXaW5kb3cuY2FzY2FkZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNhdmVQb3NpdGlvbihjb25maWd1cmVkV2luZG93KTtcclxuICAgICAgdGhpcy5tYXhpbWl6ZShjb25maWd1cmVkV2luZG93KTtcclxuICAgICAgdGhpcy53aW5kb3dzLnB1c2goY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndpbmRvd3MucHVzaChjb25maWd1cmVkV2luZG93KTtcclxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jb25maWd1cmVXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ3JlYXRlcyBhIG5ldyB3aW5kb3cgaW5zdGFuY2UuXG4gICAqXG4gICAqL1xuICBjb25maWd1cmVXaW5kb3cgPSAod2luZG93Q29uZmlnT3ZlcmxheXM6IGFueSkgPT4ge1xuICAgIHZhciB3aW5kb3dDb25maWdJbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVza3RvcC53aW5kb3dDb25maWcpO1xuICAgIHdpbmRvd0NvbmZpZ0luc3RhbmNlLnNhdmVkUG9zaXRpb24gPSBPYmplY3QuY3JlYXRlKHsgdG9wOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgYm90dG9tOiAwLCBoZWlnaHQ6IDAsIHdpZHRoOiAwIH0pO1xuICAgIHdpbmRvd0NvbmZpZ0luc3RhbmNlLnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgIC8vd2luZG93Q29uZmlnSW5zdGFuY2UuZ2xvYmFscyA9IE9iamVjdC5hc3NpZ24oe30sICRyb290U2NvcGUuJGV2YWwodGhpcy5vcHRpb25zLmdsb2JhbHMpKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih3aW5kb3dDb25maWdJbnN0YW5jZSwgd2luZG93Q29uZmlnT3ZlcmxheXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNvbmZpZ3VyZVZpZXdzXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgb25lIG9yIG1vcmUgdmlldyBpbnN0YW5jZXNcbiAgICpcbiAgICovXG4gIGNvbmZpZ3VyZVZpZXdzID0gKHdpbmRvd0NvbmZpZ092ZXJsYXlzOiBhbnksIGNvbmZpZ3VyZWRXaW5kb3c6IGFueSk6IEFycmF5PGFueT4gPT4ge1xuICAgIGxldCBjb25maWd1cmVkVmlld3M6IEFycmF5PGFueT4gPSBbXTtcbiAgICB3aW5kb3dDb25maWdPdmVybGF5cy52aWV3cy5mb3JFYWNoKCh2aWV3OiBhbnkpID0+IHtcbiAgICAgIGxldCBjb25maWd1cmVkVmlldyA9IG5ldyBUcnVEZXNrdG9wVmlld0NvbmZpZygpO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5jb21wb25lbnROYW1lID0gdmlldy5jb21wb25lbnROYW1lO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5lbnRpdGllcyA9IHZpZXcuZW50aXRpZXM7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmVudGl0eUluZGV4ID0gdmlldy5lbnRpdHlJbmRleDtcclxuICAgICAgY29uZmlndXJlZFZpZXcuaXNEaXJ0eSA9IHZpZXcuaXNEaXJ0eTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuaXNFZGl0aW5nID0gdmlldy5pc0VkaXRpbmc7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzSW52YWxpZCA9IHZpZXcuaXNWYWxpZDtcclxuICAgICAgY29uZmlndXJlZFZpZXcub3BlbkFzRGV0YWlWaWV3ID0gdmlldy5vcGVuQXNEZXRhaWxWaWV3O1xuICAgICAgLy92aWV3Q29uZmlnSW5zdGFuY2UuZ2xvYmFscyA9IHRoaXMub3B0aW9ucy5nbG9iYWxzO1xuICAgICAgLy9sZXQgY29uZmlndXJlZFZpZXcgPSBPYmplY3QuYXNzaWduKHZpZXdDb25maWdJbnN0YW5jZSwgdmlldyk7XG4gICAgICBjb25maWd1cmVkVmlldy53aW5kb3cgPSBjb25maWd1cmVkV2luZG93O1xuICAgICAgY29uZmlndXJlZFZpZXdzLnB1c2goY29uZmlndXJlZFZpZXcpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb25maWd1cmVkVmlld3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xvc2VXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVtb3ZlIGEgd2luZG93IHtvYmplY3R9IGZyb20gdGhlIHdpbmRvd3MgYXJyYXkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm5zIHRydWUgaWYgd2luZG93IHdhcyBjbG9zZWQsIGZhbHNlIGlmIG5vdCBjbG9zZWQuXG4gICAqL1xuICBjbG9zZVdpbmRvdyA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93RGlydHlDbG9zZSAmJiB3ZHcuaXNEaXJ0eSkge1xuICAgICAgYWxlcnQoXCJVbnNhdmVkIENoYW5nZXMuIFNhdmUgY2hhbmdlcyBiZWZvcmUgY2xvc2luZyB3aW5kb3cuXCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93SW52YWxpZENsb3NlICYmIHdkdy5pc0ludmFsaWQpIHtcbiAgICAgIGFsZXJ0KFwiRGF0YSBpcyBpbnZhbGlkLiBDb3JyZWN0IEludmFsaWQgZGF0YSBiZWZvcmUgY2xvc2luZyB3aW5kb3cuXCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuQ2xvc2VGbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNhbkNsb3NlRm4od2R3KSkge1xuICAgICAgICB0aGlzLndpbmRvd3Muc3BsaWNlKHRoaXMud2luZG93cy5pbmRleE9mKHdkdyksIDEpO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRm9yZW1vc3RXaW5kb3coKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpbmRvd3Muc3BsaWNlKHRoaXMud2luZG93cy5pbmRleE9mKHdkdyksIDEpO1xuICAgICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFjdGl2YXRlRm9yZW1vc3RXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSBmb3JlbW9zdCB3aW5kb3cgdG8gYW4gYWN0aXZlIHN0YXRlXG4gICAqXG4gICAqL1xuICBhY3RpdmF0ZUZvcmVtb3N0V2luZG93ID0gKCkgPT4ge1xuICAgIHZhciBmb3JlbW9zdCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2luZG93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKChmb3JlbW9zdCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMud2luZG93c1tpXS56SW5kZXggPiBmb3JlbW9zdC56SW5kZXgpICYmICF0aGlzLndpbmRvd3NbaV0ubWluaW1pemVkICYmICF0aGlzLndpbmRvd3NbaV0ub3V0T2ZCb3VuZHMpXG4gICAgICAgIGZvcmVtb3N0ID0gdGhpcy53aW5kb3dzW2ldO1xuICAgIH1cbiAgICBpZiAoZm9yZW1vc3QpXG4gICAgICBmb3JlbW9zdC5hY3RpdmUgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFjdGl2YXRlTmV4dFdpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXQgdGhlIG5leHQgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVOZXh0V2luZG93ID0gKGFjdGl2ZVdpbmRvd0xvY2F0aW9uOiBhbnkpID0+IHtcbiAgICBpZiAodGhpcy53aW5kb3dzLmxlbmd0aCA8PSAxKSByZXR1cm47XG4gICAgdmFyIGJhY2tlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoYWN0aXZlV2luZG93TG9jYXRpb24pO1xuICAgIHZhciBmcm9udGVuZCA9IHRoaXMud2luZG93cy5zbGljZSgwLCBhY3RpdmVXaW5kb3dMb2NhdGlvbiAtIDEpO1xuICAgIHZhciBzb3J0ZWQgPSBiYWNrZW5kLmNvbmNhdChmcm9udGVuZCk7XG4gICAgdmFyIG5leHRXaW5kb3cgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc29ydGVkW2ldLm1pbmltaXplZCAmJiAhc29ydGVkW2ldLm91dE9mQm91bmRzICYmICFuZXh0V2luZG93KVxuICAgICAgICBuZXh0V2luZG93ID0gc29ydGVkW2ldO1xuICAgIH1cblxuICAgIGlmIChuZXh0V2luZG93KSB7XG4gICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICBuZXh0V2luZG93LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgICAgbmV4dFdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZVByZXZpb3VzV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgcHJldmlvdXMgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVQcmV2aW91c1dpbmRvdyA9IChhY3RpdmVXaW5kb3dMb2NhdGlvbjogYW55KSA9PiB7XG4gICAgaWYgKHRoaXMud2luZG93cy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuICAgIHZhciBiYWNrZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKGFjdGl2ZVdpbmRvd0xvY2F0aW9uKTtcbiAgICB2YXIgZnJvbnRlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoMCwgYWN0aXZlV2luZG93TG9jYXRpb24gLSAxKTtcbiAgICB2YXIgc29ydGVkID0gYmFja2VuZC5jb25jYXQoZnJvbnRlbmQpO1xuICAgIHZhciBuZXh0V2luZG93ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghc29ydGVkW2ldLm1pbmltaXplZCAmJiAhc29ydGVkW2ldLm91dE9mQm91bmRzICYmICFuZXh0V2luZG93KVxuICAgICAgICBuZXh0V2luZG93ID0gc29ydGVkW2ldO1xuICAgIH1cblxuICAgIGlmIChuZXh0V2luZG93KSB7XG4gICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICBuZXh0V2luZG93LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgICAgbmV4dFdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5taW5pbWl6ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBWaXN1YWxseSByZW1vdmVzIHdpbmRvdyBmcm9tIHRoZSB2aWV3cG9ydC5cbiAgICpcbiAgICovXG4gIG1pbmltaXplID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgdGhpcy5zYXZlUG9zaXRpb24od2luZG93KTtcblxuICAgIHdpbmRvdy5hY3RpdmUgPSBmYWxzZTtcbiAgICB3aW5kb3cubWluaW1pemVkID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2YXRlRm9yZW1vc3RXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5tYXhpbWl6ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgd2hvbGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZSA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHdpbmRvdy50b3AgPSAwO1xuICAgIHdpbmRvdy5sZWZ0ID0gMDtcbiAgICB3aW5kb3cucmlnaHQgPSAwO1xuICAgIHdpbmRvdy5ib3R0b20gPSAwO1xuICAgIHdpbmRvdy5oZWlnaHQgPSAnYXV0byc7XG4gICAgd2luZG93LndpZHRoID0gJzEwMCUnO1xuICAgIHdpbmRvdy5tYXhpbWl6ZWQgPSAnZmlsbCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVMZWZ0XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFBvc2l0aW9ucyB3aW5kb3cgc3VjaCB0aGF0IGl0IGZpbGxzIHRoZSBsZWZ0IHBvcnRpb24gdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZUxlZnQgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cuc3BsaXQgPSB0cnVlO1xuICAgIHdpbmRvdy50b3AgPSAwO1xuICAgIHdpbmRvdy5sZWZ0ID0gMDtcbiAgICB3aW5kb3cuYm90dG9tID0gMDtcbiAgICB3aW5kb3cud2lkdGggPSAnNTAlJztcbiAgICB3aW5kb3cuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHdpbmRvdy5tYXhpbWl6ZWQgPSAnbGVmdCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVSaWdodFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgcmlnaHQgcG9ydGlvbiB2aWV3cG9ydC5cbiAgICpcbiAgICovXG4gIG1heGltaXplUmlnaHQgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9ICc1MCUnO1xuICAgIHdpbmRvdy5yaWdodCA9IDA7XG4gICAgd2luZG93LmJvdHRvbSA9IDA7XG4gICAgd2luZG93LndpZHRoID0gJzUwJSc7XG4gICAgd2luZG93LmhlaWdodCA9ICdhdXRvJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ3JpZ2h0JztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5yZWNvdmVyXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJyaW5ncyB3aW5kb3cgYmFjayBpbnRvIHZpZXcgd2hlbiBpdCBoYXMgZXNjYXBlZCB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICByZWNvdmVyID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LmFjdGl2ZSA9IHRydWU7XG4gICAgd2luZG93Lm91dE9mQm91bmRzID0gZmFsc2U7XG4gICAgd2luZG93Lm1pbmltaXplZCA9IGZhbHNlO1xuICAgIHdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICB0aGlzLmNhc2NhZGVXaW5kb3cod2luZG93KTtcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVzdG9yZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgcmVzdG9yZSA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIGlmICh3ZHcubWF4aW1pemVkID09PSAnZmlsbCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemUod2R3KTtcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdsZWZ0Jykge1xuICAgICAgdGhpcy5tYXhpbWl6ZUxlZnQod2R3KTtcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemVSaWdodCh3ZHcpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVdpbmRvd1N0YXRlKHdkdyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuYnJpbmdUb0Zyb250XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICB1cGRhdGVXaW5kb3dTdGF0ZSA9ICh3ZHc6IGFueSkgPT4ge1xyXG4gICAgaWYgKHdkdy5vdXRPZkJvdW5kcykge1xyXG4gICAgICB0aGlzLnJlY292ZXIod2R3KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3ZHcubWF4aW1pemVkID09PSAnZmlsbCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZSh3ZHcpO1xyXG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAnbGVmdCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZUxlZnQod2R3KTtcclxuICAgIH0gZWxzZSBpZiAod2R3Lm1heGltaXplZCA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICB0aGlzLm1heGltaXplUmlnaHQod2R3KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcclxuICAgIHdkdy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgd2R3Lm1pbmltaXplZCA9IGZhbHNlO1xyXG4gICAgd2R3LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xyXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVzdG9yZVNhdmVkUG9zaXRpb25cbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSB3aW5kb3dzIGxhc3Qga25vdyBwb3NpdGlvbiB0byB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICpcbiAgICovXG4gIHJlc3RvcmVTYXZlZFBvc2l0aW9uID0gKHdkdzogYW55KSA9PiB7XG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHdkdy50b3AgPSB3ZHcuc2F2ZWRQb3NpdGlvbi50b3A7XG4gICAgd2R3LmxlZnQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5sZWZ0O1xuICAgIHdkdy5yaWdodCA9IHdkdy5zYXZlZFBvc2l0aW9uLnJpZ2h0O1xuICAgIHdkdy5ib3R0b20gPSB3ZHcuc2F2ZWRQb3NpdGlvbi5ib3R0b207XG4gICAgd2R3LmhlaWdodCA9IHdkdy5zYXZlZFBvc2l0aW9uLmhlaWdodDtcbiAgICB3ZHcud2lkdGggPSB3ZHcuc2F2ZWRQb3NpdGlvbi53aWR0aDtcbiAgICB3ZHcubWF4aW1pemVkID0gdW5kZWZpbmVkO1xuICAgIHdkdy5taW5pbWl6ZWQgPSB1bmRlZmluZWQ7XG4gICAgd2R3LmFjdGl2ZSA9IHRydWU7XG4gICAgd2R3Lm1pbmltaXplZCA9IGZhbHNlO1xuICAgIHdkdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5zYXZlUG9zaXRpb25cbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2F2ZSB0aGUgd2luZG93cyBsYXN0IGtub3cgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICBzYXZlUG9zaXRpb24gPSAod2R3OiBhbnkpID0+IHtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi50b3AgPSB3ZHcudG9wO1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLmxlZnQgPSB3ZHcubGVmdDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5yaWdodCA9IHdkdy5yaWdodDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5ib3R0b20gPSB3ZHcuYm90dG9tO1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLmhlaWdodCA9IHdkdy5oZWlnaHQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24ud2lkdGggPSB3ZHcud2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xvc2VXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTW92ZXMgYSB3aW5kb3cgdG8gdGhlIG5leHQgY2FzY2FkZSBwb3NpdGlvbi5cbiAgICpcbiAgICovXG4gIGNhc2NhZGVXaW5kb3cgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVXaW5kb3dDYXNjYWRpbmcgfHwgd2luZG93LmlzTW9kYWwpIHJldHVybjtcbiAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wICs9IDEwO1xuICAgIHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ICs9IDEwO1xuICAgIGlmICh0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wID4gdGhpcy5tYXhXaW5kb3dDYXNjYWRlUG9zaXRpb24pXG4gICAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wID0gdGhpcy5taW5XaW5kb3dDYXNjYWRlUG9zaXRpb247XG4gICAgaWYgKHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ID4gdGhpcy5tYXhXaW5kb3dDYXNjYWRlUG9zaXRpb24pXG4gICAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCA9IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uO1xuXG4gICAgd2luZG93LnRvcCA9IHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi50b3AgKyAncHgnO1xuICAgIHdpbmRvdy5sZWZ0ID0gdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLmxlZnQgKyAncHgnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldEtleUNvZGVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICovXG4gIGdldEtleVNlcXVlbmNlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChldmVudC5zaGlmdEtleSkga2V5cy5wdXNoKCdzaGlmdCcpO1xuICAgIGlmIChldmVudC5jdHJsS2V5KSBrZXlzLnB1c2goJ2N0cmwnKTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KSBrZXlzLnB1c2goJ2FsdCcpO1xuICAgIGlmIChldmVudC5tZXRhS2V5KSBrZXlzLnB1c2goJ21ldGEnKTtcblxuICAgIHZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICBpZiAoa2V5Q29kZSkga2V5cy5wdXNoKHRoaXMua2V5Ym9hcmRNYXBba2V5Q29kZV0udG9Mb3dlckNhc2UoKSk7XG5cbiAgICByZXR1cm4ga2V5cy5qb2luKCcrJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGV2ZW50XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICBvbktleURvd24gPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBrZXlTZXF1ZW5jZSA9IHRoaXMuZ2V0S2V5U2VxdWVuY2UoZXZlbnQpO1xuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCttJykgeyAvL01heGltaXplXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmIChhY3RpdmVXaW5kb3cgPT09IG51bGwpIHJldHVybjtcbiAgICAgIGlmICghYWN0aXZlV2luZG93Lm1heGltaXplZCkge1xuICAgICAgICB0aGlzLnNhdmVQb3NpdGlvbihhY3RpdmVXaW5kb3cpO1xuICAgICAgICB0aGlzLm1heGltaXplKGFjdGl2ZVdpbmRvdyk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcgfHwgYWN0aXZlV2luZG93Lm1heGltaXplZCA9PT0gJ2xlZnQnKVxuICAgICAgICB0aGlzLm1heGltaXplKGFjdGl2ZVdpbmRvdyk7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucmVzdG9yZVNhdmVkUG9zaXRpb24oYWN0aXZlV2luZG93KTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCtuJykgeyAvL01pbmltaXplXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmIChhY3RpdmVXaW5kb3cgPT09IG51bGwgfHwgYWN0aXZlV2luZG93Lm1pbmltaXplZCkgcmV0dXJuO1xuICAgICAgdGhpcy5taW5pbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKGtleVNlcXVlbmNlID09PSAnYWx0K3cnKSB7IC8vQ3ljbGVzIEZvcndhcmRcbiAgICAgIHZhciBpbmRleCA9IHRoaXMud2luZG93cy5pbmRleE9mKHRoaXMuZ2V0QWN0aXZlV2luZG93KCkpO1xuICAgICAgdGhpcy5hY3RpdmF0ZU5leHRXaW5kb3coaW5kZXggKyAxKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ3NoaWZ0K2FsdCt3JykgeyAvL0N5Y2xlcyBCYWNrd2FyZFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy53aW5kb3dzLmluZGV4T2YodGhpcy5nZXRBY3RpdmVXaW5kb3coKSk7XG4gICAgICB0aGlzLmFjdGl2YXRlUHJldmlvdXNXaW5kb3coaW5kZXggKyAxKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ3NoaWZ0K2FsdCt4JyAmJiAhKHRoaXMuc2hpZnRQcmVzc2VkICYmIHRoaXMuYWx0UHJlc3NlZCAmJiB0aGlzLnhQcmVzc2VkKSkgeyAvL0Nsb3NlXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmICghYWN0aXZlV2luZG93KSByZXR1cm47XG4gICAgICB0aGlzLmNsb3NlV2luZG93KGFjdGl2ZVdpbmRvdyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrZCcpIHsgLy9Ub2dnbGUgRGVza3RvcFxuICAgICAgLy90aGlzLmRlc2t0b3BTaG93biA9IHRoaXMuaGlkZVNob3dBbGwoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgdGhpcy5zaGlmdFByZXNzZWQgPSB0cnVlO1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICB0aGlzLmFsdFByZXNzZWQgPSB0cnVlO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSA4OClcbiAgICAgIHRoaXMueFByZXNzZWQgPSB0cnVlO1xuICB9XG5cbiAgb25LZXlVcCA9IChldmVudDogYW55KSA9PiB7XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgdGhpcy5zaGlmdFByZXNzZWQgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgdGhpcy5hbHRQcmVzc2VkID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDg4KVxuICAgICAgdGhpcy54UHJlc3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuaGFuZGxlU2VsZWN0QXR0ZW1wdFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQcmV2ZW50cyB0aGUgdXNlciBmcm9tIGhpZ2hsaWdodCBkZXNrdG9wIGVsZW1lbnRzLlxuICAgKlxuICAgKi9cbiAgaGFuZGxlU2VsZWN0QXR0ZW1wdCA9IChlOiBhbnkpID0+IHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlLnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBub2RlTmFtZSA9PT0gJ3NlbGVjdCcpIHJldHVybiB0cnVlO1xuICAgIGlmICh3aW5kb3cuZXZlbnQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3aW5kb3dzOiBBcnJheTxhbnk+ID0gW107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ29VcmwgPSB0aGlzLm9wdGlvbnMubG9nb1VybDtcclxuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odGhpcy5kZXNrdG9wLm9wdGlvbnMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMudmlld3BvcnRUb3AgPSB0aGlzLm9wdGlvbnMubWVudWJhckNvbmZpZyAhPT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLm1lbnViYXJIZWlnaHQgKyAxIDogMDtcclxuICAgIHRoaXMudHJ1V2luZG93RXZlbnRIYW5kbGVyLm9uT3BlbigpLnN1YnNjcmliZSgod2luZGlvd0V2ZW50OiBUcnVXaW5kb3dFdmVudEFyZ3MpID0+IHtcclxuICAgICAgdGhpcy5vcGVuV2luZG93KHdpbmRpb3dFdmVudCwgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgICBkb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gdGhpcy5oYW5kbGVTZWxlY3RBdHRlbXB0O1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXApO1xyXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IHRoaXMudmlld3BvcnRDb21wb25lbnQud2luZG93Q29tcG9uZW50cy5maWx0ZXIoKHc6IFRydURlc2t0b3BXaW5kb3cpID0+IHsgcmV0dXJuIHcuaGFzQ2hhbmdlcygpID8gdHJ1ZSA6IGZhbHNlOyB9KVxyXG4gICAgICBpZiAoaGFzQ2hhbmdlcy5sZW5ndGgpIHtcclxuICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgICAgdmFyIG1zZyA9IHRoaXMudGV4dE1hbmFnZXIubXNnQ29uZmlybUV4aXRXaXRoQ2hhbmdlc1BlbmRpbmc7XHJcblxyXG4gICAgICAgIC8vIEZvciBJRSBhbmQgRmlyZWZveFxyXG4gICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICBlLnJldHVyblZhbHVlID0gbXNnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRm9yIFNhZmFyaSAvIGNocm9tZVxyXG4gICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRlc2t0b3Atd3JhcHBlclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZGVza3RvcC1tZW51YmFyLWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0Jzogb3B0aW9ucy5tZW51YmFySGVpZ2h0ICsgJ3B4J31cIj5cclxuICAgIDx0cnUtZGVza3RvcC1tZW51YmFyIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC1tZW51YmFyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8dHJ1LWRlc2t0b3Atdmlld3BvcnQgW3dpbmRvd3NdPVwid2luZG93c1wiIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC12aWV3cG9ydD5cclxuXHJcbiAgPHRydS1kZXNrdG9wLXRhc2tiYXIgW3dpbmRvd3NdPVwid2luZG93c1wiIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC10YXNrYmFyPlxyXG5cclxuICA8aW1nIGNsYXNzPVwiZGVza3RvcC12aWV3cG9ydC1sb2dvXCIgZGF0YS1uZy1zaG93PVwibG9nb1VybFwiIGFsdD1cIlwiPlxyXG48L2Rpdj5cclxuIl19
|