@ardium-ui/ui 1.0.3 → 2.0.2
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/README.md +25 -25
- package/esm2022/lib/_internal/boolean-component.mjs +28 -42
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +5 -5
- package/esm2022/lib/_internal/disablable-component.mjs +24 -22
- package/esm2022/lib/_internal/focusable-component.mjs +12 -25
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
- package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
- package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
- package/esm2022/lib/_internal/queue.mjs +1 -1
- package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
- package/esm2022/lib/badge/badge.directive.mjs +70 -99
- package/esm2022/lib/badge/badge.module.mjs +5 -5
- package/esm2022/lib/badge/badge.types.mjs +1 -1
- package/esm2022/lib/badge/index.mjs +4 -0
- package/esm2022/lib/buttons/_button-base.mjs +13 -35
- package/esm2022/lib/buttons/button/button.component.mjs +22 -37
- package/esm2022/lib/buttons/button/button.module.mjs +5 -5
- package/esm2022/lib/buttons/button/index.mjs +3 -0
- package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
- package/esm2022/lib/buttons/fab/fab.module.mjs +5 -5
- package/esm2022/lib/buttons/fab/index.mjs +3 -0
- package/esm2022/lib/buttons/general-button.types.mjs +1 -1
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +5 -5
- package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
- package/esm2022/lib/card/card.children.mjs +32 -33
- package/esm2022/lib/card/card.component.mjs +14 -17
- package/esm2022/lib/card/card.module.mjs +5 -5
- package/esm2022/lib/card/card.types.mjs +1 -1
- package/esm2022/lib/card/index.mjs +5 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
- package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
- package/esm2022/lib/checkbox/checkbox.types.mjs +1 -1
- package/esm2022/lib/checkbox/index.mjs +4 -0
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +5 -5
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +1 -1
- package/esm2022/lib/checkbox-list/index.mjs +4 -0
- package/esm2022/lib/chip/chip.component.mjs +22 -42
- package/esm2022/lib/chip/chip.module.mjs +5 -5
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
- package/esm2022/lib/chip/index.mjs +5 -0
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
- package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
- package/esm2022/lib/color/color-display/color-display.module.mjs +5 -5
- package/esm2022/lib/color/color-display/color-display.types.mjs +1 -1
- package/esm2022/lib/color/color-display/index.mjs +4 -0
- package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
- package/esm2022/lib/dialog/dialog.component.mjs +54 -130
- package/esm2022/lib/dialog/dialog.directives.mjs +4 -4
- package/esm2022/lib/dialog/dialog.module.mjs +5 -5
- package/esm2022/lib/dialog/dialog.types.mjs +1 -1
- package/esm2022/lib/dialog/index.mjs +5 -0
- package/esm2022/lib/divider/divider.component.mjs +9 -14
- package/esm2022/lib/divider/divider.module.mjs +5 -5
- package/esm2022/lib/divider/index.mjs +3 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +5 -5
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +1 -1
- package/esm2022/lib/dropdown-panel/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +10 -10
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
- package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +19 -19
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +5 -5
- package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
- package/esm2022/lib/file-inputs/file-input-types.mjs +1 -1
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +7 -7
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +5 -5
- package/esm2022/lib/form-field-frame/index.mjs +4 -0
- package/esm2022/lib/icon/icon.component.mjs +32 -67
- package/esm2022/lib/icon/icon.module.mjs +5 -5
- package/esm2022/lib/icon/icon.pipe.mjs +4 -4
- package/esm2022/lib/icon/index.mjs +4 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +25 -25
- package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +5 -5
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +10 -10
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
- package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
- package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
- package/esm2022/lib/inputs/input/index.mjs +4 -0
- package/esm2022/lib/inputs/input/input.component.mjs +95 -154
- package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
- package/esm2022/lib/inputs/input/input.module.mjs +21 -7
- package/esm2022/lib/inputs/input-transformers.mjs +6 -6
- package/esm2022/lib/inputs/input-types.mjs +1 -1
- package/esm2022/lib/inputs/input-utils.mjs +75 -94
- package/esm2022/lib/inputs/number-input/index.mjs +4 -0
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +4 -4
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +5 -5
- package/esm2022/lib/inputs/password-input/index.mjs +5 -0
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +13 -13
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +5 -5
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
- package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +10 -10
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +5 -5
- package/esm2022/lib/kbd/index.mjs +4 -0
- package/esm2022/lib/kbd/kbd.component.mjs +15 -29
- package/esm2022/lib/kbd/kbd.module.mjs +5 -5
- package/esm2022/lib/kbd/kbd.pipe.mjs +4 -4
- package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +5 -5
- package/esm2022/lib/modal/index.mjs +3 -0
- package/esm2022/lib/modal/modal.component.mjs +42 -83
- package/esm2022/lib/modal/modal.module.mjs +5 -5
- package/esm2022/lib/option/index.mjs +3 -0
- package/esm2022/lib/option/option.component.mjs +24 -46
- package/esm2022/lib/option/option.module.mjs +5 -5
- package/esm2022/lib/progress-bar/index.mjs +5 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +4 -4
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +5 -5
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
- package/esm2022/lib/progress-circle/index.mjs +5 -0
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +4 -4
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +5 -5
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
- package/esm2022/lib/radio/index.mjs +4 -0
- package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
- package/esm2022/lib/radio/radio-group.component.mjs +71 -85
- package/esm2022/lib/radio/radio.module.mjs +5 -5
- package/esm2022/lib/search-functions.mjs +7 -7
- package/esm2022/lib/segment/index.mjs +5 -0
- package/esm2022/lib/segment/segment.component.mjs +70 -137
- package/esm2022/lib/segment/segment.directives.mjs +4 -4
- package/esm2022/lib/segment/segment.module.mjs +5 -5
- package/esm2022/lib/segment/segment.types.mjs +1 -1
- package/esm2022/lib/select/index.mjs +5 -0
- package/esm2022/lib/select/select.component.mjs +348 -655
- package/esm2022/lib/select/select.directive.mjs +46 -46
- package/esm2022/lib/select/select.module.mjs +5 -5
- package/esm2022/lib/select/select.types.mjs +1 -1
- package/esm2022/lib/slide-toggle/index.mjs +4 -0
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +5 -5
- package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
- package/esm2022/lib/slider/abstract-slider.mjs +111 -200
- package/esm2022/lib/slider/index.mjs +7 -0
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +5 -5
- package/esm2022/lib/slider/slider.component.mjs +13 -10
- package/esm2022/lib/slider/slider.directive.mjs +4 -4
- package/esm2022/lib/slider/slider.module.mjs +7 -7
- package/esm2022/lib/slider/slider.types.mjs +1 -1
- package/esm2022/lib/snackbar/index.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
- package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
- package/esm2022/lib/snackbar/snackbar.token.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
- package/esm2022/lib/spinner/index.mjs +3 -0
- package/esm2022/lib/spinner/spinner.component.mjs +9 -13
- package/esm2022/lib/spinner/spinner.module.mjs +5 -5
- package/esm2022/lib/star/index.mjs +4 -0
- package/esm2022/lib/star/star-button/index.mjs +3 -0
- package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
- package/esm2022/lib/star/star-button/star-button.module.mjs +5 -5
- package/esm2022/lib/star/star-display/index.mjs +3 -0
- package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
- package/esm2022/lib/star/star-display/star-display.module.mjs +5 -5
- package/esm2022/lib/star/star-input/index.mjs +3 -0
- package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
- package/esm2022/lib/star/star-input/star-input.module.mjs +5 -5
- package/esm2022/lib/star/star.component.mjs +12 -20
- package/esm2022/lib/star/star.module.mjs +5 -5
- package/esm2022/lib/star/star.types.mjs +1 -1
- package/esm2022/lib/statebox/index.mjs +3 -0
- package/esm2022/lib/statebox/statebox.component.mjs +64 -102
- package/esm2022/lib/statebox/statebox.module.mjs +5 -5
- package/esm2022/lib/statebox/statebox.types.mjs +1 -1
- package/esm2022/lib/tabber/index.mjs +4 -0
- package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
- package/esm2022/lib/tabber/tabber.component.mjs +83 -0
- package/esm2022/lib/tabber/tabber.module.mjs +19 -0
- package/esm2022/lib/table/index.mjs +5 -0
- package/esm2022/lib/table/table-item-storage.mjs +204 -200
- package/esm2022/lib/table/table.component.mjs +184 -304
- package/esm2022/lib/table/table.directives.mjs +19 -21
- package/esm2022/lib/table/table.module.mjs +5 -5
- package/esm2022/lib/table/table.types.mjs +1 -1
- package/esm2022/lib/table/utils.mjs +1 -1
- package/esm2022/lib/table-from-csv/index.mjs +3 -0
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +5 -5
- package/esm2022/lib/table-pagination/index.mjs +4 -0
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +5 -5
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +1 -1
- package/esm2022/lib/types/alignment.types.mjs +1 -1
- package/esm2022/lib/types/colors.types.mjs +1 -1
- package/esm2022/lib/types/item-storage.types.mjs +1 -1
- package/esm2022/lib/types/theming.types.mjs +1 -1
- package/esm2022/lib/types/utility.types.mjs +2 -2
- package/esm2022/public-api.mjs +58 -182
- package/fesm2022/ardium-ui-ui.mjs +7847 -11692
- package/fesm2022/ardium-ui-ui.mjs.map +1 -1
- package/lib/_internal/boolean-component.d.ts +8 -9
- package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
- package/lib/_internal/disablable-component.d.ts +12 -7
- package/lib/_internal/focusable-component.d.ts +5 -7
- package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
- package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
- package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
- package/lib/_internal/models/pagination.model.d.ts +38 -42
- package/lib/_internal/ngmodel-component.d.ts +1 -1
- package/lib/_internal/selectable-list-component.d.ts +30 -30
- package/lib/badge/badge.directive.d.ts +15 -20
- package/lib/badge/index.d.ts +3 -0
- package/lib/buttons/_button-base.d.ts +9 -12
- package/lib/buttons/button/button.component.d.ts +6 -8
- package/lib/buttons/button/index.d.ts +2 -0
- package/lib/buttons/fab/fab.component.d.ts +4 -6
- package/lib/buttons/fab/index.d.ts +2 -0
- package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
- package/lib/buttons/icon-button/index.d.ts +2 -0
- package/lib/card/card.children.d.ts +4 -3
- package/lib/card/card.component.d.ts +5 -4
- package/lib/card/index.d.ts +4 -0
- package/lib/checkbox/checkbox.component.d.ts +8 -12
- package/lib/checkbox/index.d.ts +3 -0
- package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
- package/lib/checkbox-list/index.d.ts +3 -0
- package/lib/chip/chip.component.d.ts +8 -10
- package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
- package/lib/chip/index.d.ts +4 -0
- package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
- package/lib/color/color-display/color-display.component.d.ts +6 -9
- package/lib/color/color-display/index.d.ts +3 -0
- package/lib/color/color-picker/color-picker.types.d.ts +4 -4
- package/lib/dialog/dialog.component.d.ts +25 -35
- package/lib/dialog/dialog.types.d.ts +2 -2
- package/lib/dialog/index.d.ts +4 -0
- package/lib/divider/divider.component.d.ts +3 -4
- package/lib/divider/index.d.ts +2 -0
- package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
- package/lib/dropdown-panel/index.d.ts +3 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
- package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
- package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
- package/lib/file-inputs/file-input/index.d.ts +3 -0
- package/lib/file-inputs/file-input-base.d.ts +13 -18
- package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
- package/lib/form-field-frame/index.d.ts +3 -0
- package/lib/icon/icon.component.d.ts +10 -19
- package/lib/icon/index.d.ts +3 -0
- package/lib/inputs/color-input/color-input.types.d.ts +2 -2
- package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
- package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
- package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
- package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
- package/lib/inputs/digit-input/index.d.ts +3 -0
- package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
- package/lib/inputs/hex-input/index.d.ts +3 -0
- package/lib/inputs/hex-input.model.d.ts +10 -11
- package/lib/inputs/input/index.d.ts +3 -0
- package/lib/inputs/input/input.component.d.ts +34 -40
- package/lib/inputs/input/input.directives.d.ts +3 -3
- package/lib/inputs/input-utils.d.ts +24 -27
- package/lib/inputs/number-input/index.d.ts +3 -0
- package/lib/inputs/number-input/number-input.component.d.ts +38 -48
- package/lib/inputs/password-input/index.d.ts +4 -0
- package/lib/inputs/password-input/password-input.component.d.ts +28 -40
- package/lib/inputs/password-input/password-input.types.d.ts +2 -2
- package/lib/inputs/simple-input/index.d.ts +3 -0
- package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
- package/lib/kbd/index.d.ts +3 -0
- package/lib/kbd/kbd.component.d.ts +6 -8
- package/lib/kbd-shortcut/index.d.ts +2 -0
- package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
- package/lib/modal/index.d.ts +2 -0
- package/lib/modal/modal.component.d.ts +22 -30
- package/lib/option/index.d.ts +2 -0
- package/lib/option/option.component.d.ts +11 -16
- package/lib/progress-bar/index.d.ts +4 -0
- package/lib/progress-bar/progress-bar.component.d.ts +14 -20
- package/lib/progress-bar/progress-bar.types.d.ts +2 -2
- package/lib/progress-circle/index.d.ts +4 -0
- package/lib/progress-circle/progress-circle.component.d.ts +12 -20
- package/lib/progress-circle/progress-circle.types.d.ts +2 -2
- package/lib/radio/index.d.ts +3 -0
- package/lib/radio/radio/radio.component.d.ts +7 -8
- package/lib/radio/radio-group.component.d.ts +13 -16
- package/lib/segment/index.d.ts +4 -0
- package/lib/segment/segment.component.d.ts +22 -34
- package/lib/segment/segment.directives.d.ts +2 -3
- package/lib/select/index.d.ts +4 -0
- package/lib/select/select.component.d.ts +114 -160
- package/lib/select/select.directive.d.ts +3 -3
- package/lib/select/select.types.d.ts +2 -76
- package/lib/slide-toggle/index.d.ts +3 -0
- package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
- package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
- package/lib/slider/abstract-slider.d.ts +38 -55
- package/lib/slider/index.d.ts +6 -0
- package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
- package/lib/slider/slider.component.d.ts +2 -0
- package/lib/slider/slider.types.d.ts +8 -8
- package/lib/snackbar/snackbar-ref.d.ts +1 -2
- package/lib/snackbar/snackbar.component.d.ts +3 -3
- package/lib/snackbar/snackbar.service.d.ts +2 -2
- package/lib/snackbar/snackbar.types.d.ts +4 -4
- package/lib/spinner/index.d.ts +2 -0
- package/lib/spinner/spinner.component.d.ts +3 -3
- package/lib/star/index.d.ts +3 -0
- package/lib/star/star-button/index.d.ts +2 -0
- package/lib/star/star-button/star-button.component.d.ts +7 -7
- package/lib/star/star-display/index.d.ts +2 -0
- package/lib/star/star-display/star-display.component.d.ts +8 -12
- package/lib/star/star-input/index.d.ts +2 -0
- package/lib/star/star-input/star-input.component.d.ts +17 -22
- package/lib/star/star.component.d.ts +5 -5
- package/lib/statebox/index.d.ts +3 -0
- package/lib/statebox/statebox.component.d.ts +15 -21
- package/lib/statebox/statebox.types.d.ts +12 -8
- package/lib/tabber/index.d.ts +3 -0
- package/lib/tabber/tab/tab.component.d.ts +18 -0
- package/lib/tabber/tabber.component.d.ts +25 -0
- package/lib/tabber/tabber.module.d.ts +9 -0
- package/lib/table/index.d.ts +4 -0
- package/lib/table/table-item-storage.d.ts +70 -58
- package/lib/table/table.component.d.ts +59 -78
- package/lib/table/table.directives.d.ts +4 -3
- package/lib/table-from-csv/index.d.ts +2 -0
- package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
- package/lib/table-pagination/index.d.ts +3 -0
- package/lib/table-pagination/table-pagination.component.d.ts +21 -30
- package/lib/types/item-storage.types.d.ts +19 -18
- package/lib/types/utility.types.d.ts +2 -1
- package/package.json +8 -9
- package/prebuilt-themes/default/badge.css +5 -5
- package/prebuilt-themes/default/buttons/fab.css +4 -3
- package/prebuilt-themes/default/buttons/fab.css.map +1 -1
- package/prebuilt-themes/default/card.css +7 -7
- package/prebuilt-themes/default/chips.css +3 -8
- package/prebuilt-themes/default/chips.css.map +1 -1
- package/prebuilt-themes/default/core.css +6 -3
- package/prebuilt-themes/default/core.css.map +1 -1
- package/prebuilt-themes/default/inputs/color-input.css +1 -1
- package/prebuilt-themes/default/inputs/digit-input.css +1 -1
- package/prebuilt-themes/default/inputs/file-input.css +139 -2
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
- package/prebuilt-themes/default/inputs/hex-input.css +2 -2
- package/prebuilt-themes/default/inputs/input.css +1 -1
- package/prebuilt-themes/default/inputs/search-bar.css +1 -1
- package/prebuilt-themes/default/inputs/simple-input.css +1 -1
- package/prebuilt-themes/default/modal.css +1 -1
- package/prebuilt-themes/default/segment.css +2 -2
- package/prebuilt-themes/default/segment.css.map +1 -1
- package/prebuilt-themes/default/select.css +5 -3
- package/prebuilt-themes/default/select.css.map +1 -1
- package/prebuilt-themes/default/snackbar.css +0 -1
- package/prebuilt-themes/default/snackbar.css.map +1 -1
- package/prebuilt-themes/default/tabber.css +207 -0
- package/prebuilt-themes/default/tabber.css.map +1 -0
- package/public-api.d.ts +43 -136
- package/themes/_variables.scss +121 -121
- package/themes/default/_clear-button.scss +73 -73
- package/themes/default/_coloring.scss +137 -137
- package/themes/default/_dropdown-arrow.scss +12 -12
- package/themes/default/_mixins.scss +70 -70
- package/themes/default/badge.scss +94 -94
- package/themes/default/buttons/_button-mixins.scss +144 -144
- package/themes/default/buttons/button.scss +62 -62
- package/themes/default/buttons/fab.scss +74 -72
- package/themes/default/buttons/icon-button.scss +59 -59
- package/themes/default/calendar.scss +182 -182
- package/themes/default/card.scss +126 -126
- package/themes/default/checkbox-list.scss +83 -83
- package/themes/default/checkbox.scss +109 -109
- package/themes/default/chips.scss +200 -206
- package/themes/default/color-display.scss +41 -41
- package/themes/default/color-picker.scss +111 -111
- package/themes/default/core.scss +99 -96
- package/themes/default/dialog.scss +16 -16
- package/themes/default/divider.scss +13 -13
- package/themes/default/dropdown-panel.scss +45 -45
- package/themes/default/file-drop-area.scss +162 -162
- package/themes/default/form-field-frame.scss +78 -78
- package/themes/default/inputs/_shared.scss +46 -46
- package/themes/default/inputs/color-input.scss +46 -46
- package/themes/default/inputs/digit-input.scss +56 -56
- package/themes/default/inputs/file-input.scss +85 -78
- package/themes/default/inputs/hex-input.scss +27 -27
- package/themes/default/inputs/input.scss +52 -52
- package/themes/default/inputs/number-input.scss +121 -121
- package/themes/default/inputs/password-input.scss +43 -43
- package/themes/default/inputs/search-bar.scss +19 -19
- package/themes/default/inputs/simple-input.scss +19 -19
- package/themes/default/kbd-shortcut.scss +13 -13
- package/themes/default/kbd.scss +20 -20
- package/themes/default/modal.scss +93 -93
- package/themes/default/progress-bar.scss +166 -166
- package/themes/default/progress-circle.scss +56 -56
- package/themes/default/radio.scss +112 -112
- package/themes/default/segment.scss +340 -339
- package/themes/default/select.scss +255 -253
- package/themes/default/slide-toggle.scss +151 -151
- package/themes/default/slider.scss +224 -224
- package/themes/default/snackbar.scss +58 -60
- package/themes/default/spinner.scss +21 -21
- package/themes/default/stars.scss +122 -122
- package/themes/default/statebox.scss +109 -109
- package/themes/default/tabber.scss +86 -0
- package/themes/default/table-pagination.scss +56 -56
- package/themes/default/table.scss +403 -403
- package/esm2022/lib/calendar/calendar.component.mjs +0 -979
- package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
- package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
- package/esm2022/lib/calendar/calendar.module.mjs +0 -21
- package/esm2022/lib/calendar/calendar.types.mjs +0 -11
- package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
- package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
- package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
- package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
- package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
- package/lib/calendar/calendar.component.d.ts +0 -155
- package/lib/calendar/calendar.directives.d.ts +0 -51
- package/lib/calendar/calendar.helpers.d.ts +0 -15
- package/lib/calendar/calendar.module.d.ts +0 -11
- package/lib/calendar/calendar.types.d.ts +0 -80
- package/lib/color/color-picker/color-picker.component.d.ts +0 -125
- package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
- package/lib/color/color-picker/color-picker.module.d.ts +0 -13
- package/lib/inputs/color-input/color-input.component.d.ts +0 -147
- package/lib/inputs/color-input/color-input.module.d.ts +0 -16
|
@@ -1,979 +0,0 @@
|
|
|
1
|
-
import { forwardRef } from '@angular/core';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
3
|
-
import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
|
|
4
|
-
import { roundToMultiple } from 'more-rounding';
|
|
5
|
-
import { isDefined, isNull } from 'simple-bool';
|
|
6
|
-
import { ComponentColor } from '../types/colors.types';
|
|
7
|
-
import { _NgModelComponentBase } from '../_internal/ngmodel-component';
|
|
8
|
-
import { ArdDaysViewHeaderTemplateDirective, ArdDayTemplateDirective, ArdFloatingMonthTemplateDirective, ArdMonthsViewHeaderTemplateDirective, ArdMonthTemplateDirective, ArdWeekdayTemplateDirective, ArdYearsViewHeaderTemplateDirective, ArdYearTemplateDirective, } from './calendar.directives';
|
|
9
|
-
import { getMonthLayout } from './calendar.helpers';
|
|
10
|
-
import { CalendarView, } from './calendar.types';
|
|
11
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/common";
|
|
14
|
-
import * as i2 from "../buttons/button/button.component";
|
|
15
|
-
import * as i3 from "../buttons/icon-button/icon-button.component";
|
|
16
|
-
import * as i4 from "../icon/icon.component";
|
|
17
|
-
function isLeapYear(year) {
|
|
18
|
-
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
|
|
19
|
-
}
|
|
20
|
-
export class ArdiumCalendarComponent extends _NgModelComponentBase {
|
|
21
|
-
constructor() {
|
|
22
|
-
super(...arguments);
|
|
23
|
-
this._wasSelectedChecked = false;
|
|
24
|
-
//! determining today state
|
|
25
|
-
this.todayDate = new Date();
|
|
26
|
-
//! color & wrapper classes
|
|
27
|
-
this.color = ComponentColor.Primary;
|
|
28
|
-
//! open year & month setters
|
|
29
|
-
//pick a year range start so that the today date is always in the 3rd row
|
|
30
|
-
this.todayYearRangeStart = this.todayDate.getFullYear() - (this.todayDate.getFullYear() % 4) - 8;
|
|
31
|
-
this.displayedYearRangeStart = this.todayYearRangeStart;
|
|
32
|
-
this.yearRangeArrayCache = null;
|
|
33
|
-
this._activeDate = new Date(this.todayDate.getFullYear(), this.todayDate.getMonth(), this.todayDate.getDate());
|
|
34
|
-
//! selection functions
|
|
35
|
-
this._selected = null;
|
|
36
|
-
//! output events
|
|
37
|
-
this.yearSelected = new EventEmitter();
|
|
38
|
-
this.monthSelected = new EventEmitter();
|
|
39
|
-
this.selectedChange = new EventEmitter();
|
|
40
|
-
this.activeYearChange = new EventEmitter();
|
|
41
|
-
this.activeMonthChange = new EventEmitter();
|
|
42
|
-
this.viewChange = new EventEmitter();
|
|
43
|
-
this.changeEvent = new EventEmitter();
|
|
44
|
-
//! calendar entry hover & click
|
|
45
|
-
this._highlightedDay = null;
|
|
46
|
-
this._highlightedMonth = null;
|
|
47
|
-
this._highlightedYear = null;
|
|
48
|
-
this._isUsingKeyboard = false;
|
|
49
|
-
//! settings
|
|
50
|
-
this._firstWeekday = 1;
|
|
51
|
-
this._nointeract = false;
|
|
52
|
-
this._staticHeight = false;
|
|
53
|
-
//months view array
|
|
54
|
-
this.monthsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
55
|
-
//years view array
|
|
56
|
-
this._yearsArrayCache = null;
|
|
57
|
-
this._yearsArrayCacheStartYear = null;
|
|
58
|
-
//! change view functions
|
|
59
|
-
this.activeView = CalendarView.Days;
|
|
60
|
-
}
|
|
61
|
-
ngOnInit() {
|
|
62
|
-
this._updateCalendarArray();
|
|
63
|
-
this._updateWeekdayArray();
|
|
64
|
-
this._updateDisplayedYearRangeStart();
|
|
65
|
-
}
|
|
66
|
-
ngOnChanges(changes) {
|
|
67
|
-
if (this._wasSelectedChecked)
|
|
68
|
-
return;
|
|
69
|
-
this._wasSelectedChecked = true;
|
|
70
|
-
if (changes['selected']) {
|
|
71
|
-
const v = this.selected;
|
|
72
|
-
if (isNull(v))
|
|
73
|
-
return;
|
|
74
|
-
this.activeDate = new Date(v.getFullYear(), v.getMonth(), 1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
isDayToday(day) {
|
|
78
|
-
return this.activeYear == this.todayDate.getFullYear() && this.activeMonth == this.todayDate.getMonth() && day == this.todayDate.getDate();
|
|
79
|
-
}
|
|
80
|
-
isMonthToday(month) {
|
|
81
|
-
return this.activeYear == this.todayDate.getFullYear() && month == this.todayDate.getMonth();
|
|
82
|
-
}
|
|
83
|
-
isYearToday(year) {
|
|
84
|
-
return year == this.todayDate.getFullYear();
|
|
85
|
-
}
|
|
86
|
-
//! determining if an entry is selected
|
|
87
|
-
isDaySelected(day) {
|
|
88
|
-
if (day instanceof Date)
|
|
89
|
-
day = day.getDate();
|
|
90
|
-
return (this.selected != null && this.activeYear == this.selected.getFullYear() && this.activeMonth == this.selected.getMonth() && day == this.selected.getDate());
|
|
91
|
-
}
|
|
92
|
-
isMonthSelected(month) {
|
|
93
|
-
if (month instanceof Date)
|
|
94
|
-
month = month.getMonth();
|
|
95
|
-
return this.selected != null && this.activeYear == this.selected.getFullYear() && month == this.selected.getMonth();
|
|
96
|
-
}
|
|
97
|
-
isYearSelected(year) {
|
|
98
|
-
if (year instanceof Date)
|
|
99
|
-
year = year.getFullYear();
|
|
100
|
-
return this.selected != null && year == this.selected.getFullYear();
|
|
101
|
-
}
|
|
102
|
-
get ngClasses() {
|
|
103
|
-
return [`ard-color-${this.color}`, this.nointeract ? 'ard-calendar-nointeract' : '', this.staticHeight ? 'ard-calendar-static-height' : ''].join(' ');
|
|
104
|
-
}
|
|
105
|
-
_updateDisplayedYearRangeStart(forcedYear) {
|
|
106
|
-
if (isDefined(forcedYear))
|
|
107
|
-
this.displayedYearRangeStart = forcedYear;
|
|
108
|
-
//add the difference between the active year and the start of the range for the current year
|
|
109
|
-
//rounded to a multiple of 24, towards the number zero
|
|
110
|
-
//the difference may be negative, if the active year is before todayYearRangeStart
|
|
111
|
-
this.displayedYearRangeStart = this.todayYearRangeStart + roundToMultiple(this.activeYear - this.todayYearRangeStart, 24, 'to_zero');
|
|
112
|
-
}
|
|
113
|
-
get yearRangeArray() {
|
|
114
|
-
if (!this.yearRangeArrayCache) {
|
|
115
|
-
let yearRangeStart = this.displayedYearRangeStart;
|
|
116
|
-
const newArray = new Array(24).map(() => yearRangeStart++);
|
|
117
|
-
this.yearRangeArrayCache = newArray;
|
|
118
|
-
}
|
|
119
|
-
return this.yearRangeArrayCache;
|
|
120
|
-
}
|
|
121
|
-
set activeDate(v) {
|
|
122
|
-
const newDate = new Date(v);
|
|
123
|
-
if (this.activeYear != newDate.getFullYear())
|
|
124
|
-
this.yearRangeArrayCache = null;
|
|
125
|
-
this._activeDate = newDate;
|
|
126
|
-
this._updateCalendarArray();
|
|
127
|
-
}
|
|
128
|
-
get activeDate() {
|
|
129
|
-
return this._activeDate;
|
|
130
|
-
}
|
|
131
|
-
get activeYear() {
|
|
132
|
-
return this._activeDate.getFullYear();
|
|
133
|
-
}
|
|
134
|
-
set activeYear(v) {
|
|
135
|
-
const year = coerceNumberProperty(v, new Date().getFullYear());
|
|
136
|
-
this._activeDate.setFullYear(year);
|
|
137
|
-
this.activeDate = new Date(year, this.activeMonth, 1);
|
|
138
|
-
this.yearRangeArrayCache = null;
|
|
139
|
-
this._updateCalendarArray();
|
|
140
|
-
}
|
|
141
|
-
get activeMonth() {
|
|
142
|
-
return this._activeDate.getMonth();
|
|
143
|
-
}
|
|
144
|
-
set activeMonth(v) {
|
|
145
|
-
const month = coerceNumberProperty(v, new Date().getMonth());
|
|
146
|
-
const oldDateYear = this.activeYear;
|
|
147
|
-
this.activeDate = new Date(this.activeYear, month, 1);
|
|
148
|
-
if (oldDateYear != this.activeYear)
|
|
149
|
-
this.yearRangeArrayCache = null;
|
|
150
|
-
this._updateCalendarArray();
|
|
151
|
-
}
|
|
152
|
-
set selected(v) {
|
|
153
|
-
this.writeValue(v);
|
|
154
|
-
}
|
|
155
|
-
get selected() {
|
|
156
|
-
return this._selected;
|
|
157
|
-
}
|
|
158
|
-
writeValue(v) {
|
|
159
|
-
if (typeof v == 'string') {
|
|
160
|
-
//try to see if it is an array of numbers separated by a comma
|
|
161
|
-
const vAsArray1 = v.split(',').map(v => Number(v));
|
|
162
|
-
if (vAsArray1.length >= 1 && vAsArray1.length <= 3 && vAsArray1.every(v => !isNaN(v))) {
|
|
163
|
-
v = new Date(vAsArray1[0], vAsArray1[1] ?? 0, vAsArray1[2] ?? 1);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
//try to see if it is an array of numbers separated by some whitespace
|
|
167
|
-
const vAsArray2 = v.split(/\s/).map(v => Number(v));
|
|
168
|
-
if (vAsArray2.length >= 1 && vAsArray2.length <= 3 && vAsArray2.every(v => !isNaN(v))) {
|
|
169
|
-
v = new Date(vAsArray2[0], vAsArray2[1] ?? 0, vAsArray2[2] ?? 1);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
v = new Date(v);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
//is a Date object && does not contain an error
|
|
177
|
-
if (v instanceof Date && !isNaN(v.valueOf())) {
|
|
178
|
-
this._selected = v;
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (v == null) {
|
|
182
|
-
this._selected = null;
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
console.warn(`Could not parse [selected] value on <ard-calendar>, as it is not a valid value. Provided value: "${v}"`);
|
|
186
|
-
this._selected = null;
|
|
187
|
-
}
|
|
188
|
-
_emitChange() {
|
|
189
|
-
const v = this.selected;
|
|
190
|
-
this._onChangeRegistered?.(v);
|
|
191
|
-
this.selectedChange.emit(v);
|
|
192
|
-
this.changeEvent.emit(v);
|
|
193
|
-
}
|
|
194
|
-
get highlightedDay() {
|
|
195
|
-
return this._highlightedDay;
|
|
196
|
-
}
|
|
197
|
-
set highlightedDay(v) {
|
|
198
|
-
if (isNull(v)) {
|
|
199
|
-
this._highlightedDay = v;
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
const date = new Date(this.activeYear, this.activeMonth, v);
|
|
203
|
-
this._highlightedDay = date.getDate();
|
|
204
|
-
}
|
|
205
|
-
setHighlightedDayAdjustDate(day) {
|
|
206
|
-
this.highlightedDay = day;
|
|
207
|
-
const date = new Date(this.activeYear, this.activeMonth, day);
|
|
208
|
-
if (this.activeYear != date.getFullYear())
|
|
209
|
-
this.activeYear = date.getFullYear();
|
|
210
|
-
if (this.activeMonth != date.getMonth())
|
|
211
|
-
this.activeMonth = date.getMonth();
|
|
212
|
-
}
|
|
213
|
-
get highlightedMonth() {
|
|
214
|
-
return this._highlightedMonth;
|
|
215
|
-
}
|
|
216
|
-
set highlightedMonth(v) {
|
|
217
|
-
if (isNull(v)) {
|
|
218
|
-
this._highlightedMonth = v;
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
const date = new Date(this.activeYear, v, 1);
|
|
222
|
-
this._highlightedMonth = date.getMonth();
|
|
223
|
-
}
|
|
224
|
-
setHighlightedMonthAdjustDate(month) {
|
|
225
|
-
this.highlightedMonth = month;
|
|
226
|
-
const date = new Date(this.activeYear, month, 1);
|
|
227
|
-
if (this.activeYear != date.getFullYear())
|
|
228
|
-
this.activeYear = date.getFullYear();
|
|
229
|
-
}
|
|
230
|
-
get highlightedYear() {
|
|
231
|
-
return this._highlightedYear;
|
|
232
|
-
}
|
|
233
|
-
set highlightedYear(v) {
|
|
234
|
-
this._highlightedYear = v;
|
|
235
|
-
}
|
|
236
|
-
setHighlightedYearAdjustPage(year) {
|
|
237
|
-
this.highlightedYear = year;
|
|
238
|
-
if (year < this.displayedYearRangeStart || year >= this.displayedYearRangeStart + 24) {
|
|
239
|
-
//add the difference between the highlighted year and the displayed range start year
|
|
240
|
-
//rounded to a multiple of 24, away from the number zero
|
|
241
|
-
//the difference may be negative, if the first if condition is met
|
|
242
|
-
this.displayedYearRangeStart += roundToMultiple(year - this.displayedYearRangeStart, 24, 'from_zero');
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
get currentAriaLabel() {
|
|
246
|
-
return new Date(this.activeYear, this.activeMonth, this.highlightedDay ?? 1).toLocaleDateString(undefined, {
|
|
247
|
-
weekday: 'long',
|
|
248
|
-
year: 'numeric',
|
|
249
|
-
month: 'long',
|
|
250
|
-
day: 'numeric',
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
onCalendarDayMouseover(day) {
|
|
254
|
-
if (day == null)
|
|
255
|
-
return;
|
|
256
|
-
if (this._isUsingKeyboard)
|
|
257
|
-
return;
|
|
258
|
-
this.highlightedDay = day;
|
|
259
|
-
}
|
|
260
|
-
onCalendarMonthMouseover(month) {
|
|
261
|
-
if (this._isUsingKeyboard)
|
|
262
|
-
return;
|
|
263
|
-
this.highlightedMonth = month;
|
|
264
|
-
}
|
|
265
|
-
onCalendarYearMouseover(year) {
|
|
266
|
-
if (this._isUsingKeyboard)
|
|
267
|
-
return;
|
|
268
|
-
this.highlightedYear = year;
|
|
269
|
-
}
|
|
270
|
-
onDocumentMousemove() {
|
|
271
|
-
if (!this._isUsingKeyboard)
|
|
272
|
-
this.highlightedDay = null;
|
|
273
|
-
this._isUsingKeyboard = false;
|
|
274
|
-
}
|
|
275
|
-
onDocumentKeydown() {
|
|
276
|
-
this._isUsingKeyboard = true;
|
|
277
|
-
}
|
|
278
|
-
onCalendarDayClick(day) {
|
|
279
|
-
if (day == null)
|
|
280
|
-
return;
|
|
281
|
-
this.selectDay(day);
|
|
282
|
-
this.focus();
|
|
283
|
-
this.highlightedDay = day;
|
|
284
|
-
}
|
|
285
|
-
onCalendarMonthClick(month) {
|
|
286
|
-
this.selectMonth(month);
|
|
287
|
-
}
|
|
288
|
-
onCalendarYearClick(year) {
|
|
289
|
-
this.selectYear(year);
|
|
290
|
-
}
|
|
291
|
-
onDayGridFocus() {
|
|
292
|
-
this.highlightedDay = 1;
|
|
293
|
-
}
|
|
294
|
-
onDayGridBlur() {
|
|
295
|
-
this.highlightedDay = null;
|
|
296
|
-
}
|
|
297
|
-
onDayGridClick() {
|
|
298
|
-
this.highlightedDay ??= 1;
|
|
299
|
-
}
|
|
300
|
-
onMonthGridFocus() {
|
|
301
|
-
this.highlightedMonth = 0;
|
|
302
|
-
}
|
|
303
|
-
onMonthGridBlur() {
|
|
304
|
-
this.highlightedMonth = null;
|
|
305
|
-
}
|
|
306
|
-
onMonthGridClick() {
|
|
307
|
-
this.highlightedMonth ??= 0;
|
|
308
|
-
}
|
|
309
|
-
onYearGridFocus() {
|
|
310
|
-
this.highlightedYear = this.displayedYearRangeStart;
|
|
311
|
-
}
|
|
312
|
-
onYearGridBlur() {
|
|
313
|
-
this.highlightedYear = null;
|
|
314
|
-
}
|
|
315
|
-
onYearGridClick() {
|
|
316
|
-
this.highlightedYear ??= this.displayedYearRangeStart;
|
|
317
|
-
}
|
|
318
|
-
//! main grid keyboard controls
|
|
319
|
-
onMainGridKeydown(event) {
|
|
320
|
-
switch (event.code) {
|
|
321
|
-
case 'Space':
|
|
322
|
-
case 'Enter':
|
|
323
|
-
this._onEnterPress(event);
|
|
324
|
-
break;
|
|
325
|
-
case 'ArrowUp':
|
|
326
|
-
this._onArrowUpPress(event);
|
|
327
|
-
break;
|
|
328
|
-
case 'ArrowDown':
|
|
329
|
-
this._onArrowDownPress(event);
|
|
330
|
-
break;
|
|
331
|
-
case 'ArrowLeft':
|
|
332
|
-
this._onArrowLeftPress(event);
|
|
333
|
-
break;
|
|
334
|
-
case 'ArrowRight':
|
|
335
|
-
this._onArrowRightPress(event);
|
|
336
|
-
break;
|
|
337
|
-
case 'Home':
|
|
338
|
-
this._onHomePress(event);
|
|
339
|
-
break;
|
|
340
|
-
case 'End':
|
|
341
|
-
this._onEndPress(event);
|
|
342
|
-
break;
|
|
343
|
-
case 'PageUp':
|
|
344
|
-
this._onPageUpPress(event);
|
|
345
|
-
break;
|
|
346
|
-
case 'PageDown':
|
|
347
|
-
this._onPageDownPress(event);
|
|
348
|
-
break;
|
|
349
|
-
default:
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
//select currently selected entry
|
|
354
|
-
_onEnterPress(event) {
|
|
355
|
-
event.preventDefault();
|
|
356
|
-
this.selectCurrentlyHighlighted();
|
|
357
|
-
}
|
|
358
|
-
//highlight the entry one line above
|
|
359
|
-
_onArrowUpPress(event) {
|
|
360
|
-
event.preventDefault();
|
|
361
|
-
switch (this.activeView) {
|
|
362
|
-
case CalendarView.Days:
|
|
363
|
-
this.highlightPreviousDay(7);
|
|
364
|
-
break;
|
|
365
|
-
case CalendarView.Months:
|
|
366
|
-
this.highlightPreviousMonth(3); //3 months per line
|
|
367
|
-
break;
|
|
368
|
-
case CalendarView.Years:
|
|
369
|
-
this.highlightPreviousYear(4); //4 years per line
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
//highlight the entry one line below
|
|
374
|
-
_onArrowDownPress(event) {
|
|
375
|
-
event.preventDefault();
|
|
376
|
-
switch (this.activeView) {
|
|
377
|
-
case CalendarView.Days:
|
|
378
|
-
this.highlightNextDay(7);
|
|
379
|
-
break;
|
|
380
|
-
case CalendarView.Months:
|
|
381
|
-
this.highlightNextMonth(3); //3 months per line
|
|
382
|
-
break;
|
|
383
|
-
case CalendarView.Years:
|
|
384
|
-
this.highlightNextYear(4); //4 years per line
|
|
385
|
-
break;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
//highlight previous entry
|
|
389
|
-
_onArrowLeftPress(event) {
|
|
390
|
-
event.preventDefault();
|
|
391
|
-
switch (this.activeView) {
|
|
392
|
-
case CalendarView.Days:
|
|
393
|
-
this.highlightPreviousDay();
|
|
394
|
-
break;
|
|
395
|
-
case CalendarView.Months:
|
|
396
|
-
this.highlightPreviousMonth();
|
|
397
|
-
break;
|
|
398
|
-
case CalendarView.Years:
|
|
399
|
-
this.highlightPreviousYear();
|
|
400
|
-
break;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
//highlight next entry
|
|
404
|
-
_onArrowRightPress(event) {
|
|
405
|
-
event.preventDefault();
|
|
406
|
-
switch (this.activeView) {
|
|
407
|
-
case CalendarView.Days:
|
|
408
|
-
this.highlightNextDay();
|
|
409
|
-
break;
|
|
410
|
-
case CalendarView.Months:
|
|
411
|
-
this.highlightNextMonth();
|
|
412
|
-
break;
|
|
413
|
-
case CalendarView.Years:
|
|
414
|
-
this.highlightNextYear();
|
|
415
|
-
break;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
//highlight first entry on the page
|
|
419
|
-
_onHomePress(event) {
|
|
420
|
-
event.preventDefault();
|
|
421
|
-
switch (this.activeView) {
|
|
422
|
-
case CalendarView.Days:
|
|
423
|
-
this.highlightFirstDay();
|
|
424
|
-
break;
|
|
425
|
-
case CalendarView.Months:
|
|
426
|
-
this.highlightFirstMonth();
|
|
427
|
-
break;
|
|
428
|
-
case CalendarView.Years:
|
|
429
|
-
this.highlightFirstYear();
|
|
430
|
-
break;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
//highlight last entry on the page
|
|
434
|
-
_onEndPress(event) {
|
|
435
|
-
event.preventDefault();
|
|
436
|
-
switch (this.activeView) {
|
|
437
|
-
case CalendarView.Days:
|
|
438
|
-
this.highlightLastDay();
|
|
439
|
-
break;
|
|
440
|
-
case CalendarView.Months:
|
|
441
|
-
this.highlightLastMonth();
|
|
442
|
-
break;
|
|
443
|
-
case CalendarView.Years:
|
|
444
|
-
this.highlightLastYear();
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
//alone: highlight same entry on the previous page
|
|
449
|
-
//with alt: highlight same entry multiple pages before (days view: 12 pages, months view: 10 pages, years view: 5 pages)
|
|
450
|
-
_onPageUpPress(event) {
|
|
451
|
-
event.preventDefault();
|
|
452
|
-
switch (this.activeView) {
|
|
453
|
-
case CalendarView.Days:
|
|
454
|
-
if (event.altKey)
|
|
455
|
-
this.highlightSameDayPreviousYear();
|
|
456
|
-
else
|
|
457
|
-
this.highlightSameDayPreviousMonth();
|
|
458
|
-
break;
|
|
459
|
-
case CalendarView.Months:
|
|
460
|
-
this.highlightSameMonthPreviousYear(event.altKey);
|
|
461
|
-
break;
|
|
462
|
-
case CalendarView.Years:
|
|
463
|
-
this.highlightSameYearPreviousPage(event.altKey);
|
|
464
|
-
break;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
//alone: highlight same entry on the next page
|
|
468
|
-
//with alt: highlight same entry multiple pages after (days view: 12 pages, months view: 10 pages, years view: 5 pages)
|
|
469
|
-
_onPageDownPress(event) {
|
|
470
|
-
event.preventDefault();
|
|
471
|
-
switch (this.activeView) {
|
|
472
|
-
case CalendarView.Days:
|
|
473
|
-
if (event.altKey)
|
|
474
|
-
this.highlightSameDayNextYear();
|
|
475
|
-
else
|
|
476
|
-
this.highlightSameDayNextMonth();
|
|
477
|
-
break;
|
|
478
|
-
case CalendarView.Months:
|
|
479
|
-
this.highlightSameMonthNextYear(event.altKey);
|
|
480
|
-
break;
|
|
481
|
-
case CalendarView.Years:
|
|
482
|
-
this.highlightSameYearNextPage(event.altKey);
|
|
483
|
-
break;
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
//! manipulation methods
|
|
487
|
-
//selecting
|
|
488
|
-
selectDay(day) {
|
|
489
|
-
if (this.isDaySelected(day))
|
|
490
|
-
return;
|
|
491
|
-
if (isNull(day)) {
|
|
492
|
-
if (!isDefined(this.selected))
|
|
493
|
-
return;
|
|
494
|
-
this.selected = null;
|
|
495
|
-
this._emitChange();
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
if (day instanceof Date)
|
|
499
|
-
day = day.getDate();
|
|
500
|
-
this.selected = new Date(this.activeYear, this.activeMonth, day);
|
|
501
|
-
this._emitChange();
|
|
502
|
-
}
|
|
503
|
-
selectMonth(month) {
|
|
504
|
-
if (isNull(month)) {
|
|
505
|
-
this.activeMonth = null;
|
|
506
|
-
return;
|
|
507
|
-
}
|
|
508
|
-
if (month instanceof Date)
|
|
509
|
-
month = month.getMonth();
|
|
510
|
-
this.activeMonth = month;
|
|
511
|
-
this.activeMonthChange.emit(month);
|
|
512
|
-
this.monthSelected.emit(month);
|
|
513
|
-
this.openDaysView();
|
|
514
|
-
}
|
|
515
|
-
selectYear(year) {
|
|
516
|
-
if (isNull(year)) {
|
|
517
|
-
this.activeYear = null;
|
|
518
|
-
return;
|
|
519
|
-
}
|
|
520
|
-
if (year instanceof Date)
|
|
521
|
-
year = year.getFullYear();
|
|
522
|
-
this.activeYear = year;
|
|
523
|
-
this.activeYearChange.emit(year);
|
|
524
|
-
this.yearSelected.emit(year);
|
|
525
|
-
this.openMonthsView();
|
|
526
|
-
}
|
|
527
|
-
selectCurrentlyHighlighted() {
|
|
528
|
-
if (!isDefined(this.highlightedDay))
|
|
529
|
-
return;
|
|
530
|
-
switch (this.activeView) {
|
|
531
|
-
case CalendarView.Days:
|
|
532
|
-
this.selectDay(this.highlightedDay);
|
|
533
|
-
return;
|
|
534
|
-
case CalendarView.Months:
|
|
535
|
-
this.selectMonth(this.highlightedMonth);
|
|
536
|
-
return;
|
|
537
|
-
case CalendarView.Years:
|
|
538
|
-
this.selectYear(this.highlightedYear);
|
|
539
|
-
return;
|
|
540
|
-
default:
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
//active months/years
|
|
545
|
-
changeMonth(offset) {
|
|
546
|
-
const oldyear = this.activeYear;
|
|
547
|
-
this.activeMonth += offset;
|
|
548
|
-
if (this.activeYear != oldyear)
|
|
549
|
-
this.activeYearChange.emit(this.activeYear);
|
|
550
|
-
this.activeMonthChange.emit(this.activeMonth);
|
|
551
|
-
}
|
|
552
|
-
changeYear(offset) {
|
|
553
|
-
this.activeYear += offset;
|
|
554
|
-
this.activeYearChange.emit(this.activeYear);
|
|
555
|
-
}
|
|
556
|
-
//changing year page
|
|
557
|
-
changeYearsViewPage(pages) {
|
|
558
|
-
this.displayedYearRangeStart += 24 * pages;
|
|
559
|
-
}
|
|
560
|
-
//next/prev highlighting
|
|
561
|
-
highlightNextDay(offset = 1) {
|
|
562
|
-
const currentDay = this.highlightedDay;
|
|
563
|
-
if (!isDefined(currentDay)) {
|
|
564
|
-
this.highlightedDay = 1;
|
|
565
|
-
return;
|
|
566
|
-
}
|
|
567
|
-
this.setHighlightedDayAdjustDate(currentDay + offset);
|
|
568
|
-
}
|
|
569
|
-
highlightPreviousDay(offset = 1) {
|
|
570
|
-
this.highlightNextDay(offset * -1);
|
|
571
|
-
}
|
|
572
|
-
highlightNextMonth(offset = 1) {
|
|
573
|
-
const currentMonth = this.highlightedMonth;
|
|
574
|
-
if (!isDefined(currentMonth)) {
|
|
575
|
-
this.highlightedMonth = 0;
|
|
576
|
-
return;
|
|
577
|
-
}
|
|
578
|
-
this.setHighlightedMonthAdjustDate(currentMonth + offset);
|
|
579
|
-
}
|
|
580
|
-
highlightPreviousMonth(offset = 1) {
|
|
581
|
-
this.highlightNextMonth(offset * -1);
|
|
582
|
-
}
|
|
583
|
-
highlightNextYear(offset = 1) {
|
|
584
|
-
const currentYear = this.highlightedYear;
|
|
585
|
-
if (!isDefined(currentYear)) {
|
|
586
|
-
this.highlightedYear = 0;
|
|
587
|
-
return;
|
|
588
|
-
}
|
|
589
|
-
this.setHighlightedYearAdjustPage(currentYear + offset);
|
|
590
|
-
}
|
|
591
|
-
highlightPreviousYear(offset = 1) {
|
|
592
|
-
this.highlightNextYear(offset * -1);
|
|
593
|
-
}
|
|
594
|
-
//first/last highlighting
|
|
595
|
-
highlightFirstDay() {
|
|
596
|
-
this.highlightedDay = 1;
|
|
597
|
-
}
|
|
598
|
-
highlightLastDay() {
|
|
599
|
-
switch (this.activeMonth + 1) {
|
|
600
|
-
case 1:
|
|
601
|
-
case 3:
|
|
602
|
-
case 5:
|
|
603
|
-
case 7:
|
|
604
|
-
case 8:
|
|
605
|
-
case 10:
|
|
606
|
-
case 12:
|
|
607
|
-
this.highlightedDay = 31;
|
|
608
|
-
break;
|
|
609
|
-
case 4:
|
|
610
|
-
case 6:
|
|
611
|
-
case 9:
|
|
612
|
-
case 11:
|
|
613
|
-
this.highlightedDay = 30;
|
|
614
|
-
break;
|
|
615
|
-
case 2:
|
|
616
|
-
if (isLeapYear(this.activeYear))
|
|
617
|
-
this.highlightedDay = 29;
|
|
618
|
-
else
|
|
619
|
-
this.highlightedDay = 28;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
highlightFirstMonth() {
|
|
623
|
-
this.highlightedMonth = 0;
|
|
624
|
-
}
|
|
625
|
-
highlightLastMonth() {
|
|
626
|
-
this.highlightedMonth = 11;
|
|
627
|
-
}
|
|
628
|
-
highlightFirstYear() {
|
|
629
|
-
this.highlightedYear = this.displayedYearRangeStart;
|
|
630
|
-
}
|
|
631
|
-
highlightLastYear() {
|
|
632
|
-
this.highlightedYear = this.displayedYearRangeStart + 23; //24 years per page
|
|
633
|
-
}
|
|
634
|
-
//same day next/prev month/year
|
|
635
|
-
highlightSameDayNextMonth() {
|
|
636
|
-
this.activeMonth++;
|
|
637
|
-
this._fixDateAfterMonthChange();
|
|
638
|
-
}
|
|
639
|
-
highlightSameDayPreviousMonth() {
|
|
640
|
-
this.activeMonth--;
|
|
641
|
-
this._fixDateAfterMonthChange();
|
|
642
|
-
}
|
|
643
|
-
_fixDateAfterMonthChange() {
|
|
644
|
-
switch (this.activeMonth + 1) {
|
|
645
|
-
case 1:
|
|
646
|
-
case 3:
|
|
647
|
-
case 5:
|
|
648
|
-
case 7:
|
|
649
|
-
case 8:
|
|
650
|
-
case 10:
|
|
651
|
-
case 12:
|
|
652
|
-
//do nothing
|
|
653
|
-
break;
|
|
654
|
-
case 4:
|
|
655
|
-
case 6:
|
|
656
|
-
case 9:
|
|
657
|
-
case 11:
|
|
658
|
-
//only do if day is 31
|
|
659
|
-
if (this.highlightedDay == 31)
|
|
660
|
-
this.highlightedDay = 30;
|
|
661
|
-
break;
|
|
662
|
-
case 2: {
|
|
663
|
-
//skip if below 29 or null
|
|
664
|
-
if (!this.highlightedDay || this.highlightedDay < 29)
|
|
665
|
-
break;
|
|
666
|
-
if (isLeapYear(this.activeYear))
|
|
667
|
-
this.highlightedDay = 29;
|
|
668
|
-
else
|
|
669
|
-
this.highlightedDay = 28;
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
highlightSameDayNextYear() {
|
|
674
|
-
this.activeYear++;
|
|
675
|
-
this._fixDateAfterYearChange();
|
|
676
|
-
}
|
|
677
|
-
highlightSameDayPreviousYear() {
|
|
678
|
-
this.activeYear--;
|
|
679
|
-
this._fixDateAfterYearChange();
|
|
680
|
-
}
|
|
681
|
-
_fixDateAfterYearChange() {
|
|
682
|
-
if (this.highlightedDay != 29)
|
|
683
|
-
return; //skip if not 29th day is selected
|
|
684
|
-
if (isLeapYear(this.activeYear))
|
|
685
|
-
return; //skip if nea year is a leap year
|
|
686
|
-
if (this.activeMonth != 1)
|
|
687
|
-
return; //skip if not february
|
|
688
|
-
this.highlightedDay = 28;
|
|
689
|
-
}
|
|
690
|
-
//same month next/prev year
|
|
691
|
-
highlightSameMonthNextYear(multiple) {
|
|
692
|
-
this.activeYear += multiple ? 10 : 1;
|
|
693
|
-
}
|
|
694
|
-
highlightSameMonthPreviousYear(multiple) {
|
|
695
|
-
this.activeYear -= multiple ? 10 : 1;
|
|
696
|
-
}
|
|
697
|
-
//same year next/prev page(s)
|
|
698
|
-
highlightSameYearNextPage(multiple) {
|
|
699
|
-
if (!isDefined(this.highlightedYear)) {
|
|
700
|
-
this.highlightedYear = this.displayedYearRangeStart;
|
|
701
|
-
return;
|
|
702
|
-
}
|
|
703
|
-
this.setHighlightedYearAdjustPage(this.highlightedYear + (multiple ? 60 : 24));
|
|
704
|
-
}
|
|
705
|
-
highlightSameYearPreviousPage(multiple) {
|
|
706
|
-
if (!isDefined(this.highlightedYear)) {
|
|
707
|
-
this.highlightedYear = this.displayedYearRangeStart;
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
this.setHighlightedYearAdjustPage(this.highlightedYear - (multiple ? 60 : 24));
|
|
711
|
-
}
|
|
712
|
-
get firstWeekday() {
|
|
713
|
-
return this._firstWeekday;
|
|
714
|
-
}
|
|
715
|
-
set firstWeekday(v) {
|
|
716
|
-
this._firstWeekday = coerceNumberProperty(v, 1) % 7;
|
|
717
|
-
this._updateCalendarArray();
|
|
718
|
-
this._updateWeekdayArray();
|
|
719
|
-
}
|
|
720
|
-
get nointeract() {
|
|
721
|
-
return this._nointeract || this.disabled;
|
|
722
|
-
}
|
|
723
|
-
set nointeract(v) {
|
|
724
|
-
this._nointeract = coerceBooleanProperty(v);
|
|
725
|
-
}
|
|
726
|
-
get staticHeight() {
|
|
727
|
-
return this._staticHeight;
|
|
728
|
-
}
|
|
729
|
-
set staticHeight(v) {
|
|
730
|
-
this._staticHeight = coerceBooleanProperty(v);
|
|
731
|
-
}
|
|
732
|
-
_updateCalendarArray() {
|
|
733
|
-
const resultObj = getMonthLayout(this._activeDate, this.firstWeekday);
|
|
734
|
-
this.reserveTopRow = resultObj.leadingSpaces < 3;
|
|
735
|
-
this.calendarArray = resultObj.array;
|
|
736
|
-
}
|
|
737
|
-
getYearsArray() {
|
|
738
|
-
const year = this.displayedYearRangeStart;
|
|
739
|
-
if (this._yearsArrayCacheStartYear == year && isDefined(this._yearsArrayCache))
|
|
740
|
-
return this._yearsArrayCache;
|
|
741
|
-
const newArray = [];
|
|
742
|
-
for (let i = year; i < year + 24; i++) {
|
|
743
|
-
newArray.push(i);
|
|
744
|
-
}
|
|
745
|
-
this._yearsArrayCache = newArray;
|
|
746
|
-
this._yearsArrayCacheStartYear = year;
|
|
747
|
-
return newArray;
|
|
748
|
-
}
|
|
749
|
-
_updateWeekdayArray() {
|
|
750
|
-
this.weekdayArray = [0, 1, 2, 3, 4, 5, 6].map(v => (v + this.firstWeekday) % 7);
|
|
751
|
-
}
|
|
752
|
-
set startView(v) {
|
|
753
|
-
this.activeView = v;
|
|
754
|
-
}
|
|
755
|
-
openYearsView() {
|
|
756
|
-
this.activeView = CalendarView.Years;
|
|
757
|
-
this._updateDisplayedYearRangeStart();
|
|
758
|
-
this.viewChange.emit(this.activeView);
|
|
759
|
-
}
|
|
760
|
-
openMonthsView() {
|
|
761
|
-
this.activeView = CalendarView.Months;
|
|
762
|
-
//bring back old value
|
|
763
|
-
const oldYear = this.activeYear;
|
|
764
|
-
this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
|
|
765
|
-
//emit events
|
|
766
|
-
this.viewChange.emit(this.activeView);
|
|
767
|
-
if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
|
|
768
|
-
this.activeYearChange.emit(this.activeYear);
|
|
769
|
-
}
|
|
770
|
-
openDaysView() {
|
|
771
|
-
this.activeView = CalendarView.Days;
|
|
772
|
-
//bring back old values
|
|
773
|
-
const oldYear = this.activeYear;
|
|
774
|
-
this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
|
|
775
|
-
const oldMonth = this.activeMonth;
|
|
776
|
-
this.activeMonth = this.activeMonth ?? this.todayDate.getMonth();
|
|
777
|
-
//emit events
|
|
778
|
-
this.viewChange.emit(this.activeView);
|
|
779
|
-
if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
|
|
780
|
-
this.activeYearChange.emit(this.activeYear);
|
|
781
|
-
if (oldMonth != this.activeMonth && this.activeMonth == this.todayDate.getMonth())
|
|
782
|
-
this.activeMonthChange.emit(this.activeMonth);
|
|
783
|
-
}
|
|
784
|
-
//! context getters
|
|
785
|
-
//headers
|
|
786
|
-
getYearsViewHeaderContext() {
|
|
787
|
-
const yearRangeStart = this.displayedYearRangeStart;
|
|
788
|
-
const yearRangeEnd = yearRangeStart + 23;
|
|
789
|
-
const dateRange = {
|
|
790
|
-
low: new Date(yearRangeStart, 0, 1),
|
|
791
|
-
high: new Date(yearRangeEnd, 0, 1),
|
|
792
|
-
};
|
|
793
|
-
return {
|
|
794
|
-
nextPage: () => {
|
|
795
|
-
this.changeYearsViewPage(+1);
|
|
796
|
-
},
|
|
797
|
-
prevPage: () => {
|
|
798
|
-
this.changeYearsViewPage(-1);
|
|
799
|
-
},
|
|
800
|
-
openDaysView: () => {
|
|
801
|
-
this.openDaysView();
|
|
802
|
-
},
|
|
803
|
-
yearRange: {
|
|
804
|
-
low: yearRangeStart,
|
|
805
|
-
high: yearRangeEnd,
|
|
806
|
-
},
|
|
807
|
-
dateRange,
|
|
808
|
-
$implicit: dateRange,
|
|
809
|
-
};
|
|
810
|
-
}
|
|
811
|
-
getMonthsViewHeaderContext() {
|
|
812
|
-
return {
|
|
813
|
-
openYearsView: () => {
|
|
814
|
-
this.openYearsView();
|
|
815
|
-
},
|
|
816
|
-
openDaysView: () => {
|
|
817
|
-
this.openDaysView();
|
|
818
|
-
},
|
|
819
|
-
year: this.activeYear,
|
|
820
|
-
date: this.activeDate,
|
|
821
|
-
$implicit: this.activeYear,
|
|
822
|
-
};
|
|
823
|
-
}
|
|
824
|
-
getDaysViewHeaderContext() {
|
|
825
|
-
return {
|
|
826
|
-
nextMonth: () => {
|
|
827
|
-
this.changeMonth(+1);
|
|
828
|
-
},
|
|
829
|
-
prevMonth: () => {
|
|
830
|
-
this.changeMonth(-1);
|
|
831
|
-
},
|
|
832
|
-
nextYear: () => {
|
|
833
|
-
this.changeYear(+1);
|
|
834
|
-
},
|
|
835
|
-
prevYear: () => {
|
|
836
|
-
this.changeYear(-1);
|
|
837
|
-
},
|
|
838
|
-
openYearsView: () => {
|
|
839
|
-
this.openYearsView();
|
|
840
|
-
},
|
|
841
|
-
openMonthsView: () => {
|
|
842
|
-
this.openMonthsView();
|
|
843
|
-
},
|
|
844
|
-
year: this.activeYear,
|
|
845
|
-
month: this.activeMonth,
|
|
846
|
-
date: this.activeDate,
|
|
847
|
-
$implicit: this.activeDate,
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
//weekday
|
|
851
|
-
getWeekdayContext(dayIndex) {
|
|
852
|
-
const date = new Date(1970, 0, 4 + dayIndex);
|
|
853
|
-
return {
|
|
854
|
-
dayIndex,
|
|
855
|
-
date,
|
|
856
|
-
$implicit: date,
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
|
-
//floating month
|
|
860
|
-
getFloatingMonthContext() {
|
|
861
|
-
return {
|
|
862
|
-
month: this.activeMonth,
|
|
863
|
-
date: this.activeDate,
|
|
864
|
-
$implicit: this.activeDate,
|
|
865
|
-
};
|
|
866
|
-
}
|
|
867
|
-
//grid elements (year, month, day)
|
|
868
|
-
getYearContext(year) {
|
|
869
|
-
return {
|
|
870
|
-
value: year,
|
|
871
|
-
date: new Date(this.activeYear, 0, 1),
|
|
872
|
-
$implicit: year,
|
|
873
|
-
select: (year) => {
|
|
874
|
-
this.selectYear(year);
|
|
875
|
-
},
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
|
-
getMonthContext(month) {
|
|
879
|
-
const date = new Date(this.activeYear, month, 1);
|
|
880
|
-
return {
|
|
881
|
-
month,
|
|
882
|
-
date,
|
|
883
|
-
$implicit: date,
|
|
884
|
-
select: (month) => {
|
|
885
|
-
this.selectMonth(month);
|
|
886
|
-
},
|
|
887
|
-
};
|
|
888
|
-
}
|
|
889
|
-
getDayContext(day) {
|
|
890
|
-
return {
|
|
891
|
-
value: day,
|
|
892
|
-
date: new Date(this.activeYear, this.activeMonth, day),
|
|
893
|
-
$implicit: day,
|
|
894
|
-
select: (day) => {
|
|
895
|
-
this.selectDay(day);
|
|
896
|
-
},
|
|
897
|
-
};
|
|
898
|
-
}
|
|
899
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ArdiumCalendarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
900
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: "color", activeYear: "activeYear", activeMonth: "activeMonth", selected: "selected", firstWeekday: "firstWeekday", nointeract: "nointeract", staticHeight: "staticHeight", startView: "startView" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", selectedChange: "selectedChange", activeYearChange: "activeYearChange", activeMonthChange: "activeMonthChange", viewChange: "viewChange", changeEvent: "change" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, providers: [
|
|
901
|
-
{
|
|
902
|
-
provide: NG_VALUE_ACCESSOR,
|
|
903
|
-
useExisting: forwardRef(() => ArdiumCalendarComponent),
|
|
904
|
-
multi: true,
|
|
905
|
-
},
|
|
906
|
-
], queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: ArdYearsViewHeaderTemplateDirective, descendants: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: ArdMonthsViewHeaderTemplateDirective, descendants: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: ArdDaysViewHeaderTemplateDirective, descendants: true }, { propertyName: "weekdayTemplate", first: true, predicate: ArdWeekdayTemplateDirective, descendants: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: ArdFloatingMonthTemplateDirective, descendants: true }, { propertyName: "yearTemplate", first: true, predicate: ArdYearTemplateDirective, descendants: true }, { propertyName: "monthTemplate", first: true, predicate: ArdMonthTemplateDirective, descendants: true }, { propertyName: "dayTemplate", first: true, predicate: ArdDayTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n —\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumButtonComponent, selector: "ard-button", inputs: ["variant", "alignIcon", "vertical", "icon"] }, { kind: "component", type: i3.ArdiumIconButtonComponent, selector: "ard-icon-button", inputs: ["wrapperClasses", "color", "compact"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
907
|
-
}
|
|
908
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
|
|
909
|
-
type: Component,
|
|
910
|
-
args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
911
|
-
{
|
|
912
|
-
provide: NG_VALUE_ACCESSOR,
|
|
913
|
-
useExisting: forwardRef(() => ArdiumCalendarComponent),
|
|
914
|
-
multi: true,
|
|
915
|
-
},
|
|
916
|
-
], template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n —\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"] }]
|
|
917
|
-
}], propDecorators: { color: [{
|
|
918
|
-
type: Input
|
|
919
|
-
}], activeYear: [{
|
|
920
|
-
type: Input
|
|
921
|
-
}], activeMonth: [{
|
|
922
|
-
type: Input
|
|
923
|
-
}], selected: [{
|
|
924
|
-
type: Input
|
|
925
|
-
}], yearSelected: [{
|
|
926
|
-
type: Output
|
|
927
|
-
}], monthSelected: [{
|
|
928
|
-
type: Output
|
|
929
|
-
}], selectedChange: [{
|
|
930
|
-
type: Output
|
|
931
|
-
}], activeYearChange: [{
|
|
932
|
-
type: Output
|
|
933
|
-
}], activeMonthChange: [{
|
|
934
|
-
type: Output
|
|
935
|
-
}], viewChange: [{
|
|
936
|
-
type: Output
|
|
937
|
-
}], changeEvent: [{
|
|
938
|
-
type: Output,
|
|
939
|
-
args: ['change']
|
|
940
|
-
}], onDocumentMousemove: [{
|
|
941
|
-
type: HostListener,
|
|
942
|
-
args: ['document:mousemove']
|
|
943
|
-
}], onDocumentKeydown: [{
|
|
944
|
-
type: HostListener,
|
|
945
|
-
args: ['document:keydown']
|
|
946
|
-
}], firstWeekday: [{
|
|
947
|
-
type: Input
|
|
948
|
-
}], nointeract: [{
|
|
949
|
-
type: Input
|
|
950
|
-
}], staticHeight: [{
|
|
951
|
-
type: Input
|
|
952
|
-
}], startView: [{
|
|
953
|
-
type: Input
|
|
954
|
-
}], yearsViewHeaderTemplate: [{
|
|
955
|
-
type: ContentChild,
|
|
956
|
-
args: [ArdYearsViewHeaderTemplateDirective]
|
|
957
|
-
}], monthsViewHeaderTemplate: [{
|
|
958
|
-
type: ContentChild,
|
|
959
|
-
args: [ArdMonthsViewHeaderTemplateDirective]
|
|
960
|
-
}], daysViewHeaderTemplate: [{
|
|
961
|
-
type: ContentChild,
|
|
962
|
-
args: [ArdDaysViewHeaderTemplateDirective]
|
|
963
|
-
}], weekdayTemplate: [{
|
|
964
|
-
type: ContentChild,
|
|
965
|
-
args: [ArdWeekdayTemplateDirective]
|
|
966
|
-
}], floatingMonthTemplate: [{
|
|
967
|
-
type: ContentChild,
|
|
968
|
-
args: [ArdFloatingMonthTemplateDirective]
|
|
969
|
-
}], yearTemplate: [{
|
|
970
|
-
type: ContentChild,
|
|
971
|
-
args: [ArdYearTemplateDirective]
|
|
972
|
-
}], monthTemplate: [{
|
|
973
|
-
type: ContentChild,
|
|
974
|
-
args: [ArdMonthTemplateDirective]
|
|
975
|
-
}], dayTemplate: [{
|
|
976
|
-
type: ContentChild,
|
|
977
|
-
args: [ArdDayTemplateDirective]
|
|
978
|
-
}] } });
|
|
979
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEdBQ3pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxZQUFZLEdBVWIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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b0NBQW9DO2dCQUdsRCxzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMsa0NBQWtDO2dCQUloRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsMkJBQTJCO2dCQUl6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsaUNBQWlDO2dCQUkvQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsd0JBQXdCO2dCQUd0QyxhQUFhO3NCQURaLFlBQVk7dUJBQUMseUJBQXlCO2dCQUd2QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhpc1JlY2VpdmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQgeyBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcclxuaW1wb3J0IHsgcm91bmRUb011bHRpcGxlIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XHJcbmltcG9ydCB7IGlzRGVmaW5lZCwgaXNOdWxsIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb2xvciB9IGZyb20gJy4uL3R5cGVzL2NvbG9ycy50eXBlcyc7XHJcbmltcG9ydCB7IF9OZ01vZGVsQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9uZ21vZGVsLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQXJkRGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcclxuICBBcmREYXlUZW1wbGF0ZURpcmVjdGl2ZSxcclxuICBBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUsXHJcbiAgQXJkTW9udGhzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZE1vbnRoVGVtcGxhdGVEaXJlY3RpdmUsXHJcbiAgQXJkV2Vla2RheVRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZFllYXJUZW1wbGF0ZURpcmVjdGl2ZSxcclxufSBmcm9tICcuL2NhbGVuZGFyLmRpcmVjdGl2ZXMnO1xyXG5pbXBvcnQgeyBnZXRNb250aExheW91dCB9IGZyb20gJy4vY2FsZW5kYXIuaGVscGVycyc7XHJcbmltcG9ydCB7XHJcbiAgQ2FsZW5kYXJWaWV3LFxyXG4gIENhbGVuZGFyRGF5Q29udGV4dCxcclxuICBDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dCxcclxuICBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQsXHJcbiAgQ2FsZW5kYXJXZWVrZGF5Q29udGV4dCxcclxuICBDYWxlbmRhclllYXJDb250ZXh0LFxyXG4gIENhbGVuZGFyWWVhcnNWaWV3SGVhZGVyQ29udGV4dCxcclxuICBEYXRlUmFuZ2UsXHJcbn0gZnJvbSAnLi9jYWxlbmRhci50eXBlcyc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcclxuICByZXR1cm4gKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDA7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXJkLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcmRpdW1DYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcclxuICAgIHRoaXMuX3VwZGF0ZVdlZWtkYXlBcnJheSgpO1xyXG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfd2FzU2VsZWN0ZWRDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3dhc1NlbGVjdGVkQ2hlY2tlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5fd2FzU2VsZWN0ZWRDaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWQnXSkge1xyXG4gICAgICBjb25zdCB2ID0gdGhpcy5zZWxlY3RlZDtcclxuICAgICAgaWYgKGlzTnVsbCh2KSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLCB2LmdldE1vbnRoKCksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8hIGRldGVybWluaW5nIHRvZGF5IHN0YXRlXHJcbiAgdG9kYXlEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuXHJcbiAgaXNEYXlUb2RheShkYXk6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiB0aGlzLmFjdGl2ZU1vbnRoID09IHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCkgJiYgZGF5ID09IHRoaXMudG9kYXlEYXRlLmdldERhdGUoKTtcclxuICB9XHJcbiAgaXNNb250aFRvZGF5KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuICBpc1llYXJUb2RheSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB5ZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLyEgZGV0ZXJtaW5pbmcgaWYgYW4gZW50cnkgaXMgc2VsZWN0ZWRcclxuICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSBkYXkgPSBkYXkuZ2V0RGF0ZSgpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZCAhPSBudWxsICYmIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnNlbGVjdGVkLmdldE1vbnRoKCkgJiYgZGF5ID09IHRoaXMuc2VsZWN0ZWQuZ2V0RGF0ZSgpXHJcbiAgICApO1xyXG4gIH1cclxuICBpc01vbnRoU2VsZWN0ZWQobW9udGg6IG51bWJlciB8IERhdGUpOiBib29sZWFuIHtcclxuICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgdGhpcy5hY3RpdmVZZWFyID09IHRoaXMuc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnNlbGVjdGVkLmdldE1vbnRoKCk7XHJcbiAgfVxyXG4gIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlciB8IERhdGUpOiBib29sZWFuIHtcclxuICAgIGlmICh5ZWFyIGluc3RhbmNlb2YgRGF0ZSkgeWVhciA9IHllYXIuZ2V0RnVsbFllYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgeWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLyEgY29sb3IgJiB3cmFwcGVyIGNsYXNzZXNcclxuICBASW5wdXQoKSBjb2xvcjogQ29tcG9uZW50Q29sb3IgPSBDb21wb25lbnRDb2xvci5QcmltYXJ5O1xyXG5cclxuICBnZXQgbmdDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW2BhcmQtY29sb3ItJHt0aGlzLmNvbG9yfWAsIHRoaXMubm9pbnRlcmFjdCA/ICdhcmQtY2FsZW5kYXItbm9pbnRlcmFjdCcgOiAnJywgdGhpcy5zdGF0aWNIZWlnaHQgPyAnYXJkLWNhbGVuZGFyLXN0YXRpYy1oZWlnaHQnIDogJyddLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8vISBvcGVuIHllYXIgJiBtb250aCBzZXR0ZXJzXHJcbiAgLy9waWNrIGEgeWVhciByYW5nZSBzdGFydCBzbyB0aGF0IHRoZSB0b2RheSBkYXRlIGlzIGFsd2F5cyBpbiB0aGUgM3JkIHJvd1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9kYXlZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAtICh0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpICUgNCkgLSA4O1xyXG5cclxuICBkaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0O1xyXG5cclxuICBwcml2YXRlIF91cGRhdGVEaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydChmb3JjZWRZZWFyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZWZpbmVkKGZvcmNlZFllYXIpKSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gZm9yY2VkWWVhcjtcclxuXHJcbiAgICAvL2FkZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3RpdmUgeWVhciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgeWVhclxyXG4gICAgLy9yb3VuZGVkIHRvIGEgbXVsdGlwbGUgb2YgMjQsIHRvd2FyZHMgdGhlIG51bWJlciB6ZXJvXHJcbiAgICAvL3RoZSBkaWZmZXJlbmNlIG1heSBiZSBuZWdhdGl2ZSwgaWYgdGhlIGFjdGl2ZSB5ZWFyIGlzIGJlZm9yZSB0b2RheVllYXJSYW5nZVN0YXJ0XHJcbiAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0ICsgcm91bmRUb011bHRpcGxlKHRoaXMuYWN0aXZlWWVhciAtIHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydCwgMjQsICd0b196ZXJvJyk7XHJcbiAgfVxyXG5cclxuICB5ZWFyUmFuZ2VBcnJheUNhY2hlOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xyXG4gIGdldCB5ZWFyUmFuZ2VBcnJheSgpOiBudW1iZXJbXSB7XHJcbiAgICBpZiAoIXRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSkge1xyXG4gICAgICBsZXQgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xyXG4gICAgICBjb25zdCBuZXdBcnJheSA9IG5ldyBBcnJheSgyNCkubWFwKCgpID0+IHllYXJSYW5nZVN0YXJ0KyspO1xyXG4gICAgICB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBuZXdBcnJheTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FjdGl2ZURhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpLCB0aGlzLnRvZGF5RGF0ZS5nZXREYXRlKCkpO1xyXG4gIHNldCBhY3RpdmVEYXRlKHY6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2KTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gbmV3RGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xyXG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IG5ld0RhdGU7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gIH1cclxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEYXRlIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZVllYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGFjdGl2ZVllYXIodjogYW55KSB7XHJcbiAgICBjb25zdCB5ZWFyID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKTtcclxuICAgIHRoaXMuX2FjdGl2ZURhdGUuc2V0RnVsbFllYXIoeWVhcik7XHJcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCAxKTtcclxuICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZU1vbnRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHNldCBhY3RpdmVNb250aCh2OiBhbnkpIHtcclxuICAgIGNvbnN0IG1vbnRoID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRNb250aCgpKTtcclxuICAgIGNvbnN0IG9sZERhdGVZZWFyID0gdGhpcy5hY3RpdmVZZWFyO1xyXG4gICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XHJcbiAgICBpZiAob2xkRGF0ZVllYXIgIT0gdGhpcy5hY3RpdmVZZWFyKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcclxuICB9XHJcbiAgLy8hIHNlbGVjdGlvbiBmdW5jdGlvbnNcclxuICBwcm90ZWN0ZWQgX3NlbGVjdGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0ZWQodjogYW55KSB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUodik7XHJcbiAgfVxyXG4gIGdldCBzZWxlY3RlZCgpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHY6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgIC8vdHJ5IHRvIHNlZSBpZiBpdCBpcyBhbiBhcnJheSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBhIGNvbW1hXHJcbiAgICAgIGNvbnN0IHZBc0FycmF5MSA9IHYuc3BsaXQoJywnKS5tYXAodiA9PiBOdW1iZXIodikpO1xyXG4gICAgICBpZiAodkFzQXJyYXkxLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5MS5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTEuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XHJcbiAgICAgICAgdiA9IG5ldyBEYXRlKHZBc0FycmF5MVswXSwgdkFzQXJyYXkxWzFdID8/IDAsIHZBc0FycmF5MVsyXSA/PyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL3RyeSB0byBzZWUgaWYgaXQgaXMgYW4gYXJyYXkgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgc29tZSB3aGl0ZXNwYWNlXHJcbiAgICAgICAgY29uc3QgdkFzQXJyYXkyID0gdi5zcGxpdCgvXFxzLykubWFwKHYgPT4gTnVtYmVyKHYpKTtcclxuICAgICAgICBpZiAodkFzQXJyYXkyLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5Mi5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTIuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XHJcbiAgICAgICAgICB2ID0gbmV3IERhdGUodkFzQXJyYXkyWzBdLCB2QXNBcnJheTJbMV0gPz8gMCwgdkFzQXJyYXkyWzJdID8/IDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2ID0gbmV3IERhdGUodik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL2lzIGEgRGF0ZSBvYmplY3QgJiYgZG9lcyBub3QgY29udGFpbiBhbiBlcnJvclxyXG4gICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2LnZhbHVlT2YoKSkpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodiA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcGFyc2UgW3NlbGVjdGVkXSB2YWx1ZSBvbiA8YXJkLWNhbGVuZGFyPiwgYXMgaXQgaXMgbm90IGEgdmFsaWQgdmFsdWUuIFByb3ZpZGVkIHZhbHVlOiBcIiR7dn1cImApO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8hIG91dHB1dCBldmVudHNcclxuICBAT3V0cHV0KCkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcclxuICBAT3V0cHV0KCkgYWN0aXZlWWVhckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBhY3RpdmVNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBAT3V0cHV0KCkgdmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJWaWV3PigpO1xyXG5cclxuICBAT3V0cHV0KCdjaGFuZ2UnKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XHJcblxyXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgdGhpcy5fb25DaGFuZ2VSZWdpc3RlcmVkPy4odik7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodik7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodik7XHJcbiAgfVxyXG5cclxuICAvLyEgY2FsZW5kYXIgZW50cnkgaG92ZXIgJiBjbGlja1xyXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkRGF5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBnZXQgaGlnaGxpZ2h0ZWREYXkoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWREYXk7XHJcbiAgfVxyXG4gIHNldCBoaWdobGlnaHRlZERheSh2OiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICBpZiAoaXNOdWxsKHYpKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodGVkRGF5ID0gdjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgdik7XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZERheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0SGlnaGxpZ2h0ZWREYXlBZGp1c3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xyXG5cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIHRoaXMuYWN0aXZlTW9udGgsIGRheSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVNb250aCAhPSBkYXRlLmdldE1vbnRoKCkpIHRoaXMuYWN0aXZlTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oaWdobGlnaHRlZE1vbnRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBnZXQgaGlnaGxpZ2h0ZWRNb250aCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZE1vbnRoO1xyXG4gIH1cclxuICBzZXQgaGlnaGxpZ2h0ZWRNb250aCh2OiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICBpZiAoaXNOdWxsKHYpKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodGVkTW9udGggPSB2O1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB2LCAxKTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBzZXRIaWdobGlnaHRlZE1vbnRoQWRqdXN0RGF0ZShtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSBtb250aDtcclxuXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgZ2V0IGhpZ2hsaWdodGVkWWVhcigpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZFllYXI7XHJcbiAgfVxyXG4gIHNldCBoaWdobGlnaHRlZFllYXIodjogbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRZZWFyID0gdjtcclxuICB9XHJcblxyXG4gIHNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UoeWVhcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHllYXI7XHJcblxyXG4gICAgaWYgKHllYXIgPCB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0IHx8IHllYXIgPj0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArIDI0KSB7XHJcbiAgICAgIC8vYWRkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hsaWdodGVkIHllYXIgYW5kIHRoZSBkaXNwbGF5ZWQgcmFuZ2Ugc3RhcnQgeWVhclxyXG4gICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgYXdheSBmcm9tIHRoZSBudW1iZXIgemVyb1xyXG4gICAgICAvL3RoZSBkaWZmZXJlbmNlIG1heSBiZSBuZWdhdGl2ZSwgaWYgdGhlIGZpcnN0IGlmIGNvbmRpdGlvbiBpcyBtZXRcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArPSByb3VuZFRvTXVsdGlwbGUoeWVhciAtIHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQsIDI0LCAnZnJvbV96ZXJvJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudEFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgdGhpcy5oaWdobGlnaHRlZERheSA/PyAxKS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCB7XHJcbiAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICBtb250aDogJ2xvbmcnLFxyXG4gICAgICBkYXk6ICdudW1lcmljJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckRheU1vdXNlb3ZlcihkYXk6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChkYXkgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XHJcbiAgfVxyXG4gIG9uQ2FsZW5kYXJNb250aE1vdXNlb3Zlcihtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNVc2luZ0tleWJvYXJkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gbW9udGg7XHJcbiAgfVxyXG4gIG9uQ2FsZW5kYXJZZWFyTW91c2VvdmVyKHllYXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0geWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVXNpbmdLZXlib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScpXHJcbiAgb25Eb2N1bWVudE1vdXNlbW92ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5faXNVc2luZ0tleWJvYXJkKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSBmYWxzZTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicpXHJcbiAgb25Eb2N1bWVudEtleWRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckRheUNsaWNrKGRheTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGRheSA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcclxuXHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xyXG4gIH1cclxuICBvbkNhbGVuZGFyTW9udGhDbGljayhtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcclxuICB9XHJcbiAgb25DYWxlbmRhclllYXJDbGljayh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcclxuICB9XHJcblxyXG4gIG9uRGF5R3JpZEZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XHJcbiAgfVxyXG4gIG9uRGF5R3JpZEJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gbnVsbDtcclxuICB9XHJcbiAgb25EYXlHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID8/PSAxO1xyXG4gIH1cclxuXHJcbiAgb25Nb250aEdyaWRGb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDA7XHJcbiAgfVxyXG4gIG9uTW9udGhHcmlkQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7XHJcbiAgfVxyXG4gIG9uTW9udGhHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPz89IDA7XHJcbiAgfVxyXG5cclxuICBvblllYXJHcmlkRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgfVxyXG4gIG9uWWVhckdyaWRCbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSBudWxsO1xyXG4gIH1cclxuICBvblllYXJHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA/Pz0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcclxuICB9XHJcblxyXG4gIC8vISBtYWluIGdyaWQga2V5Ym9hcmQgY29udHJvbHNcclxuICBvbk1haW5HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XHJcbiAgICAgIGNhc2UgJ1NwYWNlJzpcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgIHRoaXMuX29uQXJyb3dVcFByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICB0aGlzLl9vbkFycm93RG93blByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICB0aGlzLl9vbkFycm93TGVmdFByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgdGhpcy5fb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICB0aGlzLl9vbkhvbWVQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgICAgdGhpcy5fb25FbmRQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XHJcbiAgICAgICAgdGhpcy5fb25QYWdlVXBQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICB0aGlzLl9vblBhZ2VEb3duUHJlc3MoZXZlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vc2VsZWN0IGN1cnJlbnRseSBzZWxlY3RlZCBlbnRyeVxyXG4gIHByaXZhdGUgX29uRW50ZXJQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdEN1cnJlbnRseUhpZ2hsaWdodGVkKCk7XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IHRoZSBlbnRyeSBvbmUgbGluZSBhYm92ZVxyXG4gIHByaXZhdGUgX29uQXJyb3dVcFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzRGF5KDcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c01vbnRoKDMpOyAvLzMgbW9udGhzIHBlciBsaW5lXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNZZWFyKDQpOyAvLzQgeWVhcnMgcGVyIGxpbmVcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgLy9oaWdobGlnaHQgdGhlIGVudHJ5IG9uZSBsaW5lIGJlbG93XHJcbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KDcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0TW9udGgoMyk7IC8vMyBtb250aHMgcGVyIGxpbmVcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcig0KTsgLy80IHllYXJzIHBlciBsaW5lXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IHByZXZpb3VzIGVudHJ5XHJcbiAgcHJpdmF0ZSBfb25BcnJvd0xlZnRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c0RheSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c01vbnRoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IG5leHQgZW50cnlcclxuICBwcml2YXRlIF9vbkFycm93UmlnaHRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IGZpcnN0IGVudHJ5IG9uIHRoZSBwYWdlXHJcbiAgcHJpdmF0ZSBfb25Ib21lUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3REYXkoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3RNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodEZpcnN0WWVhcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICAvL2hpZ2hsaWdodCBsYXN0IGVudHJ5IG9uIHRoZSBwYWdlXHJcbiAgcHJpdmF0ZSBfb25FbmRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0RGF5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodExhc3RNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodExhc3RZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYWxvbmU6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG9uIHRoZSBwcmV2aW91cyBwYWdlXHJcbiAgLy93aXRoIGFsdDogaGlnaGxpZ2h0IHNhbWUgZW50cnkgbXVsdGlwbGUgcGFnZXMgYmVmb3JlIChkYXlzIHZpZXc6IDEyIHBhZ2VzLCBtb250aHMgdmlldzogMTAgcGFnZXMsIHllYXJzIHZpZXc6IDUgcGFnZXMpXHJcbiAgcHJpdmF0ZSBfb25QYWdlVXBQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c01vbnRoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVNb250aFByZXZpb3VzWWVhcihldmVudC5hbHRLZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVZZWFyUHJldmlvdXNQYWdlKGV2ZW50LmFsdEtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYWxvbmU6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG9uIHRoZSBuZXh0IHBhZ2VcclxuICAvL3dpdGggYWx0OiBoaWdobGlnaHQgc2FtZSBlbnRyeSBtdWx0aXBsZSBwYWdlcyBhZnRlciAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxyXG4gIHByaXZhdGUgX29uUGFnZURvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTtcclxuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhOZXh0WWVhcihldmVudC5hbHRLZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UoZXZlbnQuYWx0S2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgLy8hIG1hbmlwdWxhdGlvbiBtZXRob2RzXHJcbiAgLy9zZWxlY3RpbmdcclxuICBzZWxlY3REYXkoZGF5OiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNEYXlTZWxlY3RlZChkYXkpKSByZXR1cm47XHJcbiAgICBpZiAoaXNOdWxsKGRheSkpIHtcclxuICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkgZGF5ID0gZGF5LmdldERhdGUoKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xyXG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xyXG4gIH1cclxuICBzZWxlY3RNb250aChtb250aDogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGwobW9udGgpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGggPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAobW9udGggaW5zdGFuY2VvZiBEYXRlKSBtb250aCA9IG1vbnRoLmdldE1vbnRoKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVNb250aCA9IG1vbnRoO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XHJcbiAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChtb250aCk7XHJcblxyXG4gICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICB9XHJcbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbCh5ZWFyKSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIgPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoeWVhciBpbnN0YW5jZW9mIERhdGUpIHllYXIgPSB5ZWFyLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyID0geWVhcjtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh5ZWFyKTtcclxuICAgIHRoaXMueWVhclNlbGVjdGVkLmVtaXQoeWVhcik7XHJcblxyXG4gICAgdGhpcy5vcGVuTW9udGhzVmlldygpO1xyXG4gIH1cclxuICBzZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZCgpOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWREYXkpKSByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcclxuICAgICAgICB0aGlzLnNlbGVjdERheSh0aGlzLmhpZ2hsaWdodGVkRGF5KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKHRoaXMuaGlnaGxpZ2h0ZWRNb250aCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLnNlbGVjdFllYXIodGhpcy5oaWdobGlnaHRlZFllYXIpO1xyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICAvL2FjdGl2ZSBtb250aHMveWVhcnNcclxuICBjaGFuZ2VNb250aChvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3Qgb2xkeWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcclxuICAgIHRoaXMuYWN0aXZlTW9udGggKz0gb2Zmc2V0O1xyXG5cclxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gb2xkeWVhcikgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcclxuICAgIHRoaXMuYWN0aXZlTW9udGhDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZU1vbnRoKTtcclxuICB9XHJcbiAgY2hhbmdlWWVhcihvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyICs9IG9mZnNldDtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xyXG4gIH1cclxuICAvL2NoYW5naW5nIHllYXIgcGFnZVxyXG4gIGNoYW5nZVllYXJzVmlld1BhZ2UocGFnZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArPSAyNCAqIHBhZ2VzO1xyXG4gIH1cclxuICAvL25leHQvcHJldiBoaWdobGlnaHRpbmdcclxuICBoaWdobGlnaHROZXh0RGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudERheSA9IHRoaXMuaGlnaGxpZ2h0ZWREYXk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50RGF5KSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoY3VycmVudERheSArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzRGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KG9mZnNldCAqIC0xKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy5oaWdobGlnaHRlZE1vbnRoO1xyXG4gICAgaWYgKCFpc0RlZmluZWQoY3VycmVudE1vbnRoKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGhBZGp1c3REYXRlKGN1cnJlbnRNb250aCArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzTW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aChvZmZzZXQgKiAtMSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodE5leHRZZWFyKG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmhpZ2hsaWdodGVkWWVhcjtcclxuICAgIGlmICghaXNEZWZpbmVkKGN1cnJlbnRZZWFyKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IDA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZShjdXJyZW50WWVhciArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzWWVhcihvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0TmV4dFllYXIob2Zmc2V0ICogLTEpO1xyXG4gIH1cclxuICAvL2ZpcnN0L2xhc3QgaGlnaGxpZ2h0aW5nXHJcbiAgaGlnaGxpZ2h0Rmlyc3REYXkoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TGFzdERheSgpOiB2b2lkIHtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVNb250aCArIDEpIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgY2FzZSA3OlxyXG4gICAgICBjYXNlIDg6XHJcbiAgICAgIGNhc2UgMTA6XHJcbiAgICAgIGNhc2UgMTI6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDMxO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgY2FzZSA5OlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAzMDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcclxuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcclxuICAgIH1cclxuICB9XHJcbiAgaGlnaGxpZ2h0Rmlyc3RNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDA7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodExhc3RNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDExO1xyXG4gIH1cclxuICBoaWdobGlnaHRGaXJzdFllYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodExhc3RZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICsgMjM7IC8vMjQgeWVhcnMgcGVyIHBhZ2VcclxuICB9XHJcbiAgLy9zYW1lIGRheSBuZXh0L3ByZXYgbW9udGgveWVhclxyXG4gIGhpZ2hsaWdodFNhbWVEYXlOZXh0TW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vbnRoKys7XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vbnRoLS07XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlTW9udGggKyAxKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgIGNhc2UgNzpcclxuICAgICAgY2FzZSA4OlxyXG4gICAgICBjYXNlIDEwOlxyXG4gICAgICBjYXNlIDEyOlxyXG4gICAgICAgIC8vZG8gbm90aGluZ1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgY2FzZSA5OlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICAgIC8vb25seSBkbyBpZiBkYXkgaXMgMzFcclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSA9PSAzMSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6IHtcclxuICAgICAgICAvL3NraXAgaWYgYmVsb3cgMjkgb3IgbnVsbFxyXG4gICAgICAgIGlmICghdGhpcy5oaWdobGlnaHRlZERheSB8fCB0aGlzLmhpZ2hsaWdodGVkRGF5IDwgMjkpIGJyZWFrO1xyXG5cclxuICAgICAgICBpZiAoaXNMZWFwWWVhcih0aGlzLmFjdGl2ZVllYXIpKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMjk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMjg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheU5leHRZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyKys7XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xyXG4gIH1cclxuICBoaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyLS07XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xyXG4gIH1cclxuICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWREYXkgIT0gMjkpIHJldHVybjsgLy9za2lwIGlmIG5vdCAyOXRoIGRheSBpcyBzZWxlY3RlZFxyXG4gICAgaWYgKGlzTGVhcFllYXIodGhpcy5hY3RpdmVZZWFyKSkgcmV0dXJuOyAvL3NraXAgaWYgbmVhIHllYXIgaXMgYSBsZWFwIHllYXJcclxuICAgIGlmICh0aGlzLmFjdGl2ZU1vbnRoICE9IDEpIHJldHVybjsgLy9za2lwIGlmIG5vdCBmZWJydWFyeVxyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcclxuICB9XHJcbiAgLy9zYW1lIG1vbnRoIG5leHQvcHJldiB5ZWFyXHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlWWVhciArPSBtdWx0aXBsZSA/IDEwIDogMTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoUHJldmlvdXNZZWFyKG11bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZVllYXIgLT0gbXVsdGlwbGUgPyAxMCA6IDE7XHJcbiAgfVxyXG4gIC8vc2FtZSB5ZWFyIG5leHQvcHJldiBwYWdlKHMpXHJcbiAgaGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZFllYXIpKSB7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh0aGlzLmhpZ2hsaWdodGVkWWVhciArIChtdWx0aXBsZSA/IDYwIDogMjQpKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZVllYXJQcmV2aW91c1BhZ2UobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UodGhpcy5oaWdobGlnaHRlZFllYXIgLSAobXVsdGlwbGUgPyA2MCA6IDI0KSk7XHJcbiAgfVxyXG5cclxuICAvLyEgc2V0dGluZ3NcclxuICBwcm90ZWN0ZWQgX2ZpcnN0V2Vla2RheTogbnVtYmVyID0gMTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBmaXJzdFdlZWtkYXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFdlZWtkYXk7XHJcbiAgfVxyXG4gIHNldCBmaXJzdFdlZWtkYXkodjogYW55KSB7XHJcbiAgICB0aGlzLl9maXJzdFdlZWtkYXkgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCAxKSAlIDc7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gICAgdGhpcy5fdXBkYXRlV2Vla2RheUFycmF5KCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX25vaW50ZXJhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBub2ludGVyYWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25vaW50ZXJhY3QgfHwgdGhpcy5kaXNhYmxlZDtcclxuICB9XHJcbiAgc2V0IG5vaW50ZXJhY3QodjogYW55KSB7XHJcbiAgICB0aGlzLl9ub2ludGVyYWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zdGF0aWNIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBzdGF0aWNIZWlnaHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljSGVpZ2h0O1xyXG4gIH1cclxuICBzZXQgc3RhdGljSGVpZ2h0KHY6IGFueSkge1xyXG4gICAgdGhpcy5fc3RhdGljSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGNhbGVuZGFyIGFycmF5XHJcbiAgLy9kYXlzIHZpZXcgYXJyYXlcclxuICBjYWxlbmRhckFycmF5ITogKG51bWJlciB8IG51bGwpW11bXTtcclxuXHJcbiAgcmVzZXJ2ZVRvcFJvdyE6IGJvb2xlYW47XHJcblxyXG4gIHByb3RlY3RlZCBfdXBkYXRlQ2FsZW5kYXJBcnJheSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlc3VsdE9iaiA9IGdldE1vbnRoTGF5b3V0KHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuZmlyc3RXZWVrZGF5KTtcclxuXHJcbiAgICB0aGlzLnJlc2VydmVUb3BSb3cgPSByZXN1bHRPYmoubGVhZGluZ1NwYWNlcyA8IDM7XHJcbiAgICB0aGlzLmNhbGVuZGFyQXJyYXkgPSByZXN1bHRPYmouYXJyYXk7XHJcbiAgfVxyXG5cclxuICAvL21vbnRocyB2aWV3IGFycmF5XHJcbiAgcmVhZG9ubHkgbW9udGhzQXJyYXk6IG51bWJlcltdID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMV07XHJcblxyXG4gIC8veWVhcnMgdmlldyBhcnJheVxyXG4gIHByaXZhdGUgX3llYXJzQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIGdldFllYXJzQXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcblxyXG4gICAgaWYgKHRoaXMuX3llYXJzQXJyYXlDYWNoZVN0YXJ0WWVhciA9PSB5ZWFyICYmIGlzRGVmaW5lZCh0aGlzLl95ZWFyc0FycmF5Q2FjaGUpKSByZXR1cm4gdGhpcy5feWVhcnNBcnJheUNhY2hlO1xyXG5cclxuICAgIGNvbnN0IG5ld0FycmF5OiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSB5ZWFyOyBpIDwgeWVhciArIDI0OyBpKyspIHtcclxuICAgICAgbmV3QXJyYXkucHVzaChpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGUgPSBuZXdBcnJheTtcclxuICAgIHRoaXMuX3llYXJzQXJyYXlDYWNoZVN0YXJ0WWVhciA9IHllYXI7XHJcbiAgICByZXR1cm4gbmV3QXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLyEgd2Vla2RheSBhcnJheVxyXG4gIHdlZWtkYXlBcnJheSE6IG51bWJlcltdO1xyXG5cclxuICBwcm90ZWN0ZWQgX3VwZGF0ZVdlZWtkYXlBcnJheSgpOiB2b2lkIHtcclxuICAgIHRoaXMud2Vla2RheUFycmF5ID0gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcCh2ID0+ICh2ICsgdGhpcy5maXJzdFdlZWtkYXkpICUgNyk7XHJcbiAgfVxyXG5cclxuICAvLyEgY2hhbmdlIHZpZXcgZnVuY3Rpb25zXHJcbiAgYWN0aXZlVmlldzogQ2FsZW5kYXJWaWV3ID0gQ2FsZW5kYXJWaWV3LkRheXM7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHN0YXJ0Vmlldyh2OiBDYWxlbmRhclZpZXcpIHtcclxuICAgIHRoaXMuYWN0aXZlVmlldyA9IHY7XHJcbiAgfVxyXG5cclxuICBvcGVuWWVhcnNWaWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3LlllYXJzO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXllZFllYXJSYW5nZVN0YXJ0KCk7XHJcblxyXG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcy5hY3RpdmVWaWV3KTtcclxuICB9XHJcbiAgb3Blbk1vbnRoc1ZpZXcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuTW9udGhzO1xyXG4gICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZVxyXG4gICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcclxuICAgIHRoaXMuYWN0aXZlWWVhciA9IHRoaXMuYWN0aXZlWWVhciA/PyB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgIC8vZW1pdCBldmVudHNcclxuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XHJcbiAgICBpZiAob2xkWWVhciAhPSB0aGlzLmFjdGl2ZVllYXIgJiYgdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhckNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlWWVhcik7XHJcbiAgfVxyXG4gIG9wZW5EYXlzVmlldygpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlVmlldyA9IENhbGVuZGFyVmlldy5EYXlzO1xyXG4gICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZXNcclxuICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmFjdGl2ZVllYXI7XHJcbiAgICB0aGlzLmFjdGl2ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXIgPz8gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5hY3RpdmVNb250aDtcclxuICAgIHRoaXMuYWN0aXZlTW9udGggPSB0aGlzLmFjdGl2ZU1vbnRoID8/IHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCk7XHJcblxyXG4gICAgLy9lbWl0IGV2ZW50c1xyXG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcy5hY3RpdmVWaWV3KTtcclxuICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcclxuICAgIGlmIChvbGRNb250aCAhPSB0aGlzLmFjdGl2ZU1vbnRoICYmIHRoaXMuYWN0aXZlTW9udGggPT0gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKSkgdGhpcy5hY3RpdmVNb250aENoYW5nZS5lbWl0KHRoaXMuYWN0aXZlTW9udGgpO1xyXG4gIH1cclxuXHJcbiAgLy8hIHRlbXBsYXRlIGN1c3RvbWl6YXRpb25cclxuICAvL2hlYWRlcnNcclxuICBAQ29udGVudENoaWxkKEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gIHllYXJzVmlld0hlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICBAQ29udGVudENoaWxkKEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICBtb250aHNWaWV3SGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICBAQ29udGVudENoaWxkKEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICAvL3dlZWtkYXlcclxuICBAQ29udGVudENoaWxkKEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICB3ZWVrZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhcldlZWtkYXlDb250ZXh0PjtcclxuICAvL2Zsb2F0aW5nIG1vbnRoXHJcbiAgQENvbnRlbnRDaGlsZChBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZmxvYXRpbmdNb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dD47XHJcbiAgLy9ncmlkIGVsZW1lbnRzICh5ZWFyLCBtb250aCwgZGF5KVxyXG4gIEBDb250ZW50Q2hpbGQoQXJkWWVhclRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gIHllYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyWWVhckNvbnRleHQ+O1xyXG4gIEBDb250ZW50Q2hpbGQoQXJkTW9udGhUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICBtb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJNb250aENvbnRleHQ+O1xyXG4gIEBDb250ZW50Q2hpbGQoQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhckRheUNvbnRleHQ+O1xyXG5cclxuICAvLyEgY29udGV4dCBnZXR0ZXJzXHJcbiAgLy9oZWFkZXJzXHJcbiAgZ2V0WWVhcnNWaWV3SGVhZGVyQ29udGV4dCgpOiBDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQge1xyXG4gICAgY29uc3QgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xyXG4gICAgY29uc3QgeWVhclJhbmdlRW5kID0geWVhclJhbmdlU3RhcnQgKyAyMztcclxuICAgIGNvbnN0IGRhdGVSYW5nZTogRGF0ZVJhbmdlID0ge1xyXG4gICAgICBsb3c6IG5ldyBEYXRlKHllYXJSYW5nZVN0YXJ0LCAwLCAxKSxcclxuICAgICAgaGlnaDogbmV3IERhdGUoeWVhclJhbmdlRW5kLCAwLCAxKSxcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZXh0UGFnZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcnNWaWV3UGFnZSgrMSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHByZXZQYWdlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VZZWFyc1ZpZXdQYWdlKC0xKTtcclxuICAgICAgfSxcclxuICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgeWVhclJhbmdlOiB7XHJcbiAgICAgICAgbG93OiB5ZWFyUmFuZ2VTdGFydCxcclxuICAgICAgICBoaWdoOiB5ZWFyUmFuZ2VFbmQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGVSYW5nZSxcclxuICAgICAgJGltcGxpY2l0OiBkYXRlUmFuZ2UsXHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRNb250aHNWaWV3SGVhZGVyQ29udGV4dCgpOiBDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG9wZW5ZZWFyc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5ZZWFyc1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgeWVhcjogdGhpcy5hY3RpdmVZZWFyLFxyXG4gICAgICBkYXRlOiB0aGlzLmFjdGl2ZURhdGUsXHJcbiAgICAgICRpbXBsaWNpdDogdGhpcy5hY3RpdmVZZWFyLFxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0RGF5c1ZpZXdIZWFkZXJDb250ZXh0KCk6IENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5leHRNb250aDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoKzEpO1xyXG4gICAgICB9LFxyXG4gICAgICBwcmV2TW9udGg6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcclxuICAgICAgfSxcclxuICAgICAgbmV4dFllYXI6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZVllYXIoKzEpO1xyXG4gICAgICB9LFxyXG4gICAgICBwcmV2WWVhcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcigtMSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9wZW5ZZWFyc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5ZZWFyc1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgb3Blbk1vbnRoc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5Nb250aHNWaWV3KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHllYXI6IHRoaXMuYWN0aXZlWWVhcixcclxuICAgICAgbW9udGg6IHRoaXMuYWN0aXZlTW9udGgsXHJcbiAgICAgIGRhdGU6IHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXHJcbiAgICB9O1xyXG4gIH1cclxuICAvL3dlZWtkYXlcclxuICBnZXRXZWVrZGF5Q29udGV4dChkYXlJbmRleDogbnVtYmVyKTogQ2FsZW5kYXJXZWVrZGF5Q29udGV4dCB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMTk3MCwgMCwgNCArIGRheUluZGV4KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRheUluZGV4LFxyXG4gICAgICBkYXRlLFxyXG4gICAgICAkaW1wbGljaXQ6IGRhdGUsXHJcbiAgICB9O1xyXG4gIH1cclxuICAvL2Zsb2F0aW5nIG1vbnRoXHJcbiAgZ2V0RmxvYXRpbmdNb250aENvbnRleHQoKTogQ2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtb250aDogdGhpcy5hY3RpdmVNb250aCxcclxuICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxyXG4gICAgICAkaW1wbGljaXQ6IHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgIH07XHJcbiAgfVxyXG4gIC8vZ3JpZCBlbGVtZW50cyAoeWVhciwgbW9udGgsIGRheSlcclxuICBnZXRZZWFyQ29udGV4dCh5ZWFyOiBudW1iZXIpOiBDYWxlbmRhclllYXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHZhbHVlOiB5ZWFyLFxyXG4gICAgICBkYXRlOiBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIDAsIDEpLFxyXG4gICAgICAkaW1wbGljaXQ6IHllYXIsXHJcbiAgICAgIHNlbGVjdDogKHllYXI6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldE1vbnRoQ29udGV4dChtb250aDogbnVtYmVyKTogQ2FsZW5kYXJNb250aENvbnRleHQge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgbW9udGgsIDEpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbW9udGgsXHJcbiAgICAgIGRhdGUsXHJcbiAgICAgICRpbXBsaWNpdDogZGF0ZSxcclxuICAgICAgc2VsZWN0OiAobW9udGg6IG51bWJlciB8IERhdGUpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldERheUNvbnRleHQoZGF5OiBudW1iZXIpOiBDYWxlbmRhckRheUNvbnRleHQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdmFsdWU6IGRheSxcclxuICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpLFxyXG4gICAgICAkaW1wbGljaXQ6IGRheSxcclxuICAgICAgc2VsZWN0OiAoZGF5OiBudW1iZXIgfCBEYXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXJcIiBbbmdDbGFzc109XCJuZ0NsYXNzZXNcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3RpdmVWaWV3ID09ICdkYXlzJyA/IGRheXNWaWV3IDogYWN0aXZlVmlldyA9PSAnbW9udGhzJyA/IG1vbnRoc1ZpZXcgOiB5ZWFyc1ZpZXdcIi8+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICN5ZWFyc1ZpZXc+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyclJhbmdlIGxldC1uZXh0UGFnZT1cIm5leHRQYWdlXCIgbGV0LXByZXZQYWdlPVwicHJldlBhZ2VcIiBsZXQtb3BlbkRheXNWaWV3PVwib3BlbkRheXNWaWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5cy12aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRheXNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJSYW5nZS5sb3cgfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICAmbWRhc2g7XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY3VyclJhbmdlLmhpZ2ggfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2FyZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWFycm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cInByZXZQYWdlKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24+Y2hldnJvbl9yaWdodDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInllYXJzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyc1ZpZXdIZWFkZXJDb250ZXh0KClcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLXNpbXBsZS1ncmlkXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvblllYXJHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25ZZWFyR3JpZEJsdXIoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblllYXJHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB5ZWFyIG9mIGdldFllYXJzQXJyYXkoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1oaWdobGlnaHRlZF09XCJoaWdobGlnaHRlZFllYXIgPT0geWVhciB8fCBhY3RpdmVZZWFyID09IHllYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItdG9kYXldPVwiaXNZZWFyVG9kYXkoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyWWVhckNsaWNrKHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyWWVhck1vdXNlb3Zlcih5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtYnV0dG9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFllYXJUZW1wbGF0ZSBsZXQteWVhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwieWVhclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyQ29udGV4dCh5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbW9udGhzVmlldz5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQteWVhciBsZXQtbmV4dFBhZ2U9XCJuZXh0UGFnZVwiIGxldC1wcmV2UGFnZT1cInByZXZQYWdlXCIgbGV0LW9wZW5EYXlzVmlldz1cIm9wZW5EYXlzVmlld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWRheXMtdmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXlzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9hcmQtYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItc2ltcGxlLWdyaWRcIlxyXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cImN1cnJlbnRBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uTW9udGhHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25Nb250aEdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb250aEdyaWRDbGljaygpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25NYWluR3JpZEtleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoc0FycmF5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LWhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkTW9udGggPT0gbW9udGggfHwgYWN0aXZlTW9udGggPT0gbW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci10b2RheV09XCJpc01vbnRoVG9kYXkobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhck1vbnRoQ2xpY2sobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyTW9udGhNb3VzZW92ZXIobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnktYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWZvY3VzLW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1idXR0b24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TW9udGhUZW1wbGF0ZSBsZXQtbW9udGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGggfCBkYXRlOiBcIk1NTVwiIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0TW9udGhUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE1vbnRoQ29udGV4dChtb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RheXNWaWV3PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyckRhdGUgbGV0LW5leHRNb250aD1cIm5leHRNb250aFwiIGxldC1wcmV2TW9udGg9XCJwcmV2TW9udGhcIiBsZXQtb3BlblllYXJzVmlldz1cIm9wZW5ZZWFyc1ZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXlzLXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXJkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuWWVhcnNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJEYXRlIHwgZGF0ZTogJ01NTSBZWVlZJyB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3dcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYXJkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItYXJyb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwicHJldk1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fcmlnaHQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXlzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHREYXlzVmlld0hlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheXNWaWV3SGVhZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXktbGFiZWxzIGFyZC1jYWxlbmRhci1ncmlkXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdlZWtkYXlUZW1wbGF0ZSBsZXQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItd2Vla2RheVwiPnt7IGRhdGUgfCBkYXRlOiAnRUVFRUUnIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWtkYXlJbmRleCBvZiB3ZWVrZGF5QXJyYXlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndlZWtkYXlUZW1wbGF0ZSB8fCBkZWZhdWx0V2Vla2RheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0V2Vla2RheUNvbnRleHQod2Vla2RheUluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWdyaWQgYXJkLWNhbGVuZGFyLWdyaWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYXJkLXJlc2VydmUtdG9wLXJvd109XCJyZXNlcnZlVG9wUm93XCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkRheUdyaWRGb2N1cygpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkRheUdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25EYXlHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWZsb2F0aW5nLW1vbnRoXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGbG9hdGluZ01vbnRoVGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdMTEwnIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZsb2F0aW5nTW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0RmxvYXRpbmdNb250aFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0RmxvYXRpbmdNb250aENvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWsgb2YgY2FsZW5kYXJBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1lbXB0eV09XCJkYXkgPT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktaGlnaGxpZ2h0ZWRdPVwiaGlnaGxpZ2h0ZWREYXkgPT0gZGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1zZWxlY3RlZF09XCJpc0RheVNlbGVjdGVkKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLXRvZGF5XT1cImlzRGF5VG9kYXkoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyRGF5Q2xpY2soZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyRGF5TW91c2VvdmVyKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXkgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWJ1dHRvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5VGVtcGxhdGUgbGV0LWRheT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF5VGVtcGxhdGUgfHwgZGVmYXVsdERheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheUNvbnRleHQoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdTcGlubmVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L25nLWNvbnRhaW5lcj4gLS0+Il19
|