@colijnit/corecomponents_v12 12.2.26 → 12.2.27
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/bundles/colijnit-corecomponents_v12.umd.js +13684 -13680
- package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
- package/colijnit-corecomponents_v12.d.ts +43 -43
- package/colijnit-corecomponents_v12.metadata.json +1 -1
- package/esm2015/colijnit-corecomponents_v12.js +43 -43
- package/esm2015/lib/components/article-tile/article-tile.component.js +49 -49
- package/esm2015/lib/components/article-tile/article-tile.module.js +34 -34
- package/esm2015/lib/components/base/base-input.component.js +833 -833
- package/esm2015/lib/components/base/base.module.js +21 -21
- package/esm2015/lib/components/base/commit-buttons/commit-buttons.component.js +85 -85
- package/esm2015/lib/components/base/commit-buttons/commit-buttons.module.js +20 -20
- package/esm2015/lib/components/base/dialog-base.component.js +5 -5
- package/esm2015/lib/components/base-input-date-picker/base-input-date-picker.directive.js +24 -24
- package/esm2015/lib/components/button/button.component.js +73 -73
- package/esm2015/lib/components/button/button.module.js +18 -18
- package/esm2015/lib/components/calendar/calendar-template.component.js +281 -281
- package/esm2015/lib/components/calendar/calendar.component.js +32 -32
- package/esm2015/lib/components/calendar/calendar.module.js +27 -27
- package/esm2015/lib/components/card/card.component.js +50 -50
- package/esm2015/lib/components/card/card.module.js +34 -34
- package/esm2015/lib/components/carousel/carousel.component.js +109 -109
- package/esm2015/lib/components/carousel/carousel.module.js +31 -31
- package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +293 -293
- package/esm2015/lib/components/carousel-3d/carousel-3d.module.js +18 -18
- package/esm2015/lib/components/carousel-3d/carouselItem.js +53 -53
- package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.component.js +72 -72
- package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.module.js +18 -18
- package/esm2015/lib/components/co-dialog/co-dialog.component.js +91 -91
- package/esm2015/lib/components/co-dialog/co-dialog.module.js +18 -18
- package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +35 -35
- package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.module.js +16 -16
- package/esm2015/lib/components/collapsible/collapsible.component.js +67 -67
- package/esm2015/lib/components/collapsible/collapsible.module.js +18 -18
- package/esm2015/lib/components/color-picker/color-picker.component.js +33 -33
- package/esm2015/lib/components/color-picker/color-picker.module.js +20 -20
- package/esm2015/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.js +46 -46
- package/esm2015/lib/components/core-dialog/core-dialog.module.js +38 -38
- package/esm2015/lib/components/core-dialog/core-dialog.service.js +66 -66
- package/esm2015/lib/components/core-dialog/core-dynamic-component.service.js +92 -92
- package/esm2015/lib/components/double-calendar/double-calendar.component.js +62 -62
- package/esm2015/lib/components/double-calendar/double-calendar.module.js +24 -24
- package/esm2015/lib/components/filter-item/filter-item-viewmodel.js +12 -12
- package/esm2015/lib/components/filter-item/filter-item.component.js +496 -496
- package/esm2015/lib/components/filter-item/filter-item.module.js +42 -42
- package/esm2015/lib/components/filter-item/filter-viewmodel.js +10 -10
- package/esm2015/lib/components/form/form.component.js +181 -181
- package/esm2015/lib/components/form/form.module.js +22 -22
- package/esm2015/lib/components/grid-toolbar/grid-toolbar.component.js +48 -48
- package/esm2015/lib/components/grid-toolbar/grid-toolbar.module.js +22 -22
- package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.component.js +23 -23
- package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.module.js +18 -18
- package/esm2015/lib/components/icon/icon-cache.service.js +51 -51
- package/esm2015/lib/components/icon/icon.component.js +47 -47
- package/esm2015/lib/components/icon/icon.module.js +24 -24
- package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.component.js +56 -56
- package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.module.js +22 -22
- package/esm2015/lib/components/image/image.component.js +31 -31
- package/esm2015/lib/components/image/image.module.js +13 -13
- package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +71 -71
- package/esm2015/lib/components/input-checkbox/input-checkbox.module.js +18 -18
- package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +74 -74
- package/esm2015/lib/components/input-date-picker/input-date-picker.module.js +25 -25
- package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.component.js +107 -107
- package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.module.js +26 -26
- package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +285 -285
- package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +22 -22
- package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +77 -77
- package/esm2015/lib/components/input-radio-button/input-radio-button.module.js +18 -18
- package/esm2015/lib/components/input-scanner/bar-code-scanner.js +22 -22
- package/esm2015/lib/components/input-scanner/input-scanner.component.js +56 -56
- package/esm2015/lib/components/input-scanner/input-scanner.module.js +20 -20
- package/esm2015/lib/components/input-scanner/scanner.service.js +27 -27
- package/esm2015/lib/components/input-search/input-search.component.js +67 -63
- package/esm2015/lib/components/input-search/input-search.module.js +20 -20
- package/esm2015/lib/components/input-text/input-text.component.js +192 -192
- package/esm2015/lib/components/input-text/input-text.module.js +32 -32
- package/esm2015/lib/components/input-textarea/input-textarea.component.js +55 -55
- package/esm2015/lib/components/input-textarea/input-textarea.module.js +26 -26
- package/esm2015/lib/components/level-indicator/level-indicator-level.enum.js +6 -6
- package/esm2015/lib/components/level-indicator/level-indicator.component.js +29 -29
- package/esm2015/lib/components/level-indicator/level-indicator.module.js +14 -14
- package/esm2015/lib/components/list-of-values/list-of-values-multiselect-popup.component.js +87 -87
- package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +218 -218
- package/esm2015/lib/components/list-of-values/list-of-values.component.js +199 -199
- package/esm2015/lib/components/list-of-values/list-of-values.module.js +37 -37
- package/esm2015/lib/components/loader/loader.component.js +16 -16
- package/esm2015/lib/components/loader/loader.module.js +18 -18
- package/esm2015/lib/components/pagination/paginate.pipe.js +98 -98
- package/esm2015/lib/components/pagination/pagination-instance.js +1 -1
- package/esm2015/lib/components/pagination/pagination.component.js +107 -107
- package/esm2015/lib/components/pagination/pagination.module.js +27 -27
- package/esm2015/lib/components/pagination/pagination.service.js +87 -87
- package/esm2015/lib/components/pagination-bar/pagination-bar.component.js +136 -136
- package/esm2015/lib/components/pagination-bar/pagination-bar.module.js +18 -18
- package/esm2015/lib/components/popup/const/popup-window-token.js +2 -2
- package/esm2015/lib/components/popup/interface/popup-button.js +7 -7
- package/esm2015/lib/components/popup/interface/popup-close-event.js +1 -1
- package/esm2015/lib/components/popup/interface/popup-settings.js +41 -41
- package/esm2015/lib/components/popup/interface/popup.js +1 -1
- package/esm2015/lib/components/popup/model/popup-button-globals.js +10 -10
- package/esm2015/lib/components/popup/model/popup-window.js +37 -37
- package/esm2015/lib/components/popup/popup-buttons.component.js +42 -42
- package/esm2015/lib/components/popup/popup-message-display.component.js +37 -37
- package/esm2015/lib/components/popup/popup-window-shell.component.js +141 -141
- package/esm2015/lib/components/popup/popup.module.js +48 -48
- package/esm2015/lib/components/popup/service/popup-shower.service.js +89 -89
- package/esm2015/lib/components/popup/service/prompt.service.js +126 -126
- package/esm2015/lib/components/popup/text-input-popup.component.js +33 -33
- package/esm2015/lib/components/responsive-text/responsive-text.component.js +17 -17
- package/esm2015/lib/components/responsive-text/responsive-text.module.js +18 -18
- package/esm2015/lib/components/simple-grid/base-simple-grid.component.js +163 -163
- package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +141 -141
- package/esm2015/lib/components/simple-grid/simple-grid-column.directive.js +110 -110
- package/esm2015/lib/components/simple-grid/simple-grid.component.js +378 -378
- package/esm2015/lib/components/simple-grid/simple-grid.module.js +40 -40
- package/esm2015/lib/components/tile/tile.component.js +44 -44
- package/esm2015/lib/components/tile/tile.module.js +22 -22
- package/esm2015/lib/components/tile-select/tile-select.component.js +26 -26
- package/esm2015/lib/components/tile-select/tile-select.module.js +20 -20
- package/esm2015/lib/components/tooltip/tooltip.component.js +74 -74
- package/esm2015/lib/components/tooltip/tooltip.module.js +18 -18
- package/esm2015/lib/components/validation-error/validation-error.component.js +30 -30
- package/esm2015/lib/components/validation-error/validation-error.module.js +24 -24
- package/esm2015/lib/components/view-mode-buttons/content-view-mode.enum.js +10 -10
- package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.component.js +41 -41
- package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.module.js +20 -20
- package/esm2015/lib/core/constant/default-upper-bound-for-range-components.js +3 -3
- package/esm2015/lib/core/constant/java-max-int.js +1 -1
- package/esm2015/lib/core/constant/number-inputs-key-down-white-list.js +44 -44
- package/esm2015/lib/core/decorator/input-boolean.decorator.js +33 -33
- package/esm2015/lib/core/enum/co-direction.js +8 -8
- package/esm2015/lib/core/enum/co-document-image-display-kind.enum.js +6 -6
- package/esm2015/lib/core/enum/co-document-type.enum.js +10 -10
- package/esm2015/lib/core/enum/co-orientation.js +16 -16
- package/esm2015/lib/core/enum/core-components-icon.enum.js +299 -299
- package/esm2015/lib/core/enum/file-type-internal.enum.js +16 -16
- package/esm2015/lib/core/enum/file-type.enum.js +10 -10
- package/esm2015/lib/core/enum/filterItem-mode.enum.js +42 -42
- package/esm2015/lib/core/enum/input-number-picker-show-mode.enum.js +7 -7
- package/esm2015/lib/core/enum/keyboard-code.enum.js +73 -73
- package/esm2015/lib/core/enum/keyboard-key.enum.js +75 -75
- package/esm2015/lib/core/enum/object-right-type.enum.js +6 -6
- package/esm2015/lib/core/enum/popup-button-type.enum.js +11 -11
- package/esm2015/lib/core/enum/popup-type.enum.js +10 -10
- package/esm2015/lib/core/enum/table-name.enum.js +80 -80
- package/esm2015/lib/core/function/any-nill.function.js +5 -5
- package/esm2015/lib/core/function/is-nill.function.js +4 -4
- package/esm2015/lib/core/function/none-nill.function.js +16 -16
- package/esm2015/lib/core/function/not-nill.function.js +4 -4
- package/esm2015/lib/core/model/bounds-constrained-number-value.js +170 -170
- package/esm2015/lib/core/model/check-precision-and-scale-result.js +1 -1
- package/esm2015/lib/core/model/check-within-stepped-bounds-result.js +1 -1
- package/esm2015/lib/core/model/co-document-right.bo.js +2 -2
- package/esm2015/lib/core/model/co-document.bo.js +120 -120
- package/esm2015/lib/core/model/core-components-icon-svg.js +298 -298
- package/esm2015/lib/core/model/element-position.js +9 -9
- package/esm2015/lib/core/model/event/string-prompt-result-event.js +7 -7
- package/esm2015/lib/core/service/form-input-user-change-listener.service.js +24 -24
- package/esm2015/lib/core/service/form-master.service.js +101 -101
- package/esm2015/lib/core/service/ng-zone-wrapper.service.js +19 -19
- package/esm2015/lib/core/utils/array-utils.js +263 -263
- package/esm2015/lib/core/utils/browser-utils.js +99 -99
- package/esm2015/lib/core/utils/direction-enum-utils.js +13 -13
- package/esm2015/lib/core/utils/event-utils.js +52 -52
- package/esm2015/lib/core/utils/file-utils.js +266 -266
- package/esm2015/lib/core/utils/number-utils.js +308 -308
- package/esm2015/lib/core/utils/object-utils.js +185 -185
- package/esm2015/lib/core/utils/string-utils.js +93 -93
- package/esm2015/lib/core/validator/email.validator.js +5 -5
- package/esm2015/lib/core/validator/equal.validator.js +10 -10
- package/esm2015/lib/core/validator/max-string-length.validator.js +9 -9
- package/esm2015/lib/core/validator/password.validator.js +30 -30
- package/esm2015/lib/core/validator/precision-scale.validator.js +10 -10
- package/esm2015/lib/core/validator/required.validator.js +4 -4
- package/esm2015/lib/directives/clickoutside/click-outside-master.service.js +56 -56
- package/esm2015/lib/directives/clickoutside/click-outside.directive.js +70 -70
- package/esm2015/lib/directives/clickoutside/clickoutside.module.js +18 -18
- package/esm2015/lib/directives/observe-visibility/observe-visibility.directive.js +52 -52
- package/esm2015/lib/directives/observe-visibility/observe-visibility.module.js +14 -14
- package/esm2015/lib/directives/overlay/overlay-parent.directive.js +18 -18
- package/esm2015/lib/directives/overlay/overlay.directive.js +160 -160
- package/esm2015/lib/directives/overlay/overlay.module.js +17 -17
- package/esm2015/lib/directives/ripple/ripple-ref.js +25 -25
- package/esm2015/lib/directives/ripple/ripple-renderer.js +159 -159
- package/esm2015/lib/directives/ripple/ripple.directive.js +79 -79
- package/esm2015/lib/directives/ripple/ripple.module.js +23 -23
- package/esm2015/lib/directives/ripple/scroll-dispatcher.service.js +107 -107
- package/esm2015/lib/directives/ripple/scrollable.directive.js +39 -39
- package/esm2015/lib/directives/ripple/viewport-ruler.service.js +72 -72
- package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +157 -157
- package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +18 -18
- package/esm2015/lib/directives/stopclick/stop-click.directive.js +37 -37
- package/esm2015/lib/directives/stopclick/stop-click.module.js +14 -14
- package/esm2015/lib/directives/template-wrapper/template-wrapper.directive.js +67 -67
- package/esm2015/lib/directives/template-wrapper/template-wrapper.module.js +14 -14
- package/esm2015/lib/directives/tooltip/tooltip-directive.module.js +18 -18
- package/esm2015/lib/directives/tooltip/tooltip.directive.js +77 -77
- package/esm2015/lib/interfaces/dialog-response.interface.js +1 -1
- package/esm2015/lib/interfaces/scanner-input.interface.js +1 -1
- package/esm2015/lib/interfaces/screen-config-adapter-component-interface-name.js +3 -3
- package/esm2015/lib/interfaces/screen-config-adapter.component.interface.js +1 -1
- package/esm2015/lib/model/enum/app-button-type.enum.js +10 -10
- package/esm2015/lib/model/enum/app-popup-type.enum.js +7 -7
- package/esm2015/lib/pipes/append.pipe.js +16 -16
- package/esm2015/lib/pipes/append.pipe.module.js +14 -14
- package/esm2015/lib/pipes/filter.pipe.js +15 -15
- package/esm2015/lib/pipes/filter.pipe.module.js +14 -14
- package/esm2015/lib/pipes/prepend.pipe.js +16 -16
- package/esm2015/lib/pipes/prepend.pipe.module.js +14 -14
- package/esm2015/lib/pipes/price-display-pipe.module.js +14 -14
- package/esm2015/lib/pipes/price-display.pipe.js +19 -19
- package/esm2015/lib/service/base-module-screen-config.service.js +204 -204
- package/esm2015/lib/service/base-module.service.js +41 -41
- package/esm2015/lib/service/color-sequence.service.js +22 -22
- package/esm2015/lib/service/overlay.service.js +72 -72
- package/esm2015/lib/translation/core-components-translation.module.js +28 -28
- package/esm2015/lib/translation/core-components-translation.service.js +16 -16
- package/esm2015/lib/translation/core-dictionary.service.js +28 -28
- package/esm2015/lib/translation/core-localize.pipe.js +25 -25
- package/esm2015/public-api.js +129 -129
- package/fesm2015/colijnit-corecomponents_v12.js +12090 -12086
- package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
- package/lib/components/article-tile/article-tile.component.d.ts +22 -22
- package/lib/components/article-tile/article-tile.module.d.ts +2 -2
- package/lib/components/base/base-input.component.d.ts +182 -182
- package/lib/components/base/base.module.d.ts +2 -2
- package/lib/components/base/commit-buttons/commit-buttons.component.d.ts +21 -21
- package/lib/components/base/commit-buttons/commit-buttons.module.d.ts +2 -2
- package/lib/components/base/dialog-base.component.d.ts +4 -4
- package/lib/components/base-input-date-picker/base-input-date-picker.directive.d.ts +15 -15
- package/lib/components/button/button.component.d.ts +29 -29
- package/lib/components/button/button.module.d.ts +2 -2
- package/lib/components/calendar/calendar-template.component.d.ts +60 -60
- package/lib/components/calendar/calendar.component.d.ts +13 -13
- package/lib/components/calendar/calendar.module.d.ts +2 -2
- package/lib/components/card/card.component.d.ts +23 -23
- package/lib/components/card/card.module.d.ts +2 -2
- package/lib/components/carousel/carousel.component.d.ts +23 -23
- package/lib/components/carousel/carousel.module.d.ts +6 -6
- package/lib/components/carousel-3d/carousel-3d.component.d.ts +55 -55
- package/lib/components/carousel-3d/carousel-3d.module.d.ts +2 -2
- package/lib/components/carousel-3d/carouselItem.d.ts +13 -13
- package/lib/components/checkmark-overlay/checkmark-overlay.component.d.ts +17 -17
- package/lib/components/checkmark-overlay/checkmark-overlay.module.d.ts +2 -2
- package/lib/components/co-dialog/co-dialog.component.d.ts +23 -23
- package/lib/components/co-dialog/co-dialog.module.d.ts +2 -2
- package/lib/components/co-dialog-wizard/co-dialog-wizard.component.d.ts +9 -9
- package/lib/components/co-dialog-wizard/co-dialog-wizard.module.d.ts +2 -2
- package/lib/components/collapsible/collapsible.component.d.ts +22 -22
- package/lib/components/collapsible/collapsible.module.d.ts +2 -2
- package/lib/components/color-picker/color-picker.component.d.ts +6 -6
- package/lib/components/color-picker/color-picker.module.d.ts +2 -2
- package/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +20 -20
- package/lib/components/core-dialog/core-dialog.module.d.ts +4 -4
- package/lib/components/core-dialog/core-dialog.service.d.ts +15 -15
- package/lib/components/core-dialog/core-dynamic-component.service.d.ts +12 -12
- package/lib/components/double-calendar/double-calendar.component.d.ts +18 -18
- package/lib/components/double-calendar/double-calendar.module.d.ts +2 -2
- package/lib/components/filter-item/filter-item-viewmodel.d.ts +9 -9
- package/lib/components/filter-item/filter-item.component.d.ts +80 -80
- package/lib/components/filter-item/filter-item.module.d.ts +2 -2
- package/lib/components/filter-item/filter-viewmodel.d.ts +8 -8
- package/lib/components/form/form.component.d.ts +39 -39
- package/lib/components/form/form.module.d.ts +2 -2
- package/lib/components/grid-toolbar/grid-toolbar.component.d.ts +19 -19
- package/lib/components/grid-toolbar/grid-toolbar.module.d.ts +2 -2
- package/lib/components/grid-toolbar-button/grid-toolbar-button.component.d.ts +8 -8
- package/lib/components/grid-toolbar-button/grid-toolbar-button.module.d.ts +2 -2
- package/lib/components/icon/icon-cache.service.d.ts +20 -20
- package/lib/components/icon/icon.component.d.ts +17 -17
- package/lib/components/icon/icon.module.d.ts +2 -2
- package/lib/components/icon-collapse-handle/icon-collapse-handle.component.d.ts +21 -21
- package/lib/components/icon-collapse-handle/icon-collapse-handle.module.d.ts +2 -2
- package/lib/components/image/image.component.d.ts +20 -20
- package/lib/components/image/image.module.d.ts +2 -2
- package/lib/components/input-checkbox/input-checkbox.component.d.ts +24 -24
- package/lib/components/input-checkbox/input-checkbox.module.d.ts +2 -2
- package/lib/components/input-date-picker/input-date-picker.component.d.ts +12 -12
- package/lib/components/input-date-picker/input-date-picker.module.d.ts +2 -2
- package/lib/components/input-date-range-picker/input-date-range-picker.component.d.ts +20 -20
- package/lib/components/input-date-range-picker/input-date-range-picker.module.d.ts +2 -2
- package/lib/components/input-number-picker/input-number-picker.component.d.ts +73 -73
- package/lib/components/input-number-picker/input-number-picker.module.d.ts +2 -2
- package/lib/components/input-radio-button/input-radio-button.component.d.ts +19 -19
- package/lib/components/input-radio-button/input-radio-button.module.d.ts +2 -2
- package/lib/components/input-scanner/bar-code-scanner.d.ts +7 -7
- package/lib/components/input-scanner/input-scanner.component.d.ts +24 -24
- package/lib/components/input-scanner/input-scanner.module.d.ts +2 -2
- package/lib/components/input-scanner/scanner.service.d.ts +11 -11
- package/lib/components/input-search/input-search.component.d.ts +20 -19
- package/lib/components/input-search/input-search.module.d.ts +2 -2
- package/lib/components/input-text/input-text.component.d.ts +65 -65
- package/lib/components/input-text/input-text.module.d.ts +2 -2
- package/lib/components/input-textarea/input-textarea.component.d.ts +19 -19
- package/lib/components/input-textarea/input-textarea.module.d.ts +2 -2
- package/lib/components/level-indicator/level-indicator-level.enum.d.ts +5 -5
- package/lib/components/level-indicator/level-indicator.component.d.ts +10 -10
- package/lib/components/level-indicator/level-indicator.module.d.ts +2 -2
- package/lib/components/list-of-values/list-of-values-multiselect-popup.component.d.ts +25 -25
- package/lib/components/list-of-values/list-of-values-popup.component.d.ts +47 -47
- package/lib/components/list-of-values/list-of-values.component.d.ts +37 -37
- package/lib/components/list-of-values/list-of-values.module.d.ts +2 -2
- package/lib/components/loader/loader.component.d.ts +3 -3
- package/lib/components/loader/loader.module.d.ts +2 -2
- package/lib/components/pagination/paginate.pipe.d.ts +15 -15
- package/lib/components/pagination/pagination-instance.d.ts +14 -14
- package/lib/components/pagination/pagination.component.d.ts +38 -38
- package/lib/components/pagination/pagination.module.d.ts +2 -2
- package/lib/components/pagination/pagination.service.d.ts +24 -24
- package/lib/components/pagination-bar/pagination-bar.component.d.ts +33 -33
- package/lib/components/pagination-bar/pagination-bar.module.d.ts +2 -2
- package/lib/components/popup/const/popup-window-token.d.ts +3 -3
- package/lib/components/popup/interface/popup-button.d.ts +8 -8
- package/lib/components/popup/interface/popup-close-event.d.ts +5 -5
- package/lib/components/popup/interface/popup-settings.d.ts +21 -21
- package/lib/components/popup/interface/popup.d.ts +9 -9
- package/lib/components/popup/model/popup-button-globals.d.ts +9 -9
- package/lib/components/popup/model/popup-window.d.ts +21 -21
- package/lib/components/popup/popup-buttons.component.d.ts +13 -13
- package/lib/components/popup/popup-message-display.component.d.ts +12 -12
- package/lib/components/popup/popup-window-shell.component.d.ts +42 -42
- package/lib/components/popup/popup.module.d.ts +4 -4
- package/lib/components/popup/service/popup-shower.service.d.ts +17 -17
- package/lib/components/popup/service/prompt.service.d.ts +17 -17
- package/lib/components/popup/text-input-popup.component.d.ts +12 -12
- package/lib/components/responsive-text/responsive-text.component.d.ts +4 -4
- package/lib/components/responsive-text/responsive-text.module.d.ts +2 -2
- package/lib/components/simple-grid/base-simple-grid.component.d.ts +52 -52
- package/lib/components/simple-grid/simple-grid-cell.component.d.ts +30 -30
- package/lib/components/simple-grid/simple-grid-column.directive.d.ts +42 -42
- package/lib/components/simple-grid/simple-grid.component.d.ts +64 -64
- package/lib/components/simple-grid/simple-grid.module.d.ts +2 -2
- package/lib/components/tile/tile.component.d.ts +16 -16
- package/lib/components/tile/tile.module.d.ts +2 -2
- package/lib/components/tile-select/tile-select.component.d.ts +8 -8
- package/lib/components/tile-select/tile-select.module.d.ts +2 -2
- package/lib/components/tooltip/tooltip.component.d.ts +18 -18
- package/lib/components/tooltip/tooltip.module.d.ts +2 -2
- package/lib/components/validation-error/validation-error.component.d.ts +12 -12
- package/lib/components/validation-error/validation-error.module.d.ts +2 -2
- package/lib/components/view-mode-buttons/content-view-mode.enum.d.ts +8 -8
- package/lib/components/view-mode-buttons/view-mode-buttons.component.d.ts +17 -17
- package/lib/components/view-mode-buttons/view-mode-buttons.module.d.ts +2 -2
- package/lib/core/constant/default-upper-bound-for-range-components.d.ts +2 -2
- package/lib/core/constant/java-max-int.d.ts +1 -1
- package/lib/core/constant/number-inputs-key-down-white-list.d.ts +2 -2
- package/lib/core/decorator/input-boolean.decorator.d.ts +8 -8
- package/lib/core/enum/co-direction.d.ts +6 -6
- package/lib/core/enum/co-document-image-display-kind.enum.d.ts +5 -5
- package/lib/core/enum/co-document-type.enum.d.ts +5 -5
- package/lib/core/enum/co-orientation.d.ts +6 -6
- package/lib/core/enum/core-components-icon.enum.d.ts +298 -298
- package/lib/core/enum/file-type-internal.enum.d.ts +15 -15
- package/lib/core/enum/file-type.enum.d.ts +5 -5
- package/lib/core/enum/filterItem-mode.enum.d.ts +15 -15
- package/lib/core/enum/input-number-picker-show-mode.enum.d.ts +5 -5
- package/lib/core/enum/keyboard-code.enum.d.ts +71 -71
- package/lib/core/enum/keyboard-key.enum.d.ts +70 -70
- package/lib/core/enum/object-right-type.enum.d.ts +5 -5
- package/lib/core/enum/popup-button-type.enum.d.ts +9 -9
- package/lib/core/enum/popup-type.enum.d.ts +9 -9
- package/lib/core/enum/table-name.enum.d.ts +79 -79
- package/lib/core/function/any-nill.function.d.ts +1 -1
- package/lib/core/function/is-nill.function.d.ts +1 -1
- package/lib/core/function/none-nill.function.d.ts +1 -1
- package/lib/core/function/not-nill.function.d.ts +1 -1
- package/lib/core/model/bounds-constrained-number-value.d.ts +46 -46
- package/lib/core/model/check-precision-and-scale-result.d.ts +4 -4
- package/lib/core/model/check-within-stepped-bounds-result.d.ts +8 -8
- package/lib/core/model/co-document-right.bo.d.ts +6 -6
- package/lib/core/model/co-document.bo.d.ts +61 -61
- package/lib/core/model/core-components-icon-svg.d.ts +4 -4
- package/lib/core/model/element-position.d.ts +7 -7
- package/lib/core/model/event/string-prompt-result-event.d.ts +6 -6
- package/lib/core/service/form-input-user-change-listener.service.d.ts +10 -10
- package/lib/core/service/form-master.service.d.ts +26 -26
- package/lib/core/service/ng-zone-wrapper.service.d.ts +6 -6
- package/lib/core/utils/array-utils.d.ts +85 -85
- package/lib/core/utils/browser-utils.d.ts +15 -15
- package/lib/core/utils/direction-enum-utils.d.ts +5 -5
- package/lib/core/utils/event-utils.d.ts +12 -12
- package/lib/core/utils/file-utils.d.ts +29 -29
- package/lib/core/utils/number-utils.d.ts +89 -89
- package/lib/core/utils/object-utils.d.ts +31 -31
- package/lib/core/utils/string-utils.d.ts +25 -25
- package/lib/core/validator/email.validator.d.ts +2 -2
- package/lib/core/validator/equal.validator.d.ts +2 -2
- package/lib/core/validator/max-string-length.validator.d.ts +2 -2
- package/lib/core/validator/password.validator.d.ts +3 -3
- package/lib/core/validator/precision-scale.validator.d.ts +2 -2
- package/lib/core/validator/required.validator.d.ts +2 -2
- package/lib/directives/clickoutside/click-outside-master.service.d.ts +15 -15
- package/lib/directives/clickoutside/click-outside.directive.d.ts +18 -18
- package/lib/directives/clickoutside/clickoutside.module.d.ts +2 -2
- package/lib/directives/observe-visibility/observe-visibility.directive.d.ts +14 -14
- package/lib/directives/observe-visibility/observe-visibility.module.d.ts +2 -2
- package/lib/directives/overlay/overlay-parent.directive.d.ts +6 -6
- package/lib/directives/overlay/overlay.directive.d.ts +25 -25
- package/lib/directives/overlay/overlay.module.d.ts +2 -2
- package/lib/directives/ripple/ripple-ref.d.ts +21 -21
- package/lib/directives/ripple/ripple-renderer.d.ts +56 -56
- package/lib/directives/ripple/ripple.directive.d.ts +56 -56
- package/lib/directives/ripple/ripple.module.d.ts +2 -2
- package/lib/directives/ripple/scroll-dispatcher.service.d.ts +51 -51
- package/lib/directives/ripple/scrollable.directive.d.ts +20 -20
- package/lib/directives/ripple/viewport-ruler.service.d.ts +29 -29
- package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +32 -32
- package/lib/directives/screen-configuration/screen-configuration.module.d.ts +2 -2
- package/lib/directives/stopclick/stop-click.directive.d.ts +10 -10
- package/lib/directives/stopclick/stop-click.module.d.ts +2 -2
- package/lib/directives/template-wrapper/template-wrapper.directive.d.ts +13 -13
- package/lib/directives/template-wrapper/template-wrapper.module.d.ts +2 -2
- package/lib/directives/tooltip/tooltip-directive.module.d.ts +2 -2
- package/lib/directives/tooltip/tooltip.directive.d.ts +20 -20
- package/lib/interfaces/dialog-response.interface.d.ts +6 -6
- package/lib/interfaces/scanner-input.interface.d.ts +3 -3
- package/lib/interfaces/screen-config-adapter-component-interface-name.d.ts +3 -3
- package/lib/interfaces/screen-config-adapter.component.interface.d.ts +10 -10
- package/lib/model/enum/app-button-type.enum.d.ts +9 -9
- package/lib/model/enum/app-popup-type.enum.d.ts +6 -6
- package/lib/pipes/append.pipe.d.ts +4 -4
- package/lib/pipes/append.pipe.module.d.ts +2 -2
- package/lib/pipes/filter.pipe.d.ts +4 -4
- package/lib/pipes/filter.pipe.module.d.ts +2 -2
- package/lib/pipes/prepend.pipe.d.ts +4 -4
- package/lib/pipes/prepend.pipe.module.d.ts +2 -2
- package/lib/pipes/price-display-pipe.module.d.ts +2 -2
- package/lib/pipes/price-display.pipe.d.ts +4 -4
- package/lib/service/base-module-screen-config.service.d.ts +47 -47
- package/lib/service/base-module.service.d.ts +22 -22
- package/lib/service/color-sequence.service.d.ts +4 -4
- package/lib/service/overlay.service.d.ts +13 -13
- package/lib/translation/core-components-translation.module.d.ts +4 -4
- package/lib/translation/core-components-translation.service.d.ts +6 -6
- package/lib/translation/core-dictionary.service.d.ts +12 -12
- package/lib/translation/core-localize.pipe.d.ts +7 -7
- package/package.json +1 -1
- package/public-api.d.ts +126 -126
|
@@ -1,269 +1,269 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from "@angular/core";
|
|
2
|
-
import { CoreComponentsIcon } from "../../core/enum/core-components-icon.enum";
|
|
3
|
-
export class CalendarTemplateComponent {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.icons = CoreComponentsIcon;
|
|
6
|
-
this.showWeekNumbers = true;
|
|
7
|
-
this.weekNumbers = [];
|
|
8
|
-
this.locale = "nl-NL";
|
|
9
|
-
this.highlightDaysBetweenDates = false;
|
|
10
|
-
this.dateSelected = new EventEmitter();
|
|
11
|
-
this.hoveringDate = new EventEmitter();
|
|
12
|
-
this.showCalendarBody = true;
|
|
13
|
-
this.showMonthSelection = false;
|
|
14
|
-
this.showYearSelection = false;
|
|
15
|
-
this.monthHeader = '';
|
|
16
|
-
this.yearHeader = '';
|
|
17
|
-
this.monthSelection = true;
|
|
18
|
-
this.yearSelection = false;
|
|
19
|
-
this.dayNames = [];
|
|
20
|
-
this.monthNames = [];
|
|
21
|
-
this.monthSelectionNames = [];
|
|
22
|
-
this.yearSelectionYears = [];
|
|
23
|
-
this.daysInMonth = [];
|
|
24
|
-
this.daysUnixTimestamps = [];
|
|
25
|
-
this.daysToHighlight = [];
|
|
26
|
-
}
|
|
27
|
-
set selectedDate(date) {
|
|
28
|
-
this._selectedDate = !!date ? new Date(date.getFullYear(), date.getMonth(), date.getDate()) : date;
|
|
29
|
-
if (this.secondSelectedDate && date && this.secondSelectedDate.getTime() < this.selectedDate.getTime() && this.temporarySelectedSecondaryDate) {
|
|
30
|
-
this.daysToHighlight = [];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
get selectedDate() {
|
|
34
|
-
return this._selectedDate;
|
|
35
|
-
}
|
|
36
|
-
set secondSelectedDate(date) {
|
|
37
|
-
this._secondSelectedDate = !!date ? new Date(date.getFullYear(), date.getMonth(), date.getDate()) : date;
|
|
38
|
-
if (!this.selectedDate) {
|
|
39
|
-
this.daysToHighlight = [];
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
this._fillDatesBetweenSelected();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
get secondSelectedDate() {
|
|
46
|
-
return this._secondSelectedDate;
|
|
47
|
-
}
|
|
48
|
-
set secondHoveringDate(date) {
|
|
49
|
-
this._secondHoveringDate = date;
|
|
50
|
-
if (!!date) {
|
|
51
|
-
this.temporarySelectedSecondaryDate = null;
|
|
52
|
-
}
|
|
53
|
-
if (this.selectedDate && !this.secondSelectedDate) {
|
|
54
|
-
this.temporarySelectedSecondaryDate = new Date(date);
|
|
55
|
-
}
|
|
56
|
-
this.handleMouseOverDay(date);
|
|
57
|
-
}
|
|
58
|
-
get secondHoveringDate() {
|
|
59
|
-
return this._secondHoveringDate;
|
|
60
|
-
}
|
|
61
|
-
showClass() {
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
ngOnInit() {
|
|
65
|
-
this._setInitialValues();
|
|
66
|
-
this.generateMonthNames();
|
|
67
|
-
this.generateCalendar();
|
|
68
|
-
this._fillDatesBetweenSelected();
|
|
69
|
-
}
|
|
70
|
-
prevMonth() {
|
|
71
|
-
if (this.workingMonth === 0) {
|
|
72
|
-
this.workingMonth = 11;
|
|
73
|
-
this.workingYear--;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.workingMonth--;
|
|
77
|
-
}
|
|
78
|
-
this.generateCalendar();
|
|
79
|
-
this._fillDatesBetweenSelected();
|
|
80
|
-
this.calculateWeekNumbers();
|
|
81
|
-
}
|
|
82
|
-
nextMonth() {
|
|
83
|
-
if (this.workingMonth === 11) {
|
|
84
|
-
this.workingMonth = 0;
|
|
85
|
-
this.workingYear++;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
this.workingMonth++;
|
|
89
|
-
}
|
|
90
|
-
this.generateCalendar();
|
|
91
|
-
this._fillDatesBetweenSelected();
|
|
92
|
-
this.calculateWeekNumbers();
|
|
93
|
-
}
|
|
94
|
-
prevYear() {
|
|
95
|
-
this.workingYear--;
|
|
96
|
-
this.generateCalendar();
|
|
97
|
-
}
|
|
98
|
-
nextYear() {
|
|
99
|
-
this.workingYear++;
|
|
100
|
-
this.generateCalendar();
|
|
101
|
-
}
|
|
102
|
-
generateCalendar() {
|
|
103
|
-
this._setMonthDaysForDate(this.workingMonth);
|
|
104
|
-
// Update the displayed month
|
|
105
|
-
const month = this.monthNames[this.workingMonth];
|
|
106
|
-
const year = this.workingYear;
|
|
107
|
-
// Update headerText
|
|
108
|
-
this.monthHeader = `${month} ${year}`;
|
|
109
|
-
this.yearHeader = `${year}`;
|
|
110
|
-
this.generateYearSelectionYears();
|
|
111
|
-
this.calculateWeekNumbers();
|
|
112
|
-
}
|
|
113
|
-
_setInitialValues() {
|
|
114
|
-
this.workingDay = this.selectedDate ? this.selectedDate : new Date();
|
|
115
|
-
this.workingYear = this.workingDay.getFullYear();
|
|
116
|
-
this.workingMonth = this.workingDay.getMonth();
|
|
117
|
-
}
|
|
118
|
-
_setMonthDaysForDate(monthNumber) {
|
|
119
|
-
this.daysInMonth = [];
|
|
120
|
-
const firstDayOfMonth = new Date(this.workingYear, monthNumber, 0).getDay();
|
|
121
|
-
const lastDayOfMonth = new Date(this.workingYear, monthNumber + 1, 0).getDate();
|
|
122
|
-
// Add null values to the beginning of the array to align the first day with the correct day of the week
|
|
123
|
-
for (let i = 0; i < firstDayOfMonth; i++) {
|
|
124
|
-
this.daysInMonth.push(null);
|
|
125
|
-
}
|
|
126
|
-
// Add the days of the current month to the array
|
|
127
|
-
for (let i = 1; i <= lastDayOfMonth; i++) {
|
|
128
|
-
const date = new Date(this.workingYear, this.workingMonth, i);
|
|
129
|
-
this.daysInMonth.push(date);
|
|
130
|
-
}
|
|
131
|
-
// Add null values to the end of the array to fill out the grid
|
|
132
|
-
// const remainingCells = 42 - this.daysInMonth.length;
|
|
133
|
-
// for (let i = 0; i < remainingCells; i++) {
|
|
134
|
-
// this.daysInMonth.push(null);
|
|
135
|
-
// }
|
|
136
|
-
this.daysUnixTimestamps = this.daysInMonth.map(day => { return day ? day.getTime() : undefined; });
|
|
137
|
-
}
|
|
138
|
-
generateYearSelectionYears() {
|
|
139
|
-
const pastYears = 5;
|
|
140
|
-
const futureYears = 3;
|
|
141
|
-
const years = [];
|
|
142
|
-
for (let i = pastYears; i >= 1; i--) {
|
|
143
|
-
years.push(this.workingYear - i);
|
|
144
|
-
}
|
|
145
|
-
years.push(this.workingYear);
|
|
146
|
-
for (let i = 1; i <= futureYears; i++) {
|
|
147
|
-
years.push(this.workingYear + i);
|
|
148
|
-
}
|
|
149
|
-
this.yearSelectionYears = years.reverse();
|
|
150
|
-
}
|
|
151
|
-
openMonthSelection() {
|
|
152
|
-
this.showCalendarBody = false;
|
|
153
|
-
this.monthSelection = false;
|
|
154
|
-
this.yearSelection = true;
|
|
155
|
-
this.showMonthSelection = true;
|
|
156
|
-
}
|
|
157
|
-
openYearSelection() {
|
|
158
|
-
this.showMonthSelection = false;
|
|
159
|
-
this.showYearSelection = true;
|
|
160
|
-
}
|
|
161
|
-
selectDate(day) {
|
|
162
|
-
this.selectedDate = day;
|
|
163
|
-
this._fillDatesBetweenSelected();
|
|
164
|
-
this.dateSelected.emit(new Date(this.selectedDate));
|
|
165
|
-
}
|
|
166
|
-
selectMonth(month) {
|
|
167
|
-
this.showSelectedMonth = month;
|
|
168
|
-
this.workingMonth = this.monthSelectionNames.indexOf(month);
|
|
169
|
-
this.showMonthSelection = false;
|
|
170
|
-
this.yearSelection = false;
|
|
171
|
-
this.monthSelection = true;
|
|
172
|
-
this.showCalendarBody = true;
|
|
173
|
-
this.generateCalendar();
|
|
174
|
-
}
|
|
175
|
-
selectYear(year) {
|
|
176
|
-
this.workingYear = year;
|
|
177
|
-
this.showYearSelection = false;
|
|
178
|
-
this.showMonthSelection = true;
|
|
179
|
-
this.generateCalendar();
|
|
180
|
-
}
|
|
181
|
-
generateMonthNames() {
|
|
182
|
-
for (let i = 0; i < 12; i++) {
|
|
183
|
-
const date = new Date(2000, i, 1);
|
|
184
|
-
const monthNameShort = date.toLocaleString(this.locale, { month: 'short' });
|
|
185
|
-
const monthNameFull = date.toLocaleString(this.locale, { month: 'long' });
|
|
186
|
-
this.monthSelectionNames.push(this._capitalizeFirstLetter(monthNameShort));
|
|
187
|
-
this.monthNames.push(this._capitalizeFirstLetter(monthNameFull));
|
|
188
|
-
}
|
|
189
|
-
for (let i = 1; i <= 7; i++) {
|
|
190
|
-
const date = new Date(2018, 0, i);
|
|
191
|
-
const weekdayName = date.toLocaleString(this.locale, { weekday: 'short' });
|
|
192
|
-
this.dayNames.push(this._capitalizeFirstLetter(weekdayName));
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
handleMouseOverDay(day) {
|
|
196
|
-
if (this.highlightDaysBetweenDates && day && (this.selectedDate || this.secondSelectedDate) && !(this.selectedDate && this.secondSelectedDate) && !(this.selectedDate && !this.temporarySelectedSecondaryDate && !this.secondSelectedDate)) {
|
|
197
|
-
this.daysToHighlight = [];
|
|
198
|
-
if (this.daysUnixTimestamps.includes(day.getTime())) {
|
|
199
|
-
this.daysToHighlight.push(...this.daysInMonth.map((dayInMonth) => {
|
|
200
|
-
if (this.selectedDate) {
|
|
201
|
-
if (dayInMonth &&
|
|
202
|
-
// day in the month is after selected date and day in the month is before the hovering day
|
|
203
|
-
(dayInMonth.getTime() > this.selectedDate.getTime() && dayInMonth.getTime() < day.getTime()) ||
|
|
204
|
-
// second date is after selected date and day in the month is before hovering day and day in month is after selected date
|
|
205
|
-
(this._secondHoveringDate && this._secondHoveringDate.getTime() > this.selectedDate.getTime() && day && dayInMonth && dayInMonth.getTime() < day.getTime() && dayInMonth.getTime() > this.selectedDate.getTime())) {
|
|
206
|
-
return dayInMonth;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
if (dayInMonth &&
|
|
211
|
-
// day in the month is after second date and day in the month is before the hovering day
|
|
212
|
-
(dayInMonth.getTime() > this.secondSelectedDate.getTime() && dayInMonth.getTime() < day.getTime())) {
|
|
213
|
-
return dayInMonth;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}));
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
this.daysToHighlight.push(...this.daysInMonth.map((day) => {
|
|
220
|
-
if (day > this.selectedDate) {
|
|
221
|
-
return day;
|
|
222
|
-
}
|
|
223
|
-
}));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
this.hoveringDate.next(day);
|
|
227
|
-
}
|
|
228
|
-
_fillDatesBetweenSelected() {
|
|
229
|
-
if (this.selectedDate && this.secondSelectedDate) {
|
|
230
|
-
this.daysToHighlight = [];
|
|
231
|
-
this.daysToHighlight.push(...this.daysInMonth.map((dayInMonth) => {
|
|
232
|
-
if (dayInMonth && (dayInMonth > this.selectedDate && dayInMonth < this.secondSelectedDate) || (dayInMonth > this.secondSelectedDate && dayInMonth < this.selectedDate)) {
|
|
233
|
-
return dayInMonth;
|
|
234
|
-
}
|
|
235
|
-
}));
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
_capitalizeFirstLetter(value) {
|
|
239
|
-
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
240
|
-
}
|
|
241
|
-
calculateWeekNumbers() {
|
|
242
|
-
this.weekNumbers = [];
|
|
243
|
-
let weekNumber = null;
|
|
244
|
-
for (let i = 0; i < this.daysInMonth.length; i++) {
|
|
245
|
-
const day = this.daysInMonth[i];
|
|
246
|
-
if (day) {
|
|
247
|
-
// Start of a new week or first day of the month, calculate and set weekNumber
|
|
248
|
-
weekNumber = this.getISOWeek(day);
|
|
249
|
-
// Check if the weekNumber is not already in the array
|
|
250
|
-
if (!this.weekNumbers.includes(weekNumber)) {
|
|
251
|
-
this.weekNumbers.push(weekNumber);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
getISOWeek(date) {
|
|
257
|
-
const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
|
258
|
-
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
|
|
259
|
-
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
260
|
-
const weekNumber = Math.ceil(((d.valueOf() - yearStart.valueOf()) / 86400000 + 1) / 7);
|
|
261
|
-
return weekNumber;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
CalendarTemplateComponent.decorators = [
|
|
265
|
-
{ type: Component, args: [{
|
|
266
|
-
selector: "calendar-template",
|
|
1
|
+
import { Component, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from "@angular/core";
|
|
2
|
+
import { CoreComponentsIcon } from "../../core/enum/core-components-icon.enum";
|
|
3
|
+
export class CalendarTemplateComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.icons = CoreComponentsIcon;
|
|
6
|
+
this.showWeekNumbers = true;
|
|
7
|
+
this.weekNumbers = [];
|
|
8
|
+
this.locale = "nl-NL";
|
|
9
|
+
this.highlightDaysBetweenDates = false;
|
|
10
|
+
this.dateSelected = new EventEmitter();
|
|
11
|
+
this.hoveringDate = new EventEmitter();
|
|
12
|
+
this.showCalendarBody = true;
|
|
13
|
+
this.showMonthSelection = false;
|
|
14
|
+
this.showYearSelection = false;
|
|
15
|
+
this.monthHeader = '';
|
|
16
|
+
this.yearHeader = '';
|
|
17
|
+
this.monthSelection = true;
|
|
18
|
+
this.yearSelection = false;
|
|
19
|
+
this.dayNames = [];
|
|
20
|
+
this.monthNames = [];
|
|
21
|
+
this.monthSelectionNames = [];
|
|
22
|
+
this.yearSelectionYears = [];
|
|
23
|
+
this.daysInMonth = [];
|
|
24
|
+
this.daysUnixTimestamps = [];
|
|
25
|
+
this.daysToHighlight = [];
|
|
26
|
+
}
|
|
27
|
+
set selectedDate(date) {
|
|
28
|
+
this._selectedDate = !!date ? new Date(date.getFullYear(), date.getMonth(), date.getDate()) : date;
|
|
29
|
+
if (this.secondSelectedDate && date && this.secondSelectedDate.getTime() < this.selectedDate.getTime() && this.temporarySelectedSecondaryDate) {
|
|
30
|
+
this.daysToHighlight = [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
get selectedDate() {
|
|
34
|
+
return this._selectedDate;
|
|
35
|
+
}
|
|
36
|
+
set secondSelectedDate(date) {
|
|
37
|
+
this._secondSelectedDate = !!date ? new Date(date.getFullYear(), date.getMonth(), date.getDate()) : date;
|
|
38
|
+
if (!this.selectedDate) {
|
|
39
|
+
this.daysToHighlight = [];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this._fillDatesBetweenSelected();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
get secondSelectedDate() {
|
|
46
|
+
return this._secondSelectedDate;
|
|
47
|
+
}
|
|
48
|
+
set secondHoveringDate(date) {
|
|
49
|
+
this._secondHoveringDate = date;
|
|
50
|
+
if (!!date) {
|
|
51
|
+
this.temporarySelectedSecondaryDate = null;
|
|
52
|
+
}
|
|
53
|
+
if (this.selectedDate && !this.secondSelectedDate) {
|
|
54
|
+
this.temporarySelectedSecondaryDate = new Date(date);
|
|
55
|
+
}
|
|
56
|
+
this.handleMouseOverDay(date);
|
|
57
|
+
}
|
|
58
|
+
get secondHoveringDate() {
|
|
59
|
+
return this._secondHoveringDate;
|
|
60
|
+
}
|
|
61
|
+
showClass() {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
ngOnInit() {
|
|
65
|
+
this._setInitialValues();
|
|
66
|
+
this.generateMonthNames();
|
|
67
|
+
this.generateCalendar();
|
|
68
|
+
this._fillDatesBetweenSelected();
|
|
69
|
+
}
|
|
70
|
+
prevMonth() {
|
|
71
|
+
if (this.workingMonth === 0) {
|
|
72
|
+
this.workingMonth = 11;
|
|
73
|
+
this.workingYear--;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.workingMonth--;
|
|
77
|
+
}
|
|
78
|
+
this.generateCalendar();
|
|
79
|
+
this._fillDatesBetweenSelected();
|
|
80
|
+
this.calculateWeekNumbers();
|
|
81
|
+
}
|
|
82
|
+
nextMonth() {
|
|
83
|
+
if (this.workingMonth === 11) {
|
|
84
|
+
this.workingMonth = 0;
|
|
85
|
+
this.workingYear++;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.workingMonth++;
|
|
89
|
+
}
|
|
90
|
+
this.generateCalendar();
|
|
91
|
+
this._fillDatesBetweenSelected();
|
|
92
|
+
this.calculateWeekNumbers();
|
|
93
|
+
}
|
|
94
|
+
prevYear() {
|
|
95
|
+
this.workingYear--;
|
|
96
|
+
this.generateCalendar();
|
|
97
|
+
}
|
|
98
|
+
nextYear() {
|
|
99
|
+
this.workingYear++;
|
|
100
|
+
this.generateCalendar();
|
|
101
|
+
}
|
|
102
|
+
generateCalendar() {
|
|
103
|
+
this._setMonthDaysForDate(this.workingMonth);
|
|
104
|
+
// Update the displayed month
|
|
105
|
+
const month = this.monthNames[this.workingMonth];
|
|
106
|
+
const year = this.workingYear;
|
|
107
|
+
// Update headerText
|
|
108
|
+
this.monthHeader = `${month} ${year}`;
|
|
109
|
+
this.yearHeader = `${year}`;
|
|
110
|
+
this.generateYearSelectionYears();
|
|
111
|
+
this.calculateWeekNumbers();
|
|
112
|
+
}
|
|
113
|
+
_setInitialValues() {
|
|
114
|
+
this.workingDay = this.selectedDate ? this.selectedDate : new Date();
|
|
115
|
+
this.workingYear = this.workingDay.getFullYear();
|
|
116
|
+
this.workingMonth = this.workingDay.getMonth();
|
|
117
|
+
}
|
|
118
|
+
_setMonthDaysForDate(monthNumber) {
|
|
119
|
+
this.daysInMonth = [];
|
|
120
|
+
const firstDayOfMonth = new Date(this.workingYear, monthNumber, 0).getDay();
|
|
121
|
+
const lastDayOfMonth = new Date(this.workingYear, monthNumber + 1, 0).getDate();
|
|
122
|
+
// Add null values to the beginning of the array to align the first day with the correct day of the week
|
|
123
|
+
for (let i = 0; i < firstDayOfMonth; i++) {
|
|
124
|
+
this.daysInMonth.push(null);
|
|
125
|
+
}
|
|
126
|
+
// Add the days of the current month to the array
|
|
127
|
+
for (let i = 1; i <= lastDayOfMonth; i++) {
|
|
128
|
+
const date = new Date(this.workingYear, this.workingMonth, i);
|
|
129
|
+
this.daysInMonth.push(date);
|
|
130
|
+
}
|
|
131
|
+
// Add null values to the end of the array to fill out the grid
|
|
132
|
+
// const remainingCells = 42 - this.daysInMonth.length;
|
|
133
|
+
// for (let i = 0; i < remainingCells; i++) {
|
|
134
|
+
// this.daysInMonth.push(null);
|
|
135
|
+
// }
|
|
136
|
+
this.daysUnixTimestamps = this.daysInMonth.map(day => { return day ? day.getTime() : undefined; });
|
|
137
|
+
}
|
|
138
|
+
generateYearSelectionYears() {
|
|
139
|
+
const pastYears = 5;
|
|
140
|
+
const futureYears = 3;
|
|
141
|
+
const years = [];
|
|
142
|
+
for (let i = pastYears; i >= 1; i--) {
|
|
143
|
+
years.push(this.workingYear - i);
|
|
144
|
+
}
|
|
145
|
+
years.push(this.workingYear);
|
|
146
|
+
for (let i = 1; i <= futureYears; i++) {
|
|
147
|
+
years.push(this.workingYear + i);
|
|
148
|
+
}
|
|
149
|
+
this.yearSelectionYears = years.reverse();
|
|
150
|
+
}
|
|
151
|
+
openMonthSelection() {
|
|
152
|
+
this.showCalendarBody = false;
|
|
153
|
+
this.monthSelection = false;
|
|
154
|
+
this.yearSelection = true;
|
|
155
|
+
this.showMonthSelection = true;
|
|
156
|
+
}
|
|
157
|
+
openYearSelection() {
|
|
158
|
+
this.showMonthSelection = false;
|
|
159
|
+
this.showYearSelection = true;
|
|
160
|
+
}
|
|
161
|
+
selectDate(day) {
|
|
162
|
+
this.selectedDate = day;
|
|
163
|
+
this._fillDatesBetweenSelected();
|
|
164
|
+
this.dateSelected.emit(new Date(this.selectedDate));
|
|
165
|
+
}
|
|
166
|
+
selectMonth(month) {
|
|
167
|
+
this.showSelectedMonth = month;
|
|
168
|
+
this.workingMonth = this.monthSelectionNames.indexOf(month);
|
|
169
|
+
this.showMonthSelection = false;
|
|
170
|
+
this.yearSelection = false;
|
|
171
|
+
this.monthSelection = true;
|
|
172
|
+
this.showCalendarBody = true;
|
|
173
|
+
this.generateCalendar();
|
|
174
|
+
}
|
|
175
|
+
selectYear(year) {
|
|
176
|
+
this.workingYear = year;
|
|
177
|
+
this.showYearSelection = false;
|
|
178
|
+
this.showMonthSelection = true;
|
|
179
|
+
this.generateCalendar();
|
|
180
|
+
}
|
|
181
|
+
generateMonthNames() {
|
|
182
|
+
for (let i = 0; i < 12; i++) {
|
|
183
|
+
const date = new Date(2000, i, 1);
|
|
184
|
+
const monthNameShort = date.toLocaleString(this.locale, { month: 'short' });
|
|
185
|
+
const monthNameFull = date.toLocaleString(this.locale, { month: 'long' });
|
|
186
|
+
this.monthSelectionNames.push(this._capitalizeFirstLetter(monthNameShort));
|
|
187
|
+
this.monthNames.push(this._capitalizeFirstLetter(monthNameFull));
|
|
188
|
+
}
|
|
189
|
+
for (let i = 1; i <= 7; i++) {
|
|
190
|
+
const date = new Date(2018, 0, i);
|
|
191
|
+
const weekdayName = date.toLocaleString(this.locale, { weekday: 'short' });
|
|
192
|
+
this.dayNames.push(this._capitalizeFirstLetter(weekdayName));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
handleMouseOverDay(day) {
|
|
196
|
+
if (this.highlightDaysBetweenDates && day && (this.selectedDate || this.secondSelectedDate) && !(this.selectedDate && this.secondSelectedDate) && !(this.selectedDate && !this.temporarySelectedSecondaryDate && !this.secondSelectedDate)) {
|
|
197
|
+
this.daysToHighlight = [];
|
|
198
|
+
if (this.daysUnixTimestamps.includes(day.getTime())) {
|
|
199
|
+
this.daysToHighlight.push(...this.daysInMonth.map((dayInMonth) => {
|
|
200
|
+
if (this.selectedDate) {
|
|
201
|
+
if (dayInMonth &&
|
|
202
|
+
// day in the month is after selected date and day in the month is before the hovering day
|
|
203
|
+
(dayInMonth.getTime() > this.selectedDate.getTime() && dayInMonth.getTime() < day.getTime()) ||
|
|
204
|
+
// second date is after selected date and day in the month is before hovering day and day in month is after selected date
|
|
205
|
+
(this._secondHoveringDate && this._secondHoveringDate.getTime() > this.selectedDate.getTime() && day && dayInMonth && dayInMonth.getTime() < day.getTime() && dayInMonth.getTime() > this.selectedDate.getTime())) {
|
|
206
|
+
return dayInMonth;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
if (dayInMonth &&
|
|
211
|
+
// day in the month is after second date and day in the month is before the hovering day
|
|
212
|
+
(dayInMonth.getTime() > this.secondSelectedDate.getTime() && dayInMonth.getTime() < day.getTime())) {
|
|
213
|
+
return dayInMonth;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.daysToHighlight.push(...this.daysInMonth.map((day) => {
|
|
220
|
+
if (day > this.selectedDate) {
|
|
221
|
+
return day;
|
|
222
|
+
}
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
this.hoveringDate.next(day);
|
|
227
|
+
}
|
|
228
|
+
_fillDatesBetweenSelected() {
|
|
229
|
+
if (this.selectedDate && this.secondSelectedDate) {
|
|
230
|
+
this.daysToHighlight = [];
|
|
231
|
+
this.daysToHighlight.push(...this.daysInMonth.map((dayInMonth) => {
|
|
232
|
+
if (dayInMonth && (dayInMonth > this.selectedDate && dayInMonth < this.secondSelectedDate) || (dayInMonth > this.secondSelectedDate && dayInMonth < this.selectedDate)) {
|
|
233
|
+
return dayInMonth;
|
|
234
|
+
}
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
_capitalizeFirstLetter(value) {
|
|
239
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
240
|
+
}
|
|
241
|
+
calculateWeekNumbers() {
|
|
242
|
+
this.weekNumbers = [];
|
|
243
|
+
let weekNumber = null;
|
|
244
|
+
for (let i = 0; i < this.daysInMonth.length; i++) {
|
|
245
|
+
const day = this.daysInMonth[i];
|
|
246
|
+
if (day) {
|
|
247
|
+
// Start of a new week or first day of the month, calculate and set weekNumber
|
|
248
|
+
weekNumber = this.getISOWeek(day);
|
|
249
|
+
// Check if the weekNumber is not already in the array
|
|
250
|
+
if (!this.weekNumbers.includes(weekNumber)) {
|
|
251
|
+
this.weekNumbers.push(weekNumber);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
getISOWeek(date) {
|
|
257
|
+
const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
|
258
|
+
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
|
|
259
|
+
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
260
|
+
const weekNumber = Math.ceil(((d.valueOf() - yearStart.valueOf()) / 86400000 + 1) / 7);
|
|
261
|
+
return weekNumber;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
CalendarTemplateComponent.decorators = [
|
|
265
|
+
{ type: Component, args: [{
|
|
266
|
+
selector: "calendar-template",
|
|
267
267
|
template: `
|
|
268
268
|
<div class="calendar">
|
|
269
269
|
<div class="calendar-header" *ngIf="monthSelection || yearSelection">
|
|
@@ -324,19 +324,19 @@ CalendarTemplateComponent.decorators = [
|
|
|
324
324
|
</div>
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
327
|
-
`,
|
|
328
|
-
encapsulation: ViewEncapsulation.None
|
|
329
|
-
},] }
|
|
330
|
-
];
|
|
331
|
-
CalendarTemplateComponent.propDecorators = {
|
|
332
|
-
showWeekNumbers: [{ type: Input }],
|
|
333
|
-
locale: [{ type: Input }],
|
|
334
|
-
highlightDaysBetweenDates: [{ type: Input }],
|
|
335
|
-
selectedDate: [{ type: Input }],
|
|
336
|
-
secondSelectedDate: [{ type: Input }],
|
|
337
|
-
secondHoveringDate: [{ type: Input }],
|
|
338
|
-
dateSelected: [{ type: Output }],
|
|
339
|
-
hoveringDate: [{ type: Output }],
|
|
340
|
-
showClass: [{ type: HostBinding, args: ["class.calendar-template",] }]
|
|
341
|
-
};
|
|
327
|
+
`,
|
|
328
|
+
encapsulation: ViewEncapsulation.None
|
|
329
|
+
},] }
|
|
330
|
+
];
|
|
331
|
+
CalendarTemplateComponent.propDecorators = {
|
|
332
|
+
showWeekNumbers: [{ type: Input }],
|
|
333
|
+
locale: [{ type: Input }],
|
|
334
|
+
highlightDaysBetweenDates: [{ type: Input }],
|
|
335
|
+
selectedDate: [{ type: Input }],
|
|
336
|
+
secondSelectedDate: [{ type: Input }],
|
|
337
|
+
secondHoveringDate: [{ type: Input }],
|
|
338
|
+
dateSelected: [{ type: Output }],
|
|
339
|
+
hoveringDate: [{ type: Output }],
|
|
340
|
+
showClass: [{ type: HostBinding, args: ["class.calendar-template",] }]
|
|
341
|
+
};
|
|
342
342
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLXRlbXBsYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQW1FN0UsTUFBTSxPQUFPLHlCQUF5QjtJQWpFdEM7UUFrRWtCLFVBQUssR0FBOEIsa0JBQWtCLENBQUM7UUFHL0Qsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFFaEMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsV0FBTSxHQUFXLE9BQU8sQ0FBQztRQUd6Qiw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUE2QzNDLGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFHNUQsaUJBQVksR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU1RCxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFDakMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQU9uQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBRXhCLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLHdCQUFtQixHQUFhLEVBQUUsQ0FBQztRQUNuQyx1QkFBa0IsR0FBYSxFQUFFLENBQUM7UUFDbEMsZ0JBQVcs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QUM7OztZQW5ZRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RFQ7Z0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7Ozs4QkFJRSxLQUFLO3FCQUlMLEtBQUs7d0NBR0wsS0FBSzsyQkFHTCxLQUFLO2lDQVlMLEtBQUs7aUNBY0wsS0FBSzsyQkFnQkwsTUFBTTsyQkFHTixNQUFNO3dCQWdDTixXQUFXLFNBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0NvcmVDb21wb25lbnRzSWNvbn0gZnJvbSBcIi4uLy4uL2NvcmUvZW51bS9jb3JlLWNvbXBvbmVudHMtaWNvbi5lbnVtXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJjYWxlbmRhci10ZW1wbGF0ZVwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIiAqbmdJZj1cIm1vbnRoU2VsZWN0aW9uIHx8IHllYXJTZWxlY3Rpb25cIj5cclxuICAgICAgICAgIDxjby1pY29uIGNsYXNzPVwiY2FsZW5kYXItY2hhbmdlLW1vbnRoLWJ1dHRvblwiIFtpY29uXT1cImljb25zLkFycm93UG9pbnRMZWZ0XCIgKGNsaWNrKT1cInByZXZNb250aCgpXCI+PC9jby1pY29uPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXItdGl0bGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlci10aXRsZVwiIFt0ZXh0Q29udGVudF09XCJtb250aFNlbGVjdGlvbiA/IG1vbnRoSGVhZGVyIDogeWVhckhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb250aFNlbGVjdGlvbiA/IG9wZW5Nb250aFNlbGVjdGlvbigpIDogb3BlblllYXJTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8Y28taWNvbiBjbGFzcz1cImNhbGVuZGFyLWNoYW5nZS1tb250aC1idXR0b25cIiBbaWNvbl09XCJpY29ucy5BcnJvd1BvaW50UmlnaHRcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj48L2NvLWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb24tZ3JpZCBtb250aFwiICpuZ0lmPVwic2hvd01vbnRoU2VsZWN0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aFNlbGVjdGlvbk5hbWVzXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1tb250aC1vci15ZWFyXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKG1vbnRoKVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9udGhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhcIiBbdGV4dENvbnRlbnRdPVwibW9udGhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGlvbi1ncmlkIHllYXJcIiAqbmdJZj1cInNob3dZZWFyU2VsZWN0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJTZWxlY3Rpb25ZZWFyc1wiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY2FsZW5kYXItbW9udGgtb3IteWVhclwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcclxuICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cInllYXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInllYXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwieWVhclwiIFt0ZXh0Q29udGVudF09XCJ5ZWFyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrLXdyYXBwZXJcIiAqbmdJZj1cInNob3dXZWVrTnVtYmVycyAmJiBzaG93Q2FsZW5kYXJCb2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrLW51bWJlclwiIFt0ZXh0Q29udGVudF09XCInVydcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWstbnVtYmVyXCIgKm5nRm9yPVwibGV0IHdlZWtOdW1iZXIgb2Ygd2Vla051bWJlcnNcIj5cclxuICAgICAgICAgICAgICB7eyB3ZWVrTnVtYmVyIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiICpuZ0lmPVwic2hvd0NhbGVuZGFyQm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LW5hbWVzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWtkYXlcIiAqbmdGb3I9XCJsZXQgZGF5TmFtZSBvZiBkYXlOYW1lc1wiIFt0ZXh0Q29udGVudF09XCJkYXlOYW1lXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c0luTW9udGhcIiBjbGFzcz1cImNhbGVuZGFyLWRheVwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmhpZ2hsaWdodGVkLWRheV09XCJkYXlzVG9IaWdobGlnaHQuaW5jbHVkZXMoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkLWRheV09XCJzZWxlY3RlZERhdGUgJiYgKGRheSAmJiBkYXkuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpKSB8fFxyXG4gICAgICAgICAgICBzZWNvbmRTZWxlY3RlZERhdGUgJiYgKGRheSAmJiBkYXkuZ2V0VGltZSgpID09PSBzZWNvbmRTZWxlY3RlZERhdGUuZ2V0VGltZSgpKSB8fFxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlTZWxlY3RlZFNlY29uZGFyeURhdGUgJiYgKGRheSAmJiBkYXkuZ2V0VGltZSgpID09PSB0ZW1wb3JhcnlTZWxlY3RlZFNlY29uZGFyeURhdGUuZ2V0VGltZSgpKVwiXHJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJoYW5kbGVNb3VzZU92ZXJEYXkoZGF5KVwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gRGF5IG51bWJlciAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LW51bWJlclwiIFt0ZXh0Q29udGVudF09XCJkYXkuZ2V0RGF0ZSgpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJUZW1wbGF0ZUNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGljb25zOiB0eXBlb2YgQ29yZUNvbXBvbmVudHNJY29uID0gQ29yZUNvbXBvbmVudHNJY29uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93V2Vla051bWJlcnM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwdWJsaWMgd2Vla051bWJlcnM6IG51bWJlcltdID0gW107XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbG9jYWxlOiBzdHJpbmcgPSBcIm5sLU5MXCI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGhpZ2hsaWdodERheXNCZXR3ZWVuRGF0ZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSAhIWRhdGUgPyBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpIDogZGF0ZTtcclxuICAgIGlmICh0aGlzLnNlY29uZFNlbGVjdGVkRGF0ZSAmJiBkYXRlICYmIHRoaXMuc2Vjb25kU2VsZWN0ZWREYXRlLmdldFRpbWUoKSA8IHRoaXMuc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAmJiB0aGlzLnRlbXBvcmFyeVNlbGVjdGVkU2Vjb25kYXJ5RGF0ZSkge1xyXG4gICAgICB0aGlzLmRheXNUb0hpZ2hsaWdodCA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RlZERhdGUoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlY29uZFNlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9zZWNvbmRTZWxlY3RlZERhdGUgPSAhIWRhdGUgPyBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpIDogZGF0ZTtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHtcclxuICAgICAgdGhpcy5kYXlzVG9IaWdobGlnaHQgPSBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ZpbGxEYXRlc0JldHdlZW5TZWxlY3RlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWNvbmRTZWxlY3RlZERhdGUoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kU2VsZWN0ZWREYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlY29uZEhvdmVyaW5nRGF0ZShkYXRlIDogRGF0ZSkge1xyXG4gICAgdGhpcy5fc2Vjb25kSG92ZXJpbmdEYXRlID0gZGF0ZTtcclxuICAgIGlmICghIWRhdGUpIHtcclxuICAgICAgdGhpcy50ZW1wb3JhcnlTZWxlY3RlZFNlY29uZGFyeURhdGUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlICYmICF0aGlzLnNlY29uZFNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICB0aGlzLnRlbXBvcmFyeVNlbGVjdGVkU2Vjb25kYXJ5RGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYW5kbGVNb3VzZU92ZXJEYXkoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlY29uZEhvdmVyaW5nRGF0ZSgpOiBEYXRlIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWNvbmRIb3ZlcmluZ0RhdGU7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZGF0ZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBob3ZlcmluZ0RhdGU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgcHVibGljIHNob3dDYWxlbmRhckJvZHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBzaG93TW9udGhTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd1llYXJTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd1NlbGVjdGVkTW9udGg6IHN0cmluZztcclxuXHJcbiAgcHVibGljIHdvcmtpbmdEYXk6IERhdGU7XHJcbiAgcHVibGljIHdvcmtpbmdZZWFyOiBudW1iZXI7XHJcbiAgcHVibGljIHdvcmtpbmdNb250aDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgbW9udGhIZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyB5ZWFySGVhZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHVibGljIG1vbnRoU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgeWVhclNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZGF5TmFtZXMgPSBbXTtcclxuICBwdWJsaWMgbW9udGhOYW1lcyA9IFtdO1xyXG4gIHB1YmxpYyBtb250aFNlbGVjdGlvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHB1YmxpYyB5ZWFyU2VsZWN0aW9uWWVhcnM6IG51bWJlcltdID0gW107XHJcbiAgcHVibGljIGRheXNJbk1vbnRoOiBEYXRlW10gPSBbXTtcclxuXHJcbiAgcHVibGljIGRheXNVbml4VGltZXN0YW1wczogbnVtYmVyW10gPSBbXTtcclxuICBwdWJsaWMgZGF5c1RvSGlnaGxpZ2h0OiBEYXRlW10gPSBbXTtcclxuICBwdWJsaWMgdGVtcG9yYXJ5U2VsZWN0ZWRTZWNvbmRhcnlEYXRlOiBEYXRlO1xyXG5cclxuICBwcml2YXRlIF9zZWNvbmRIb3ZlcmluZ0RhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfc2Vjb25kU2VsZWN0ZWREYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZTogRGF0ZTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY2FsZW5kYXItdGVtcGxhdGVcIilcclxuICBwdWJsaWMgc2hvd0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXRJbml0aWFsVmFsdWVzKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlTW9udGhOYW1lcygpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLl9maWxsRGF0ZXNCZXR3ZWVuU2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmV2TW9udGgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53b3JraW5nTW9udGggPT09IDApIHtcclxuICAgICAgdGhpcy53b3JraW5nTW9udGggPSAxMTtcclxuICAgICAgdGhpcy53b3JraW5nWWVhci0tO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53b3JraW5nTW9udGgtLTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgdGhpcy5fZmlsbERhdGVzQmV0d2VlblNlbGVjdGVkKCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZVdlZWtOdW1iZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV4dE1vbnRoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud29ya2luZ01vbnRoID09PSAxMSkge1xyXG4gICAgICB0aGlzLndvcmtpbmdNb250aCA9IDA7XHJcbiAgICAgIHRoaXMud29ya2luZ1llYXIrKztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud29ya2luZ01vbnRoKys7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuX2ZpbGxEYXRlc0JldHdlZW5TZWxlY3RlZCgpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVXZWVrTnVtYmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXZZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy53b3JraW5nWWVhci0tO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV4dFllYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLndvcmtpbmdZZWFyKys7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2V0TW9udGhEYXlzRm9yRGF0ZSh0aGlzLndvcmtpbmdNb250aCk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5ZWQgbW9udGhcclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5tb250aE5hbWVzW3RoaXMud29ya2luZ01vbnRoXTtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLndvcmtpbmdZZWFyO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBoZWFkZXJUZXh0XHJcbiAgICB0aGlzLm1vbnRoSGVhZGVyID0gYCR7bW9udGh9ICR7eWVhcn1gO1xyXG4gICAgdGhpcy55ZWFySGVhZGVyID0gYCR7eWVhcn1gO1xyXG5cclxuICAgIHRoaXMuZ2VuZXJhdGVZZWFyU2VsZWN0aW9uWWVhcnMoKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlV2Vla051bWJlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEluaXRpYWxWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLndvcmtpbmdEYXkgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IHRoaXMuc2VsZWN0ZWREYXRlIDogbmV3IERhdGUoKTtcclxuICAgIHRoaXMud29ya2luZ1llYXIgPSB0aGlzLndvcmtpbmdEYXkuZ2V0RnVsbFllYXIoKTtcclxuICAgIHRoaXMud29ya2luZ01vbnRoID0gdGhpcy53b3JraW5nRGF5LmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRNb250aERheXNGb3JEYXRlKG1vbnRoTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF5c0luTW9udGggPSBbXTtcclxuXHJcbiAgICBjb25zdCBmaXJzdERheU9mTW9udGggPSBuZXcgRGF0ZSh0aGlzLndvcmtpbmdZZWFyLCBtb250aE51bWJlciwgMCkuZ2V0RGF5KCk7XHJcbiAgICBjb25zdCBsYXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHRoaXMud29ya2luZ1llYXIsIG1vbnRoTnVtYmVyICsgMSwgMCkuZ2V0RGF0ZSgpO1xyXG5cclxuICAgIC8vIEFkZCBudWxsIHZhbHVlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSB0byBhbGlnbiB0aGUgZmlyc3QgZGF5IHdpdGggdGhlIGNvcnJlY3QgZGF5IG9mIHRoZSB3ZWVrXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0RGF5T2ZNb250aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuZGF5c0luTW9udGgucHVzaChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgdGhlIGRheXMgb2YgdGhlIGN1cnJlbnQgbW9udGggdG8gdGhlIGFycmF5XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBsYXN0RGF5T2ZNb250aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLndvcmtpbmdZZWFyLCB0aGlzLndvcmtpbmdNb250aCwgaSk7XHJcbiAgICAgIHRoaXMuZGF5c0luTW9udGgucHVzaChkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgbnVsbCB2YWx1ZXMgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgdG8gZmlsbCBvdXQgdGhlIGdyaWRcclxuICAgIC8vIGNvbnN0IHJlbWFpbmluZ0NlbGxzID0gNDIgLSB0aGlzLmRheXNJbk1vbnRoLmxlbmd0aDtcclxuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtYWluaW5nQ2VsbHM7IGkrKykge1xyXG4gICAgLy8gICB0aGlzLmRheXNJbk1vbnRoLnB1c2gobnVsbCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhpcy5kYXlzVW5peFRpbWVzdGFtcHMgPSB0aGlzLmRheXNJbk1vbnRoLm1hcChkYXkgPT4geyByZXR1cm4gZGF5ID8gZGF5LmdldFRpbWUoKSA6IHVuZGVmaW5lZCB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVllYXJTZWxlY3Rpb25ZZWFycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhc3RZZWFycyA9IDU7XHJcbiAgICBjb25zdCBmdXR1cmVZZWFycyA9IDM7XHJcbiAgICBjb25zdCB5ZWFycyA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBwYXN0WWVhcnM7IGkgPj0gMTsgaS0tKSB7XHJcblxyXG4gICAgICB5ZWFycy5wdXNoKHRoaXMud29ya2luZ1llYXIgLSBpKTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFycy5wdXNoKHRoaXMud29ya2luZ1llYXIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGZ1dHVyZVllYXJzOyBpKyspIHtcclxuICAgICAgeWVhcnMucHVzaCh0aGlzLndvcmtpbmdZZWFyICsgaSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy55ZWFyU2VsZWN0aW9uWWVhcnMgPSB5ZWFycy5yZXZlcnNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3Blbk1vbnRoU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q2FsZW5kYXJCb2R5ID0gZmFsc2U7XHJcbiAgICB0aGlzLm1vbnRoU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnllYXJTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5zaG93TW9udGhTZWxlY3Rpb24gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5ZZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93TW9udGhTZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXJTZWxlY3Rpb24gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdERhdGUoZGF5OiBEYXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRheTtcclxuICAgIHRoaXMuX2ZpbGxEYXRlc0JldHdlZW5TZWxlY3RlZCgpO1xyXG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdE1vbnRoKG1vbnRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd1NlbGVjdGVkTW9udGggPSBtb250aDtcclxuICAgIHRoaXMud29ya2luZ01vbnRoID0gdGhpcy5tb250aFNlbGVjdGlvbk5hbWVzLmluZGV4T2YobW9udGgpO1xyXG4gICAgdGhpcy5zaG93TW9udGhTZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgIHRoaXMueWVhclNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5tb250aFNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLnNob3dDYWxlbmRhckJvZHkgPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMud29ya2luZ1llYXIgPSB5ZWFyO1xyXG4gICAgdGhpcy5zaG93WWVhclNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93TW9udGhTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVNb250aE5hbWVzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgyMDAwLCBpLCAxKTtcclxuICAgICAgY29uc3QgbW9udGhOYW1lU2hvcnQgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7bW9udGg6ICdzaG9ydCd9KTtcclxuICAgICAgY29uc3QgbW9udGhOYW1lRnVsbCA9IGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHttb250aDogJ2xvbmcnfSk7XHJcbiAgICAgIHRoaXMubW9udGhTZWxlY3Rpb25OYW1lcy5wdXNoKHRoaXMuX2NhcGl0YWxpemVGaXJzdExldHRlcihtb250aE5hbWVTaG9ydCkpO1xyXG4gICAgICB0aGlzLm1vbnRoTmFtZXMucHVzaCh0aGlzLl9jYXBpdGFsaXplRmlyc3RMZXR0ZXIobW9udGhOYW1lRnVsbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDc7IGkrKykge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMjAxOCwgMCwgaSk7XHJcbiAgICAgIGNvbnN0IHdlZWtkYXlOYW1lID0gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pO1xyXG4gICAgICB0aGlzLmRheU5hbWVzLnB1c2godGhpcy5fY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHdlZWtkYXlOYW1lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlTW91c2VPdmVyRGF5KGRheTogRGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0RGF5c0JldHdlZW5EYXRlcyAmJiBkYXkgJiYgKHRoaXMuc2VsZWN0ZWREYXRlIHx8IHRoaXMuc2Vjb25kU2VsZWN0ZWREYXRlKSAmJiAhKHRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuc2Vjb25kU2VsZWN0ZWREYXRlKSAmJiAhKHRoaXMuc2VsZWN0ZWREYXRlICYmICF0aGlzLnRlbXBvcmFyeVNlbGVjdGVkU2Vjb25kYXJ5RGF0ZSAmJiAhdGhpcy5zZWNvbmRTZWxlY3RlZERhdGUpKSB7XHJcbiAgICAgIHRoaXMuZGF5c1RvSGlnaGxpZ2h0ID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRheXNVbml4VGltZXN0YW1wcy5pbmNsdWRlcyhkYXkuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgIHRoaXMuZGF5c1RvSGlnaGxpZ2h0LnB1c2goLi4udGhpcy5kYXlzSW5Nb250aC5tYXAoKGRheUluTW9udGg6IERhdGUpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoZGF5SW5Nb250aCAmJlxyXG4gICAgICAgICAgICAgIC8vIGRheSBpbiB0aGUgbW9udGggaXMgYWZ0ZXIgc2VsZWN0ZWQgZGF0ZSBhbmQgZGF5IGluIHRoZSBtb250aCBpcyBiZWZvcmUgdGhlIGhvdmVyaW5nIGRheVxyXG4gICAgICAgICAgICAgIChkYXlJbk1vbnRoLmdldFRpbWUoKSA+IHRoaXMuc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAmJiBkYXlJbk1vbnRoLmdldFRpbWUoKSA8IGRheS5nZXRUaW1lKCkpIHx8XHJcbiAgICAgICAgICAgICAgLy8gc2Vjb25kIGRhdGUgaXMgYWZ0ZXIgc2VsZWN0ZWQgZGF0ZSBhbmQgZGF5IGluIHRoZSBtb250aCBpcyBiZWZvcmUgaG92ZXJpbmcgZGF5IGFuZCBkYXkgaW4gbW9udGggaXMgYWZ0ZXIgc2VsZWN0ZWQgZGF0ZVxyXG4gICAgICAgICAgICAgICh0aGlzLl9zZWNvbmRIb3ZlcmluZ0RhdGUgJiYgdGhpcy5fc2Vjb25kSG92ZXJpbmdEYXRlLmdldFRpbWUoKSA+IHRoaXMuc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAmJiBkYXkgJiYgZGF5SW5Nb250aCAmJiBkYXlJbk1vbnRoLmdldFRpbWUoKSA8IGRheS5nZXRUaW1lKCkgJiYgZGF5SW5Nb250aC5nZXRUaW1lKCkgPiB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRheUluTW9udGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkYXlJbk1vbnRoICYmXHJcbiAgICAgICAgICAgICAgLy8gZGF5IGluIHRoZSBtb250aCBpcyBhZnRlciBzZWNvbmQgZGF0ZSBhbmQgZGF5IGluIHRoZSBtb250aCBpcyBiZWZvcmUgdGhlIGhvdmVyaW5nIGRheVxyXG4gICAgICAgICAgICAgIChkYXlJbk1vbnRoLmdldFRpbWUoKSA+IHRoaXMuc2Vjb25kU2VsZWN0ZWREYXRlLmdldFRpbWUoKSAmJiBkYXlJbk1vbnRoLmdldFRpbWUoKSA8IGRheS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRheUluTW9udGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXlzVG9IaWdobGlnaHQucHVzaCguLi50aGlzLmRheXNJbk1vbnRoLm1hcCgoZGF5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF5ID4gdGhpcy5zZWxlY3RlZERhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRheTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaG92ZXJpbmdEYXRlLm5leHQoZGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbGxEYXRlc0JldHdlZW5TZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLnNlY29uZFNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICB0aGlzLmRheXNUb0hpZ2hsaWdodCA9IFtdO1xyXG4gICAgICB0aGlzLmRheXNUb0hpZ2hsaWdodC5wdXNoKC4uLnRoaXMuZGF5c0luTW9udGgubWFwKChkYXlJbk1vbnRoOiBEYXRlKSA9PiB7XHJcbiAgICAgICAgaWYgKGRheUluTW9udGggJiYgKGRheUluTW9udGggPiB0aGlzLnNlbGVjdGVkRGF0ZSAmJiBkYXlJbk1vbnRoIDwgdGhpcy5zZWNvbmRTZWxlY3RlZERhdGUpIHx8IChkYXlJbk1vbnRoID4gdGhpcy5zZWNvbmRTZWxlY3RlZERhdGUgJiYgZGF5SW5Nb250aCA8IHRoaXMuc2VsZWN0ZWREYXRlKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGRheUluTW9udGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVXZWVrTnVtYmVycygpOiB2b2lkIHtcclxuICAgIHRoaXMud2Vla051bWJlcnMgPSBbXTtcclxuICAgIGxldCB3ZWVrTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXlzSW5Nb250aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBkYXkgPSB0aGlzLmRheXNJbk1vbnRoW2ldO1xyXG4gICAgICBpZiAoZGF5KSB7XHJcbiAgICAgICAgICAvLyBTdGFydCBvZiBhIG5ldyB3ZWVrIG9yIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIGNhbGN1bGF0ZSBhbmQgc2V0IHdlZWtOdW1iZXJcclxuICAgICAgICAgIHdlZWtOdW1iZXIgPSB0aGlzLmdldElTT1dlZWsoZGF5KTtcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB3ZWVrTnVtYmVyIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBhcnJheVxyXG4gICAgICAgICAgaWYgKCF0aGlzLndlZWtOdW1iZXJzLmluY2x1ZGVzKHdlZWtOdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2Vla051bWJlcnMucHVzaCh3ZWVrTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRJU09XZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKSk7XHJcbiAgICAgIGQuc2V0VVRDRGF0ZShkLmdldFVUQ0RhdGUoKSArIDQgLSAoZC5nZXRVVENEYXkoKSB8fCA3KSk7XHJcbiAgICAgIGNvbnN0IHllYXJTdGFydCA9IG5ldyBEYXRlKERhdGUuVVRDKGQuZ2V0VVRDRnVsbFllYXIoKSwgMCwgMSkpO1xyXG4gICAgICBjb25zdCB3ZWVrTnVtYmVyID0gTWF0aC5jZWlsKCgoZC52YWx1ZU9mKCkgLSB5ZWFyU3RhcnQudmFsdWVPZigpKSAvIDg2NDAwMDAwICsgMSkgLyA3KTtcclxuICAgICAgcmV0dXJuIHdlZWtOdW1iZXI7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|