cmat 0.0.17 → 0.0.18
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/components/carousel/carousel.component.d.ts +136 -0
- package/components/carousel/carousel.interface.d.ts +38 -0
- package/components/carousel/index.d.ts +5 -0
- package/components/carousel/public-api.d.ts +2 -0
- package/components/custom-formly/public-api.d.ts +1 -0
- package/components/custom-formly/types/knob/knob.component.d.ts +36 -0
- package/components/custom-formly/types/table/table.component.d.ts +3 -8
- package/components/custom-formly/wrappers/form-field/form-field.component.d.ts +4 -4
- package/components/image-viewer/image-viewer.component.d.ts +76 -0
- package/components/image-viewer/index.d.ts +5 -0
- package/components/image-viewer/public-api.d.ts +1 -0
- package/components/knob-input/index.d.ts +5 -0
- package/components/knob-input/knob-input.component.d.ts +95 -0
- package/components/knob-input/public-api.d.ts +1 -0
- package/components/material-datetimepicker/datetimepicker-input.d.ts +2 -2
- package/components/opt-input/index.d.ts +5 -0
- package/components/opt-input/models/config.d.ts +14 -0
- package/components/opt-input/otp-input.component.d.ts +70 -0
- package/components/opt-input/public-api.d.ts +1 -0
- package/components/opt-input/utils/keyboard-util.d.ts +9 -0
- package/components/opt-input/utils/object-util.d.ts +3 -0
- package/components/org-chart/designer/chart-designer.component.d.ts +17 -0
- package/components/org-chart/index.d.ts +5 -0
- package/components/org-chart/node/chart-node.component.d.ts +17 -0
- package/components/org-chart/node/node.type.d.ts +22 -0
- package/components/org-chart/org-chart.component.d.ts +12 -0
- package/components/org-chart/public-api.d.ts +2 -0
- package/components/popover/popover.interfaces.d.ts +1 -1
- package/components/select-table/index.d.ts +5 -0
- package/components/select-table/public-api.d.ts +2 -0
- package/components/select-table/select-table.component.d.ts +96 -0
- package/components/select-table/select-table.type.d.ts +20 -0
- package/components/select-tree/select-tree.component.d.ts +11 -12
- package/components/speed-dial/index.d.ts +5 -0
- package/components/speed-dial/public-api.d.ts +2 -0
- package/components/speed-dial/speed-dial.component.d.ts +63 -0
- package/components/transfer-picker/interface.d.ts +0 -1
- package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +8 -6
- package/components/treetable/index.d.ts +5 -0
- package/components/treetable/public-api.d.ts +2 -0
- package/components/treetable/treetable.component.d.ts +32 -0
- package/components/treetable/treetable.interface.d.ts +9 -0
- package/directives/animate-on-scroll/animate-on-scroll.directive.d.ts +4 -4
- package/directives/arrow-cursor/arrow-cursor.directive.d.ts +31 -0
- package/directives/arrow-cursor/index.d.ts +5 -0
- package/directives/arrow-cursor/public-api.d.ts +1 -0
- package/directives/data-exporter/constants.d.ts +26 -0
- package/directives/data-exporter/data-exporter.directive.d.ts +18 -0
- package/directives/data-exporter/index.d.ts +5 -0
- package/directives/data-exporter/mime.d.ts +5 -0
- package/directives/data-exporter/options.d.ts +21 -0
- package/directives/data-exporter/public-api.d.ts +2 -0
- package/directives/data-exporter/services/exporters/csv-exporter.service.d.ts +12 -0
- package/directives/data-exporter/services/exporters/exporter.d.ts +4 -0
- package/directives/data-exporter/services/exporters/file-exporter.d.ts +8 -0
- package/directives/data-exporter/services/exporters/json-exporter.service.d.ts +11 -0
- package/directives/data-exporter/services/exporters/txt-exporter.service.d.ts +12 -0
- package/directives/data-exporter/services/exporters/worksheet-exporter.d.ts +10 -0
- package/directives/data-exporter/services/exporters/xls-exporter.service.d.ts +14 -0
- package/directives/data-exporter/services/exporters/xlsx-exporter.service.d.ts +9 -0
- package/directives/data-exporter/services/file-util.d.ts +8 -0
- package/directives/data-exporter/services/service-locator.service.d.ts +11 -0
- package/directives/debounce/abstract-debounce.directive.d.ts +1 -1
- package/fesm2022/cmat-animations.mjs.map +1 -1
- package/fesm2022/cmat-components-adapter.mjs +9 -9
- package/fesm2022/cmat-components-adapter.mjs.map +1 -1
- package/fesm2022/cmat-components-breadcrumb.mjs +10 -10
- package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/cmat-components-card.mjs +4 -4
- package/fesm2022/cmat-components-card.mjs.map +1 -1
- package/fesm2022/cmat-components-carousel.mjs +711 -0
- package/fesm2022/cmat-components-carousel.mjs.map +1 -0
- package/fesm2022/cmat-components-cascade.mjs +12 -12
- package/fesm2022/cmat-components-cascade.mjs.map +1 -1
- package/fesm2022/cmat-components-chip-input.mjs +5 -5
- package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
- package/fesm2022/cmat-components-custom-formly.mjs +168 -155
- package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
- package/fesm2022/cmat-components-date-range.mjs +5 -5
- package/fesm2022/cmat-components-date-range.mjs.map +1 -1
- package/fesm2022/cmat-components-drawer.mjs +6 -6
- package/fesm2022/cmat-components-drawer.mjs.map +1 -1
- package/fesm2022/cmat-components-fullscreen.mjs +4 -4
- package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
- package/fesm2022/cmat-components-highlight.mjs +7 -7
- package/fesm2022/cmat-components-highlight.mjs.map +1 -1
- package/fesm2022/cmat-components-image-viewer.mjs +227 -0
- package/fesm2022/cmat-components-image-viewer.mjs.map +1 -0
- package/fesm2022/cmat-components-json-editor.mjs +4 -4
- package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
- package/fesm2022/cmat-components-knob-input.mjs +404 -0
- package/fesm2022/cmat-components-knob-input.mjs.map +1 -0
- package/fesm2022/cmat-components-masonry.mjs +4 -4
- package/fesm2022/cmat-components-masonry.mjs.map +1 -1
- package/fesm2022/cmat-components-material-color-picker.mjs +4 -4
- package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-material-datetimepicker.mjs +53 -53
- package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
- package/fesm2022/cmat-components-navigation.mjs +51 -51
- package/fesm2022/cmat-components-navigation.mjs.map +1 -1
- package/fesm2022/cmat-components-opt-input.mjs +457 -0
- package/fesm2022/cmat-components-opt-input.mjs.map +1 -0
- package/fesm2022/cmat-components-org-chart.mjs +141 -0
- package/fesm2022/cmat-components-org-chart.mjs.map +1 -0
- package/fesm2022/cmat-components-pagination.mjs +13 -13
- package/fesm2022/cmat-components-pagination.mjs.map +1 -1
- package/fesm2022/cmat-components-password-strength.mjs +12 -12
- package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
- package/fesm2022/cmat-components-popover.mjs +10 -10
- package/fesm2022/cmat-components-popover.mjs.map +1 -1
- package/fesm2022/cmat-components-progress-bar.mjs +4 -4
- package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
- package/fesm2022/cmat-components-rating.mjs +4 -4
- package/fesm2022/cmat-components-rating.mjs.map +1 -1
- package/fesm2022/cmat-components-select-search.mjs +11 -11
- package/fesm2022/cmat-components-select-search.mjs.map +1 -1
- package/fesm2022/cmat-components-select-table.mjs +658 -0
- package/fesm2022/cmat-components-select-table.mjs.map +1 -0
- package/fesm2022/cmat-components-select-tree.mjs +75 -57
- package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
- package/fesm2022/cmat-components-speed-dial.mjs +312 -0
- package/fesm2022/cmat-components-speed-dial.mjs.map +1 -0
- package/fesm2022/cmat-components-timeline.mjs +14 -14
- package/fesm2022/cmat-components-timeline.mjs.map +1 -1
- package/fesm2022/cmat-components-toast.mjs +11 -11
- package/fesm2022/cmat-components-toast.mjs.map +1 -1
- package/fesm2022/cmat-components-transfer-picker.mjs +60 -41
- package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-treetable.mjs +122 -0
- package/fesm2022/cmat-components-treetable.mjs.map +1 -0
- package/fesm2022/cmat-components-upload.mjs +11 -11
- package/fesm2022/cmat-components-upload.mjs.map +1 -1
- package/fesm2022/cmat-directives-animate-on-scroll.mjs +21 -21
- package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -1
- package/fesm2022/cmat-directives-arrow-cursor.mjs +184 -0
- package/fesm2022/cmat-directives-arrow-cursor.mjs.map +1 -0
- package/fesm2022/cmat-directives-autofocus.mjs +3 -3
- package/fesm2022/cmat-directives-autofocus.mjs.map +1 -1
- package/fesm2022/cmat-directives-data-exporter.mjs +324 -0
- package/fesm2022/cmat-directives-data-exporter.mjs.map +1 -0
- package/fesm2022/cmat-directives-debounce.mjs +9 -9
- package/fesm2022/cmat-directives-debounce.mjs.map +1 -1
- package/fesm2022/cmat-directives-digit-only.mjs +8 -6
- package/fesm2022/cmat-directives-digit-only.mjs.map +1 -1
- package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
- package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -1
- package/fesm2022/cmat-lib-mock-api.mjs +6 -6
- package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
- package/fesm2022/cmat-pipes-bytes.mjs +3 -3
- package/fesm2022/cmat-pipes-bytes.mjs.map +1 -1
- package/fesm2022/cmat-pipes-date-format.mjs +3 -3
- package/fesm2022/cmat-pipes-date-format.mjs.map +1 -1
- package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
- package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -1
- package/fesm2022/cmat-pipes-group-by.mjs +3 -3
- package/fesm2022/cmat-pipes-group-by.mjs.map +1 -1
- package/fesm2022/cmat-pipes-keys.mjs +3 -3
- package/fesm2022/cmat-pipes-keys.mjs.map +1 -1
- package/fesm2022/cmat-pipes-secure.mjs +3 -3
- package/fesm2022/cmat-pipes-secure.mjs.map +1 -1
- package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
- package/fesm2022/cmat-pipes-uppercase.mjs.map +1 -1
- package/fesm2022/cmat-services-alert.mjs +3 -3
- package/fesm2022/cmat-services-alert.mjs.map +1 -1
- package/fesm2022/cmat-services-config.mjs +6 -6
- package/fesm2022/cmat-services-config.mjs.map +1 -1
- package/fesm2022/cmat-services-confirmation.mjs +7 -7
- package/fesm2022/cmat-services-confirmation.mjs.map +1 -1
- package/fesm2022/cmat-services-data.mjs +3 -3
- package/fesm2022/cmat-services-data.mjs.map +1 -1
- package/fesm2022/cmat-services-export-as.mjs +211 -0
- package/fesm2022/cmat-services-export-as.mjs.map +1 -0
- package/fesm2022/cmat-services-loading.mjs +6 -6
- package/fesm2022/cmat-services-loading.mjs.map +1 -1
- package/fesm2022/cmat-services-local-storage.mjs +3 -3
- package/fesm2022/cmat-services-local-storage.mjs.map +1 -1
- package/fesm2022/cmat-services-media-watcher.mjs +3 -3
- package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
- package/fesm2022/cmat-services-platform.mjs +3 -3
- package/fesm2022/cmat-services-platform.mjs.map +1 -1
- package/fesm2022/cmat-services-splash-screen.mjs +3 -3
- package/fesm2022/cmat-services-splash-screen.mjs.map +1 -1
- package/fesm2022/cmat-services-title.mjs +3 -3
- package/fesm2022/cmat-services-title.mjs.map +1 -1
- package/fesm2022/cmat-services-translation.mjs +3 -3
- package/fesm2022/cmat-services-translation.mjs.map +1 -1
- package/fesm2022/cmat-services-utils.mjs +3 -3
- package/fesm2022/cmat-services-utils.mjs.map +1 -1
- package/fesm2022/cmat-validators.mjs.map +1 -1
- package/fesm2022/cmat-version.mjs.map +1 -1
- package/icons/arrow-cursor.svg +1 -1
- package/package.json +82 -148
- package/services/export-as/export-as-config.model.d.ts +8 -0
- package/services/export-as/export-as.service.d.ts +43 -0
- package/services/export-as/index.d.ts +5 -0
- package/services/export-as/public-api.d.ts +2 -0
- package/styles/overrides/angular-material.scss +95 -13
- package/esm2022/animations/cmat-animations.mjs +0 -5
- package/esm2022/animations/defaults.mjs +0 -12
- package/esm2022/animations/dropdown.mjs +0 -26
- package/esm2022/animations/expand-collapse.mjs +0 -17
- package/esm2022/animations/fade.mjs +0 -170
- package/esm2022/animations/public-api.mjs +0 -19
- package/esm2022/animations/shake.mjs +0 -59
- package/esm2022/animations/slide.mjs +0 -124
- package/esm2022/animations/transform.mjs +0 -16
- package/esm2022/animations/zoom.mjs +0 -38
- package/esm2022/cmat.mjs +0 -5
- package/esm2022/components/adapter/cmat-components-adapter.mjs +0 -5
- package/esm2022/components/adapter/datetime-adapter.mjs +0 -127
- package/esm2022/components/adapter/datetime-formats.mjs +0 -3
- package/esm2022/components/adapter/dayjs-date-adapter.mjs +0 -198
- package/esm2022/components/adapter/dayjs-date-formats.mjs +0 -12
- package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +0 -100
- package/esm2022/components/adapter/dayjs-datetime-formats.mjs +0 -21
- package/esm2022/components/adapter/native-datetime-adapter.mjs +0 -130
- package/esm2022/components/adapter/native-datetime-formats.mjs +0 -15
- package/esm2022/components/adapter/public-api.mjs +0 -9
- package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +0 -19
- package/esm2022/components/breadcrumb/breadcrumb.component.mjs +0 -94
- package/esm2022/components/breadcrumb/breadcrumb.service.mjs +0 -333
- package/esm2022/components/breadcrumb/cmat-components-breadcrumb.mjs +0 -5
- package/esm2022/components/breadcrumb/public-api.mjs +0 -6
- package/esm2022/components/breadcrumb/types/breadcrumb.config.mjs +0 -2
- package/esm2022/components/breadcrumb/types/breadcrumb.mjs +0 -2
- package/esm2022/components/card/card.component.mjs +0 -49
- package/esm2022/components/card/card.types.mjs +0 -2
- package/esm2022/components/card/cmat-components-card.mjs +0 -5
- package/esm2022/components/card/public-api.mjs +0 -3
- package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +0 -49
- package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +0 -384
- package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +0 -22
- package/esm2022/components/cascade/cmat-components-cascade.mjs +0 -5
- package/esm2022/components/cascade/options.interface.mjs +0 -2
- package/esm2022/components/cascade/public-api.mjs +0 -4
- package/esm2022/components/chip-input/chip-input.component.mjs +0 -251
- package/esm2022/components/chip-input/cmat-components-chip-input.mjs +0 -5
- package/esm2022/components/chip-input/public-api.mjs +0 -2
- package/esm2022/components/custom-formly/cmat-components-custom-formly.mjs +0 -5
- package/esm2022/components/custom-formly/extension/addons.extension.mjs +0 -13
- package/esm2022/components/custom-formly/public-api.mjs +0 -29
- package/esm2022/components/custom-formly/types/button/button.component.mjs +0 -81
- package/esm2022/components/custom-formly/types/cascade/cascade.component.mjs +0 -71
- package/esm2022/components/custom-formly/types/checklist/checklist.component.mjs +0 -161
- package/esm2022/components/custom-formly/types/chips/chips.component.mjs +0 -55
- package/esm2022/components/custom-formly/types/color-picker/color-picker.component.mjs +0 -15
- package/esm2022/components/custom-formly/types/date-range/date-range.component.mjs +0 -25
- package/esm2022/components/custom-formly/types/datepicker/datepicker.component.mjs +0 -51
- package/esm2022/components/custom-formly/types/multicheckbox/multicheckbox.component.mjs +0 -88
- package/esm2022/components/custom-formly/types/number/number.component.mjs +0 -27
- package/esm2022/components/custom-formly/types/quill/quill.component.mjs +0 -171
- package/esm2022/components/custom-formly/types/radio/radio.component.mjs +0 -87
- package/esm2022/components/custom-formly/types/rating/rating.component.mjs +0 -27
- package/esm2022/components/custom-formly/types/repeat/repeat.component.mjs +0 -25
- package/esm2022/components/custom-formly/types/select/select.component.mjs +0 -167
- package/esm2022/components/custom-formly/types/select-tree/select-tree.component.mjs +0 -66
- package/esm2022/components/custom-formly/types/stepper/horizontal/stepper.component.mjs +0 -28
- package/esm2022/components/custom-formly/types/stepper/stepper.type.mjs +0 -2
- package/esm2022/components/custom-formly/types/stepper/vertical/stepper.component.mjs +0 -28
- package/esm2022/components/custom-formly/types/table/table.component.mjs +0 -127
- package/esm2022/components/custom-formly/types/tabs/tab.component.mjs +0 -16
- package/esm2022/components/custom-formly/types/tags/tags.component.mjs +0 -146
- package/esm2022/components/custom-formly/types/textarea/textarea.component.mjs +0 -25
- package/esm2022/components/custom-formly/types/upload/upload.component.mjs +0 -58
- package/esm2022/components/custom-formly/wrappers/addons/addons.component.mjs +0 -92
- package/esm2022/components/custom-formly/wrappers/card/card.component.mjs +0 -14
- package/esm2022/components/custom-formly/wrappers/expansion/expansion.component.mjs +0 -14
- package/esm2022/components/custom-formly/wrappers/form-field/form-field.component.mjs +0 -47
- package/esm2022/components/custom-formly/wrappers/panel/panel.component.mjs +0 -12
- package/esm2022/components/date-range/cmat-components-date-range.mjs +0 -5
- package/esm2022/components/date-range/date-range.component.mjs +0 -558
- package/esm2022/components/date-range/public-api.mjs +0 -2
- package/esm2022/components/drawer/cmat-components-drawer.mjs +0 -5
- package/esm2022/components/drawer/drawer.component.mjs +0 -301
- package/esm2022/components/drawer/drawer.service.mjs +0 -41
- package/esm2022/components/drawer/drawer.types.mjs +0 -2
- package/esm2022/components/drawer/public-api.mjs +0 -4
- package/esm2022/components/fullscreen/cmat-components-fullscreen.mjs +0 -5
- package/esm2022/components/fullscreen/fullscreen.component.mjs +0 -44
- package/esm2022/components/fullscreen/public-api.mjs +0 -2
- package/esm2022/components/highlight/cmat-components-highlight.mjs +0 -5
- package/esm2022/components/highlight/highlight.component.mjs +0 -80
- package/esm2022/components/highlight/highlight.service.mjs +0 -47
- package/esm2022/components/highlight/public-api.mjs +0 -3
- package/esm2022/components/json-editor/cmat-components-json-editor.mjs +0 -5
- package/esm2022/components/json-editor/json-editor.component.mjs +0 -176
- package/esm2022/components/json-editor/public-api.mjs +0 -2
- package/esm2022/components/masonry/cmat-components-masonry.mjs +0 -5
- package/esm2022/components/masonry/masonry.component.mjs +0 -54
- package/esm2022/components/masonry/public-api.mjs +0 -2
- package/esm2022/components/material-color-picker/base-color.mjs +0 -13
- package/esm2022/components/material-color-picker/cmat-components-material-color-picker.mjs +0 -5
- package/esm2022/components/material-color-picker/material-color-picker.component.mjs +0 -147
- package/esm2022/components/material-color-picker/public-api.mjs +0 -3
- package/esm2022/components/material-color-picker/selected-color.mjs +0 -3
- package/esm2022/components/material-datetimepicker/calendar-body.mjs +0 -76
- package/esm2022/components/material-datetimepicker/calendar.mjs +0 -670
- package/esm2022/components/material-datetimepicker/clock.mjs +0 -290
- package/esm2022/components/material-datetimepicker/cmat-components-material-datetimepicker.mjs +0 -5
- package/esm2022/components/material-datetimepicker/datetimepicker-animations.mjs +0 -34
- package/esm2022/components/material-datetimepicker/datetimepicker-errors.mjs +0 -6
- package/esm2022/components/material-datetimepicker/datetimepicker-filtertype.mjs +0 -8
- package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +0 -341
- package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +0 -63
- package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +0 -87
- package/esm2022/components/material-datetimepicker/datetimepicker-types.mjs +0 -2
- package/esm2022/components/material-datetimepicker/datetimepicker.mjs +0 -531
- package/esm2022/components/material-datetimepicker/month-view.mjs +0 -141
- package/esm2022/components/material-datetimepicker/multi-year-view.mjs +0 -197
- package/esm2022/components/material-datetimepicker/public-api.mjs +0 -11
- package/esm2022/components/material-datetimepicker/time.mjs +0 -455
- package/esm2022/components/material-datetimepicker/year-view.mjs +0 -124
- package/esm2022/components/navigation/cmat-components-navigation.mjs +0 -5
- package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +0 -70
- package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +0 -82
- package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +0 -47
- package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +0 -47
- package/esm2022/components/navigation/horizontal/horizontal.component.mjs +0 -87
- package/esm2022/components/navigation/navigation.service.mjs +0 -140
- package/esm2022/components/navigation/navigation.types.mjs +0 -3
- package/esm2022/components/navigation/public-api.mjs +0 -5
- package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +0 -162
- package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +0 -60
- package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +0 -277
- package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +0 -56
- package/esm2022/components/navigation/vertical/components/group/group.component.mjs +0 -78
- package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +0 -56
- package/esm2022/components/navigation/vertical/vertical.component.mjs +0 -584
- package/esm2022/components/pagination/cmat-components-pagination.mjs +0 -5
- package/esm2022/components/pagination/pagination.component.mjs +0 -67
- package/esm2022/components/pagination/pagination.directive.mjs +0 -197
- package/esm2022/components/pagination/pagination.instance.mjs +0 -2
- package/esm2022/components/pagination/pagination.pipe.mjs +0 -100
- package/esm2022/components/pagination/pagination.service.mjs +0 -90
- package/esm2022/components/pagination/public-api.mjs +0 -6
- package/esm2022/components/password-strength/animations/index.mjs +0 -48
- package/esm2022/components/password-strength/cmat-components-password-strength.mjs +0 -5
- package/esm2022/components/password-strength/enum.mjs +0 -17
- package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +0 -27
- package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +0 -206
- package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +0 -150
- package/esm2022/components/password-strength/mat-password-strength-validator.mjs +0 -36
- package/esm2022/components/password-strength/public-api.mjs +0 -4
- package/esm2022/components/password-strength/regexp.class.mjs +0 -8
- package/esm2022/components/popover/cmat-components-popover.mjs +0 -5
- package/esm2022/components/popover/popover-trigger.mjs +0 -442
- package/esm2022/components/popover/popover.component.mjs +0 -348
- package/esm2022/components/popover/popover.errors.mjs +0 -27
- package/esm2022/components/popover/popover.interfaces.mjs +0 -2
- package/esm2022/components/popover/popover.target.mjs +0 -18
- package/esm2022/components/popover/popover.type.mjs +0 -2
- package/esm2022/components/popover/public-api.mjs +0 -5
- package/esm2022/components/progress-bar/cmat-components-progress-bar.mjs +0 -5
- package/esm2022/components/progress-bar/progress-bar.component.mjs +0 -58
- package/esm2022/components/progress-bar/public-api.mjs +0 -2
- package/esm2022/components/rating/cmat-components-rating.mjs +0 -5
- package/esm2022/components/rating/public-api.mjs +0 -2
- package/esm2022/components/rating/rating.component.mjs +0 -202
- package/esm2022/components/select-search/cmat-components-select-search.mjs +0 -5
- package/esm2022/components/select-search/default-options.mjs +0 -16
- package/esm2022/components/select-search/public-api.mjs +0 -3
- package/esm2022/components/select-search/select-no-entries-found.directive.mjs +0 -14
- package/esm2022/components/select-search/select-search-clear.directive.mjs +0 -14
- package/esm2022/components/select-search/select-search.component.mjs +0 -485
- package/esm2022/components/select-tree/cmat-components-select-tree.mjs +0 -5
- package/esm2022/components/select-tree/public-api.mjs +0 -4
- package/esm2022/components/select-tree/select-tree.component.mjs +0 -565
- package/esm2022/components/select-tree/select-tree.flatnode.mjs +0 -3
- package/esm2022/components/select-tree/select-tree.node.mjs +0 -3
- package/esm2022/components/timeline/cmat-components-timeline.mjs +0 -5
- package/esm2022/components/timeline/public-api.mjs +0 -3
- package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +0 -70
- package/esm2022/components/timeline/timeline.component.mjs +0 -107
- package/esm2022/components/toast/cmat-components-toast.mjs +0 -5
- package/esm2022/components/toast/models/global-config.model.mjs +0 -2
- package/esm2022/components/toast/models/toast.model.mjs +0 -2
- package/esm2022/components/toast/models/type.model.mjs +0 -2
- package/esm2022/components/toast/public-api.mjs +0 -7
- package/esm2022/components/toast/toast-modal.component.mjs +0 -53
- package/esm2022/components/toast/toast.component.mjs +0 -30
- package/esm2022/components/toast/toast.service.mjs +0 -122
- package/esm2022/components/transfer-picker/cmat-components-transfer-picker.mjs +0 -5
- package/esm2022/components/transfer-picker/filter/filter.component.mjs +0 -91
- package/esm2022/components/transfer-picker/interface.mjs +0 -17
- package/esm2022/components/transfer-picker/public-api.mjs +0 -8
- package/esm2022/components/transfer-picker/search/search.component.mjs +0 -38
- package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +0 -201
- package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +0 -32
- package/esm2022/components/transfer-picker/transfer-picker.component.mjs +0 -84
- package/esm2022/components/transfer-picker/transfer-picker.service.mjs +0 -137
- package/esm2022/components/upload/cmat-components-upload.mjs +0 -5
- package/esm2022/components/upload/files.type.mjs +0 -2
- package/esm2022/components/upload/files.util.service.mjs +0 -89
- package/esm2022/components/upload/public-api.mjs +0 -5
- package/esm2022/components/upload/upload-queue/upload-queue.component.mjs +0 -155
- package/esm2022/components/upload/upload.component.mjs +0 -118
- package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +0 -126
- package/esm2022/directives/animate-on-scroll/cmat-directives-animate-on-scroll.mjs +0 -5
- package/esm2022/directives/animate-on-scroll/public-api.mjs +0 -2
- package/esm2022/directives/animate-on-scroll/scroll.service.mjs +0 -38
- package/esm2022/directives/autofocus/autofocus.directive.mjs +0 -20
- package/esm2022/directives/autofocus/cmat-directives-autofocus.mjs +0 -5
- package/esm2022/directives/autofocus/public-api.mjs +0 -2
- package/esm2022/directives/debounce/abstract-debounce.directive.mjs +0 -34
- package/esm2022/directives/debounce/cmat-directives-debounce.mjs +0 -5
- package/esm2022/directives/debounce/debounce-click.directive.mjs +0 -25
- package/esm2022/directives/debounce/debounce-keyup.directive.mjs +0 -25
- package/esm2022/directives/debounce/public-api.mjs +0 -3
- package/esm2022/directives/digit-only/cmat-directives-digit-only.mjs +0 -5
- package/esm2022/directives/digit-only/digit-only.directive.mjs +0 -298
- package/esm2022/directives/digit-only/mask.directive.mjs +0 -84
- package/esm2022/directives/digit-only/public-api.mjs +0 -3
- package/esm2022/directives/equal-validator/cmat-directives-equal-validator.mjs +0 -5
- package/esm2022/directives/equal-validator/equal-validator.directive.mjs +0 -54
- package/esm2022/directives/equal-validator/public-api.mjs +0 -2
- package/esm2022/lib/mock-api/cmat-lib-mock-api.mjs +0 -5
- package/esm2022/lib/mock-api/mock-api.constants.mjs +0 -3
- package/esm2022/lib/mock-api/mock-api.interceptor.mjs +0 -73
- package/esm2022/lib/mock-api/mock-api.request-handler.mjs +0 -48
- package/esm2022/lib/mock-api/mock-api.service.mjs +0 -93
- package/esm2022/lib/mock-api/mock-api.types.mjs +0 -2
- package/esm2022/lib/mock-api/mock-api.utils.mjs +0 -16
- package/esm2022/lib/mock-api/public-api.mjs +0 -6
- package/esm2022/pipes/bytes/bytes.pipe.mjs +0 -25
- package/esm2022/pipes/bytes/cmat-pipes-bytes.mjs +0 -5
- package/esm2022/pipes/bytes/public-api.mjs +0 -2
- package/esm2022/pipes/date-format/cmat-pipes-date-format.mjs +0 -5
- package/esm2022/pipes/date-format/date-format.pipe.mjs +0 -20
- package/esm2022/pipes/date-format/public-api.mjs +0 -2
- package/esm2022/pipes/find-by-key/cmat-pipes-find-by-key.mjs +0 -5
- package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +0 -23
- package/esm2022/pipes/find-by-key/public-api.mjs +0 -2
- package/esm2022/pipes/group-by/cmat-pipes-group-by.mjs +0 -5
- package/esm2022/pipes/group-by/group-by.pipe.mjs +0 -29
- package/esm2022/pipes/group-by/public-api.mjs +0 -2
- package/esm2022/pipes/keys/cmat-pipes-keys.mjs +0 -5
- package/esm2022/pipes/keys/keys.pipe.mjs +0 -26
- package/esm2022/pipes/keys/public-api.mjs +0 -2
- package/esm2022/pipes/secure/cmat-pipes-secure.mjs +0 -5
- package/esm2022/pipes/secure/public-api.mjs +0 -2
- package/esm2022/pipes/secure/secure-pipe.mjs +0 -46
- package/esm2022/pipes/uppercase/cmat-pipes-uppercase.mjs +0 -5
- package/esm2022/pipes/uppercase/public-api.mjs +0 -2
- package/esm2022/pipes/uppercase/uppercase.pipe.mjs +0 -17
- package/esm2022/public-api.mjs +0 -2
- package/esm2022/services/alert/alert.dialog.mjs +0 -12
- package/esm2022/services/alert/alert.message.mjs +0 -9
- package/esm2022/services/alert/alert.service.mjs +0 -166
- package/esm2022/services/alert/cmat-services-alert.mjs +0 -5
- package/esm2022/services/alert/enum.mjs +0 -15
- package/esm2022/services/alert/public-api.mjs +0 -5
- package/esm2022/services/config/cmat-services-config.mjs +0 -5
- package/esm2022/services/config/config.constants.mjs +0 -3
- package/esm2022/services/config/config.service.mjs +0 -35
- package/esm2022/services/config/public-api.mjs +0 -4
- package/esm2022/services/config/urlStateConfig.service.mjs +0 -30
- package/esm2022/services/confirmation/cmat-services-confirmation.mjs +0 -5
- package/esm2022/services/confirmation/confirmation.service.mjs +0 -51
- package/esm2022/services/confirmation/confirmation.types.mjs +0 -2
- package/esm2022/services/confirmation/dialog/dialog.component.mjs +0 -25
- package/esm2022/services/confirmation/public-api.mjs +0 -3
- package/esm2022/services/data/cmat-services-data.mjs +0 -5
- package/esm2022/services/data/data.service.mjs +0 -169
- package/esm2022/services/data/public-api.mjs +0 -2
- package/esm2022/services/loading/cmat-services-loading.mjs +0 -5
- package/esm2022/services/loading/loading.interceptor.mjs +0 -29
- package/esm2022/services/loading/loading.service.mjs +0 -72
- package/esm2022/services/loading/public-api.mjs +0 -3
- package/esm2022/services/local-storage/cmat-services-local-storage.mjs +0 -5
- package/esm2022/services/local-storage/local-storage.service.mjs +0 -22
- package/esm2022/services/local-storage/public-api.mjs +0 -2
- package/esm2022/services/media-watcher/cmat-services-media-watcher.mjs +0 -5
- package/esm2022/services/media-watcher/media-watcher.service.mjs +0 -55
- package/esm2022/services/media-watcher/public-api.mjs +0 -2
- package/esm2022/services/platform/cmat-services-platform.mjs +0 -5
- package/esm2022/services/platform/platform.service.mjs +0 -46
- package/esm2022/services/platform/public-api.mjs +0 -2
- package/esm2022/services/splash-screen/cmat-services-splash-screen.mjs +0 -5
- package/esm2022/services/splash-screen/public-api.mjs +0 -2
- package/esm2022/services/splash-screen/splash-screen.service.mjs +0 -42
- package/esm2022/services/title/cmat-services-title.mjs +0 -5
- package/esm2022/services/title/public-api.mjs +0 -2
- package/esm2022/services/title/title.service.mjs +0 -46
- package/esm2022/services/translation/cmat-services-translation.mjs +0 -5
- package/esm2022/services/translation/public-api.mjs +0 -2
- package/esm2022/services/translation/translation.service.mjs +0 -62
- package/esm2022/services/utils/cmat-services-utils.mjs +0 -5
- package/esm2022/services/utils/public-api.mjs +0 -2
- package/esm2022/services/utils/utils.service.mjs +0 -467
- package/esm2022/validators/cmat-validators.mjs +0 -5
- package/esm2022/validators/public-api.mjs +0 -2
- package/esm2022/validators/validators.mjs +0 -33
- package/esm2022/version/cmat-version.mjs +0 -5
- package/esm2022/version/public-api.mjs +0 -2
- package/esm2022/version/version.mjs +0 -11
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
import { TemplatePortal } from '@angular/cdk/portal';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { FormControl, NG_VALUE_ACCESSOR, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
6
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
-
import { MatInputModule } from '@angular/material/input';
|
|
9
|
-
import dayjs from 'dayjs';
|
|
10
|
-
import isBetween from 'dayjs/plugin/isBetween';
|
|
11
|
-
import { Subject } from 'rxjs';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/cdk/overlay";
|
|
14
|
-
import * as i2 from "@angular/forms";
|
|
15
|
-
import * as i3 from "@angular/material/button";
|
|
16
|
-
import * as i4 from "@angular/material/icon";
|
|
17
|
-
import * as i5 from "@angular/material/datepicker";
|
|
18
|
-
import * as i6 from "@angular/material/form-field";
|
|
19
|
-
import * as i7 from "@angular/material/input";
|
|
20
|
-
export class CmatDateRangeComponent {
|
|
21
|
-
constructor(_overlay, _viewContainerRef, _changeDetectorRef) {
|
|
22
|
-
this._overlay = _overlay;
|
|
23
|
-
this._viewContainerRef = _viewContainerRef;
|
|
24
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
25
|
-
this.rangeChanged = new EventEmitter();
|
|
26
|
-
this.activeDates = {
|
|
27
|
-
month1: null,
|
|
28
|
-
month2: null
|
|
29
|
-
};
|
|
30
|
-
this.setWhichDate = 'start';
|
|
31
|
-
this._range = {
|
|
32
|
-
start: null,
|
|
33
|
-
end: null
|
|
34
|
-
};
|
|
35
|
-
this._timeRegExp = new RegExp('^(0[0-9]|1[0-9]|2[0-4]|[0-9]):([0-5][0-9])(A|(?:AM)|P|(?:PM))?$', 'i');
|
|
36
|
-
this._unsubscribeAll = new Subject();
|
|
37
|
-
dayjs.extend(isBetween);
|
|
38
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
39
|
-
this._onChange = () => { };
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
41
|
-
this._onTouched = () => { };
|
|
42
|
-
this.dateFormat = 'YYYY/MM/DD';
|
|
43
|
-
this.timeFormat = '12';
|
|
44
|
-
}
|
|
45
|
-
get readonly() {
|
|
46
|
-
return this._readonly;
|
|
47
|
-
}
|
|
48
|
-
set readonly(value) {
|
|
49
|
-
this._readonly = value;
|
|
50
|
-
}
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
52
|
-
get dateFormat() {
|
|
53
|
-
return this._dateFormat;
|
|
54
|
-
}
|
|
55
|
-
set dateFormat(value) {
|
|
56
|
-
// Return if the values are the same
|
|
57
|
-
if (this._dateFormat === value) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
// Store the value
|
|
61
|
-
this._dateFormat = value;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Setter & getter for timeFormat input */
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
66
|
-
get timeFormat() {
|
|
67
|
-
return this._timeFormat;
|
|
68
|
-
}
|
|
69
|
-
set timeFormat(value) {
|
|
70
|
-
// Return if the values are the same
|
|
71
|
-
if (this._timeFormat === value) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
// Set format based on the time format input
|
|
75
|
-
this._timeFormat = value === '12' ? 'hh:mmA' : 'HH:mm';
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Setter & getter for timeRange input */
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
80
|
-
get timeRange() {
|
|
81
|
-
return this._timeRange;
|
|
82
|
-
}
|
|
83
|
-
set timeRange(value) {
|
|
84
|
-
// Return if the values are the same
|
|
85
|
-
if (this._timeRange === value) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
// Store the value
|
|
89
|
-
this._timeRange = value;
|
|
90
|
-
// If the time range turned off...
|
|
91
|
-
if (!value && this._range.start && this._range.end) {
|
|
92
|
-
this.range = {
|
|
93
|
-
start: this._range.start.clone().startOf('day'),
|
|
94
|
-
end: this._range.end.clone().endOf('day')
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Setter & getter for range input */
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
101
|
-
get range() {
|
|
102
|
-
if (this._range.start && this._range.end) {
|
|
103
|
-
// Clone the range start and end
|
|
104
|
-
const start = this._range.start.clone();
|
|
105
|
-
const end = this._range.end.clone();
|
|
106
|
-
// Build and return the range object
|
|
107
|
-
return {
|
|
108
|
-
startDate: start.clone().format(this.dateFormat),
|
|
109
|
-
startTime: this.timeRange ? start.clone().format(this.timeFormat) : null,
|
|
110
|
-
endDate: end.clone().format(this.dateFormat),
|
|
111
|
-
endTime: this.timeRange ? end.clone().format(this.timeFormat) : null
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
return void 0;
|
|
115
|
-
}
|
|
116
|
-
set range(value) {
|
|
117
|
-
if (!value) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
// Check if the value is an object and has 'start' and 'end' values
|
|
121
|
-
if (!value.start || !value.end) {
|
|
122
|
-
console.error('Range input must have "start" and "end" properties!');
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
// Check if we are setting an individual date or both of them
|
|
126
|
-
const whichDate = value.whichDate || null;
|
|
127
|
-
// Get the start and end dates as moment
|
|
128
|
-
const start = dayjs(value.start);
|
|
129
|
-
const end = dayjs(value.end);
|
|
130
|
-
// If we are only setting the start date...
|
|
131
|
-
if (whichDate === 'start') {
|
|
132
|
-
// Set the start date
|
|
133
|
-
this._range.start = start.clone();
|
|
134
|
-
// If the selected start date is after the end date...
|
|
135
|
-
if (this._range.end && this._range.start.isAfter(this._range.end)) {
|
|
136
|
-
// Set the end date to the start date but keep the end date's time
|
|
137
|
-
const endDate = start.clone().hour(this._range.end.hour()).minute(this._range.end.minute()).second(this._range.end.second());
|
|
138
|
-
// Test this new end date to see if it's ahead of the start date
|
|
139
|
-
if (this._range.start.isBefore(endDate)) {
|
|
140
|
-
// If it's, set the new end date
|
|
141
|
-
this._range.end = endDate;
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
// Otherwise, set the end date same as the start date
|
|
145
|
-
this._range.end = start.clone();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// If we are only setting the end date...
|
|
150
|
-
if (whichDate === 'end') {
|
|
151
|
-
// Set the end date
|
|
152
|
-
this._range.end = end.clone();
|
|
153
|
-
// If the selected end date is before the start date...
|
|
154
|
-
if (this._range.start?.isAfter(this._range.end)) {
|
|
155
|
-
// Set the start date to the end date but keep the start date's time
|
|
156
|
-
const startDate = end.clone().hour(this._range.start.hour()).minute(this._range.start.minute()).second(this._range.start.second());
|
|
157
|
-
// Test this new end date to see if it's ahead of the start date
|
|
158
|
-
if (this._range.end.isAfter(startDate)) {
|
|
159
|
-
// If it's, set the new start date
|
|
160
|
-
this._range.start = startDate;
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
// Otherwise, set the start date same as the end date
|
|
164
|
-
this._range.start = end.clone();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
// If we are setting both dates...
|
|
169
|
-
if (!whichDate) {
|
|
170
|
-
// Set the start date
|
|
171
|
-
this._range.start = start.clone();
|
|
172
|
-
// If the start date is before the end date, set the end date as normal.
|
|
173
|
-
// If the start date is after the end date, set the end date same as the start date.
|
|
174
|
-
this._range.end = start.isBefore(end) ? end.clone() : start.clone();
|
|
175
|
-
}
|
|
176
|
-
if (this._range.start && this._range.end) {
|
|
177
|
-
// Prepare another range object that holds the ISO formatted range dates
|
|
178
|
-
const range = {
|
|
179
|
-
start: this._range.start.clone().toISOString(),
|
|
180
|
-
end: this._range.end.clone().toISOString()
|
|
181
|
-
};
|
|
182
|
-
// Emit the range changed event with the range
|
|
183
|
-
this.rangeChanged.emit(range);
|
|
184
|
-
// Update the model with the range if the change was not a programmatic change
|
|
185
|
-
// Because programmatic changes trigger writeValue which triggers onChange and onTouched
|
|
186
|
-
// internally causing them to trigger twice which breaks the form's pristine and touched
|
|
187
|
-
// statuses.
|
|
188
|
-
if (!this._programmaticChange) {
|
|
189
|
-
this._onTouched(range);
|
|
190
|
-
this._onChange(range);
|
|
191
|
-
}
|
|
192
|
-
// Set the active dates
|
|
193
|
-
this.activeDates = {
|
|
194
|
-
month1: this._range.start.clone(),
|
|
195
|
-
month2: this._range.start.clone().add(1, 'month')
|
|
196
|
-
};
|
|
197
|
-
// Set the time form controls
|
|
198
|
-
this.startTimeFormControl.setValue(this._range.start.clone().format(this._timeFormat).toString());
|
|
199
|
-
this.endTimeFormControl.setValue(this._range.end.clone().format(this._timeFormat).toString());
|
|
200
|
-
}
|
|
201
|
-
// Run ngAfterContentInit on month views to trigger
|
|
202
|
-
// re-render on month views if they are available
|
|
203
|
-
if (this._matMonthView1 && this._matMonthView2) {
|
|
204
|
-
this._matMonthView1.ngAfterContentInit();
|
|
205
|
-
this._matMonthView2.ngAfterContentInit();
|
|
206
|
-
}
|
|
207
|
-
// Reset the programmatic change status
|
|
208
|
-
this._programmaticChange = false;
|
|
209
|
-
}
|
|
210
|
-
// -----------------------------------------------------------------------------------------------------
|
|
211
|
-
// @ Control Value Accessor
|
|
212
|
-
// -----------------------------------------------------------------------------------------------------
|
|
213
|
-
/**
|
|
214
|
-
* Update the form model on change
|
|
215
|
-
*
|
|
216
|
-
* @param fn
|
|
217
|
-
*/
|
|
218
|
-
registerOnChange(fn) {
|
|
219
|
-
this._onChange = fn;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Update the form model on blur
|
|
223
|
-
*
|
|
224
|
-
* @param fn
|
|
225
|
-
*/
|
|
226
|
-
registerOnTouched(fn) {
|
|
227
|
-
this._onTouched = fn;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Write to view from model when the form model changes programmatically
|
|
231
|
-
*
|
|
232
|
-
* @param range
|
|
233
|
-
*/
|
|
234
|
-
writeValue(range) {
|
|
235
|
-
// Set this change as a programmatic one
|
|
236
|
-
this._programmaticChange = true;
|
|
237
|
-
// Set the range
|
|
238
|
-
this.range = range;
|
|
239
|
-
this._changeDetectorRef.markForCheck();
|
|
240
|
-
}
|
|
241
|
-
ngOnInit() {
|
|
242
|
-
// Initialize the component
|
|
243
|
-
this._init();
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* On destroy
|
|
247
|
-
*/
|
|
248
|
-
ngOnDestroy() {
|
|
249
|
-
this._unsubscribeAll.next(void 0);
|
|
250
|
-
this._unsubscribeAll.complete();
|
|
251
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
252
|
-
this.writeValue = () => { };
|
|
253
|
-
}
|
|
254
|
-
// -----------------------------------------------------------------------------------------------------
|
|
255
|
-
// @ Public methods
|
|
256
|
-
// -----------------------------------------------------------------------------------------------------
|
|
257
|
-
/**
|
|
258
|
-
* Open the picker panel
|
|
259
|
-
*/
|
|
260
|
-
openPickerPanel() {
|
|
261
|
-
if (this.readonly)
|
|
262
|
-
return;
|
|
263
|
-
// Create the overlay
|
|
264
|
-
const overlayRef = this._overlay.create({
|
|
265
|
-
panelClass: 'cmat-date-range-panel',
|
|
266
|
-
backdropClass: '',
|
|
267
|
-
hasBackdrop: true,
|
|
268
|
-
scrollStrategy: this._overlay.scrollStrategies.reposition(),
|
|
269
|
-
positionStrategy: this._overlay.position()
|
|
270
|
-
.flexibleConnectedTo(this._pickerPanelOrigin)
|
|
271
|
-
.withPositions([
|
|
272
|
-
{
|
|
273
|
-
originX: 'start',
|
|
274
|
-
originY: 'bottom',
|
|
275
|
-
overlayX: 'start',
|
|
276
|
-
overlayY: 'top',
|
|
277
|
-
offsetY: 8
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
originX: 'start',
|
|
281
|
-
originY: 'top',
|
|
282
|
-
overlayX: 'start',
|
|
283
|
-
overlayY: 'bottom',
|
|
284
|
-
offsetY: -8
|
|
285
|
-
}
|
|
286
|
-
])
|
|
287
|
-
});
|
|
288
|
-
// Create a portal from the template
|
|
289
|
-
const templatePortal = new TemplatePortal(this._pickerPanel, this._viewContainerRef);
|
|
290
|
-
// On backdrop click
|
|
291
|
-
overlayRef.backdropClick().subscribe(() => {
|
|
292
|
-
// If template portal exists and attached...
|
|
293
|
-
if (templatePortal?.isAttached) {
|
|
294
|
-
// Detach it
|
|
295
|
-
templatePortal.detach();
|
|
296
|
-
}
|
|
297
|
-
// If overlay exists and attached...
|
|
298
|
-
if (overlayRef?.hasAttached()) {
|
|
299
|
-
// Detach it
|
|
300
|
-
overlayRef.detach();
|
|
301
|
-
overlayRef.dispose();
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
// Attach the portal to the overlay
|
|
305
|
-
overlayRef.attach(templatePortal);
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Get month label
|
|
309
|
-
*
|
|
310
|
-
* @param month
|
|
311
|
-
*/
|
|
312
|
-
getMonthLabel(month) {
|
|
313
|
-
if (month === 1) {
|
|
314
|
-
return this.activeDates.month1?.clone().format('YYYY MMMM');
|
|
315
|
-
}
|
|
316
|
-
return this.activeDates.month2?.clone().format('YYYY MMMM');
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Date class function to add/remove class names to calendar days
|
|
320
|
-
*/
|
|
321
|
-
dateClass() {
|
|
322
|
-
return (date) => {
|
|
323
|
-
// If the date is both start and end date...
|
|
324
|
-
if (date.isSame(this._range.start, 'day') && date.isSame(this._range.end, 'day')) {
|
|
325
|
-
return ['cmat-date-range', 'cmat-date-range-start', 'cmat-date-range-end'];
|
|
326
|
-
}
|
|
327
|
-
// If the date is the start date...
|
|
328
|
-
if (date.isSame(this._range.start, 'day')) {
|
|
329
|
-
return ['cmat-date-range', 'cmat-date-range-start'];
|
|
330
|
-
}
|
|
331
|
-
// If the date is the end date...
|
|
332
|
-
if (date.isSame(this._range.end, 'day')) {
|
|
333
|
-
return ['cmat-date-range', 'cmat-date-range-end'];
|
|
334
|
-
}
|
|
335
|
-
// If the date is in between start and end dates...
|
|
336
|
-
if (date.isBetween(this._range.start, this._range.end, 'day')) {
|
|
337
|
-
return ['cmat-date-range', 'cmat-date-range-mid'];
|
|
338
|
-
}
|
|
339
|
-
return void 0;
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Date filter to enable/disable calendar days
|
|
344
|
-
*/
|
|
345
|
-
dateFilter() {
|
|
346
|
-
// If we are selecting the end date, disable all the dates that comes before the start date
|
|
347
|
-
return (date) => !(this.setWhichDate === 'end' && date.isBefore(this._range.start, 'day'));
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* On selected date change
|
|
351
|
-
*
|
|
352
|
-
* @param date
|
|
353
|
-
*/
|
|
354
|
-
onSelectedDateChange(date) {
|
|
355
|
-
if (this._range.start && this._range.end) {
|
|
356
|
-
// Create a new range object
|
|
357
|
-
const newRange = {
|
|
358
|
-
start: this._range.start.clone().toISOString(),
|
|
359
|
-
end: this._range.end.clone().toISOString(),
|
|
360
|
-
whichDate: ''
|
|
361
|
-
};
|
|
362
|
-
// Replace either the start or the end date with the new one
|
|
363
|
-
// depending on which date we are setting
|
|
364
|
-
if (this.setWhichDate === 'start') {
|
|
365
|
-
newRange.start = dayjs(newRange.start).year(date.year()).month(date.month()).date(date.date()).toISOString();
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
newRange.end = dayjs(newRange.end).year(date.year()).month(date.month()).date(date.date()).toISOString();
|
|
369
|
-
}
|
|
370
|
-
// Append the which date to the new range object
|
|
371
|
-
newRange.whichDate = this.setWhichDate;
|
|
372
|
-
// Switch which date to set on the next run
|
|
373
|
-
this.setWhichDate = this.setWhichDate === 'start' ? 'end' : 'start';
|
|
374
|
-
// Set the range
|
|
375
|
-
this.range = newRange;
|
|
376
|
-
this._changeDetectorRef.markForCheck();
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Go to previous month on both views
|
|
381
|
-
*/
|
|
382
|
-
prev() {
|
|
383
|
-
this.activeDates.month1 = dayjs(this.activeDates.month1).subtract(1, 'month');
|
|
384
|
-
this.activeDates.month2 = dayjs(this.activeDates.month2).subtract(1, 'month');
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Go to next month on both views
|
|
388
|
-
*/
|
|
389
|
-
next() {
|
|
390
|
-
this.activeDates.month1 = dayjs(this.activeDates.month1).add(1, 'month');
|
|
391
|
-
this.activeDates.month2 = dayjs(this.activeDates.month2).add(1, 'month');
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Update the start time
|
|
395
|
-
*
|
|
396
|
-
* @param event
|
|
397
|
-
*/
|
|
398
|
-
updateStartTime(event) {
|
|
399
|
-
// Parse the time
|
|
400
|
-
const parsedTime = this._parseTime(event.target.value);
|
|
401
|
-
// Go back to the previous value if the form control is not valid
|
|
402
|
-
if (this.startTimeFormControl.invalid) {
|
|
403
|
-
if (this._range.start) {
|
|
404
|
-
// Override the time
|
|
405
|
-
const time = this._range.start.clone().format(this._timeFormat);
|
|
406
|
-
// Set the time
|
|
407
|
-
this.startTimeFormControl.setValue(time);
|
|
408
|
-
}
|
|
409
|
-
// Do not update the range
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
if (this._range.start && this._range.end) {
|
|
413
|
-
// Append the new time to the start date
|
|
414
|
-
const startDate = this._range.start.clone().hour(parsedTime.hour()).minute(parsedTime.minute());
|
|
415
|
-
// If the new start date is after the current end date,
|
|
416
|
-
// use the end date's time and set the start date again
|
|
417
|
-
if (startDate.isAfter(this._range.end)) {
|
|
418
|
-
const endDateHours = this._range.end.hour();
|
|
419
|
-
const endDateMinutes = this._range.end.minute();
|
|
420
|
-
// Set the start date
|
|
421
|
-
startDate.hour(endDateHours).minute(endDateMinutes);
|
|
422
|
-
}
|
|
423
|
-
// If everything is okay, set the new date
|
|
424
|
-
this.range = {
|
|
425
|
-
start: startDate.toISOString(),
|
|
426
|
-
end: this._range.end.clone().toISOString(),
|
|
427
|
-
whichDate: 'start'
|
|
428
|
-
};
|
|
429
|
-
this._changeDetectorRef.markForCheck();
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Update the end time
|
|
434
|
-
*
|
|
435
|
-
* @param event
|
|
436
|
-
*/
|
|
437
|
-
updateEndTime(event) {
|
|
438
|
-
// Parse the time
|
|
439
|
-
const parsedTime = this._parseTime(event.target.value);
|
|
440
|
-
// Go back to the previous value if the form control is not valid
|
|
441
|
-
if (this.endTimeFormControl.invalid) {
|
|
442
|
-
if (this._range.end) {
|
|
443
|
-
// Override the time
|
|
444
|
-
const time = this._range.end.clone().format(this._timeFormat);
|
|
445
|
-
// Set the time
|
|
446
|
-
this.endTimeFormControl.setValue(time);
|
|
447
|
-
}
|
|
448
|
-
// Do not update the range
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
if (this._range.start && this._range.end) {
|
|
452
|
-
// Append the new time to the end date
|
|
453
|
-
const endDate = this._range.end.clone().hour(parsedTime.hour()).minute(parsedTime.minute());
|
|
454
|
-
// If the new end date is before the current start date,
|
|
455
|
-
// use the start date's time and set the end date again
|
|
456
|
-
if (endDate.isBefore(this._range.start)) {
|
|
457
|
-
const startDateHours = this._range.start.hour();
|
|
458
|
-
const startDateMinutes = this._range.start.minute();
|
|
459
|
-
// Set the end date
|
|
460
|
-
endDate.hour(startDateHours).minute(startDateMinutes);
|
|
461
|
-
}
|
|
462
|
-
// If everything is okay, set the new date
|
|
463
|
-
this.range = {
|
|
464
|
-
start: this._range.start.clone().toISOString(),
|
|
465
|
-
end: endDate.toISOString(),
|
|
466
|
-
whichDate: 'end'
|
|
467
|
-
};
|
|
468
|
-
this._changeDetectorRef.markForCheck();
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
// -----------------------------------------------------------------------------------------------------
|
|
472
|
-
// @ Private methods
|
|
473
|
-
// -----------------------------------------------------------------------------------------------------
|
|
474
|
-
/**
|
|
475
|
-
* Initialize
|
|
476
|
-
*
|
|
477
|
-
* @private
|
|
478
|
-
*/
|
|
479
|
-
_init() {
|
|
480
|
-
// Start and end time form controls
|
|
481
|
-
this.startTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]);
|
|
482
|
-
this.endTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]);
|
|
483
|
-
// Set the default range
|
|
484
|
-
this._programmaticChange = true;
|
|
485
|
-
this.range = {
|
|
486
|
-
start: dayjs().startOf('day').toISOString(),
|
|
487
|
-
end: dayjs().add(1, 'day').endOf('day').toISOString()
|
|
488
|
-
};
|
|
489
|
-
// Set the default time range
|
|
490
|
-
this._programmaticChange = true;
|
|
491
|
-
this.timeRange = true;
|
|
492
|
-
this._changeDetectorRef.markForCheck();
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* Parse the time from the inputs
|
|
496
|
-
*
|
|
497
|
-
* @param value
|
|
498
|
-
* @private
|
|
499
|
-
*/
|
|
500
|
-
_parseTime(value) {
|
|
501
|
-
// Parse the time using the time regexp
|
|
502
|
-
const timeArr = value.split(this._timeRegExp).filter(part => part !== '');
|
|
503
|
-
// Get the meridiem
|
|
504
|
-
const meridiem = timeArr[2] || null;
|
|
505
|
-
// If meridiem exists...
|
|
506
|
-
if (meridiem) {
|
|
507
|
-
// Create a moment using 12-hours format and return it
|
|
508
|
-
return dayjs(value, 'hh:mmA').second(0);
|
|
509
|
-
}
|
|
510
|
-
// If meridiem doesn't exist, create a moment using 24-hours format and return in
|
|
511
|
-
return dayjs(value, 'HH:mm').second(0);
|
|
512
|
-
}
|
|
513
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: CmatDateRangeComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
514
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: CmatDateRangeComponent, isStandalone: true, selector: "cmat-date-range", inputs: { readonly: "readonly", dateFormat: "dateFormat", timeFormat: "timeFormat", timeRange: "timeRange", range: "range" }, outputs: { rangeChanged: "rangeChanged" }, providers: [
|
|
515
|
-
{
|
|
516
|
-
provide: NG_VALUE_ACCESSOR,
|
|
517
|
-
useExisting: forwardRef(() => CmatDateRangeComponent),
|
|
518
|
-
multi: true
|
|
519
|
-
}
|
|
520
|
-
], viewQueries: [{ propertyName: "_matMonthView1", first: true, predicate: ["matMonthView1"], descendants: true }, { propertyName: "_matMonthView2", first: true, predicate: ["matMonthView2"], descendants: true }, { propertyName: "_pickerPanelOrigin", first: true, predicate: ["pickerPanelOrigin"], descendants: true, read: ElementRef }, { propertyName: "_pickerPanel", first: true, predicate: ["pickerPanel"], descendants: true }], exportAs: ["cmatDateRange"], ngImport: i0, template: "<div #pickerPanelOrigin role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\">\r\n\r\n <div class=\"start\">\r\n <div class=\"date\">{{range.startDate}}</div>\r\n @if (range.startTime) {\r\n <div class=\"time\">{{range.startTime}}</div>\r\n }\r\n </div>\r\n\r\n <div class=\"separator\">-</div>\r\n\r\n <div class=\"end\">\r\n <div class=\"date\">{{range.endDate}}</div>\r\n @if (range.endTime) {\r\n <div class=\"time\">{{range.endTime}}</div>\r\n }\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #pickerPanel>\r\n\r\n <!-- Start -->\r\n <div class=\"start\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <button type=\"button\" class=\"previous-button\" mat-icon-button tabindex=\"1\" (click)=\"prev()\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\r\n </button>\r\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\r\n </div>\r\n <mat-month-view #matMonthView1 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n [(activeDate)]=\"activeDates.month1\" (click)=\"$event.stopImmediatePropagation()\"\r\n (selectedChange)=\"onSelectedDateChange($event)\">\r\n </mat-month-view>\r\n </div>\r\n\r\n @if (timeRange) {\r\n <mat-form-field class=\"time start-time\">\r\n <input matInput tabindex=\"3\" [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\"\r\n (blur)=\"updateStartTime($event)\">\r\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n }\r\n\r\n </div>\r\n\r\n <!-- End -->\r\n <div class=\"end\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\r\n <button type=\"button\" class=\"next-button\" mat-icon-button tabindex=\"2\" (click)=\"next()\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\r\n </button>\r\n </div>\r\n <mat-month-view #matMonthView2 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n [(activeDate)]=\"activeDates.month2\" (click)=\"$event.stopImmediatePropagation()\"\r\n (selectedChange)=\"onSelectedDateChange($event)\">\r\n </mat-month-view>\r\n </div>\r\n\r\n @if (timeRange) {\r\n <mat-form-field class=\"time end-time\">\r\n <input matInput tabindex=\"4\" [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\">\r\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n }\r\n\r\n </div>\r\n\r\n </ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}.cmat-date-range-panel{border-radius:4px;padding:24px}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatMonthView, selector: "mat-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName", "activeDrag"], outputs: ["selectedChange", "_userSelection", "dragStarted", "dragEnded", "activeDateChange"], exportAs: ["matMonthView"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
521
|
-
}
|
|
522
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: CmatDateRangeComponent, decorators: [{
|
|
523
|
-
type: Component,
|
|
524
|
-
args: [{ selector: 'cmat-date-range', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatDateRange', providers: [
|
|
525
|
-
{
|
|
526
|
-
provide: NG_VALUE_ACCESSOR,
|
|
527
|
-
useExisting: forwardRef(() => CmatDateRangeComponent),
|
|
528
|
-
multi: true
|
|
529
|
-
}
|
|
530
|
-
], standalone: true, imports: [FormsModule, ReactiveFormsModule, MatButtonModule, MatIconModule,
|
|
531
|
-
MatDatepickerModule, MatFormFieldModule,
|
|
532
|
-
MatInputModule], template: "<div #pickerPanelOrigin role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\">\r\n\r\n <div class=\"start\">\r\n <div class=\"date\">{{range.startDate}}</div>\r\n @if (range.startTime) {\r\n <div class=\"time\">{{range.startTime}}</div>\r\n }\r\n </div>\r\n\r\n <div class=\"separator\">-</div>\r\n\r\n <div class=\"end\">\r\n <div class=\"date\">{{range.endDate}}</div>\r\n @if (range.endTime) {\r\n <div class=\"time\">{{range.endTime}}</div>\r\n }\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #pickerPanel>\r\n\r\n <!-- Start -->\r\n <div class=\"start\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <button type=\"button\" class=\"previous-button\" mat-icon-button tabindex=\"1\" (click)=\"prev()\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\r\n </button>\r\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\r\n </div>\r\n <mat-month-view #matMonthView1 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n [(activeDate)]=\"activeDates.month1\" (click)=\"$event.stopImmediatePropagation()\"\r\n (selectedChange)=\"onSelectedDateChange($event)\">\r\n </mat-month-view>\r\n </div>\r\n\r\n @if (timeRange) {\r\n <mat-form-field class=\"time start-time\">\r\n <input matInput tabindex=\"3\" [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\"\r\n (blur)=\"updateStartTime($event)\">\r\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n }\r\n\r\n </div>\r\n\r\n <!-- End -->\r\n <div class=\"end\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\r\n <button type=\"button\" class=\"next-button\" mat-icon-button tabindex=\"2\" (click)=\"next()\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\r\n </button>\r\n </div>\r\n <mat-month-view #matMonthView2 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n [(activeDate)]=\"activeDates.month2\" (click)=\"$event.stopImmediatePropagation()\"\r\n (selectedChange)=\"onSelectedDateChange($event)\">\r\n </mat-month-view>\r\n </div>\r\n\r\n @if (timeRange) {\r\n <mat-form-field class=\"time end-time\">\r\n <input matInput tabindex=\"4\" [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\">\r\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n }\r\n\r\n </div>\r\n\r\n </ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}.cmat-date-range-panel{border-radius:4px;padding:24px}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"] }]
|
|
533
|
-
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { rangeChanged: [{
|
|
534
|
-
type: Output
|
|
535
|
-
}], _matMonthView1: [{
|
|
536
|
-
type: ViewChild,
|
|
537
|
-
args: ['matMonthView1']
|
|
538
|
-
}], _matMonthView2: [{
|
|
539
|
-
type: ViewChild,
|
|
540
|
-
args: ['matMonthView2']
|
|
541
|
-
}], _pickerPanelOrigin: [{
|
|
542
|
-
type: ViewChild,
|
|
543
|
-
args: ['pickerPanelOrigin', { read: ElementRef }]
|
|
544
|
-
}], _pickerPanel: [{
|
|
545
|
-
type: ViewChild,
|
|
546
|
-
args: ['pickerPanel']
|
|
547
|
-
}], readonly: [{
|
|
548
|
-
type: Input
|
|
549
|
-
}], dateFormat: [{
|
|
550
|
-
type: Input
|
|
551
|
-
}], timeFormat: [{
|
|
552
|
-
type: Input
|
|
553
|
-
}], timeRange: [{
|
|
554
|
-
type: Input
|
|
555
|
-
}], range: [{
|
|
556
|
-
type: Input
|
|
557
|
-
}] } });
|
|
558
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM04sT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTJDLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQXNCL0IsTUFBTSxPQUFPLHNCQUFzQjtJQTRCL0IsWUFDWSxRQUFpQixFQUNqQixpQkFBbUMs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b250ZW50IjpbImltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3JzLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2FsZW5kYXJDZWxsQ3NzQ2xhc3NlcywgTWF0TW9udGhWaWV3LCBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgZGF5anMsIHsgRGF5anMgfSBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY21hdC1kYXRlLXJhbmdlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtcmFuZ2UuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGV4cG9ydEFzOiAnY21hdERhdGVSYW5nZScsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDbWF0RGF0ZVJhbmdlQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSxNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFxyXG4gICAgICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgXHJcbiAgICAgICAgTWF0SW5wdXRNb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbWF0RGF0ZVJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJhbmdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4oKTtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzEnKSBwcml2YXRlIF9tYXRNb250aFZpZXcxOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzInKSBwcml2YXRlIF9tYXRNb250aFZpZXcyOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlclBhbmVsT3JpZ2luJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgX3BpY2tlclBhbmVsT3JpZ2luOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgncGlja2VyUGFuZWwnKSBwcml2YXRlIF9waWNrZXJQYW5lbDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBhY3RpdmVEYXRlczogeyBtb250aDE6IERheWpzIHwgbnVsbDsgbW9udGgyOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBtb250aDE6IG51bGwsXHJcbiAgICAgICAgbW9udGgyOiBudWxsXHJcbiAgICB9O1xyXG4gICAgc2V0V2hpY2hEYXRlOiAnc3RhcnQnIHwgJ2VuZCcgPSAnc3RhcnQnO1xyXG4gICAgc3RhcnRUaW1lRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gICAgZW5kVGltZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICAgIHByaXZhdGUgX2RhdGVGb3JtYXQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIF9wcm9ncmFtbWF0aWNDaGFuZ2UhOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfcmFuZ2U6IHsgc3RhcnQ6IERheWpzIHwgbnVsbDsgZW5kOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBzdGFydDogbnVsbCxcclxuICAgICAgICBlbmQ6IG51bGxcclxuICAgIH07XHJcbiAgICBwcml2YXRlIF90aW1lRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90aW1lUmFuZ2U6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVSZWdFeHA6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtNF18WzAtOV0pOihbMC01XVswLTldKShBfCg/OkFNKXxQfCg/OlBNKSk/JCcsICdpJyk7XHJcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXHJcbiAgICAgICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgICkge1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSAoKTogdm9pZCA9PiB7IH07XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHsgfTtcclxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSAnWVlZWS9NTS9ERCc7XHJcbiAgICAgICAgdGhpcy50aW1lRm9ybWF0ID0gJzEyJzsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCByZWFkb25seSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVGb3JtYXQ7XHJcbiAgICB9XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRlRm9ybWF0ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0ZXIgJiBnZXR0ZXIgZm9yIHRpbWVGb3JtYXQgaW5wdXQgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgdGltZUZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lRm9ybWF0O1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB0aW1lRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fdGltZUZvcm1hdCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGZvcm1hdCBiYXNlZCBvbiB0aGUgdGltZSBmb3JtYXQgaW5wdXRcclxuICAgICAgICB0aGlzLl90aW1lRm9ybWF0ID0gdmFsdWUgPT09ICcxMicgPyAnaGg6bW1BJyA6ICdISDptbSc7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHRlciAmIGdldHRlciBmb3IgdGltZVJhbmdlIGlucHV0ICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IHRpbWVSYW5nZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZVJhbmdlO1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB0aW1lUmFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fdGltZVJhbmdlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLl90aW1lUmFuZ2UgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgcmFuZ2UgdHVybmVkIG9mZi4uLlxyXG4gICAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5fcmFuZ2Uuc3RhcnQgJiYgdGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS5zdGFydE9mKCdkYXknKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZW5kT2YoJ2RheScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGVyICYgZ2V0dGVyIGZvciByYW5nZSBpbnB1dCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCByYW5nZSgpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmRcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yYW5nZS5lbmQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuZCByZXR1cm4gdGhlIHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBzdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lOiB0aGlzLnRpbWVSYW5nZSA/IHN0YXJ0LmNsb25lKCkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuZGF0ZUZvcm1hdCksXHJcbiAgICAgICAgICAgICAgICBlbmRUaW1lOiB0aGlzLnRpbWVSYW5nZSA/IGVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpIDogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHJhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IGFuZCBoYXMgJ3N0YXJ0JyBhbmQgJ2VuZCcgdmFsdWVzXHJcbiAgICAgICAgaWYgKCF2YWx1ZS5zdGFydCB8fCAhdmFsdWUuZW5kKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JhbmdlIGlucHV0IG11c3QgaGF2ZSBcInN0YXJ0XCIgYW5kIFwiZW5kXCIgcHJvcGVydGllcyEnKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBzZXR0aW5nIGFuIGluZGl2aWR1YWwgZGF0ZSBvciBib3RoIG9mIHRoZW1cclxuICAgICAgICBjb25zdCB3aGljaERhdGUgPSB2YWx1ZS53aGljaERhdGUgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzIGFzIG1vbWVudFxyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZGF5anModmFsdWUuc3RhcnQpO1xyXG4gICAgICAgIGNvbnN0IGVuZCA9IGRheWpzKHZhbHVlLmVuZCk7XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBvbmx5IHNldHRpbmcgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICBpZiAod2hpY2hEYXRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IHN0YXJ0LmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLmVuZCAmJiB0aGlzLl9yYW5nZS5zdGFydC5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGRhdGUgdG8gdGhlIHN0YXJ0IGRhdGUgYnV0IGtlZXAgdGhlIGVuZCBkYXRlJ3MgdGltZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHN0YXJ0LmNsb25lKCkuaG91cih0aGlzLl9yYW5nZS5lbmQuaG91cigpKS5taW51dGUodGhpcy5fcmFuZ2UuZW5kLm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2UuZW5kLnNlY29uZCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHRoaXMgbmV3IGVuZCBkYXRlIHRvIHNlZSBpZiBpdCdzIGFoZWFkIG9mIHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzLCBzZXQgdGhlIG5ldyBlbmQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLmVuZCA9IGVuZERhdGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLmVuZCA9IHN0YXJ0LmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBvbmx5IHNldHRpbmcgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgaWYgKHdoaWNoRGF0ZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBlbmQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCBlbmQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0Py5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZSB0byB0aGUgZW5kIGRhdGUgYnV0IGtlZXAgdGhlIHN0YXJ0IGRhdGUncyB0aW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBlbmQuY2xvbmUoKS5ob3VyKHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLnN0YXJ0Lm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2Uuc3RhcnQuc2Vjb25kKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhpcyBuZXcgZW5kIGRhdGUgdG8gc2VlIGlmIGl0J3MgYWhlYWQgb2YgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQuaXNBZnRlcihzdGFydERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIHN0YXJ0IGRhdGUgc2FtZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IGVuZC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgc2V0dGluZyBib3RoIGRhdGVzLi4uXHJcbiAgICAgICAgaWYgKCF3aGljaERhdGUpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBkYXRlIGlzIGJlZm9yZSB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgYXMgbm9ybWFsLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZS5cclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gc3RhcnQuaXNCZWZvcmUoZW5kKSA/IGVuZC5jbG9uZSgpIDogc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gUHJlcGFyZSBhbm90aGVyIHJhbmdlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBJU08gZm9ybWF0dGVkIHJhbmdlIGRhdGVzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCB0aGUgcmFuZ2UgY2hhbmdlZCBldmVudCB3aXRoIHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlQ2hhbmdlZC5lbWl0KHJhbmdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgd2l0aCB0aGUgcmFuZ2UgaWYgdGhlIGNoYW5nZSB3YXMgbm90IGEgcHJvZ3JhbW1hdGljIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHByb2dyYW1tYXRpYyBjaGFuZ2VzIHRyaWdnZXIgd3JpdGVWYWx1ZSB3aGljaCB0cmlnZ2VycyBvbkNoYW5nZSBhbmQgb25Ub3VjaGVkXHJcbiAgICAgICAgICAgIC8vIGludGVybmFsbHkgY2F1c2luZyB0aGVtIHRvIHRyaWdnZXIgdHdpY2Ugd2hpY2ggYnJlYWtzIHRoZSBmb3JtJ3MgcHJpc3RpbmUgYW5kIHRvdWNoZWRcclxuICAgICAgICAgICAgLy8gc3RhdHVzZXMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQocmFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGVzID0ge1xyXG4gICAgICAgICAgICAgICAgbW9udGgxOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgbW9udGgyOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuX3RpbWVGb3JtYXQpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUnVuIG5nQWZ0ZXJDb250ZW50SW5pdCBvbiBtb250aCB2aWV3cyB0byB0cmlnZ2VyXHJcbiAgICAgICAgLy8gcmUtcmVuZGVyIG9uIG1vbnRoIHZpZXdzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmICh0aGlzLl9tYXRNb250aFZpZXcxICYmIHRoaXMuX21hdE1vbnRoVmlldzIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3MS5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3Mi5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9ncmFtbWF0aWMgY2hhbmdlIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBibHVyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIHRvIHZpZXcgZnJvbSBtb2RlbCB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByYW5nZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKHJhbmdlOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhpcyBjaGFuZ2UgYXMgYSBwcm9ncmFtbWF0aWMgb25lXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgdGhpcy5faW5pdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPbiBkZXN0cm95XHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQodm9pZCAwKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlID0gKCk6IHZvaWQgPT4geyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3BlbiB0aGUgcGlja2VyIHBhbmVsXHJcbiAgICAgKi9cclxuICAgIG9wZW5QaWNrZXJQYW5lbCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZWFkb25seSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIG92ZXJsYXlcclxuICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnY21hdC1kYXRlLXJhbmdlLXBhbmVsJyxcclxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogJycsXHJcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9waWNrZXJQYW5lbE9yaWdpbilcclxuICAgICAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiA4XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAtOFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIHBvcnRhbCBmcm9tIHRoZSB0ZW1wbGF0ZVxyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuX3BpY2tlclBhbmVsLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcclxuXHJcbiAgICAgICAgLy8gT24gYmFja2Ryb3AgY2xpY2tcclxuICAgICAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGVtcGxhdGUgcG9ydGFsIGV4aXN0cyBhbmQgYXR0YWNoZWQuLi5cclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlUG9ydGFsPy5pc0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZXRhY2ggaXRcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9ydGFsLmRldGFjaCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBvdmVybGF5IGV4aXN0cyBhbmQgYXR0YWNoZWQuLi5cclxuICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERldGFjaCBpdFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgcG9ydGFsIHRvIHRoZSBvdmVybGF5XHJcbiAgICAgICAgb3ZlcmxheVJlZi5hdHRhY2godGVtcGxhdGVQb3J0YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IG1vbnRoIGxhYmVsXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG1vbnRoXHJcbiAgICAgKi9cclxuICAgIGdldE1vbnRoTGFiZWwobW9udGg6IG51bWJlcik6IHN0cmluZyB8IHZvaWQge1xyXG4gICAgICAgIGlmIChtb250aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVEYXRlcy5tb250aDE/LmNsb25lKCkuZm9ybWF0KCdZWVlZIE1NTU0nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMj8uY2xvbmUoKS5mb3JtYXQoJ1lZWVkgTU1NTScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0ZSBjbGFzcyBmdW5jdGlvbiB0byBhZGQvcmVtb3ZlIGNsYXNzIG5hbWVzIHRvIGNhbGVuZGFyIGRheXNcclxuICAgICAqL1xyXG4gICAgZGF0ZUNsYXNzKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIChkYXRlOiBEYXlqcyk6IE1hdENhbGVuZGFyQ2VsbENzc0NsYXNzZXMgfCB2b2lkID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGlzIGJvdGggc3RhcnQgYW5kIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5zdGFydCwgJ2RheScpICYmIGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLmVuZCwgJ2RheScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWydjbWF0LWRhdGUtcmFuZ2UnLCAnY21hdC1kYXRlLXJhbmdlLXN0YXJ0JywgJ2NtYXQtZGF0ZS1yYW5nZS1lbmQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLnN0YXJ0LCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2Utc3RhcnQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5lbmQsICdkYXknKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnY21hdC1kYXRlLXJhbmdlJywgJ2NtYXQtZGF0ZS1yYW5nZS1lbmQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgaW4gYmV0d2VlbiBzdGFydCBhbmQgZW5kIGRhdGVzLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzQmV0d2Vlbih0aGlzLl9yYW5nZS5zdGFydCwgdGhpcy5fcmFuZ2UuZW5kLCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2UtbWlkJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGUgZmlsdGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNhbGVuZGFyIGRheXNcclxuICAgICAqL1xyXG4gICAgZGF0ZUZpbHRlcigpOiBhbnkge1xyXG4gICAgICAgIC8vIElmIHdlIGFyZSBzZWxlY3RpbmcgdGhlIGVuZCBkYXRlLCBkaXNhYmxlIGFsbCB0aGUgZGF0ZXMgdGhhdCBjb21lcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICByZXR1cm4gKGRhdGU6IERheWpzKTogYm9vbGVhbiA9PiAhKHRoaXMuc2V0V2hpY2hEYXRlID09PSAnZW5kJyAmJiBkYXRlLmlzQmVmb3JlKHRoaXMuX3JhbmdlLnN0YXJ0LCAnZGF5JykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGF0ZVxyXG4gICAgICovXHJcbiAgICBvblNlbGVjdGVkRGF0ZUNoYW5nZShkYXRlOiBEYXlqcyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB3aGljaERhdGU6ICcnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBsYWNlIGVpdGhlciB0aGUgc3RhcnQgb3IgdGhlIGVuZCBkYXRlIHdpdGggdGhlIG5ldyBvbmVcclxuICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGRhdGUgd2UgYXJlIHNldHRpbmdcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0V2hpY2hEYXRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdSYW5nZS5zdGFydCA9IGRheWpzKG5ld1JhbmdlLnN0YXJ0KS55ZWFyKGRhdGUueWVhcigpKS5tb250aChkYXRlLm1vbnRoKCkpLmRhdGUoZGF0ZS5kYXRlKCkpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdSYW5nZS5lbmQgPSBkYXlqcyhuZXdSYW5nZS5lbmQpLnllYXIoZGF0ZS55ZWFyKCkpLm1vbnRoKGRhdGUubW9udGgoKSkuZGF0ZShkYXRlLmRhdGUoKSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSB3aGljaCBkYXRlIHRvIHRoZSBuZXcgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICAgIG5ld1JhbmdlLndoaWNoRGF0ZSA9IHRoaXMuc2V0V2hpY2hEYXRlO1xyXG5cclxuICAgICAgICAgICAgLy8gU3dpdGNoIHdoaWNoIGRhdGUgdG8gc2V0IG9uIHRoZSBuZXh0IHJ1blxyXG4gICAgICAgICAgICB0aGlzLnNldFdoaWNoRGF0ZSA9IHRoaXMuc2V0V2hpY2hEYXRlID09PSAnc3RhcnQnID8gJ2VuZCcgOiAnc3RhcnQnO1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0gbmV3UmFuZ2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHbyB0byBwcmV2aW91cyBtb250aCBvbiBib3RoIHZpZXdzXHJcbiAgICAgKi9cclxuICAgIHByZXYoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDEgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSkuc3VidHJhY3QoMSwgJ21vbnRoJyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDIgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMikuc3VidHJhY3QoMSwgJ21vbnRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHbyB0byBuZXh0IG1vbnRoIG9uIGJvdGggdmlld3NcclxuICAgICAqL1xyXG4gICAgbmV4dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxKS5hZGQoMSwgJ21vbnRoJyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDIgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMikuYWRkKDEsICdtb250aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBzdGFydCB0aW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVN0YXJ0VGltZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLy8gUGFyc2UgdGhlIHRpbWVcclxuICAgICAgICBjb25zdCBwYXJzZWRUaW1lID0gdGhpcy5fcGFyc2VUaW1lKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHZhbHVlIGlmIHRoZSBmb3JtIGNvbnRyb2wgaXMgbm90IHZhbGlkXHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRUaW1lRm9ybUNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSB0aW1lICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS5mb3JtYXQodGhpcy5fdGltZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZUZvcm1Db250cm9sLnNldFZhbHVlKHRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGltZSB0byB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmhvdXIocGFyc2VkVGltZS5ob3VyKCkpLm1pbnV0ZShwYXJzZWRUaW1lLm1pbnV0ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgY3VycmVudCBlbmQgZGF0ZSxcclxuICAgICAgICAgICAgLy8gdXNlIHRoZSBlbmQgZGF0ZSdzIHRpbWUgYW5kIHNldCB0aGUgc3RhcnQgZGF0ZSBhZ2FpblxyXG4gICAgICAgICAgICBpZiAoc3RhcnREYXRlLmlzQWZ0ZXIodGhpcy5fcmFuZ2UuZW5kKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZUhvdXJzID0gdGhpcy5fcmFuZ2UuZW5kLmhvdXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGVNaW51dGVzID0gdGhpcy5fcmFuZ2UuZW5kLm1pbnV0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLmhvdXIoZW5kRGF0ZUhvdXJzKS5taW51dGUoZW5kRGF0ZU1pbnV0ZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBldmVyeXRoaW5nIGlzIG9rYXksIHNldCB0aGUgbmV3IGRhdGVcclxuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHdoaWNoRGF0ZTogJ3N0YXJ0J1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBlbmQgdGltZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVFbmRUaW1lKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSB0aGlzLl9wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlIGZvcm0gY29udHJvbCBpcyBub3QgdmFsaWRcclxuICAgICAgICBpZiAodGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgdGltZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5kVGltZUZvcm1Db250cm9sLnNldFZhbHVlKHRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGltZSB0byB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmhvdXIocGFyc2VkVGltZS5ob3VyKCkpLm1pbnV0ZShwYXJzZWRUaW1lLm1pbnV0ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBjdXJyZW50IHN0YXJ0IGRhdGUsXHJcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RhcnQgZGF0ZSdzIHRpbWUgYW5kIHNldCB0aGUgZW5kIGRhdGUgYWdhaW5cclxuICAgICAgICAgICAgaWYgKGVuZERhdGUuaXNCZWZvcmUodGhpcy5fcmFuZ2Uuc3RhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGVIb3VycyA9IHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZU1pbnV0ZXMgPSB0aGlzLl9yYW5nZS5zdGFydC5taW51dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBkYXRlXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlLmhvdXIoc3RhcnREYXRlSG91cnMpLm1pbnV0ZShzdGFydERhdGVNaW51dGVzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBva2F5LCBzZXQgdGhlIG5ldyBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB3aGljaERhdGU6ICdlbmQnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgUHJpdmF0ZSBtZXRob2RzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZVxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gU3RhcnQgYW5kIGVuZCB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICB0aGlzLnN0YXJ0VGltZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5wYXR0ZXJuKHRoaXMuX3RpbWVSZWdFeHApXSk7XHJcbiAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnBhdHRlcm4odGhpcy5fdGltZVJlZ0V4cCldKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHJhbmdlXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICBzdGFydDogZGF5anMoKS5zdGFydE9mKCdkYXknKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICBlbmQ6IGRheWpzKCkuYWRkKDEsICdkYXknKS5lbmRPZignZGF5JykudG9JU09TdHJpbmcoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0aW1lIHJhbmdlXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRpbWVSYW5nZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgdGhlIHRpbWUgZnJvbSB0aGUgaW5wdXRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9wYXJzZVRpbWUodmFsdWU6IHN0cmluZyk6IERheWpzIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZSB1c2luZyB0aGUgdGltZSByZWdleHBcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gdmFsdWUuc3BsaXQodGhpcy5fdGltZVJlZ0V4cCkuZmlsdGVyKHBhcnQgPT4gcGFydCAhPT0gJycpO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIG1lcmlkaWVtXHJcbiAgICAgICAgY29uc3QgbWVyaWRpZW0gPSB0aW1lQXJyWzJdIHx8IG51bGw7XHJcblxyXG4gICAgICAgIC8vIElmIG1lcmlkaWVtIGV4aXN0cy4uLlxyXG4gICAgICAgIGlmIChtZXJpZGllbSkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBtb21lbnQgdXNpbmcgMTItaG91cnMgZm9ybWF0IGFuZCByZXR1cm4gaXRcclxuICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnaGg6bW1BJykuc2Vjb25kKDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgbWVyaWRpZW0gZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgbW9tZW50IHVzaW5nIDI0LWhvdXJzIGZvcm1hdCBhbmQgcmV0dXJuIGluXHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnSEg6bW0nKS5zZWNvbmQoMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjcGlja2VyUGFuZWxPcmlnaW4gcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicmFuZ2VcIiAoY2xpY2spPVwib3BlblBpY2tlclBhbmVsKClcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInN0YXJ0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPnt7cmFuZ2Uuc3RhcnREYXRlfX08L2Rpdj5cclxuICAgIEBpZiAocmFuZ2Uuc3RhcnRUaW1lKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lXCI+e3tyYW5nZS5zdGFydFRpbWV9fTwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+LTwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZW5kXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPnt7cmFuZ2UuZW5kRGF0ZX19PC9kaXY+XHJcbiAgICBAaWYgKHJhbmdlLmVuZFRpbWUpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInRpbWVcIj57e3JhbmdlLmVuZFRpbWV9fTwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI3BpY2tlclBhbmVsPlxyXG5cclxuICA8IS0tIFN0YXJ0IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJzdGFydFwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb250aFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmV2aW91cy1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gdGFiaW5kZXg9XCIxXCIgKGNsaWNrKT1cInByZXYoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTpjaGV2cm9uLWxlZnQnXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtbGFiZWxcIj57e2dldE1vbnRoTGFiZWwoMSl9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1tb250aC12aWV3ICNtYXRNb250aFZpZXcxIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXIoKVwiIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzKClcIlxyXG4gICAgICAgIFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZXMubW9udGgxXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgPC9tYXQtbW9udGgtdmlldz5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIEBpZiAodGltZVJhbmdlKSB7XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRpbWUgc3RhcnQtdGltZVwiPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0YWJpbmRleD1cIjNcIiBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCIgW2Zvcm1Db250cm9sXT1cInN0YXJ0VGltZUZvcm1Db250cm9sXCJcclxuICAgICAgICAgIChibHVyKT1cInVwZGF0ZVN0YXJ0VGltZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPuW8gOWni+aXtumXtDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIH1cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEVuZCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJlbmRcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb250aFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1sYWJlbFwiPnt7Z2V0TW9udGhMYWJlbCgyKX19PC9kaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5leHQtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiMlwiIChjbGljayk9XCJuZXh0KClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTpjaGV2cm9uLXJpZ2h0J1wiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LW1vbnRoLXZpZXcgI21hdE1vbnRoVmlldzIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlcigpXCIgW2RhdGVDbGFzc109XCJkYXRlQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbKGFjdGl2ZURhdGUpXT1cImFjdGl2ZURhdGVzLm1vbnRoMlwiIChjbGljayk9XCIkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICA8L21hdC1tb250aC12aWV3PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAodGltZVJhbmdlKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGltZSBlbmQtdGltZVwiPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHRhYmluZGV4PVwiNFwiIFtmb3JtQ29udHJvbF09XCJlbmRUaW1lRm9ybUNvbnRyb2xcIiAoYmx1cik9XCJ1cGRhdGVFbmRUaW1lKCRldmVudClcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+57uT5p2f5pe26Ze0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfVxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L25nLXRlbXBsYXRlPiJdfQ==
|