@ardium-ui/ui 1.0.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- package/esm2022/lib/buttons/fab/index.mjs +3 -0
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +4 -4
- 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 +4 -4
- package/esm2022/lib/card/index.mjs +5 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
- package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/esm2022/lib/dialog/dialog.module.mjs +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +9 -9
- 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 +18 -18
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +4 -4
- 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/form-field-frame/form-field-frame.component.mjs +20 -47
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +6 -6
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +4 -4
- 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 +4 -4
- package/esm2022/lib/icon/icon.pipe.mjs +3 -3
- package/esm2022/lib/icon/index.mjs +4 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +24 -24
- 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 +4 -4
- 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 +9 -9
- 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-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 +3 -3
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +4 -4
- 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 +12 -12
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +4 -4
- 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 +9 -9
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +4 -4
- package/esm2022/lib/kbd/index.mjs +4 -0
- package/esm2022/lib/kbd/kbd.component.mjs +15 -29
- package/esm2022/lib/kbd/kbd.module.mjs +4 -4
- package/esm2022/lib/kbd/kbd.pipe.mjs +3 -3
- 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 +4 -4
- package/esm2022/lib/modal/index.mjs +3 -0
- package/esm2022/lib/modal/modal.component.mjs +42 -83
- package/esm2022/lib/modal/modal.module.mjs +4 -4
- package/esm2022/lib/option/index.mjs +3 -0
- package/esm2022/lib/option/option.component.mjs +24 -46
- package/esm2022/lib/option/option.module.mjs +4 -4
- 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 +3 -3
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +4 -4
- 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 +3 -3
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- package/esm2022/lib/slider/slider.component.mjs +13 -10
- package/esm2022/lib/slider/slider.directive.mjs +3 -3
- package/esm2022/lib/slider/slider.module.mjs +7 -7
- package/esm2022/lib/slider/slider.types.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.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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- package/esm2022/lib/star/star.component.mjs +12 -20
- package/esm2022/lib/star/star.module.mjs +4 -4
- package/esm2022/lib/statebox/index.mjs +3 -0
- package/esm2022/lib/statebox/statebox.component.mjs +64 -102
- package/esm2022/lib/statebox/statebox.module.mjs +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- package/esm2022/lib/types/item-storage.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/default/_clear-button.scss +1 -1
- package/themes/default/badge.scss +5 -5
- package/themes/default/buttons/fab.scss +5 -3
- package/themes/default/card.scss +7 -7
- package/themes/default/chips.scss +2 -8
- package/themes/default/core.scss +6 -3
- package/themes/default/inputs/digit-input.scss +1 -1
- package/themes/default/inputs/file-input.scss +8 -1
- package/themes/default/inputs/hex-input.scss +1 -1
- package/themes/default/modal.scss +1 -1
- package/themes/default/segment.scss +2 -1
- package/themes/default/select.scss +4 -2
- package/themes/default/snackbar.scss +0 -2
- package/themes/default/tabber.scss +86 -0
- 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,6 +1,6 @@
|
|
|
1
|
-
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
1
|
+
import { Overlay, OverlayConfig, ScrollStrategyOptions } from '@angular/cdk/overlay';
|
|
2
2
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
3
|
-
import { ChangeDetectionStrategy,
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, HostBinding, HostListener, Input, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation, computed, contentChild, forwardRef, inject, input, model, output, signal, viewChild, } from '@angular/core';
|
|
4
4
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
5
|
import { coerceArrayProperty, coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
|
|
6
6
|
import { Subject, merge, startWith, takeUntil } from 'rxjs';
|
|
@@ -16,149 +16,228 @@ import { FormElementAppearance } from '../types/theming.types';
|
|
|
16
16
|
import { FormElementVariant } from './../types/theming.types';
|
|
17
17
|
import { ArdAddCustomTemplateDirective, ArdDropdownFooterTemplateDirective, ArdDropdownHeaderTemplateDirective, ArdItemDisplayLimitTemplateDirective, ArdItemLimitReachedTemplateDirective, ArdLoadingPlaceholderTemplateDirective, ArdLoadingSpinnerTemplateDirective, ArdNoItemsFoundTemplateDirective, ArdOptgroupTemplateDirective, ArdOptionTemplateDirective, ArdSelectPlaceholderTemplateDirective, ArdSelectPrefixTemplateDirective, ArdSelectSuffixTemplateDirective, ArdValueTemplateDirective, } from './select.directive';
|
|
18
18
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/
|
|
20
|
-
import * as i2 from "
|
|
21
|
-
import * as i3 from "../
|
|
22
|
-
import * as i4 from "../
|
|
23
|
-
import * as i5 from "
|
|
24
|
-
import * as i6 from "
|
|
25
|
-
import * as i7 from "../_internal/clear-button/clear-button.component";
|
|
19
|
+
import * as i1 from "@angular/common";
|
|
20
|
+
import * as i2 from "../form-field-frame/form-field-frame.component";
|
|
21
|
+
import * as i3 from "../dropdown-panel/dropdown-panel.component";
|
|
22
|
+
import * as i4 from "../chip/deletable-chip/deletable-chip.component";
|
|
23
|
+
import * as i5 from "@ardium-ui/devkit";
|
|
24
|
+
import * as i6 from "../_internal/clear-button/clear-button.component";
|
|
26
25
|
export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
this.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
this.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
this.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
set itemDisplayLimit(v) {
|
|
103
|
-
this._itemDisplayLimit = coerceNumberProperty(v, Infinity);
|
|
104
|
-
}
|
|
105
|
-
get searchFn() {
|
|
106
|
-
return this._searchFn;
|
|
107
|
-
}
|
|
108
|
-
set searchFn(fn) {
|
|
109
|
-
if (fn !== undefined && fn !== null && !isFunction(fn)) {
|
|
110
|
-
throw Error('`searchFn` must be a function.');
|
|
111
|
-
}
|
|
112
|
-
this._searchFn = fn;
|
|
113
|
-
}
|
|
114
|
-
get compareWith() {
|
|
115
|
-
return this._compareWith;
|
|
116
|
-
}
|
|
117
|
-
set compareWith(fn) {
|
|
118
|
-
if (fn !== undefined && fn !== null && !isFunction(fn)) {
|
|
119
|
-
throw Error('`compareWith` must be a function.');
|
|
120
|
-
}
|
|
121
|
-
this._compareWith = fn;
|
|
122
|
-
}
|
|
123
|
-
get compact() {
|
|
124
|
-
return this._compact;
|
|
125
|
-
}
|
|
126
|
-
set compact(v) {
|
|
127
|
-
this._compact = coerceBooleanProperty(v);
|
|
128
|
-
}
|
|
129
|
-
get ngClasses() {
|
|
130
|
-
return [
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
this._componentId = '000';
|
|
29
|
+
//! public constants
|
|
30
|
+
this.itemStorage = new ItemStorage(this);
|
|
31
|
+
this.DEFAULTS = {
|
|
32
|
+
valueFrom: 'value',
|
|
33
|
+
labelFrom: 'label',
|
|
34
|
+
disabledFrom: 'disabled',
|
|
35
|
+
groupLabelFrom: 'group',
|
|
36
|
+
groupDisabledFrom: 'disabled',
|
|
37
|
+
childrenFrom: 'children',
|
|
38
|
+
searchFn: searchFunctions.byLabel,
|
|
39
|
+
clearButtonTitle: 'Clear',
|
|
40
|
+
noItemsFoundText: 'No items found.',
|
|
41
|
+
loadingPlaceholderText: 'Loading...',
|
|
42
|
+
};
|
|
43
|
+
//! privates
|
|
44
|
+
this._items = [];
|
|
45
|
+
this._isMouseBeingUsed = signal(false);
|
|
46
|
+
this._searchBarFocused = signal(false);
|
|
47
|
+
this._destroy$ = new Subject();
|
|
48
|
+
//! publics
|
|
49
|
+
this.searchTerm = signal('');
|
|
50
|
+
this.isItemsInputUsed = false;
|
|
51
|
+
//! binding-related inputs
|
|
52
|
+
//value/label/disabled/group/pre-grouped children paths
|
|
53
|
+
this.valueFrom = input(undefined);
|
|
54
|
+
this.labelFrom = input(undefined);
|
|
55
|
+
this.disabledFrom = input(undefined);
|
|
56
|
+
//! group-related inputs
|
|
57
|
+
this.groupLabelFrom = input(undefined);
|
|
58
|
+
this.groupDisabledFrom = input(undefined);
|
|
59
|
+
this.childrenFrom = input(undefined);
|
|
60
|
+
//! settings
|
|
61
|
+
this.placeholder = input('Select item');
|
|
62
|
+
this.searchPlaceholder = input('Search...');
|
|
63
|
+
this.clearButtonTitle = input(this.DEFAULTS.clearButtonTitle);
|
|
64
|
+
this.dropdownPosition = input(ArdPanelPosition.Auto);
|
|
65
|
+
//! template-related settings
|
|
66
|
+
this.noItemsFoundText = input(this.DEFAULTS.noItemsFoundText);
|
|
67
|
+
this.loadingPlaceholderText = input(this.DEFAULTS.loadingPlaceholderText);
|
|
68
|
+
//! search-related options
|
|
69
|
+
this.searchInputId = input(undefined);
|
|
70
|
+
this.inputAttrs = input({});
|
|
71
|
+
//! other inputs
|
|
72
|
+
this.isLoading = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
73
|
+
this.inputProps = input({});
|
|
74
|
+
this.htmlId = input(crypto.randomUUID());
|
|
75
|
+
//! boolean settings
|
|
76
|
+
this.itemsAlreadyGrouped = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
77
|
+
//should the value that the "disabledFrom" path lead to be inverted?
|
|
78
|
+
//useful when the property is e.g. "active", which is the oposite of "disabled"
|
|
79
|
+
this.invertDisabled = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
80
|
+
this.noGroupActions = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
81
|
+
this.autoHighlightFirst = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
82
|
+
this.autoFocus = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
83
|
+
this.keepOpen = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
84
|
+
this.hideSelected = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
85
|
+
this.noBackspaceClear = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
86
|
+
this.sortMultipleValues = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
87
|
+
this.searchCaseSensitive = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
88
|
+
this.keepSearchAfterSelect = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
89
|
+
//! number inputs
|
|
90
|
+
this.maxSelectedItems = input(Infinity, { transform: v => coerceNumberProperty(v, Infinity) });
|
|
91
|
+
this.itemDisplayLimit = input(Infinity, { transform: v => coerceNumberProperty(v, Infinity) });
|
|
92
|
+
//! function inputs
|
|
93
|
+
this.searchFn = input(this.DEFAULTS.searchFn);
|
|
94
|
+
this.compareWith = input(undefined);
|
|
95
|
+
//! appearance
|
|
96
|
+
this.appearance = input(FormElementAppearance.Outlined);
|
|
97
|
+
this.variant = input(FormElementVariant.Rounded);
|
|
98
|
+
this.compact = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
99
|
+
this.ngClasses = computed(() => [
|
|
131
100
|
//appearance, variant handled in ard-form-field-frame component
|
|
132
|
-
this.compact ? 'ard-compact' : '',
|
|
133
|
-
this.multiselectable ? 'ard-multiselect' : 'ard-singleselect',
|
|
134
|
-
this.clearable ? 'ard-clearable' : '',
|
|
135
|
-
this.searchable ? 'ard-searchable' : '',
|
|
136
|
-
this.filtered ? 'ard-filtered' : '',
|
|
137
|
-
this.touched ? 'ard-touched' : '',
|
|
138
|
-
this.
|
|
139
|
-
this._searchBarFocused ? 'ard-select-focused' : '',
|
|
140
|
-
this._searchBarFocused ? 'ard-select-focused' : '',
|
|
141
|
-
].join(' ');
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
101
|
+
this.compact() ? 'ard-compact' : '',
|
|
102
|
+
this.multiselectable() ? 'ard-multiselect' : 'ard-singleselect',
|
|
103
|
+
this.clearable() ? 'ard-clearable' : '',
|
|
104
|
+
this.searchable() ? 'ard-searchable' : '',
|
|
105
|
+
this.filtered() ? 'ard-filtered' : '',
|
|
106
|
+
this.touched() ? 'ard-touched' : '',
|
|
107
|
+
this.isOpen() ? 'ard-dropdown-open' : '',
|
|
108
|
+
this._searchBarFocused() ? 'ard-select-focused' : '',
|
|
109
|
+
this._searchBarFocused() ? 'ard-select-focused' : '',
|
|
110
|
+
].join(' '));
|
|
111
|
+
this.dropdownAppearance = input(undefined);
|
|
112
|
+
this.dropdownAppearanceOrDefault = computed(() => {
|
|
113
|
+
if (this.dropdownAppearance())
|
|
114
|
+
return this.dropdownAppearance();
|
|
115
|
+
if (this.appearance() === FormElementAppearance.Outlined)
|
|
116
|
+
return DropdownPanelAppearance.Outlined;
|
|
117
|
+
return DropdownPanelAppearance.Raised;
|
|
118
|
+
});
|
|
119
|
+
this.dropdownVariant = input(undefined);
|
|
120
|
+
this.dropdownVariantOrDefault = computed(() => {
|
|
121
|
+
if (this.dropdownVariant())
|
|
122
|
+
return this.dropdownVariant();
|
|
123
|
+
const variant = this.variant();
|
|
124
|
+
if (variant === FormElementVariant.Pill)
|
|
125
|
+
return DropdownPanelVariant.Rounded;
|
|
126
|
+
return variant;
|
|
127
|
+
});
|
|
128
|
+
//! attribute and/or class setters/getters
|
|
129
|
+
this.multiselectable = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
130
|
+
this.clearable = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
131
|
+
this.searchable = input(false, { transform: v => coerceBooleanProperty(v) });
|
|
132
|
+
this.filtered = computed(() => this.searchable() && this.searchTerm() !== '');
|
|
133
|
+
this.touched = signal(false);
|
|
134
|
+
//! custom options
|
|
135
|
+
this._defaultAddCustomFn = (value) => value;
|
|
136
|
+
this.addCustom = input(false, {
|
|
137
|
+
transform: v => {
|
|
138
|
+
if (isFunction(v)) {
|
|
139
|
+
return v;
|
|
140
|
+
}
|
|
141
|
+
//coerce the value into a boolean
|
|
142
|
+
//if "true", use the default function. Otherwise, just set to "false".
|
|
143
|
+
return coerceBooleanProperty(v) && this._defaultAddCustomFn;
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
this.shouldShowAddCustom = computed(() => this.addCustom() !== false && this.searchTerm().length > 0 && this.itemStorage.isNoItemsFound());
|
|
147
|
+
this.valueChange = output();
|
|
148
|
+
//! output events
|
|
149
|
+
this.changeEvent = output({ alias: 'change' });
|
|
150
|
+
this.addEvent = output({ alias: 'add' });
|
|
151
|
+
this.failedToAddEvent = output({ alias: 'failedToAdd' });
|
|
152
|
+
this.removeEvent = output({ alias: 'remove' });
|
|
153
|
+
this.clearEvent = output({ alias: 'clear' });
|
|
154
|
+
this.openEvent = output({ alias: 'open' });
|
|
155
|
+
this.closeEvent = output({ alias: 'close' });
|
|
156
|
+
this.scrollEvent = output({ alias: 'scroll' });
|
|
157
|
+
this.scrollToEndEvent = output({ alias: 'scrollToEnd' });
|
|
158
|
+
this.searchEvent = output({ alias: 'search' });
|
|
159
|
+
this.isOpen = model(false);
|
|
160
|
+
//! view children
|
|
161
|
+
this.searchInput = viewChild('searchInput');
|
|
162
|
+
this.dropdownPanel = viewChild(ArdiumDropdownPanelComponent);
|
|
163
|
+
//! templates
|
|
164
|
+
this.optionTemplate = contentChild(ArdOptionTemplateDirective);
|
|
165
|
+
this.optgroupTemplate = contentChild(ArdOptgroupTemplateDirective);
|
|
166
|
+
this.valueTemplate = contentChild(ArdValueTemplateDirective);
|
|
167
|
+
this.placeholderTemplate = contentChild(ArdSelectPlaceholderTemplateDirective);
|
|
168
|
+
this.loadingSpinnerTemplate = contentChild(ArdLoadingSpinnerTemplateDirective);
|
|
169
|
+
this.loadingPlaceholderTemplate = contentChild(ArdLoadingPlaceholderTemplateDirective);
|
|
170
|
+
this.dropdownHeaderTemplate = contentChild(ArdDropdownHeaderTemplateDirective);
|
|
171
|
+
this.dropdownFooterTemplate = contentChild(ArdDropdownFooterTemplateDirective);
|
|
172
|
+
this.noItemsFoundTemplate = contentChild(ArdNoItemsFoundTemplateDirective);
|
|
173
|
+
this.addCustomTemplate = contentChild(ArdAddCustomTemplateDirective);
|
|
174
|
+
this.itemLimitReachedTemplate = contentChild(ArdItemLimitReachedTemplateDirective);
|
|
175
|
+
this.itemDisplayLimitTemplate = contentChild(ArdItemDisplayLimitTemplateDirective);
|
|
176
|
+
this.prefixTemplate = contentChild(ArdSelectPrefixTemplateDirective);
|
|
177
|
+
this.suffixTemplate = contentChild(ArdSelectSuffixTemplateDirective);
|
|
178
|
+
this.getStatsContext = computed(() => ({
|
|
179
|
+
totalItems: this.totalItems(),
|
|
180
|
+
foundItems: this.foundItems(),
|
|
181
|
+
}));
|
|
182
|
+
this.getSearchContext = computed(() => ({
|
|
183
|
+
$implicit: this.searchTerm(),
|
|
184
|
+
searchTerm: this.searchTerm(),
|
|
185
|
+
totalItems: this.totalItems(),
|
|
186
|
+
foundItems: this.foundItems(),
|
|
187
|
+
}));
|
|
188
|
+
this.getPlaceholderContext = computed(() => {
|
|
189
|
+
const placeholder = this.placeholderForCurrentContext();
|
|
190
|
+
return {
|
|
191
|
+
placeholder,
|
|
192
|
+
$implicit: placeholder,
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
this.getCustomOptionContext = computed(() => ({
|
|
196
|
+
$implicit: this.searchTerm(),
|
|
197
|
+
searchTerm: this.searchTerm(),
|
|
198
|
+
}));
|
|
199
|
+
this.getItemLimitContext = computed(() => ({
|
|
200
|
+
totalItems: this.totalItems(),
|
|
201
|
+
selectedItems: this.itemStorage.selectedItems().length,
|
|
202
|
+
itemLimit: this.maxSelectedItems(),
|
|
203
|
+
}));
|
|
204
|
+
this.getItemDisplayLimitContext = computed(() => {
|
|
205
|
+
const selectedItems = this.itemStorage.selectedItems().length;
|
|
206
|
+
return {
|
|
207
|
+
totalItems: this.totalItems(),
|
|
208
|
+
selectedItems,
|
|
209
|
+
itemLimit: this.maxSelectedItems(),
|
|
210
|
+
overflowCount: selectedItems - (this.itemDisplayLimit() ?? 0),
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
this.elementRef = inject((ElementRef));
|
|
214
|
+
this._cd = inject(ChangeDetectorRef);
|
|
215
|
+
this.overlay = inject(Overlay);
|
|
216
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
217
|
+
this.scrollStrategyOpts = inject(ScrollStrategyOptions);
|
|
218
|
+
//! getters
|
|
219
|
+
this.firstHighlightedItem = computed(() => this.itemStorage.highlightedItems()?.first());
|
|
220
|
+
this.shouldDisplayPlaceholder = computed(() => !this.itemStorage.isAnyItemSelected() && !this.searchTerm());
|
|
221
|
+
this.shouldDisplayValue = computed(() => this.itemStorage.isAnyItemSelected() && (!this.searchTerm() || this.multiselectable()));
|
|
222
|
+
this.shouldShowClearButton = computed(() => this.clearable() && !this.disabled() && (this.itemStorage.isAnyItemSelected() || this.searchTerm() !== ''));
|
|
223
|
+
this.itemsToDisplay = computed(() => this.itemStorage.groups().values());
|
|
224
|
+
this.shouldShowNoItemsFound = computed(() => this.itemStorage.isNoItemsFound() && !this.isLoading() && !this.shouldShowAddCustom());
|
|
225
|
+
this.totalItems = computed(() => this.itemStorage.items().length);
|
|
226
|
+
this.foundItems = computed(() => this.searchable() ? this.itemStorage.filteredItems().length : undefined);
|
|
227
|
+
this.shouldShowItemDisplayLimit = computed(() => this.multiselectable() &&
|
|
228
|
+
this.itemDisplayLimit() !== Infinity &&
|
|
229
|
+
this.itemStorage.selectedItems().length > this.itemDisplayLimit());
|
|
230
|
+
this.isInputElementReadonly = computed(() => !this.addCustom() && (!this.searchable() || this.itemStorage.isItemLimitReached()));
|
|
231
|
+
this.placeholderForCurrentContext = computed(() => {
|
|
232
|
+
if (this.searchPlaceholder() && this.searchable() && (this._searchBarFocused() || this._isClickedWithin()))
|
|
233
|
+
return this.searchPlaceholder();
|
|
234
|
+
return this.placeholder();
|
|
235
|
+
});
|
|
236
|
+
//! click handlers
|
|
237
|
+
this._isClickedWithin = signal(false);
|
|
155
238
|
}
|
|
156
|
-
get
|
|
157
|
-
|
|
158
|
-
return this._dropdownVariant;
|
|
159
|
-
if (this.variant == FormElementVariant.Pill)
|
|
160
|
-
return DropdownPanelVariant.Rounded;
|
|
161
|
-
return this.variant;
|
|
239
|
+
get _groupItemsHostAttribute() {
|
|
240
|
+
return this.groupLabelFrom();
|
|
162
241
|
}
|
|
163
242
|
//! items setter/getter
|
|
164
243
|
get items() {
|
|
@@ -173,7 +252,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
173
252
|
else if (isAnyString(value)) {
|
|
174
253
|
value = coerceArrayProperty(value);
|
|
175
254
|
}
|
|
176
|
-
|
|
255
|
+
const printErrors = this.itemStorage.setItems(value);
|
|
177
256
|
if (printErrors) {
|
|
178
257
|
this._printPrimitiveWarnings();
|
|
179
258
|
}
|
|
@@ -187,19 +266,23 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
187
266
|
setTimeout(() => {
|
|
188
267
|
const item = this.itemStorage.findItemByValue(option.oldValue ?? option.value);
|
|
189
268
|
if (item) {
|
|
190
|
-
item.disabled
|
|
191
|
-
item.label
|
|
192
|
-
item.value
|
|
193
|
-
item.itemData.
|
|
194
|
-
|
|
195
|
-
|
|
269
|
+
item.disabled.set(option.disabled);
|
|
270
|
+
item.label.set(option.label || item.label());
|
|
271
|
+
item.value.set(option.value);
|
|
272
|
+
item.itemData.set({
|
|
273
|
+
label: option.label || item.label(),
|
|
274
|
+
value: option.value,
|
|
275
|
+
disabled: option.disabled,
|
|
276
|
+
});
|
|
196
277
|
}
|
|
197
278
|
this.detectChanges();
|
|
198
279
|
}, 0);
|
|
199
280
|
});
|
|
200
281
|
};
|
|
201
|
-
this.optionComponents.changes
|
|
202
|
-
|
|
282
|
+
this.optionComponents.changes
|
|
283
|
+
.pipe(startWith(this.optionComponents), takeUntil(this._destroy$))
|
|
284
|
+
.subscribe((options) => {
|
|
285
|
+
if (options.length === 0)
|
|
203
286
|
return;
|
|
204
287
|
setTimeout(() => {
|
|
205
288
|
this.items = options.map(option => ({
|
|
@@ -212,55 +295,11 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
212
295
|
}, 0);
|
|
213
296
|
});
|
|
214
297
|
}
|
|
215
|
-
get multiselectable() {
|
|
216
|
-
return this._multiselectable;
|
|
217
|
-
}
|
|
218
|
-
set multiselectable(v) {
|
|
219
|
-
this._multiselectable = coerceBooleanProperty(v);
|
|
220
|
-
}
|
|
221
|
-
get singleselectable() {
|
|
222
|
-
return !this._multiselectable;
|
|
223
|
-
}
|
|
224
|
-
get clearable() {
|
|
225
|
-
return this._clearable;
|
|
226
|
-
}
|
|
227
|
-
set clearable(v) {
|
|
228
|
-
this._clearable = coerceBooleanProperty(v);
|
|
229
|
-
}
|
|
230
|
-
get searchable() {
|
|
231
|
-
return this._searchable;
|
|
232
|
-
}
|
|
233
|
-
set searchable(v) {
|
|
234
|
-
this._searchable = coerceBooleanProperty(v);
|
|
235
|
-
}
|
|
236
|
-
get filtered() {
|
|
237
|
-
return this._searchable && this.searchTerm != '';
|
|
238
|
-
}
|
|
239
|
-
get touched() {
|
|
240
|
-
return this._touched;
|
|
241
|
-
}
|
|
242
|
-
set touched(state) {
|
|
243
|
-
this._touched = state;
|
|
244
|
-
}
|
|
245
|
-
get addCustom() {
|
|
246
|
-
return this._addCustom;
|
|
247
|
-
}
|
|
248
|
-
set addCustom(v) {
|
|
249
|
-
if (isFunction(v)) {
|
|
250
|
-
this._addCustom = v;
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
//coerce the value into a boolean
|
|
254
|
-
//if "true", use the default function. Otherwise, just set to "false".
|
|
255
|
-
this._addCustom = coerceBooleanProperty(v) && this._defaultAddCustomFn;
|
|
256
|
-
}
|
|
257
|
-
get shouldShowAddCustom() {
|
|
258
|
-
return this.addCustom != false && this.searchTerm.length > 0 && this.itemStorage.isNoItemsFound;
|
|
259
|
-
}
|
|
260
298
|
async addCustomOption(value) {
|
|
261
|
-
|
|
299
|
+
const ac = this.addCustom();
|
|
300
|
+
if (!ac)
|
|
262
301
|
return;
|
|
263
|
-
const newOptionObj = await this.itemStorage.addCustomOption(value,
|
|
302
|
+
const newOptionObj = await this.itemStorage.addCustomOption(value, ac);
|
|
264
303
|
this.selectItem(newOptionObj);
|
|
265
304
|
}
|
|
266
305
|
//! control value accessor
|
|
@@ -273,15 +312,15 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
273
312
|
this.itemStorage.handleWriteValue(ngModel);
|
|
274
313
|
this._cd.markForCheck();
|
|
275
314
|
}
|
|
276
|
-
|
|
315
|
+
//! change & touch event emitters
|
|
277
316
|
_emitChange() {
|
|
278
|
-
|
|
317
|
+
const value = this.itemStorage.value();
|
|
279
318
|
this._onChangeRegistered?.(value);
|
|
280
319
|
this.changeEvent.emit(value);
|
|
281
320
|
this.valueChange.emit(value);
|
|
282
321
|
}
|
|
283
322
|
_onTouched() {
|
|
284
|
-
this.touched
|
|
323
|
+
this.touched.set(true);
|
|
285
324
|
this._onTouchedRegistered?.();
|
|
286
325
|
}
|
|
287
326
|
//! value input & output
|
|
@@ -299,165 +338,29 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
299
338
|
}
|
|
300
339
|
//! context providers
|
|
301
340
|
getValueContext(item) {
|
|
302
|
-
const $this = this;
|
|
303
341
|
return {
|
|
304
342
|
$implicit: item,
|
|
305
343
|
item,
|
|
306
|
-
itemData: item.itemData,
|
|
307
|
-
unselect() {
|
|
308
|
-
|
|
344
|
+
itemData: item.itemData(),
|
|
345
|
+
unselect: () => {
|
|
346
|
+
this.unselectItem(item);
|
|
309
347
|
},
|
|
310
348
|
};
|
|
311
349
|
}
|
|
312
|
-
getStatsContext() {
|
|
313
|
-
return {
|
|
314
|
-
totalItems: this.totalItems,
|
|
315
|
-
foundItems: this.foundItems,
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
getSearchContext() {
|
|
319
|
-
return {
|
|
320
|
-
$implicit: this.searchTerm,
|
|
321
|
-
searchTerm: this.searchTerm,
|
|
322
|
-
totalItems: this.totalItems,
|
|
323
|
-
foundItems: this.foundItems,
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
getPlaceholderContext() {
|
|
327
|
-
const placeholder = this.placeholderForCurrentContext;
|
|
328
|
-
return {
|
|
329
|
-
placeholder,
|
|
330
|
-
$implicit: placeholder,
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
getCustomOptionContext() {
|
|
334
|
-
return {
|
|
335
|
-
$implicit: this.searchTerm,
|
|
336
|
-
searchTerm: this.searchTerm,
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
350
|
getGroupContext(group) {
|
|
340
351
|
return {
|
|
341
352
|
$implicit: group,
|
|
342
353
|
group,
|
|
343
|
-
selectedChildren: group.children.filter(v => v.selected).length,
|
|
344
|
-
totalChildren: group.children.length,
|
|
354
|
+
selectedChildren: group.children().filter(v => v.selected()).length,
|
|
355
|
+
totalChildren: group.children().length,
|
|
345
356
|
};
|
|
346
357
|
}
|
|
347
358
|
getOptionContext(item) {
|
|
348
359
|
return {
|
|
349
360
|
$implicit: item,
|
|
350
361
|
item,
|
|
351
|
-
itemData: item.itemData,
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
getItemLimitContext() {
|
|
355
|
-
return {
|
|
356
|
-
totalItems: this.totalItems,
|
|
357
|
-
selectedItems: this.itemStorage.selectedItems.length,
|
|
358
|
-
itemLimit: this.maxSelectedItems,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
getItemDisplayLimitContext() {
|
|
362
|
-
let selectedItems = this.itemStorage.selectedItems.length;
|
|
363
|
-
return {
|
|
364
|
-
totalItems: this.totalItems,
|
|
365
|
-
selectedItems,
|
|
366
|
-
itemLimit: this.maxSelectedItems,
|
|
367
|
-
overflowCount: selectedItems - (this.itemDisplayLimit ?? 0),
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
constructor(_elementRef, _cd, overlay, viewContainerRef, scrollStrategyOpts) {
|
|
371
|
-
super();
|
|
372
|
-
this._cd = _cd;
|
|
373
|
-
this.overlay = overlay;
|
|
374
|
-
this.viewContainerRef = viewContainerRef;
|
|
375
|
-
this.scrollStrategyOpts = scrollStrategyOpts;
|
|
376
|
-
//! public constants
|
|
377
|
-
this.itemStorage = new ItemStorage(this);
|
|
378
|
-
this.DEFAULTS = {
|
|
379
|
-
valueFrom: 'value',
|
|
380
|
-
labelFrom: 'label',
|
|
381
|
-
disabledFrom: 'disabled',
|
|
382
|
-
groupLabelFrom: 'group',
|
|
383
|
-
groupDisabledFrom: 'disabled',
|
|
384
|
-
childrenFrom: 'children',
|
|
385
|
-
searchFn: searchFunctions.byLabel,
|
|
386
|
-
clearButtonTitle: 'Clear',
|
|
387
|
-
noItemsFoundText: 'No items found.',
|
|
388
|
-
loadingPlaceholderText: 'Loading...',
|
|
362
|
+
itemData: item.itemData(),
|
|
389
363
|
};
|
|
390
|
-
//! privates
|
|
391
|
-
this._items = [];
|
|
392
|
-
this._isMouseBeingUsed = false;
|
|
393
|
-
this._searchBarFocused = false;
|
|
394
|
-
this._destroy$ = new Subject();
|
|
395
|
-
//! publics
|
|
396
|
-
this.searchTerm = '';
|
|
397
|
-
this.isItemsInputUsed = false;
|
|
398
|
-
//! settings
|
|
399
|
-
this.placeholder = 'Select item';
|
|
400
|
-
this.searchPlaceholder = 'Search...';
|
|
401
|
-
this.dropdownPosition = ArdPanelPosition.Auto;
|
|
402
|
-
this.clearButtonTitle = this.DEFAULTS.clearButtonTitle;
|
|
403
|
-
//! template-related settings
|
|
404
|
-
this.noItemsFoundText = this.DEFAULTS.noItemsFoundText;
|
|
405
|
-
this.loadingPlaceholderText = this.DEFAULTS.loadingPlaceholderText;
|
|
406
|
-
//! other inputs
|
|
407
|
-
this.isLoading = false;
|
|
408
|
-
this.inputAttrs = {};
|
|
409
|
-
this.htmlId = crypto.randomUUID();
|
|
410
|
-
//! boolean settings
|
|
411
|
-
this._itemsAlreadyGrouped = false;
|
|
412
|
-
//should the value that the "disabledFrom" path lead to be inverted?
|
|
413
|
-
//useful when the property is e.g. "active", which is the oposite of "disabled"
|
|
414
|
-
this._invertDisabled = false;
|
|
415
|
-
this._noGroupActions = false;
|
|
416
|
-
this._autoHighlightFirst = true;
|
|
417
|
-
this._autoFocus = false;
|
|
418
|
-
this._keepOpen = false;
|
|
419
|
-
this._hideSelected = false;
|
|
420
|
-
this._clearOnBackspace = false;
|
|
421
|
-
this._sortMultipleValues = false;
|
|
422
|
-
this._searchCaseSensitive = false;
|
|
423
|
-
this._keepSearchAfterSelect = false;
|
|
424
|
-
//! number inputs
|
|
425
|
-
this._maxSelectedItems = undefined;
|
|
426
|
-
this._itemDisplayLimit = Infinity;
|
|
427
|
-
//! function inputs
|
|
428
|
-
this._searchFn = this.DEFAULTS.searchFn;
|
|
429
|
-
//! appearance
|
|
430
|
-
this.appearance = FormElementAppearance.Outlined;
|
|
431
|
-
this.variant = FormElementVariant.Rounded;
|
|
432
|
-
this._compact = false;
|
|
433
|
-
this._dropdownAppearance = undefined;
|
|
434
|
-
this._dropdownVariant = undefined;
|
|
435
|
-
//! class-based inputs
|
|
436
|
-
this.groupItems = false; //default value may be changed to "true" in ngOnChanges if this.groupBy is defined or this.itemsAlreadyGrouped is set to "true"
|
|
437
|
-
//! attribute and/or class setters/getters
|
|
438
|
-
this._multiselectable = false;
|
|
439
|
-
this._clearable = true;
|
|
440
|
-
this._searchable = false;
|
|
441
|
-
this._touched = false;
|
|
442
|
-
//! custom options
|
|
443
|
-
this._defaultAddCustomFn = (value) => value;
|
|
444
|
-
this._addCustom = false;
|
|
445
|
-
this.valueChange = new EventEmitter();
|
|
446
|
-
//! output events
|
|
447
|
-
this.changeEvent = new EventEmitter();
|
|
448
|
-
this.addEvent = new EventEmitter();
|
|
449
|
-
this.failedToAddEvent = new EventEmitter();
|
|
450
|
-
this.removeEvent = new EventEmitter();
|
|
451
|
-
this.clearEvent = new EventEmitter();
|
|
452
|
-
this.openEvent = new EventEmitter();
|
|
453
|
-
this.closeEvent = new EventEmitter();
|
|
454
|
-
this.scrollEvent = new EventEmitter();
|
|
455
|
-
this.scrollToEndEvent = new EventEmitter();
|
|
456
|
-
this.searchEvent = new EventEmitter();
|
|
457
|
-
this.isDropdownOpenChange = new EventEmitter();
|
|
458
|
-
//! click handlers
|
|
459
|
-
this._isClickedWithin = false;
|
|
460
|
-
this.element = _elementRef.nativeElement;
|
|
461
364
|
}
|
|
462
365
|
_createOverlay() {
|
|
463
366
|
const strategy = this.overlay
|
|
@@ -511,7 +414,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
511
414
|
this._destroy$.complete();
|
|
512
415
|
}
|
|
513
416
|
ngAfterViewInit() {
|
|
514
|
-
if (this.autoFocus) {
|
|
417
|
+
if (this.autoFocus()) {
|
|
515
418
|
this.focus();
|
|
516
419
|
}
|
|
517
420
|
}
|
|
@@ -523,14 +426,10 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
523
426
|
ngOnChanges(changes) {
|
|
524
427
|
//fire items load handler when loading is set to false
|
|
525
428
|
if (changes['loading']) {
|
|
526
|
-
if (changes['loading'].currentValue
|
|
429
|
+
if (changes['loading'].currentValue === false) {
|
|
527
430
|
this._onItemsLoad();
|
|
528
431
|
}
|
|
529
432
|
}
|
|
530
|
-
//set groupItems to true by default if groupLabelFrom or itemsAlreadyGrouped is set to true as the first change
|
|
531
|
-
if ((changes['groupLabelFrom']?.firstChange || changes['itemsAlreadyGrouped']?.firstChange) && !changes['groupItems']) {
|
|
532
|
-
this.groupItems = true;
|
|
533
|
-
}
|
|
534
433
|
}
|
|
535
434
|
_onItemsLoad() {
|
|
536
435
|
if (!this._searchBarFocused)
|
|
@@ -538,145 +437,110 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
538
437
|
this.open();
|
|
539
438
|
}
|
|
540
439
|
_printPrimitiveWarnings() {
|
|
541
|
-
function makeWarning(str) {
|
|
542
|
-
console.warn(`Skipped using [${str}] property bound to <ard-select>, as some provided items are of primitive type`);
|
|
440
|
+
function makeWarning(str, errorCode) {
|
|
441
|
+
console.warn(`ARD-WA000${errorCode}: Skipped using [${str}] property bound to <ard-select>, as some provided items are of primitive type`);
|
|
543
442
|
}
|
|
544
|
-
if (this.valueFrom) {
|
|
545
|
-
makeWarning('valueFrom');
|
|
443
|
+
if (this.valueFrom()) {
|
|
444
|
+
makeWarning('valueFrom', '5a');
|
|
546
445
|
}
|
|
547
|
-
if (this.labelFrom) {
|
|
548
|
-
makeWarning('labelFrom');
|
|
446
|
+
if (this.labelFrom()) {
|
|
447
|
+
makeWarning('labelFrom', '5b');
|
|
549
448
|
}
|
|
550
|
-
if (this.disabledFrom) {
|
|
551
|
-
makeWarning('disabledFrom');
|
|
449
|
+
if (this.disabledFrom()) {
|
|
450
|
+
makeWarning('disabledFrom', '5c');
|
|
552
451
|
}
|
|
553
|
-
if (this.groupLabelFrom) {
|
|
554
|
-
makeWarning('groupLabelFrom');
|
|
452
|
+
if (this.groupLabelFrom()) {
|
|
453
|
+
makeWarning('groupLabelFrom', '5d');
|
|
555
454
|
}
|
|
556
|
-
if (this.groupDisabledFrom) {
|
|
557
|
-
makeWarning('groupDisabledFrom');
|
|
455
|
+
if (this.groupDisabledFrom()) {
|
|
456
|
+
makeWarning('groupDisabledFrom', '5e');
|
|
558
457
|
}
|
|
559
|
-
if (this.childrenFrom) {
|
|
560
|
-
makeWarning('childrenFrom');
|
|
458
|
+
if (this.childrenFrom()) {
|
|
459
|
+
makeWarning('childrenFrom', '5f');
|
|
561
460
|
}
|
|
562
|
-
if (this.invertDisabled) {
|
|
563
|
-
makeWarning('invertDisabled');
|
|
461
|
+
if (this.invertDisabled()) {
|
|
462
|
+
makeWarning('invertDisabled', '5g');
|
|
564
463
|
}
|
|
565
464
|
}
|
|
566
|
-
//! getters
|
|
567
|
-
get firstHighlightedItem() {
|
|
568
|
-
return this.itemStorage.highlightedItems?.first();
|
|
569
|
-
}
|
|
570
|
-
get shouldDisplayPlaceholder() {
|
|
571
|
-
return !this.itemStorage.isAnyItemSelected && !this.searchTerm;
|
|
572
|
-
}
|
|
573
|
-
get shouldDisplayValue() {
|
|
574
|
-
return this.itemStorage.isAnyItemSelected && (!this.searchTerm || this.multiselectable);
|
|
575
|
-
}
|
|
576
|
-
get shouldShowClearButton() {
|
|
577
|
-
return this._clearable && !this._disabled && (this.itemStorage.isAnyItemSelected || this.searchTerm != '');
|
|
578
|
-
}
|
|
579
|
-
get itemsToDisplay() {
|
|
580
|
-
return this.itemStorage.groups.values();
|
|
581
|
-
}
|
|
582
|
-
get shouldShowNoItemsFound() {
|
|
583
|
-
return this.itemStorage.isNoItemsFound && !this.isLoading && !this.shouldShowAddCustom;
|
|
584
|
-
}
|
|
585
|
-
get totalItems() {
|
|
586
|
-
return this.itemStorage.items.length;
|
|
587
|
-
}
|
|
588
|
-
get foundItems() {
|
|
589
|
-
if (!this.searchable)
|
|
590
|
-
return undefined;
|
|
591
|
-
return this.itemStorage.filteredItems.length;
|
|
592
|
-
}
|
|
593
|
-
get shouldShowItemDisplayLimit() {
|
|
594
|
-
return this.multiselectable && this.itemDisplayLimit != Infinity && this.itemStorage.selectedItems.length > this.itemDisplayLimit;
|
|
595
|
-
}
|
|
596
|
-
get isInputElementReadonly() {
|
|
597
|
-
return !this.addCustom && (!this.searchable || this.itemStorage.isItemLimitReached);
|
|
598
|
-
}
|
|
599
465
|
isValueWithinDisplayLimit(i) {
|
|
600
|
-
return !this.multiselectable || this.itemDisplayLimit
|
|
601
|
-
}
|
|
602
|
-
get placeholderForCurrentContext() {
|
|
603
|
-
if (this.searchPlaceholder && this.searchable && (this._searchBarFocused || this._isClickedWithin))
|
|
604
|
-
return this.searchPlaceholder;
|
|
605
|
-
return this.placeholder;
|
|
466
|
+
return !this.multiselectable() || this.itemDisplayLimit() === Infinity || i < this.itemDisplayLimit();
|
|
606
467
|
}
|
|
607
468
|
//! search input event handlers
|
|
608
469
|
filter(filterTerm, suppressSearchEvent = false) {
|
|
609
|
-
this.searchTerm
|
|
610
|
-
|
|
470
|
+
this.searchTerm.set(filterTerm);
|
|
471
|
+
const matching = this.itemStorage.filter(filterTerm);
|
|
611
472
|
if (!suppressSearchEvent)
|
|
612
473
|
this.searchEvent.emit({ search: filterTerm, matching });
|
|
613
474
|
this.open();
|
|
614
475
|
}
|
|
615
|
-
onSearchInputFocus(
|
|
616
|
-
this._searchBarFocused
|
|
476
|
+
onSearchInputFocus() {
|
|
477
|
+
this._searchBarFocused.set(true);
|
|
617
478
|
}
|
|
618
|
-
onSearchInputBlur(
|
|
619
|
-
if (!this._searchBarFocused)
|
|
479
|
+
onSearchInputBlur() {
|
|
480
|
+
if (!this._searchBarFocused())
|
|
620
481
|
return;
|
|
621
482
|
this._onTouched();
|
|
622
|
-
this._searchBarFocused
|
|
483
|
+
this._searchBarFocused.set(false);
|
|
623
484
|
}
|
|
624
485
|
//! item selection handlers
|
|
625
486
|
toggleItem(item) {
|
|
626
|
-
if (item.selected) {
|
|
487
|
+
if (item.selected()) {
|
|
627
488
|
this.unselectItem(item);
|
|
628
489
|
return;
|
|
629
490
|
}
|
|
630
491
|
this.selectItem(item);
|
|
631
492
|
}
|
|
632
493
|
selectItem(...items) {
|
|
633
|
-
|
|
634
|
-
if (unselected.length > 0)
|
|
494
|
+
const [selected, unselected, failedToSelect] = this.itemStorage.selectItem(...items);
|
|
495
|
+
if (unselected.length > 0) {
|
|
635
496
|
this.removeEvent.emit(unselected);
|
|
497
|
+
}
|
|
636
498
|
if (failedToSelect.length > 0) {
|
|
637
499
|
this.failedToAddEvent.emit(failedToSelect);
|
|
638
500
|
}
|
|
639
501
|
if (selected.length > 0) {
|
|
640
502
|
this.addEvent.emit(selected);
|
|
641
|
-
this._emitChange();
|
|
642
503
|
this.focus();
|
|
643
|
-
if (!this.keepSearchAfterSelect)
|
|
504
|
+
if (!this.keepSearchAfterSelect())
|
|
644
505
|
this._clearSearch(true);
|
|
645
|
-
if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
|
|
506
|
+
if (!this.keepOpen() || this.itemStorage.isNoItemsToSelect()) {
|
|
646
507
|
this.close();
|
|
647
508
|
}
|
|
648
509
|
}
|
|
510
|
+
if (unselected.length > 0 || selected.length > 0) {
|
|
511
|
+
this._emitChange();
|
|
512
|
+
}
|
|
649
513
|
}
|
|
650
514
|
unselectItem(...items) {
|
|
651
|
-
|
|
515
|
+
const unselected = this.itemStorage.unselectItem(...items);
|
|
652
516
|
this.removeEvent.emit(unselected);
|
|
653
517
|
this._emitChange();
|
|
654
|
-
if (!this.keepSearchAfterSelect)
|
|
518
|
+
if (!this.keepSearchAfterSelect())
|
|
655
519
|
this._clearSearch();
|
|
656
520
|
this.focus();
|
|
657
|
-
if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
|
|
521
|
+
if (!this.keepOpen() || this.itemStorage.isNoItemsToSelect()) {
|
|
658
522
|
this.close();
|
|
659
523
|
}
|
|
660
524
|
}
|
|
661
525
|
_clearAllItems() {
|
|
662
|
-
|
|
526
|
+
const cleared = this.itemStorage.clearAllSelected(true);
|
|
663
527
|
this.focus();
|
|
664
528
|
this.clearEvent.emit();
|
|
665
529
|
this.removeEvent.emit(cleared);
|
|
666
530
|
this._emitChange();
|
|
667
531
|
}
|
|
668
532
|
_clearLastItem() {
|
|
669
|
-
|
|
533
|
+
const clearedValue = this.itemStorage.clearLastSelected().value();
|
|
670
534
|
this.focus();
|
|
671
535
|
this.removeEvent.emit([clearedValue]);
|
|
672
536
|
this._emitChange();
|
|
673
537
|
}
|
|
674
538
|
//! highligh-related
|
|
675
539
|
onMouseMove() {
|
|
676
|
-
this._isMouseBeingUsed
|
|
540
|
+
this._isMouseBeingUsed.set(true);
|
|
677
541
|
}
|
|
678
542
|
onGroupMouseover(group) {
|
|
679
|
-
if (!this.multiselectable || this.noGroupActions)
|
|
543
|
+
if (!this.multiselectable() || this.noGroupActions())
|
|
680
544
|
return;
|
|
681
545
|
this.itemStorage.highlightGroup(group);
|
|
682
546
|
}
|
|
@@ -684,38 +548,38 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
684
548
|
event.stopPropagation();
|
|
685
549
|
}
|
|
686
550
|
onItemMouseEnter(option, event) {
|
|
687
|
-
if (!this._isMouseBeingUsed)
|
|
551
|
+
if (!this._isMouseBeingUsed())
|
|
688
552
|
return;
|
|
689
553
|
this.itemStorage.highlightSingleItem(option);
|
|
690
554
|
event.stopPropagation();
|
|
691
555
|
}
|
|
692
556
|
onItemMouseLeave(option, event) {
|
|
693
|
-
if (!this._isMouseBeingUsed)
|
|
557
|
+
if (!this._isMouseBeingUsed())
|
|
694
558
|
return;
|
|
695
559
|
this.itemStorage.unhighlightItem(option);
|
|
696
560
|
event.stopPropagation();
|
|
697
561
|
}
|
|
698
562
|
onItemClick(option, event) {
|
|
699
563
|
event.stopPropagation();
|
|
700
|
-
if (this.clearable)
|
|
564
|
+
if (this.clearable())
|
|
701
565
|
this.toggleItem(option);
|
|
702
566
|
else
|
|
703
567
|
this.selectItem(option);
|
|
704
|
-
this._isClickedWithin
|
|
568
|
+
this._isClickedWithin.set(true);
|
|
705
569
|
}
|
|
706
570
|
onGroupClick(group) {
|
|
707
|
-
if (!this.multiselectable || this.noGroupActions)
|
|
571
|
+
if (!this.multiselectable() || this.noGroupActions())
|
|
708
572
|
return;
|
|
709
|
-
if (group.children.every(o => o.selected)) {
|
|
710
|
-
this.unselectItem(...group.children);
|
|
573
|
+
if (group.children().every(o => o.selected)) {
|
|
574
|
+
this.unselectItem(...group.children());
|
|
711
575
|
return;
|
|
712
576
|
}
|
|
713
|
-
this.selectItem(...group.children);
|
|
714
|
-
this._isClickedWithin
|
|
577
|
+
this.selectItem(...group.children());
|
|
578
|
+
this._isClickedWithin.set(true);
|
|
715
579
|
}
|
|
716
580
|
handleClearButtonClick(event) {
|
|
717
581
|
event.stopPropagation();
|
|
718
|
-
if (this.searchTerm) {
|
|
582
|
+
if (this.searchTerm()) {
|
|
719
583
|
this._clearSearch();
|
|
720
584
|
return;
|
|
721
585
|
}
|
|
@@ -723,27 +587,27 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
723
587
|
}
|
|
724
588
|
handleDropdownArrowClick(event) {
|
|
725
589
|
event.stopPropagation();
|
|
726
|
-
this._isClickedWithin
|
|
590
|
+
this._isClickedWithin.set(true);
|
|
727
591
|
this.toggle();
|
|
728
592
|
}
|
|
729
593
|
handleOutsideClick(event) {
|
|
730
|
-
if (!this.
|
|
594
|
+
if (!this.isOpen())
|
|
731
595
|
return;
|
|
732
596
|
const target = event.target;
|
|
733
|
-
if (this.
|
|
597
|
+
if (this.elementRef.nativeElement.contains(target))
|
|
734
598
|
return;
|
|
735
599
|
this.close();
|
|
736
600
|
}
|
|
737
601
|
handleAnywhereClick(event) {
|
|
738
602
|
const target = event.target;
|
|
739
|
-
if (target.tagName
|
|
603
|
+
if (target.tagName !== 'INPUT') {
|
|
740
604
|
event.preventDefault();
|
|
741
605
|
}
|
|
742
|
-
this._isClickedWithin
|
|
743
|
-
if (!this._searchBarFocused) {
|
|
606
|
+
this._isClickedWithin.set(true);
|
|
607
|
+
if (!this._searchBarFocused()) {
|
|
744
608
|
this.focus();
|
|
745
609
|
}
|
|
746
|
-
if (this.
|
|
610
|
+
if (this.searchable()) {
|
|
747
611
|
this.open();
|
|
748
612
|
}
|
|
749
613
|
else {
|
|
@@ -751,36 +615,34 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
751
615
|
}
|
|
752
616
|
}
|
|
753
617
|
onMouseup() {
|
|
754
|
-
this._isClickedWithin
|
|
618
|
+
this._isClickedWithin.set(false);
|
|
755
619
|
}
|
|
756
620
|
//! dropdown state handlers
|
|
757
621
|
toggle() {
|
|
758
|
-
if (this.
|
|
622
|
+
if (this.isOpen()) {
|
|
759
623
|
this.close();
|
|
760
624
|
return;
|
|
761
625
|
}
|
|
762
626
|
this.open();
|
|
763
627
|
}
|
|
764
628
|
open() {
|
|
765
|
-
if (this.disabled || this.
|
|
629
|
+
if (this.disabled() || this.isOpen())
|
|
766
630
|
return;
|
|
767
|
-
this.
|
|
768
|
-
if (this.autoHighlightFirst)
|
|
631
|
+
this.isOpen.set(true);
|
|
632
|
+
if (this.autoHighlightFirst())
|
|
769
633
|
this.itemStorage.highlightFirstItem();
|
|
770
634
|
this._createOverlay();
|
|
771
635
|
this.focus();
|
|
772
636
|
this.openEvent.emit();
|
|
773
|
-
this.isDropdownOpenChange.emit(this.isDropdownOpen);
|
|
774
637
|
this.detectChanges();
|
|
775
638
|
}
|
|
776
639
|
close() {
|
|
777
|
-
if (!this.
|
|
640
|
+
if (!this.isOpen())
|
|
778
641
|
return;
|
|
779
|
-
this.
|
|
642
|
+
this.isOpen.set(false);
|
|
780
643
|
this._destroyOverlay();
|
|
781
644
|
this._onTouched();
|
|
782
645
|
this.closeEvent.emit();
|
|
783
|
-
this.isDropdownOpenChange.emit(this.isDropdownOpen);
|
|
784
646
|
this._cd.markForCheck();
|
|
785
647
|
}
|
|
786
648
|
//! ChangeDetectorRef
|
|
@@ -794,17 +656,17 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
794
656
|
this._setSearch('', suppressSearchEvent);
|
|
795
657
|
}
|
|
796
658
|
_setSearch(searchTerm, suppressSearchEvent = false) {
|
|
797
|
-
this.searchTerm
|
|
659
|
+
this.searchTerm.set(searchTerm);
|
|
798
660
|
this.filter(searchTerm, suppressSearchEvent);
|
|
799
661
|
}
|
|
800
662
|
_setSearchInputAttributes() {
|
|
801
|
-
const input = this.searchInput.nativeElement;
|
|
663
|
+
const input = this.searchInput().nativeElement;
|
|
802
664
|
const attributes = {
|
|
803
665
|
type: 'text',
|
|
804
666
|
autocorrect: 'off',
|
|
805
667
|
autocapitalize: 'off',
|
|
806
668
|
autocomplete: 'off',
|
|
807
|
-
...this.inputAttrs,
|
|
669
|
+
...this.inputAttrs(),
|
|
808
670
|
};
|
|
809
671
|
for (const key of Object.keys(attributes)) {
|
|
810
672
|
input.setAttribute(key, attributes[key]);
|
|
@@ -844,7 +706,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
844
706
|
}
|
|
845
707
|
case 'KeyA': {
|
|
846
708
|
if (event.ctrlKey) {
|
|
847
|
-
this._onCtrlAPress(
|
|
709
|
+
this._onCtrlAPress();
|
|
848
710
|
return;
|
|
849
711
|
}
|
|
850
712
|
}
|
|
@@ -854,22 +716,22 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
854
716
|
event.preventDefault();
|
|
855
717
|
let shouldClose = true;
|
|
856
718
|
//select the currently highlighted option
|
|
857
|
-
if (this.
|
|
858
|
-
if (this.clearable && this.itemStorage.highlightedItems.every(item => item.selected)) {
|
|
859
|
-
this.unselectItem(...this.itemStorage.highlightedItems);
|
|
719
|
+
if (this.isOpen() && this.firstHighlightedItem()) {
|
|
720
|
+
if (this.clearable() && this.itemStorage.highlightedItems().every(item => item.selected)) {
|
|
721
|
+
this.unselectItem(...this.itemStorage.highlightedItems());
|
|
860
722
|
}
|
|
861
723
|
else {
|
|
862
|
-
this.selectItem(...this.itemStorage.highlightedItems);
|
|
724
|
+
this.selectItem(...this.itemStorage.highlightedItems());
|
|
863
725
|
}
|
|
864
726
|
}
|
|
865
727
|
//add a custom option
|
|
866
|
-
else if (this.
|
|
867
|
-
await this.addCustomOption(this.searchTerm);
|
|
728
|
+
else if (this.isOpen() && this.shouldShowAddCustom()) {
|
|
729
|
+
await this.addCustomOption(this.searchTerm());
|
|
868
730
|
}
|
|
869
731
|
//in case of no action, open the dropdown (or keep it open)
|
|
870
732
|
else
|
|
871
733
|
shouldClose = false;
|
|
872
|
-
if (!this.keepOpen && shouldClose) {
|
|
734
|
+
if (!this.keepOpen() && shouldClose) {
|
|
873
735
|
this.itemStorage.clearAllHighlights();
|
|
874
736
|
this.close();
|
|
875
737
|
}
|
|
@@ -878,7 +740,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
878
740
|
}
|
|
879
741
|
}
|
|
880
742
|
_onSpacePress(event) {
|
|
881
|
-
if (this.
|
|
743
|
+
if (this.isOpen())
|
|
882
744
|
return;
|
|
883
745
|
event.preventDefault();
|
|
884
746
|
this.open();
|
|
@@ -886,70 +748,72 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
|
886
748
|
_onArrowDownPress(event) {
|
|
887
749
|
event.preventDefault();
|
|
888
750
|
this.open();
|
|
889
|
-
this._isMouseBeingUsed
|
|
751
|
+
this._isMouseBeingUsed.set(false);
|
|
890
752
|
const recentlyHighlighted = this.itemStorage.highlightNextItem(+1, event.shiftKey);
|
|
891
753
|
if (recentlyHighlighted) {
|
|
892
754
|
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
893
755
|
}
|
|
894
|
-
this.dropdownPanel
|
|
756
|
+
this.dropdownPanel()?.scrollToRecentlyHighlighted('bottom');
|
|
895
757
|
}
|
|
896
758
|
_onArrowUpPress(event) {
|
|
897
|
-
if (!this.
|
|
759
|
+
if (!this.isOpen())
|
|
898
760
|
return;
|
|
899
761
|
event.preventDefault();
|
|
900
|
-
this._isMouseBeingUsed
|
|
762
|
+
this._isMouseBeingUsed.set(false);
|
|
901
763
|
const recentlyHighlighted = this.itemStorage.highlightNextItem(-1, event.shiftKey);
|
|
902
764
|
if (recentlyHighlighted) {
|
|
903
765
|
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
904
766
|
}
|
|
905
|
-
this.dropdownPanel
|
|
767
|
+
this.dropdownPanel()?.scrollToRecentlyHighlighted('top');
|
|
906
768
|
}
|
|
907
769
|
_onHomePress(event) {
|
|
908
|
-
if (!this.
|
|
770
|
+
if (!this.isOpen() ||
|
|
771
|
+
(this.searchInput()?.nativeElement.selectionEnd !== 0 && this.searchInput()?.nativeElement.selectionStart !== 0))
|
|
909
772
|
return;
|
|
910
773
|
event.preventDefault();
|
|
911
|
-
this._isMouseBeingUsed
|
|
774
|
+
this._isMouseBeingUsed.set(false);
|
|
912
775
|
const recentlyHighlighted = this.itemStorage.highlightFirstItem();
|
|
913
776
|
if (!recentlyHighlighted)
|
|
914
777
|
return;
|
|
915
778
|
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
916
|
-
this.dropdownPanel
|
|
779
|
+
this.dropdownPanel()?.scrollToRecentlyHighlighted('top');
|
|
917
780
|
}
|
|
918
781
|
_onEndPress(event) {
|
|
919
|
-
if (!this.
|
|
920
|
-
(this.searchInput
|
|
782
|
+
if (!this.isOpen() ||
|
|
783
|
+
(this.searchInput()?.nativeElement.selectionEnd !== this.searchTerm().length &&
|
|
784
|
+
this.searchInput()?.nativeElement.selectionStart !== this.searchTerm().length))
|
|
921
785
|
return;
|
|
922
786
|
event.preventDefault();
|
|
923
|
-
this._isMouseBeingUsed
|
|
787
|
+
this._isMouseBeingUsed.set(false);
|
|
924
788
|
const recentlyHighlighted = this.itemStorage.highlightLastItem();
|
|
925
789
|
if (!recentlyHighlighted)
|
|
926
790
|
return;
|
|
927
791
|
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
928
|
-
this.dropdownPanel
|
|
792
|
+
this.dropdownPanel()?.scrollToRecentlyHighlighted('bottom');
|
|
929
793
|
}
|
|
930
794
|
_onBackspaceOrDeletePress(event) {
|
|
931
|
-
if (this.searchTerm || !this.
|
|
795
|
+
if (this.searchTerm() || !this.clearable() || this.noBackspaceClear() || !this.itemStorage.isAnyItemSelected())
|
|
932
796
|
return;
|
|
933
797
|
event.preventDefault();
|
|
934
|
-
if (this.multiselectable && this.itemStorage.selectedItems.length > 1) {
|
|
798
|
+
if (this.multiselectable() && this.itemStorage.selectedItems().length > 1) {
|
|
935
799
|
this._clearLastItem();
|
|
936
800
|
return;
|
|
937
801
|
}
|
|
938
802
|
this._clearAllItems();
|
|
939
803
|
}
|
|
940
|
-
_onCtrlAPress(
|
|
804
|
+
_onCtrlAPress() {
|
|
941
805
|
this.itemStorage.highlightAllItems();
|
|
942
806
|
}
|
|
943
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
944
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
807
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
808
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: ArdiumSelectComponent, selector: "ard-select", inputs: { valueFrom: { classPropertyName: "valueFrom", publicName: "valueFrom", isSignal: true, isRequired: false, transformFunction: null }, labelFrom: { classPropertyName: "labelFrom", publicName: "labelFrom", isSignal: true, isRequired: false, transformFunction: null }, disabledFrom: { classPropertyName: "disabledFrom", publicName: "disabledFrom", isSignal: true, isRequired: false, transformFunction: null }, groupLabelFrom: { classPropertyName: "groupLabelFrom", publicName: "groupLabelFrom", isSignal: true, isRequired: false, transformFunction: null }, groupDisabledFrom: { classPropertyName: "groupDisabledFrom", publicName: "groupDisabledFrom", isSignal: true, isRequired: false, transformFunction: null }, childrenFrom: { classPropertyName: "childrenFrom", publicName: "childrenFrom", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, clearButtonTitle: { classPropertyName: "clearButtonTitle", publicName: "clearButtonTitle", isSignal: true, isRequired: false, transformFunction: null }, dropdownPosition: { classPropertyName: "dropdownPosition", publicName: "dropdownPosition", isSignal: true, isRequired: false, transformFunction: null }, noItemsFoundText: { classPropertyName: "noItemsFoundText", publicName: "noItemsFoundText", isSignal: true, isRequired: false, transformFunction: null }, loadingPlaceholderText: { classPropertyName: "loadingPlaceholderText", publicName: "loadingPlaceholderText", isSignal: true, isRequired: false, transformFunction: null }, searchInputId: { classPropertyName: "searchInputId", publicName: "searchInputId", isSignal: true, isRequired: false, transformFunction: null }, inputAttrs: { classPropertyName: "inputAttrs", publicName: "inputAttrs", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, inputProps: { classPropertyName: "inputProps", publicName: "inputProps", isSignal: true, isRequired: false, transformFunction: null }, htmlId: { classPropertyName: "htmlId", publicName: "htmlId", isSignal: true, isRequired: false, transformFunction: null }, itemsAlreadyGrouped: { classPropertyName: "itemsAlreadyGrouped", publicName: "itemsAlreadyGrouped", isSignal: true, isRequired: false, transformFunction: null }, invertDisabled: { classPropertyName: "invertDisabled", publicName: "invertDisabled", isSignal: true, isRequired: false, transformFunction: null }, noGroupActions: { classPropertyName: "noGroupActions", publicName: "noGroupActions", isSignal: true, isRequired: false, transformFunction: null }, autoHighlightFirst: { classPropertyName: "autoHighlightFirst", publicName: "autoHighlightFirst", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, hideSelected: { classPropertyName: "hideSelected", publicName: "hideSelected", isSignal: true, isRequired: false, transformFunction: null }, noBackspaceClear: { classPropertyName: "noBackspaceClear", publicName: "noBackspaceClear", isSignal: true, isRequired: false, transformFunction: null }, sortMultipleValues: { classPropertyName: "sortMultipleValues", publicName: "sortMultipleValues", isSignal: true, isRequired: false, transformFunction: null }, searchCaseSensitive: { classPropertyName: "searchCaseSensitive", publicName: "searchCaseSensitive", isSignal: true, isRequired: false, transformFunction: null }, keepSearchAfterSelect: { classPropertyName: "keepSearchAfterSelect", publicName: "keepSearchAfterSelect", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedItems: { classPropertyName: "maxSelectedItems", publicName: "maxSelectedItems", isSignal: true, isRequired: false, transformFunction: null }, itemDisplayLimit: { classPropertyName: "itemDisplayLimit", publicName: "itemDisplayLimit", isSignal: true, isRequired: false, transformFunction: null }, searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, dropdownAppearance: { classPropertyName: "dropdownAppearance", publicName: "dropdownAppearance", isSignal: true, isRequired: false, transformFunction: null }, dropdownVariant: { classPropertyName: "dropdownVariant", publicName: "dropdownVariant", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, multiselectable: { classPropertyName: "multiselectable", publicName: "multiselectable", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, addCustom: { classPropertyName: "addCustom", publicName: "addCustom", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", changeEvent: "change", addEvent: "add", failedToAddEvent: "failedToAdd", removeEvent: "remove", clearEvent: "clear", openEvent: "open", closeEvent: "close", scrollEvent: "scroll", scrollToEndEvent: "scrollToEnd", searchEvent: "search", isOpen: "isOpenChange" }, host: { listeners: { "window:resize": "onWindowResize()", "mouseup": "onMouseup()", "keydown": "onKeyPress($event)" }, properties: { "class.ard-group-items": "this._groupItemsHostAttribute" } }, providers: [
|
|
945
809
|
{
|
|
946
810
|
provide: NG_VALUE_ACCESSOR,
|
|
947
811
|
useExisting: forwardRef(() => ArdiumSelectComponent),
|
|
948
812
|
multi: true,
|
|
949
813
|
},
|
|
950
|
-
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, static: true }, { propertyName: "dropdownPanel", first: true, predicate: i0.forwardRef(() => ArdiumDropdownPanelComponent), descendants: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i4.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i5.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i6.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i7._ClearButtonComponent, selector: "ard-_clear-button" }, { kind: "directive", type: i6.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
814
|
+
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, isSignal: true }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, isSignal: true }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, isSignal: true }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, isSignal: true }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, isSignal: true }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "dropdownPanel", first: true, predicate: ArdiumDropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i3.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i4.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i5.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i6._ClearButtonComponent, selector: "ard-clear-button" }, { kind: "directive", type: i5.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
951
815
|
}
|
|
952
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
816
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumSelectComponent, decorators: [{
|
|
953
817
|
type: Component,
|
|
954
818
|
args: [{ selector: 'ard-select', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
955
819
|
{
|
|
@@ -957,82 +821,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
|
|
|
957
821
|
useExisting: forwardRef(() => ArdiumSelectComponent),
|
|
958
822
|
multi: true,
|
|
959
823
|
},
|
|
960
|
-
], template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
|
|
961
|
-
}],
|
|
962
|
-
type: Input
|
|
963
|
-
}], labelFrom: [{
|
|
964
|
-
type: Input
|
|
965
|
-
}], disabledFrom: [{
|
|
966
|
-
type: Input
|
|
967
|
-
}], groupLabelFrom: [{
|
|
968
|
-
type: Input
|
|
969
|
-
}], groupDisabledFrom: [{
|
|
970
|
-
type: Input
|
|
971
|
-
}], childrenFrom: [{
|
|
972
|
-
type: Input
|
|
973
|
-
}], placeholder: [{
|
|
974
|
-
type: Input
|
|
975
|
-
}], searchPlaceholder: [{
|
|
976
|
-
type: Input
|
|
977
|
-
}], dropdownPosition: [{
|
|
978
|
-
type: Input
|
|
979
|
-
}], clearButtonTitle: [{
|
|
980
|
-
type: Input
|
|
981
|
-
}], noItemsFoundText: [{
|
|
982
|
-
type: Input
|
|
983
|
-
}], loadingPlaceholderText: [{
|
|
984
|
-
type: Input
|
|
985
|
-
}], searchInputId: [{
|
|
986
|
-
type: Input
|
|
987
|
-
}], isLoading: [{
|
|
988
|
-
type: Input
|
|
989
|
-
}], inputAttrs: [{
|
|
990
|
-
type: Input
|
|
991
|
-
}], htmlId: [{
|
|
992
|
-
type: Input
|
|
993
|
-
}], itemsAlreadyGrouped: [{
|
|
994
|
-
type: Input
|
|
995
|
-
}], invertDisabled: [{
|
|
996
|
-
type: Input
|
|
997
|
-
}], noGroupActions: [{
|
|
998
|
-
type: Input
|
|
999
|
-
}], autoHighlightFirst: [{
|
|
1000
|
-
type: Input
|
|
1001
|
-
}], autoFocus: [{
|
|
1002
|
-
type: Input
|
|
1003
|
-
}], keepOpen: [{
|
|
1004
|
-
type: Input
|
|
1005
|
-
}], hideSelected: [{
|
|
1006
|
-
type: Input
|
|
1007
|
-
}], noBackspaceClear: [{
|
|
1008
|
-
type: Input
|
|
1009
|
-
}], sortMultipleValues: [{
|
|
1010
|
-
type: Input
|
|
1011
|
-
}], searchCaseSensitive: [{
|
|
1012
|
-
type: Input
|
|
1013
|
-
}], keepSearchAfterSelect: [{
|
|
1014
|
-
type: Input
|
|
1015
|
-
}], maxSelectedItems: [{
|
|
1016
|
-
type: Input
|
|
1017
|
-
}], itemDisplayLimit: [{
|
|
1018
|
-
type: Input
|
|
1019
|
-
}], searchFn: [{
|
|
1020
|
-
type: Input
|
|
1021
|
-
}], compareWith: [{
|
|
1022
|
-
type: Input
|
|
1023
|
-
}], appearance: [{
|
|
1024
|
-
type: Input
|
|
1025
|
-
}], variant: [{
|
|
1026
|
-
type: Input
|
|
1027
|
-
}], compact: [{
|
|
1028
|
-
type: Input
|
|
1029
|
-
}], dropdowonAppearance: [{
|
|
1030
|
-
type: Input
|
|
1031
|
-
}], dropdowonVariant: [{
|
|
1032
|
-
type: Input
|
|
1033
|
-
}], groupItems: [{
|
|
1034
|
-
type: Input
|
|
1035
|
-
}, {
|
|
824
|
+
], template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
|
|
825
|
+
}], propDecorators: { _groupItemsHostAttribute: [{
|
|
1036
826
|
type: HostBinding,
|
|
1037
827
|
args: ['class.ard-group-items']
|
|
1038
828
|
}], items: [{
|
|
@@ -1040,105 +830,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
|
|
|
1040
830
|
}], optionComponents: [{
|
|
1041
831
|
type: ContentChildren,
|
|
1042
832
|
args: [ArdiumOptionComponent]
|
|
1043
|
-
}], multiselectable: [{
|
|
1044
|
-
type: Input
|
|
1045
|
-
}, {
|
|
1046
|
-
type: HostBinding,
|
|
1047
|
-
args: ['attr.multiple']
|
|
1048
|
-
}], clearable: [{
|
|
1049
|
-
type: Input
|
|
1050
|
-
}], searchable: [{
|
|
1051
|
-
type: Input
|
|
1052
|
-
}], addCustom: [{
|
|
1053
|
-
type: Input
|
|
1054
833
|
}], value: [{
|
|
1055
834
|
type: Input
|
|
1056
|
-
}], valueChange: [{
|
|
1057
|
-
type: Output
|
|
1058
|
-
}], changeEvent: [{
|
|
1059
|
-
type: Output,
|
|
1060
|
-
args: ['change']
|
|
1061
|
-
}], addEvent: [{
|
|
1062
|
-
type: Output,
|
|
1063
|
-
args: ['add']
|
|
1064
|
-
}], failedToAddEvent: [{
|
|
1065
|
-
type: Output,
|
|
1066
|
-
args: ['failedToAdd']
|
|
1067
|
-
}], removeEvent: [{
|
|
1068
|
-
type: Output,
|
|
1069
|
-
args: ['remove']
|
|
1070
|
-
}], clearEvent: [{
|
|
1071
|
-
type: Output,
|
|
1072
|
-
args: ['clear']
|
|
1073
|
-
}], openEvent: [{
|
|
1074
|
-
type: Output,
|
|
1075
|
-
args: ['open']
|
|
1076
|
-
}], closeEvent: [{
|
|
1077
|
-
type: Output,
|
|
1078
|
-
args: ['close']
|
|
1079
|
-
}], scrollEvent: [{
|
|
1080
|
-
type: Output,
|
|
1081
|
-
args: ['scroll']
|
|
1082
|
-
}], scrollToEndEvent: [{
|
|
1083
|
-
type: Output,
|
|
1084
|
-
args: ['scrollToEnd']
|
|
1085
|
-
}], searchEvent: [{
|
|
1086
|
-
type: Output,
|
|
1087
|
-
args: ['search']
|
|
1088
|
-
}], isDropdownOpen: [{
|
|
1089
|
-
type: Input,
|
|
1090
|
-
args: ['isOpen']
|
|
1091
|
-
}], isDropdownOpenChange: [{
|
|
1092
|
-
type: Output,
|
|
1093
|
-
args: ['isOpenChange']
|
|
1094
|
-
}], searchInput: [{
|
|
1095
|
-
type: ViewChild,
|
|
1096
|
-
args: ['searchInput', { static: true }]
|
|
1097
|
-
}], dropdownPanel: [{
|
|
1098
|
-
type: ViewChild,
|
|
1099
|
-
args: [forwardRef(() => ArdiumDropdownPanelComponent)]
|
|
1100
|
-
}], optionTemplate: [{
|
|
1101
|
-
type: ContentChild,
|
|
1102
|
-
args: [ArdOptionTemplateDirective, { read: TemplateRef }]
|
|
1103
|
-
}], optgroupTemplate: [{
|
|
1104
|
-
type: ContentChild,
|
|
1105
|
-
args: [ArdOptgroupTemplateDirective, { read: TemplateRef }]
|
|
1106
|
-
}], valueTemplate: [{
|
|
1107
|
-
type: ContentChild,
|
|
1108
|
-
args: [ArdValueTemplateDirective, { read: TemplateRef }]
|
|
1109
|
-
}], placeholderTemplate: [{
|
|
1110
|
-
type: ContentChild,
|
|
1111
|
-
args: [ArdSelectPlaceholderTemplateDirective, { read: TemplateRef }]
|
|
1112
|
-
}], loadingSpinnerTemplate: [{
|
|
1113
|
-
type: ContentChild,
|
|
1114
|
-
args: [ArdLoadingSpinnerTemplateDirective, { read: TemplateRef }]
|
|
1115
|
-
}], loadingPlaceholderTemplate: [{
|
|
1116
|
-
type: ContentChild,
|
|
1117
|
-
args: [ArdLoadingPlaceholderTemplateDirective, { read: TemplateRef }]
|
|
1118
|
-
}], dropdownHeaderTemplate: [{
|
|
1119
|
-
type: ContentChild,
|
|
1120
|
-
args: [ArdDropdownHeaderTemplateDirective, { read: TemplateRef }]
|
|
1121
|
-
}], dropdownFooterTemplate: [{
|
|
1122
|
-
type: ContentChild,
|
|
1123
|
-
args: [ArdDropdownFooterTemplateDirective, { read: TemplateRef }]
|
|
1124
|
-
}], noItemsFoundTemplate: [{
|
|
1125
|
-
type: ContentChild,
|
|
1126
|
-
args: [ArdNoItemsFoundTemplateDirective, { read: TemplateRef }]
|
|
1127
|
-
}], addCustomTemplate: [{
|
|
1128
|
-
type: ContentChild,
|
|
1129
|
-
args: [ArdAddCustomTemplateDirective, { read: TemplateRef }]
|
|
1130
|
-
}], itemLimitReachedTemplate: [{
|
|
1131
|
-
type: ContentChild,
|
|
1132
|
-
args: [ArdItemLimitReachedTemplateDirective, { read: TemplateRef }]
|
|
1133
|
-
}], itemDisplayLimitTemplate: [{
|
|
1134
|
-
type: ContentChild,
|
|
1135
|
-
args: [ArdItemDisplayLimitTemplateDirective, { read: TemplateRef }]
|
|
1136
|
-
}], prefixTemplate: [{
|
|
1137
|
-
type: ContentChild,
|
|
1138
|
-
args: [ArdSelectPrefixTemplateDirective, { read: TemplateRef }]
|
|
1139
|
-
}], suffixTemplate: [{
|
|
1140
|
-
type: ContentChild,
|
|
1141
|
-
args: [ArdSelectSuffixTemplateDirective, { read: TemplateRef }]
|
|
1142
835
|
}], dropdownHost: [{
|
|
1143
836
|
type: ViewChild,
|
|
1144
837
|
args: ['dropdownHost', { read: ElementRef }]
|
|
@@ -1155,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
|
|
|
1155
848
|
type: HostListener,
|
|
1156
849
|
args: ['keydown', ['$event']]
|
|
1157
850
|
}] } });
|
|
1158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLGFBQWEsRUFBcUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUVULGlCQUFpQixFQUNqQixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9C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YztzQkFEYixZQUFZO3VCQUFDLGVBQWU7Z0JBdVE3QixTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUztnQkFvRXZCLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXlQcm9wZXJ0eSwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcbmltcG9ydCB7IFN1YmplY3QsIG1lcmdlLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNBbnlTdHJpbmcsIGlzQXJyYXksIGlzRnVuY3Rpb24gfSBmcm9tICdzaW1wbGUtYm9vbCc7XG5pbXBvcnQgeyBJdGVtU3RvcmFnZSB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIENvbXBhcmVXaXRoRm4sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudFZhcmlhbnQgfSBmcm9tICcuLy4uL3R5cGVzL3RoZW1pbmcudHlwZXMnO1xuaW1wb3J0IHtcbiAgQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZERyb3Bkb3duRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZERyb3Bkb3duSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTm9JdGVtc0ZvdW5kVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE9wdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRTZWxlY3RQbGFjZWhvbGRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRTZWxlY3RQcmVmaXhUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0U3VmZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vc2VsZWN0LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBBZGRDdXN0b21GbixcbiAgQ3VzdG9tT3B0aW9uQ29udGV4dCxcbiAgR3JvdXBDb250ZXh0LFxuICBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCxcbiAgSXRlbUxpbWl0Q29udGV4dCxcbiAgUGxhY2Vob2xkZXJDb250ZXh0LFxuICBTZWFyY2hDb250ZXh0LFxuICBTdGF0c0NvbnRleHQsXG4gIFZhbHVlQ29udGV4dCxcbn0gZnJvbSAnLi9zZWxlY3QudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcmQtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBcmRpdW1TZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQXJkaXVtU2VsZWN0Q29tcG9uZW50XG4gIGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IGVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgREVGQVVMVFMgPSB7XG4gICAgdmFsdWVGcm9tOiAndmFsdWUnLFxuICAgIGxhYmVsRnJvbTogJ2xhYmVsJyxcbiAgICBkaXNhYmxlZEZyb206ICdkaXNhYmxlZCcsXG4gICAgZ3JvdXBMYWJlbEZyb206ICdncm91cCcsXG4gICAgZ3JvdXBEaXNhYmxlZEZyb206ICdkaXNhYmxlZCcsXG4gICAgY2hpbGRyZW5Gcm9tOiAnY2hpbGRyZW4nLFxuICAgIHNlYXJjaEZuOiBzZWFyY2hGdW5jdGlvbnMuYnlMYWJlbCxcbiAgICBjbGVhckJ1dHRvblRpdGxlOiAnQ2xlYXInLFxuICAgIG5vSXRlbXNGb3VuZFRleHQ6ICdObyBpdGVtcyBmb3VuZC4nLFxuICAgIGxvYWRpbmdQbGFjZWhvbGRlclRleHQ6ICdMb2FkaW5nLi4uJyxcbiAgfTtcblxuICAvLyEgcHJpdmF0ZXNcbiAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdIHwgbnVsbCA9IFtdO1xuICBwcml2YXRlIF9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgX3NlYXJjaEJhckZvY3VzZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vISBwdWJsaWNzXG4gIHB1YmxpYyBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcbiAgaXNJdGVtc0lucHV0VXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgQElucHV0KCkgdmFsdWVGcm9tPzogc3RyaW5nO1xuICBASW5wdXQoKSBsYWJlbEZyb20/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2FibGVkRnJvbT86IHN0cmluZztcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIEBJbnB1dCgpIGdyb3VwTGFiZWxGcm9tPzogc3RyaW5nIHwgR3JvdXBCeUZuO1xuICBASW5wdXQoKSBncm91cERpc2FibGVkRnJvbT86IHN0cmluZztcbiAgQElucHV0KCkgY2hpbGRyZW5Gcm9tPzogc3RyaW5nO1xuICAvLyEgc2V0dGluZ3NcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWxlY3QgaXRlbSc7XG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoLi4uJztcbiAgQElucHV0KCkgZHJvcGRvd25Qb3NpdGlvbjogQXJkUGFuZWxQb3NpdGlvbiA9IEFyZFBhbmVsUG9zaXRpb24uQXV0bztcbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZTogc3RyaW5nID0gdGhpcy5ERUZBVUxUUy5jbGVhckJ1dHRvblRpdGxlO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICBASW5wdXQoKSBub0l0ZW1zRm91bmRUZXh0OiBzdHJpbmcgPSB0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQ7XG4gIEBJbnB1dCgpIGxvYWRpbmdQbGFjZWhvbGRlclRleHQ6IHN0cmluZyA9IHRoaXMuREVGQVVMVFMubG9hZGluZ1BsYWNlaG9sZGVyVGV4dDtcbiAgLy8hIHNlYXJjaC1yZWxhdGVkIG9wdGlvbnNcbiAgQElucHV0KCkgc2VhcmNoSW5wdXRJZD86IHN0cmluZztcbiAgLy8hIG90aGVyIGlucHV0c1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5wdXRBdHRyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKSBodG1sSWQ6IHN0cmluZyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcHJpdmF0ZSBfaXRlbXNBbHJlYWR5R3JvdXBlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgaXRlbXNBbHJlYWR5R3JvdXBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNBbHJlYWR5R3JvdXBlZDtcbiAgfVxuICBzZXQgaXRlbXNBbHJlYWR5R3JvdXBlZCh2OiBhbnkpIHtcbiAgICB0aGlzLl9pdGVtc0FscmVhZHlHcm91cGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy9zaG91bGQgdGhlIHZhbHVlIHRoYXQgdGhlIFwiZGlzYWJsZWRGcm9tXCIgcGF0aCBsZWFkIHRvIGJlIGludmVydGVkP1xuICAvL3VzZWZ1bCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBlLmcuIFwiYWN0aXZlXCIsIHdoaWNoIGlzIHRoZSBvcG9zaXRlIG9mIFwiZGlzYWJsZWRcIlxuICBwcml2YXRlIF9pbnZlcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgaW52ZXJ0RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmVydERpc2FibGVkO1xuICB9XG4gIHNldCBpbnZlcnREaXNhYmxlZCh2OiBhbnkpIHtcbiAgICB0aGlzLl9pbnZlcnREaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX25vR3JvdXBBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBub0dyb3VwQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbm9Hcm91cEFjdGlvbnM7XG4gIH1cbiAgc2V0IG5vR3JvdXBBY3Rpb25zKHY6IGFueSkge1xuICAgIHRoaXMuX25vR3JvdXBBY3Rpb25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0hpZ2hsaWdodEZpcnN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZ2V0IGF1dG9IaWdobGlnaHRGaXJzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0hpZ2hsaWdodEZpcnN0O1xuICB9XG4gIHNldCBhdXRvSGlnaGxpZ2h0Rmlyc3QodjogYW55KSB7XG4gICAgdGhpcy5fYXV0b0hpZ2hsaWdodEZpcnN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBhdXRvRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Gb2N1cztcbiAgfVxuICBzZXQgYXV0b0ZvY3VzKHY6IGFueSkge1xuICAgIHRoaXMuX2F1dG9Gb2N1cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBrZWVwT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2VlcE9wZW47XG4gIH1cbiAgc2V0IGtlZXBPcGVuKHY6IGFueSkge1xuICAgIHRoaXMuX2tlZXBPcGVuID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGlkZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBoaWRlU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGVTZWxlY3RlZDtcbiAgfVxuICBzZXQgaGlkZVNlbGVjdGVkKHY6IGFueSkge1xuICAgIHRoaXMuX2hpZGVTZWxlY3RlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyT25CYWNrc3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IG5vQmFja3NwYWNlQ2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFyT25CYWNrc3BhY2U7XG4gIH1cbiAgc2V0IG5vQmFja3NwYWNlQ2xlYXIodjogYW55KSB7XG4gICAgdGhpcy5fY2xlYXJPbkJhY2tzcGFjZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRNdWx0aXBsZVZhbHVlczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgc29ydE11bHRpcGxlVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TXVsdGlwbGVWYWx1ZXM7XG4gIH1cbiAgc2V0IHNvcnRNdWx0aXBsZVZhbHVlcyh2OiBhbnkpIHtcbiAgICB0aGlzLl9zb3J0TXVsdGlwbGVWYWx1ZXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9zZWFyY2hDYXNlU2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBzZWFyY2hDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hDYXNlU2Vuc2l0aXZlO1xuICB9XG4gIHNldCBzZWFyY2hDYXNlU2Vuc2l0aXZlKHY6IGFueSkge1xuICAgIHRoaXMuX3NlYXJjaENhc2VTZW5zaXRpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9rZWVwU2VhcmNoQWZ0ZXJTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGtlZXBTZWFyY2hBZnRlclNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2VlcFNlYXJjaEFmdGVyU2VsZWN0O1xuICB9XG4gIHNldCBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QodjogYW55KSB7XG4gICAgdGhpcy5fa2VlcFNlYXJjaEFmdGVyU2VsZWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcHJpdmF0ZSBfbWF4U2VsZWN0ZWRJdGVtczogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBnZXQgbWF4U2VsZWN0ZWRJdGVtcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXhTZWxlY3RlZEl0ZW1zO1xuICB9XG4gIHNldCBtYXhTZWxlY3RlZEl0ZW1zKHY6IGFueSkge1xuICAgIHRoaXMuX21heFNlbGVjdGVkSXRlbXMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbURpc3BsYXlMaW1pdDogbnVtYmVyID0gSW5maW5pdHk7XG4gIEBJbnB1dCgpXG4gIGdldCBpdGVtRGlzcGxheUxpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1EaXNwbGF5TGltaXQ7XG4gIH1cbiAgc2V0IGl0ZW1EaXNwbGF5TGltaXQodjogYW55KSB7XG4gICAgdGhpcy5faXRlbURpc3BsYXlMaW1pdCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIEluZmluaXR5KTtcbiAgfVxuXG4gIC8vISBmdW5jdGlvbiBpbnB1dHNcbiAgcHJpdmF0ZSBfc2VhcmNoRm46IFNlYXJjaEZuID0gdGhpcy5ERUZBVUxUUy5zZWFyY2hGbjtcbiAgQElucHV0KClcbiAgZ2V0IHNlYXJjaEZuKCk6IFNlYXJjaEZuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRm47XG4gIH1cbiAgc2V0IHNlYXJjaEZuKGZuOiBTZWFyY2hGbikge1xuICAgIGlmIChmbiAhPT0gdW5kZWZpbmVkICYmIGZuICE9PSBudWxsICYmICFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2BzZWFyY2hGbmAgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cbiAgICB0aGlzLl9zZWFyY2hGbiA9IGZuO1xuICB9XG4gIHByaXZhdGUgX2NvbXBhcmVXaXRoPzogQ29tcGFyZVdpdGhGbjtcbiAgQElucHV0KClcbiAgZ2V0IGNvbXBhcmVXaXRoKCk6IENvbXBhcmVXaXRoRm4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJlV2l0aDtcbiAgfVxuICBzZXQgY29tcGFyZVdpdGgoZm46IENvbXBhcmVXaXRoRm4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoZm4gIT09IHVuZGVmaW5lZCAmJiBmbiAhPT0gbnVsbCAmJiAhaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIHRocm93IEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcbiAgfVxuXG4gIC8vISBhcHBlYXJhbmNlXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IEZvcm1FbGVtZW50QXBwZWFyYW5jZSA9IEZvcm1FbGVtZW50QXBwZWFyYW5jZS5PdXRsaW5lZDtcbiAgQElucHV0KCkgdmFyaWFudDogRm9ybUVsZW1lbnRWYXJpYW50ID0gRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQ7XG5cbiAgcHJpdmF0ZSBfY29tcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgY29tcGFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGFjdDtcbiAgfVxuICBzZXQgY29tcGFjdCh2OiBhbnkpIHtcbiAgICB0aGlzLl9jb21wYWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgZ2V0IG5nQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCA/ICdhcmQtY29tcGFjdCcgOiAnJyxcbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlID8gJ2FyZC1tdWx0aXNlbGVjdCcgOiAnYXJkLXNpbmdsZXNlbGVjdCcsXG4gICAgICB0aGlzLmNsZWFyYWJsZSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlID8gJ2FyZC1zZWFyY2hhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5maWx0ZXJlZCA/ICdhcmQtZmlsdGVyZWQnIDogJycsXG4gICAgICB0aGlzLnRvdWNoZWQgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgICB0aGlzLl9zZWFyY2hCYXJGb2N1c2VkID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Ryb3Bkb3duQXBwZWFyYW5jZT86IERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBzZXQgZHJvcGRvd29uQXBwZWFyYW5jZSh2OiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZSA9IHY7XG4gIH1cbiAgZ2V0IGRyb3Bkb3duQXBwZWFyYW5jZSgpOiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSB7XG4gICAgaWYgKHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZSkgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZTtcbiAgICBpZiAodGhpcy5hcHBlYXJhbmNlID09IEZvcm1FbGVtZW50QXBwZWFyYW5jZS5PdXRsaW5lZCkgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLk91dGxpbmVkO1xuICAgIHJldHVybiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZS5SYWlzZWQ7XG4gIH1cbiAgcHJpdmF0ZSBfZHJvcGRvd25WYXJpYW50PzogRHJvcGRvd25QYW5lbFZhcmlhbnQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHNldCBkcm9wZG93b25WYXJpYW50KHY6IERyb3Bkb3duUGFuZWxWYXJpYW50KSB7XG4gICAgdGhpcy5fZHJvcGRvd25WYXJpYW50ID0gdjtcbiAgfVxuICBnZXQgZHJvcGRvd25WYXJpYW50KCk6IERyb3Bkb3duUGFuZWxWYXJpYW50IHtcbiAgICBpZiAodGhpcy5fZHJvcGRvd25WYXJpYW50KSByZXR1cm4gdGhpcy5fZHJvcGRvd25WYXJpYW50O1xuICAgIGlmICh0aGlzLnZhcmlhbnQgPT0gRm9ybUVsZW1lbnRWYXJpYW50LlBpbGwpIHJldHVybiBEcm9wZG93blBhbmVsVmFyaWFudC5Sb3VuZGVkO1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQ7XG4gIH1cblxuICAvLyEgY2xhc3MtYmFzZWQgaW5wdXRzXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJykgZ3JvdXBJdGVtczogYm9vbGVhbiA9IGZhbHNlOyAvL2RlZmF1bHQgdmFsdWUgbWF5IGJlIGNoYW5nZWQgdG8gXCJ0cnVlXCIgaW4gbmdPbkNoYW5nZXMgaWYgdGhpcy5ncm91cEJ5IGlzIGRlZmluZWQgb3IgdGhpcy5pdGVtc0FscmVhZHlHcm91cGVkIGlzIHNldCB0byBcInRydWVcIlxuXG4gIC8vISBpdGVtcyBzZXR0ZXIvZ2V0dGVyXG4gIEBJbnB1dCgpXG4gIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cbiAgc2V0IGl0ZW1zKHZhbHVlOiBzdHJpbmcgfCBhbnlbXSB8IG51bGwpIHtcbiAgICB0aGlzLmlzSXRlbXNJbnB1dFVzZWQgPSB0cnVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSBbXTtcbiAgICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaXNBbnlTdHJpbmcodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IGNvZXJjZUFycmF5UHJvcGVydHkodmFsdWUpO1xuICAgIH1cbiAgICBsZXQgcHJpbnRFcnJvcnMgPSB0aGlzLml0ZW1TdG9yYWdlLnNldEl0ZW1zKHZhbHVlKTtcbiAgICBpZiAocHJpbnRFcnJvcnMpIHtcbiAgICAgIHRoaXMuX3ByaW50UHJpbWl0aXZlV2FybmluZ3MoKTtcbiAgICB9XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKEFyZGl1bU9wdGlvbkNvbXBvbmVudClcbiAgb3B0aW9uQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+O1xuXG4gIHByaXZhdGUgX3NldEl0ZW1zRnJvbUNvbXBvbmVudHMoKSB7XG4gICAgY29uc3QgaGFuZGxlT3B0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZE9yRGVzdHJveWVkID0gbWVyZ2UodGhpcy5vcHRpb25Db21wb25lbnRzLmNoYW5nZXMsIHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgIG1lcmdlKC4uLnRoaXMub3B0aW9uQ29tcG9uZW50cy5tYXAob3B0aW9uID0+IG9wdGlvbi5zdGF0ZUNoYW5nZSQpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwoY2hhbmdlZE9yRGVzdHJveWVkKSlcbiAgICAgICAgLnN1YnNjcmliZShvcHRpb24gPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbVN0b3JhZ2UuZmluZEl0ZW1CeVZhbHVlKG9wdGlvbi5vbGRWYWx1ZSA/PyBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlZCA9IG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgaXRlbS5sYWJlbCA9IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLmRpc2FibGVkID0gb3B0aW9uLmRpc2FibGVkO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLmxhYmVsID0gb3B0aW9uLmxhYmVsIHx8IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICAgIGl0ZW0uaXRlbURhdGEudmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbkNvbXBvbmVudHMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm9wdGlvbkNvbXBvbmVudHMpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIGxhYmVsOiBvcHRpb24ubGFiZWwsXG4gICAgICAgICAgZGlzYWJsZWQ6IG9wdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgfSkpO1xuICAgICAgICBoYW5kbGVPcHRpb25DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vISBhdHRyaWJ1dGUgYW5kL29yIGNsYXNzIHNldHRlcnMvZ2V0dGVyc1xuICBwcml2YXRlIF9tdWx0aXNlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLm11bHRpcGxlJylcbiAgZ2V0IG11bHRpc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlzZWxlY3RhYmxlO1xuICB9XG4gIHNldCBtdWx0aXNlbGVjdGFibGUodjogYW55KSB7XG4gICAgdGhpcy5fbXVsdGlzZWxlY3RhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG4gIGdldCBzaW5nbGVzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fbXVsdGlzZWxlY3RhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZ2V0IGNsZWFyYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYXJhYmxlO1xuICB9XG4gIHNldCBjbGVhcmFibGUodjogYW55KSB7XG4gICAgdGhpcy5fY2xlYXJhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgc2VhcmNoYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoYWJsZTtcbiAgfVxuICBzZXQgc2VhcmNoYWJsZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9zZWFyY2hhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hhYmxlICYmIHRoaXMuc2VhcmNoVGVybSAhPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdWNoZWQ7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgdG91Y2hlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3RvdWNoZWQgPSBzdGF0ZTtcbiAgfVxuXG4gIC8vISBjdXN0b20gb3B0aW9uc1xuICBwcml2YXRlIF9kZWZhdWx0QWRkQ3VzdG9tRm46IEFkZEN1c3RvbUZuPGFueT4gPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWU7XG4gIHByaXZhdGUgX2FkZEN1c3RvbTogZmFsc2UgfCBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+PiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgYWRkQ3VzdG9tKCk6IGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLl9hZGRDdXN0b207XG4gIH1cbiAgc2V0IGFkZEN1c3RvbSh2OiBzdHJpbmcgfCBib29sZWFuIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4pIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2KSkge1xuICAgICAgdGhpcy5fYWRkQ3VzdG9tID0gdjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9jb2VyY2UgdGhlIHZhbHVlIGludG8gYSBib29sZWFuXG4gICAgLy9pZiBcInRydWVcIiwgdXNlIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLiBPdGhlcndpc2UsIGp1c3Qgc2V0IHRvIFwiZmFsc2VcIi5cbiAgICB0aGlzLl9hZGRDdXN0b20gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgJiYgdGhpcy5fZGVmYXVsdEFkZEN1c3RvbUZuO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dBZGRDdXN0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ3VzdG9tICE9IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybS5sZW5ndGggPiAwICYmIHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zRm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRDdXN0b21PcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5hZGRDdXN0b20pIHJldHVybjtcblxuICAgIGNvbnN0IG5ld09wdGlvbk9iaiA9IGF3YWl0IHRoaXMuaXRlbVN0b3JhZ2UuYWRkQ3VzdG9tT3B0aW9uKHZhbHVlLCB0aGlzLmFkZEN1c3RvbSk7XG5cbiAgICB0aGlzLnNlbGVjdEl0ZW0obmV3T3B0aW9uT2JqKTtcbiAgfVxuXG4gIC8vISBjb250cm9sIHZhbHVlIGFjY2Vzc29yXG4gIC8vb3ZlcnJpZGUgdGhlIHdyaXRlVmFsdWUgYW5kIHNldERpc2FibGVkU3RhdGUgZGVmaW5lZCBpbiBfTmdNb2RlbENvbXBvbmVudFxuICBvdmVycmlkZSBzZXREaXNhYmxlZFN0YXRlKHN0YXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBzdGF0ZTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICB3cml0ZVZhbHVlKG5nTW9kZWw6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oYW5kbGVXcml0ZVZhbHVlKG5nTW9kZWwpO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIC8vKiBjaGFuZ2UgJiB0b3VjaCBldmVudCBlbWl0dGVyc1xuICBwcm90ZWN0ZWQgX2VtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgfVxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIEBPdXRwdXQoJ2NoYW5nZScpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgQE91dHB1dCgnYWRkJykgYWRkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCdmYWlsZWRUb0FkZCcpIGZhaWxlZFRvQWRkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCdyZW1vdmUnKSByZW1vdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoJ2NsZWFyJykgY2xlYXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgQE91dHB1dCgnb3BlbicpIG9wZW5FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgQE91dHB1dCgnY2xvc2UnKSBjbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBAT3V0cHV0KCdzY3JvbGwnKSBzY3JvbGxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG4gIH0+KCk7XG4gIEBPdXRwdXQoJ3Njcm9sbFRvRW5kJykgc2Nyb2xsVG9FbmRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnc2VhcmNoJykgc2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBtYXRjaGluZzogYW55W107XG4gIH0+KCk7XG5cbiAgQElucHV0KCdpc09wZW4nKVxuICBpc0Ryb3Bkb3duT3BlbiE6IGJvb2xlYW47XG4gIEBPdXRwdXQoJ2lzT3BlbkNoYW5nZScpIGlzRHJvcGRvd25PcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCkpXG4gIGRyb3Bkb3duUGFuZWwhOiBBcmRpdW1Ecm9wZG93blBhbmVsQ29tcG9uZW50O1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgQENvbnRlbnRDaGlsZChBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBvcHRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkT3B0Z3JvdXBUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBvcHRncm91cFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHZhbHVlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcGxhY2Vob2xkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBkcm9wZG93bkhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duRm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIG5vSXRlbXNGb3VuZFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRBZGRDdXN0b21UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBhZGRDdXN0b21UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkSXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChBcmRTZWxlY3RQcmVmaXhUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcmVmaXhUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkU2VsZWN0U3VmZml4VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgc3VmZml4VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vISBjb250ZXh0IHByb3ZpZGVyc1xuICBnZXRWYWx1ZUNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogVmFsdWVDb250ZXh0IHtcbiAgICBjb25zdCAkdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgIGl0ZW0sXG4gICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAkdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0U3RhdHNDb250ZXh0KCk6IFN0YXRzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcyxcbiAgICB9O1xuICB9XG4gIGdldFNlYXJjaENvbnRleHQoKTogU2VhcmNoQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zLFxuICAgIH07XG4gIH1cbiAgZ2V0UGxhY2Vob2xkZXJDb250ZXh0KCk6IFBsYWNlaG9sZGVyQ29udGV4dCB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9XG4gIGdldEN1c3RvbU9wdGlvbkNvbnRleHQoKTogQ3VzdG9tT3B0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtLFxuICAgIH07XG4gIH1cbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmZpbHRlcih2ID0+IHYuc2VsZWN0ZWQpLmxlbmd0aCxcbiAgICAgIHRvdGFsQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgIGl0ZW0sXG4gICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICB9O1xuICB9XG4gIGdldEl0ZW1MaW1pdENvbnRleHQoKTogSXRlbUxpbWl0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIHNlbGVjdGVkSXRlbXM6IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICBpdGVtTGltaXQ6IHRoaXMubWF4U2VsZWN0ZWRJdGVtcyxcbiAgICB9O1xuICB9XG4gIGdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KCk6IEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0IHtcbiAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGg7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICBpdGVtTGltaXQ6IHRoaXMubWF4U2VsZWN0ZWRJdGVtcyxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0ID8/IDApLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBzY3JvbGxTdHJhdGVneU9wdHM6IFNjcm9sbFN0cmF0ZWd5T3B0aW9uc1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNJdGVtc0lucHV0VXNlZCkge1xuICAgICAgdGhpcy5fc2V0SXRlbXNGcm9tQ29tcG9uZW50cygpO1xuICAgIH1cbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy9maXJlIGl0ZW1zIGxvYWQgaGFuZGxlciB3aGVuIGxvYWRpbmcgaXMgc2V0IHRvIGZhbHNlXG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXSkge1xuICAgICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXS5jdXJyZW50VmFsdWUgPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9zZXQgZ3JvdXBJdGVtcyB0byB0cnVlIGJ5IGRlZmF1bHQgaWYgZ3JvdXBMYWJlbEZyb20gb3IgaXRlbXNBbHJlYWR5R3JvdXBlZCBpcyBzZXQgdG8gdHJ1ZSBhcyB0aGUgZmlyc3QgY2hhbmdlXG4gICAgaWYgKChjaGFuZ2VzWydncm91cExhYmVsRnJvbSddPy5maXJzdENoYW5nZSB8fCBjaGFuZ2VzWydpdGVtc0FscmVhZHlHcm91cGVkJ10/LmZpcnN0Q2hhbmdlKSAmJiAhY2hhbmdlc1snZ3JvdXBJdGVtcyddKSB7XG4gICAgICB0aGlzLmdyb3VwSXRlbXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9vbkl0ZW1zTG9hZCgpIHtcbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQpIHJldHVybjtcbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBwcml2YXRlIF9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCkge1xuICAgIGZ1bmN0aW9uIG1ha2VXYXJuaW5nKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXNpbmcgWyR7c3RyfV0gcHJvcGVydHkgYm91bmQgdG8gPGFyZC1zZWxlY3Q+LCBhcyBzb21lIHByb3ZpZGVkIGl0ZW1zIGFyZSBvZiBwcmltaXRpdmUgdHlwZWApO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZUZyb20pIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnbGFiZWxGcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVkRnJvbSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2Rpc2FibGVkRnJvbScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncm91cExhYmVsRnJvbSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnZ3JvdXBEaXNhYmxlZEZyb20nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hpbGRyZW5Gcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnY2hpbGRyZW5Gcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmludmVydERpc2FibGVkKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICBnZXQgZmlyc3RIaWdobGlnaHRlZEl0ZW0oKTogQXJkT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zPy5maXJzdCgpO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkICYmICF0aGlzLnNlYXJjaFRlcm07XG4gIH1cbiAgZ2V0IHNob3VsZERpc3BsYXlWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCAmJiAoIXRoaXMuc2VhcmNoVGVybSB8fCB0aGlzLm11bHRpc2VsZWN0YWJsZSk7XG4gIH1cbiAgZ2V0IHNob3VsZFNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYXJhYmxlICYmICF0aGlzLl9kaXNhYmxlZCAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCB8fCB0aGlzLnNlYXJjaFRlcm0gIT0gJycpO1xuICB9XG4gIGdldCBpdGVtc1RvRGlzcGxheSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuZ3JvdXBzLnZhbHVlcygpO1xuICB9XG4gIGdldCBzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kICYmICF0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy5zaG91bGRTaG93QWRkQ3VzdG9tO1xuICB9XG4gIGdldCB0b3RhbEl0ZW1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMubGVuZ3RoO1xuICB9XG4gIGdldCBmb3VuZEl0ZW1zKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuZmlsdGVyZWRJdGVtcy5sZW5ndGg7XG4gIH1cbiAgZ2V0IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm11bHRpc2VsZWN0YWJsZSAmJiB0aGlzLml0ZW1EaXNwbGF5TGltaXQgIT0gSW5maW5pdHkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IHRoaXMuaXRlbURpc3BsYXlMaW1pdDtcbiAgfVxuICBnZXQgaXNJbnB1dEVsZW1lbnRSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuYWRkQ3VzdG9tICYmICghdGhpcy5zZWFyY2hhYmxlIHx8IHRoaXMuaXRlbVN0b3JhZ2UuaXNJdGVtTGltaXRSZWFjaGVkKTtcbiAgfVxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUgfHwgdGhpcy5pdGVtRGlzcGxheUxpbWl0ID09IEluZmluaXR5IHx8IGkgPCB0aGlzLml0ZW1EaXNwbGF5TGltaXQ7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlciAmJiB0aGlzLnNlYXJjaGFibGUgJiYgKHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKSkgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXI7XG4gIH1cblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGZpbHRlclRlcm07XG4gICAgbGV0IG1hdGNoaW5nID0gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXIoZmlsdGVyVGVybSk7XG4gICAgaWYgKCFzdXBwcmVzc1NlYXJjaEV2ZW50KSB0aGlzLnNlYXJjaEV2ZW50LmVtaXQoeyBzZWFyY2g6IGZpbHRlclRlcm0sIG1hdGNoaW5nIH0pO1xuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRGb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgPSB0cnVlO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCkge1xuICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtKTtcbiAgfVxuICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IHZvaWQge1xuICAgIGxldCBbc2VsZWN0ZWQsIHVuc2VsZWN0ZWQsIGZhaWxlZFRvU2VsZWN0XSA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0SXRlbSguLi5pdGVtcyk7XG5cbiAgICBpZiAodW5zZWxlY3RlZC5sZW5ndGggPiAwKSB0aGlzLnJlbW92ZUV2ZW50LmVtaXQodW5zZWxlY3RlZCk7XG5cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuXG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuIHx8IHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zVG9TZWxlY3QpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgbGV0IHVuc2VsZWN0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLnVuc2VsZWN0SXRlbSguLi5pdGVtcyk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQodW5zZWxlY3RlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICAgIGlmICghdGhpcy5rZWVwU2VhcmNoQWZ0ZXJTZWxlY3QpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4gfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9jbGVhckFsbEl0ZW1zKCk6IHZvaWQge1xuICAgIGxldCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgbGV0IGNsZWFyZWRWYWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UuY2xlYXJMYXN0U2VsZWN0ZWQoKS52YWx1ZTtcblxuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMucmVtb3ZlRXZlbnQuZW1pdChbY2xlYXJlZFZhbHVlXSk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIC8vISBoaWdobGlnaC1yZWxhdGVkXG4gIG9uTW91c2VNb3ZlKCkge1xuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQgPSB0cnVlO1xuICB9XG4gIG9uR3JvdXBNb3VzZW92ZXIoZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRHcm91cChncm91cCk7XG4gIH1cbiAgb25JdGVtTW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VFbnRlcihvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodFNpbmdsZUl0ZW0ob3B0aW9uKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUxlYXZlKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgX2lzQ2xpY2tlZFdpdGhpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvbkl0ZW1DbGljayhvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGVhcmFibGUpIHRoaXMudG9nZ2xlSXRlbShvcHRpb24pO1xuICAgIGVsc2UgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbik7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSB0cnVlO1xuICB9XG4gIG9uR3JvdXBDbGljayhncm91cDogQXJkT3B0aW9uR3JvdXApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlzZWxlY3RhYmxlIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMpIHJldHVybjtcbiAgICBpZiAoZ3JvdXAuY2hpbGRyZW4uZXZlcnkobyA9PiBvLnNlbGVjdGVkKSkge1xuICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcbiAgfVxuICBoYW5kbGVDbGVhckJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5fY2xlYXJTZWFyY2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJBbGxJdGVtcygpO1xuICB9XG4gIGhhbmRsZURyb3Bkb3duQXJyb3dDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcblxuICAgIHRoaXMudG9nZ2xlKCk7XG4gIH1cbiAgaGFuZGxlT3V0c2lkZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9ICdJTlBVVCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWFyY2hhYmxlKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcpXG4gIG9uTW91c2V1cCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSBmYWxzZTtcbiAgfVxuICAvLyEgZHJvcGRvd24gc3RhdGUgaGFuZGxlcnNcbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Ryb3Bkb3duT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XG4gICAgaWYgKHRoaXMuYXV0b0hpZ2hsaWdodEZpcnN0KSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuQ2hhbmdlLmVtaXQodGhpcy5pc0Ryb3Bkb3duT3Blbik7XG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuQ2hhbmdlLmVtaXQodGhpcy5pc0Ryb3Bkb3duT3Blbik7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIENoYW5nZURldGVjdG9yUmVmXG4gIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCEoPGFueT50aGlzLl9jZCkuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIC8vISBzZWFyY2hcbiAgcHJpdmF0ZSBfY2xlYXJTZWFyY2goc3VwcHJlc3NTZWFyY2hFdmVudDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0U2VhcmNoKCcnLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2goc2VhcmNoVGVybTogc3RyaW5nLCBzdXBwcmVzc1NlYXJjaEV2ZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtO1xuICAgIHRoaXMuZmlsdGVyKHNlYXJjaFRlcm0sIHN1cHByZXNzU2VhcmNoRXZlbnQpO1xuICB9XG4gIHByaXZhdGUgX3NldFNlYXJjaElucHV0QXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgYXV0b2NvcnJlY3Q6ICdvZmYnLFxuICAgICAgYXV0b2NhcGl0YWxpemU6ICdvZmYnLFxuICAgICAgYXV0b2NvbXBsZXRlOiAnb2ZmJyxcbiAgICAgIC4uLnRoaXMuaW5wdXRBdHRycyxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFzeW5jIF9vbkVudGVyUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBzaG91bGRDbG9zZSA9IHRydWU7XG5cbiAgICAvL3NlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmIHRoaXMuZmlyc3RIaWdobGlnaHRlZEl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSAmJiB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKSkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbSguLi50aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vYWRkIGEgY3VzdG9tIG9wdGlvblxuICAgIGVsc2UgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4gJiYgdGhpcy5zaG91bGRTaG93QWRkQ3VzdG9tKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZEN1c3RvbU9wdGlvbih0aGlzLnNlYXJjaFRlcm0pO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbiAmJiBzaG91bGRDbG9zZSkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbEhpZ2hsaWdodHMoKTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX29uU3BhY2VQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlbigpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oKzEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbC5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ2JvdHRvbScpO1xuICB9XG4gIHByaXZhdGUgX29uQXJyb3dVcFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodE5leHRJdGVtKC0xLCBldmVudC5zaGlmdEtleSk7XG4gICAgaWYgKHJlY2VudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgIHRoaXMuaXRlbVN0b3JhZ2Uuc2V0UmVjZW50bHlIaWdobGlnaHRlZChyZWNlbnRseUhpZ2hsaWdodGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCd0b3AnKTtcbiAgfVxuICBwcml2YXRlIF9vbkhvbWVQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Ryb3Bkb3duT3BlbiB8fCAodGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCAhPSAwICYmIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPSAwKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcbiAgICBpZiAoIXJlY2VudGx5SGlnaGxpZ2h0ZWQpIHJldHVybjtcblxuICAgIHRoaXMuaXRlbVN0b3JhZ2Uuc2V0UmVjZW50bHlIaWdobGlnaHRlZChyZWNlbnRseUhpZ2hsaWdodGVkKTtcbiAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCd0b3AnKTtcbiAgfVxuICBwcml2YXRlIF9vbkVuZFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEcm9wZG93bk9wZW4gfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9IHRoaXMuc2VhcmNoVGVybS5sZW5ndGggJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ICE9IHRoaXMuc2VhcmNoVGVybS5sZW5ndGgpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRMYXN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbC5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ2JvdHRvbScpO1xuICB9XG4gIHByaXZhdGUgX29uQmFja3NwYWNlT3JEZWxldGVQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXJjaFRlcm0gfHwgIXRoaXMuX2NsZWFyYWJsZSB8fCB0aGlzLm5vQmFja3NwYWNlQ2xlYXIgfHwgIXRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlICYmIHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9jbGVhckxhc3RJdGVtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIF9vbkN0cmxBUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEFsbEl0ZW1zKCk7XG4gIH1cbn1cbiIsIjxhcmQtZm9ybS1maWVsZC1mcmFtZVxyXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICBbdmFyaWFudF09XCJ2YXJpYW50XCJcclxuICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gICAgW3ByZWZpeFRlbXBsYXRlXT1cInByZWZpeFRlbXBsYXRlXCJcclxuICAgIFtzdWZmaXhUZW1wbGF0ZV09XCJzdWZmaXhUZW1wbGF0ZVwiXHJcbj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0XCJcclxuICAgICAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFueXdoZXJlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgW2NsYXNzLmFyZC1oYXMtdmFsdWVdPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3Nlc1wiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtdmFsdWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGREaXNwbGF5UGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGUgbGV0LXBsaGxkcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXBsYWNlaG9sZGVyXCI+e3sgcGxobGRyIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRQbGFjZWhvbGRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkRGlzcGxheVZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC12YWx1ZS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5oaWRkZW5dPVwiIWlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoaSkgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNWYWx1ZVdpdGhpbkRpc3BsYXlMaW1pdChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZhbHVlVGVtcGxhdGUgfHwgKG11bHRpc2VsZWN0YWJsZSA/IGRlZmF1bHRNdWx0aVZhbHVlVGVtcGxhdGUgOiAgZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFZhbHVlQ29udGV4dChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWYWx1ZVRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2FyZElubmVySFRNTF09XCJpdGVtLmxhYmVsXCIgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIGxldC1pdGVtIGxldC11bnNlbGVjdD1cInVuc2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1kZWxldGFibGUtY2hpcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlKT1cInVuc2VsZWN0KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwidmFyaWFudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFthcmRJbm5lckhUTUxdPVwiaXRlbS5sYWJlbFwiIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWRlbGV0YWJsZS1jaGlwPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGUgbGV0LWNvdW50PVwib3ZlcmZsb3dDb3VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Y291bnR9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJpc0Ryb3Bkb3duT3BlbiA/IGh0bWxJZCA6IG51bGxcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwic2VhcmNoSW5wdXRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc0lucHV0RWxlbWVudFJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNEcm9wZG93bk9wZW4gPyBodG1sSWQgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyKHNlYXJjaElucHV0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvblNlYXJjaElucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uU2VhcmNoSW5wdXRCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtY29udHJvbHNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNpbXBsZS1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxhcmQtX2NsZWFyLWJ1dHRvbiAqbmdJZj1cInNob3VsZFNob3dDbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY2xlYXJCdXR0b25UaXRsZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvYXJkLV9jbGVhci1idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93LXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRHJvcGRvd25BcnJvd0NsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blRlbXBsYXRlPlxyXG4gICAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgICAgIGNsYXNzPVwiYXJkLWRyb3Bkb3duLXBhbmVsIGFyZC1zZWxlY3QtZHJvcGRvd24tcGFuZWxcIlxyXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgICAgICBbaGVhZGVyVGVtcGxhdGVdPVwiZHJvcGRvd25IZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImRyb3Bkb3duQXBwZWFyYW5jZVwiXHJcbiAgICAgICAgW3ZhcmlhbnRdPVwiZHJvcGRvd25WYXJpYW50XCJcclxuICAgICAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgICAgIFtmaWx0ZXJWYWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICBbcGFuZWxJZF09XCJodG1sSWRcIlxyXG4gICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgICAgIChhcmRDbGlja091dHNpZGUpPVwiaGFuZGxlT3V0c2lkZUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoKVwiXHJcbiAgICAgICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChzY3JvbGxUb0VuZCk9XCJzY3JvbGxUb0VuZEV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtZGlzYWJsZWRdPVwiZ3JvdXAuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWhpZ2hsaWdodGVkXT1cImdyb3VwLmhpZ2hsaWdodGVkXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25Hcm91cE1vdXNlb3Zlcihncm91cClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBDbGljayhncm91cClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXAubGFiZWwgIT09ICcnICYmIGdyb3VwLmxhYmVsICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRncm91cFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiIFthcmRJbm5lckhUTUxdPVwiZ3JvdXAubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGdyb3VwVGVtcGxhdGUgfHwgZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0R3JvdXBDb250ZXh0KGdyb3VwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGdyb3VwLWNoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBncm91cC5jaGlsZHJlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkXT1cIm9wdGlvbi5oaWdobGlnaHRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkLXJlY2VudF09XCJvcHRpb24uaGlnaGxpZ2h0ZWRfcmVjZW50bHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImh0bWxJZCArICctJyArIG9wdGlvbi5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1DbGljayhvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm9uSXRlbU1vdXNlT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkl0ZW1Nb3VzZUxlYXZlKG9wdGlvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlIHx8IGRlZmF1bHRPcHRpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE9wdGlvbkNvbnRleHQob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bm9JdGVtc0ZvdW5kVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dBZGRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGUgbGV0LXNlYXJjaFRlcm0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCIgKGNsaWNrKT1cImFkZEN1c3RvbU9wdGlvbihzZWFyY2hUZXJtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tdmFsdWVcIj5cInt7c2VhcmNoVGVybX19XCI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRDdXN0b21UZW1wbGF0ZSB8fCBkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEN1c3RvbU9wdGlvbkNvbnRleHQoKVwiPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bG9hZGluZ1BsYWNlaG9sZGVyVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXJkLWRyb3Bkb3duLXBhbmVsPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
851
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBT0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFtQixNQUFNLGtEQUFrRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxxQkFBcUIsRUFB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZUFycmF5UHJvcGVydHksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQW55U3RyaW5nLCBpc0FycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgSXRlbVN0b3JhZ2UsIEl0ZW1TdG9yYWdlSG9zdCB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRWYXJpYW50IH0gZnJvbSAnLi8uLi90eXBlcy90aGVtaW5nLnR5cGVzJztcbmltcG9ydCB7XG4gIEFyZEFkZEN1c3RvbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRncm91cFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFNlbGVjdFN1ZmZpeFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLFxufSBmcm9tICcuL3NlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgQWRkQ3VzdG9tRm4sXG4gIEN1c3RvbU9wdGlvbkNvbnRleHQsXG4gIEdyb3VwQ29udGV4dCxcbiAgSXRlbURpc3BsYXlMaW1pdENvbnRleHQsXG4gIEl0ZW1MaW1pdENvbnRleHQsXG4gIFBsYWNlaG9sZGVyQ29udGV4dCxcbiAgU2VhcmNoQ29udGV4dCxcbiAgU3RhdHNDb250ZXh0LFxuICBWYWx1ZUNvbnRleHQsXG59IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJkLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJdGVtU3RvcmFnZUhvc3RcbntcbiAgcmVhZG9ubHkgX2NvbXBvbmVudElkOiBzdHJpbmcgPSAnMDAwJztcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHZhbHVlRnJvbTogJ3ZhbHVlJyxcbiAgICBsYWJlbEZyb206ICdsYWJlbCcsXG4gICAgZGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGdyb3VwTGFiZWxGcm9tOiAnZ3JvdXAnLFxuICAgIGdyb3VwRGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGNoaWxkcmVuRnJvbTogJ2NoaWxkcmVuJyxcbiAgICBzZWFyY2hGbjogc2VhcmNoRnVuY3Rpb25zLmJ5TGFiZWwsXG4gICAgY2xlYXJCdXR0b25UaXRsZTogJ0NsZWFyJyxcbiAgICBub0l0ZW1zRm91bmRUZXh0OiAnTm8gaXRlbXMgZm91bmQuJyxcbiAgICBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0OiAnTG9hZGluZy4uLicsXG4gIH07XG5cbiAgLy8hIHByaXZhdGVzXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSB8IG51bGwgPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNNb3VzZUJlaW5nVXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaEJhckZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8hIHB1YmxpY3NcbiAgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgcmVhZG9ubHkgdmFsdWVGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgbGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZWRGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIHJlYWRvbmx5IGdyb3VwTGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nIHwgR3JvdXBCeUZuPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZ3JvdXBEaXNhYmxlZEZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBjaGlsZHJlbkZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICAvLyEgc2V0dGluZ3NcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCdTZWxlY3QgaXRlbScpO1xuICByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ1NlYXJjaC4uLicpO1xuICByZWFkb25seSBjbGVhckJ1dHRvblRpdGxlID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmNsZWFyQnV0dG9uVGl0bGUpO1xuXG4gIHJlYWRvbmx5IGRyb3Bkb3duUG9zaXRpb24gPSBpbnB1dDxBcmRQYW5lbFBvc2l0aW9uPihBcmRQYW5lbFBvc2l0aW9uLkF1dG8pO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICByZWFkb25seSBub0l0ZW1zRm91bmRUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmxvYWRpbmdQbGFjZWhvbGRlclRleHQpO1xuICAvLyEgc2VhcmNoLXJlbGF0ZWQgb3B0aW9uc1xuICByZWFkb25seSBzZWFyY2hJbnB1dElkID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaW5wdXRBdHRycyA9IGlucHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgLy8hIG90aGVyIGlucHV0c1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGlucHV0UHJvcHMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IGh0bWxJZCA9IGlucHV0PHN0cmluZz4oY3J5cHRvLnJhbmRvbVVVSUQoKSk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcmVhZG9ubHkgaXRlbXNBbHJlYWR5R3JvdXBlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcblxuICAvL3Nob3VsZCB0aGUgdmFsdWUgdGhhdCB0aGUgXCJkaXNhYmxlZEZyb21cIiBwYXRoIGxlYWQgdG8gYmUgaW52ZXJ0ZWQ/XG4gIC8vdXNlZnVsIHdoZW4gdGhlIHByb3BlcnR5IGlzIGUuZy4gXCJhY3RpdmVcIiwgd2hpY2ggaXMgdGhlIG9wb3NpdGUgb2YgXCJkaXNhYmxlZFwiXG4gIHJlYWRvbmx5IGludmVydERpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IG5vR3JvdXBBY3Rpb25zID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBhdXRvSGlnaGxpZ2h0Rmlyc3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGF1dG9Gb2N1cyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkga2VlcE9wZW4gPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGhpZGVTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgbm9CYWNrc3BhY2VDbGVhciA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgc29ydE11bHRpcGxlVmFsdWVzID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcmVhZG9ubHkgbWF4U2VsZWN0ZWRJdGVtcyA9IGlucHV0PG51bWJlciwgYW55PihJbmZpbml0eSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgSW5maW5pdHkpIH0pO1xuICByZWFkb25seSBpdGVtRGlzcGxheUxpbWl0ID0gaW5wdXQ8bnVtYmVyLCBhbnk+KEluZmluaXR5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBJbmZpbml0eSkgfSk7XG5cbiAgLy8hIGZ1bmN0aW9uIGlucHV0c1xuICByZWFkb25seSBzZWFyY2hGbiA9IGlucHV0PFNlYXJjaEZuPih0aGlzLkRFRkFVTFRTLnNlYXJjaEZuKTtcbiAgcmVhZG9ubHkgY29tcGFyZVdpdGggPSBpbnB1dDxOdWxsYWJsZTxTZWFyY2hGbj4+KHVuZGVmaW5lZCk7XG5cbiAgLy8hIGFwcGVhcmFuY2VcbiAgcmVhZG9ubHkgYXBwZWFyYW5jZSA9IGlucHV0PEZvcm1FbGVtZW50QXBwZWFyYW5jZT4oRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKTtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PEZvcm1FbGVtZW50VmFyaWFudD4oRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQpO1xuXG4gIHJlYWRvbmx5IGNvbXBhY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCgpID8gJ2FyZC1jb21wYWN0JyA6ICcnLFxuICAgICAgdGhpcy5tdWx0aXNlbGVjdGFibGUoKSA/ICdhcmQtbXVsdGlzZWxlY3QnIDogJ2FyZC1zaW5nbGVzZWxlY3QnLFxuICAgICAgdGhpcy5jbGVhcmFibGUoKSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlKCkgPyAnYXJkLXNlYXJjaGFibGUnIDogJycsXG4gICAgICB0aGlzLmZpbHRlcmVkKCkgPyAnYXJkLWZpbHRlcmVkJyA6ICcnLFxuICAgICAgdGhpcy50b3VjaGVkKCkgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzT3BlbigpID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICByZWFkb25seSBkcm9wZG93bkFwcGVhcmFuY2UgPSBpbnB1dDxOdWxsYWJsZTxEcm9wZG93blBhbmVsQXBwZWFyYW5jZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQXBwZWFyYW5jZU9yRGVmYXVsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5kcm9wZG93bkFwcGVhcmFuY2UoKSkgcmV0dXJuIHRoaXMuZHJvcGRvd25BcHBlYXJhbmNlKCkhO1xuICAgIGlmICh0aGlzLmFwcGVhcmFuY2UoKSA9PT0gRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKSByZXR1cm4gRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UuT3V0bGluZWQ7XG4gICAgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLlJhaXNlZDtcbiAgfSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVmFyaWFudCA9IGlucHV0PE51bGxhYmxlPERyb3Bkb3duUGFuZWxWYXJpYW50Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZHJvcGRvd25WYXJpYW50T3JEZWZhdWx0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duVmFyaWFudCgpKSByZXR1cm4gdGhpcy5kcm9wZG93blZhcmlhbnQoKSE7XG4gICAgY29uc3QgdmFyaWFudCA9IHRoaXMudmFyaWFudCgpO1xuICAgIGlmICh2YXJpYW50ID09PSBGb3JtRWxlbWVudFZhcmlhbnQuUGlsbCkgcmV0dXJuIERyb3Bkb3duUGFuZWxWYXJpYW50LlJvdW5kZWQ7XG4gICAgcmV0dXJuIHZhcmlhbnQ7XG4gIH0pO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJylcbiAgZ2V0IF9ncm91cEl0ZW1zSG9zdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cExhYmVsRnJvbSgpO1xuICB9XG5cbiAgLy8hIGl0ZW1zIHNldHRlci9nZXR0ZXJcbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBzZXQgaXRlbXModmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCkge1xuICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IHRydWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgdGhpcy5pc0l0ZW1zSW5wdXRVc2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0FueVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHByaW50RXJyb3JzID0gdGhpcy5pdGVtU3RvcmFnZS5zZXRJdGVtcyh2YWx1ZSk7XG4gICAgaWYgKHByaW50RXJyb3JzKSB7XG4gICAgICB0aGlzLl9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihBcmRpdW1PcHRpb25Db21wb25lbnQpXG4gIG9wdGlvbkNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8QXJkaXVtT3B0aW9uQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCkge1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICBtZXJnZSguLi50aGlzLm9wdGlvbkNvbXBvbmVudHMubWFwKG9wdGlvbiA9PiBvcHRpb24uc3RhdGVDaGFuZ2UkKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAgIC5zdWJzY3JpYmUob3B0aW9uID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1TdG9yYWdlLmZpbmRJdGVtQnlWYWx1ZShvcHRpb24ub2xkVmFsdWUgPz8gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQuc2V0KG9wdGlvbi5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgIGl0ZW0ubGFiZWwuc2V0KG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCkpO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlLnNldChvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLnNldCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5vcHRpb25Db21wb25lbnRzKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW1zID0gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGhhbmRsZU9wdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8hIGF0dHJpYnV0ZSBhbmQvb3IgY2xhc3Mgc2V0dGVycy9nZXR0ZXJzXG4gIHJlYWRvbmx5IG11bHRpc2VsZWN0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgY2xlYXJhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5zZWFyY2hhYmxlKCkgJiYgdGhpcy5zZWFyY2hUZXJtKCkgIT09ICcnKTtcblxuICByZWFkb25seSB0b3VjaGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyEgY3VzdG9tIG9wdGlvbnNcbiAgcHJpdmF0ZSBfZGVmYXVsdEFkZEN1c3RvbUZuOiBBZGRDdXN0b21Gbjxhbnk+ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlO1xuXG4gIHJlYWRvbmx5IGFkZEN1c3RvbSA9IGlucHV0PFxuICAgIGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4sXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+XG4gID4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IHYgPT4ge1xuICAgICAgaWYgKGlzRnVuY3Rpb24odikpIHtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9XG4gICAgICAvL2NvZXJjZSB0aGUgdmFsdWUgaW50byBhIGJvb2xlYW5cbiAgICAgIC8vaWYgXCJ0cnVlXCIsIHVzZSB0aGUgZGVmYXVsdCBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0byBcImZhbHNlXCIuXG4gICAgICByZXR1cm4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpICYmIHRoaXMuX2RlZmF1bHRBZGRDdXN0b21GbjtcbiAgICB9LFxuICB9KTtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0FkZEN1c3RvbSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuYWRkQ3VzdG9tKCkgIT09IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNGb3VuZCgpXG4gICk7XG5cbiAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhYyA9IHRoaXMuYWRkQ3VzdG9tKCk7XG4gICAgaWYgKCFhYykgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3T3B0aW9uT2JqID0gYXdhaXQgdGhpcy5pdGVtU3RvcmFnZS5hZGRDdXN0b21PcHRpb24odmFsdWUsIGFjKTtcblxuICAgIHRoaXMuc2VsZWN0SXRlbShuZXdPcHRpb25PYmopO1xuICB9XG5cbiAgLy8hIGNvbnRyb2wgdmFsdWUgYWNjZXNzb3JcbiAgLy9vdmVycmlkZSB0aGUgd3JpdGVWYWx1ZSBhbmQgc2V0RGlzYWJsZWRTdGF0ZSBkZWZpbmVkIGluIF9OZ01vZGVsQ29tcG9uZW50XG4gIG92ZXJyaWRlIHNldERpc2FibGVkU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHN0YXRlO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbCk7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIGNoYW5nZSAmIHRvdWNoIGV2ZW50IGVtaXR0ZXJzXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UudmFsdWUoKTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQuc2V0KHRydWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IFNpZ25hbDxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIHJlYWRvbmx5IGNoYW5nZUV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnY2hhbmdlJyB9KTtcbiAgcmVhZG9ubHkgYWRkRXZlbnQgPSBvdXRwdXQ8YW55W10+KHsgYWxpYXM6ICdhZGQnIH0pO1xuICByZWFkb25seSBmYWlsZWRUb0FkZEV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnZmFpbGVkVG9BZGQnIH0pO1xuICByZWFkb25seSByZW1vdmVFdmVudCA9IG91dHB1dDxhbnlbXT4oeyBhbGlhczogJ3JlbW92ZScgfSk7XG4gIHJlYWRvbmx5IGNsZWFyRXZlbnQgPSBvdXRwdXQ8dm9pZD4oeyBhbGlhczogJ2NsZWFyJyB9KTtcbiAgcmVhZG9ubHkgb3BlbkV2ZW50ID0gb3V0cHV0PHZvaWQ+KHsgYWxpYXM6ICdvcGVuJyB9KTtcbiAgcmVhZG9ubHkgY2xvc2VFdmVudCA9IG91dHB1dDx2b2lkPih7IGFsaWFzOiAnY2xvc2UnIH0pO1xuICByZWFkb25seSBzY3JvbGxFdmVudCA9IG91dHB1dDx7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgfT4oeyBhbGlhczogJ3Njcm9sbCcgfSk7XG4gIHJlYWRvbmx5IHNjcm9sbFRvRW5kRXZlbnQgPSBvdXRwdXQoeyBhbGlhczogJ3Njcm9sbFRvRW5kJyB9KTtcbiAgcmVhZG9ubHkgc2VhcmNoRXZlbnQgPSBvdXRwdXQ8e1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIG1hdGNoaW5nOiBhbnlbXTtcbiAgfT4oeyBhbGlhczogJ3NlYXJjaCcgfSk7XG5cbiAgcmVhZG9ubHkgaXNPcGVuID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIHJlYWRvbmx5IHNlYXJjaElucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBkcm9wZG93blBhbmVsID0gdmlld0NoaWxkPEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQ+KEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQpO1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgcmVhZG9ubHkgb3B0aW9uVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkT3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBvcHRncm91cFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSB2YWx1ZVRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBwbGFjZWhvbGRlclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duSGVhZGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duRm9vdGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IG5vSXRlbXNGb3VuZFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgYWRkQ3VzdG9tVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBpdGVtTGltaXRSZWFjaGVkVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgcHJlZml4VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBzdWZmaXhUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRTZWxlY3RTdWZmaXhUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgLy8hIGNvbnRleHQgcHJvdmlkZXJzXG4gIGdldFZhbHVlQ29udGV4dChpdGVtOiBBcmRPcHRpb24pOiBWYWx1ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBpdGVtLFxuICAgICAgaXRlbURhdGE6IGl0ZW0uaXRlbURhdGEoKSxcbiAgICAgIHVuc2VsZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJlYWRvbmx5IGdldFN0YXRzQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTdGF0c0NvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zKCksXG4gICAgfSlcbiAgKTtcbiAgcmVhZG9ubHkgZ2V0U2VhcmNoQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTZWFyY2hDb250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMoKSxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcygpLFxuICAgIH0pXG4gICk7XG4gIHJlYWRvbmx5IGdldFBsYWNlaG9sZGVyQ29udGV4dCA9IGNvbXB1dGVkKCgpOiBQbGFjZWhvbGRlckNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlckZvckN1cnJlbnRDb250ZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBDdXN0b21PcHRpb25Db250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgfSlcbiAgKTtcbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuKCkuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCgpKS5sZW5ndGgsXG4gICAgICB0b3RhbENoaWxkcmVuOiBncm91cC5jaGlsZHJlbigpLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dDxBcmRPcHRpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBpdGVtLFxuICAgICAgaXRlbSxcbiAgICAgIGl0ZW1EYXRhOiBpdGVtLml0ZW1EYXRhKCksXG4gICAgfTtcbiAgfVxuICByZWFkb25seSBnZXRJdGVtTGltaXRDb250ZXh0ID0gY29tcHV0ZWQoXG4gICAgKCk6IEl0ZW1MaW1pdENvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICB9KVxuICApO1xuICByZWFkb25seSBnZXRJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9IGNvbXB1dGVkKCgpOiBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zKCksXG4gICAgICBzZWxlY3RlZEl0ZW1zLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0KCkgPz8gMCksXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxTdHJhdGVneU9wdHMgPSBpbmplY3QoU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKTtcblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKCkpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0l0ZW1zSW5wdXRVc2VkKSB7XG4gICAgICB0aGlzLl9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCk7XG4gICAgfVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL2ZpcmUgaXRlbXMgbG9hZCBoYW5kbGVyIHdoZW4gbG9hZGluZyBpcyBzZXQgdG8gZmFsc2VcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddKSB7XG4gICAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddLmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25JdGVtc0xvYWQoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcHJpbnRQcmltaXRpdmVXYXJuaW5ncygpIHtcbiAgICBmdW5jdGlvbiBtYWtlV2FybmluZyhzdHI6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEFSRC1XQTAwMCR7ZXJyb3JDb2RlfTogU2tpcHBlZCB1c2luZyBbJHtzdHJ9XSBwcm9wZXJ0eSBib3VuZCB0byA8YXJkLXNlbGVjdD4sIGFzIHNvbWUgcHJvdmlkZWQgaXRlbXMgYXJlIG9mIHByaW1pdGl2ZSB0eXBlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nLCAnNWEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdsYWJlbEZyb20nLCAnNWInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdkaXNhYmxlZEZyb20nLCAnNWMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBMYWJlbEZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJywgJzVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdncm91cERpc2FibGVkRnJvbScsICc1ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGlsZHJlbkZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2NoaWxkcmVuRnJvbScsICc1ZicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnZlcnREaXNhYmxlZCgpKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnLCAnNWcnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICByZWFkb25seSBmaXJzdEhpZ2hsaWdodGVkSXRlbSA9IGNvbXB1dGVkPEFyZE9wdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCk/LmZpcnN0KCkpO1xuICByZWFkb25seSBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpICYmICF0aGlzLnNlYXJjaFRlcm0oKSk7XG4gIHJlYWRvbmx5IHNob3VsZERpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQoKSAmJiAoIXRoaXMuc2VhcmNoVGVybSgpIHx8IHRoaXMubXVsdGlzZWxlY3RhYmxlKCkpXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbGVhckJ1dHRvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuY2xlYXJhYmxlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpIHx8IHRoaXMuc2VhcmNoVGVybSgpICE9PSAnJylcbiAgKTtcbiAgcmVhZG9ubHkgaXRlbXNUb0Rpc3BsYXkgPSBjb21wdXRlZDxJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPj4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5ncm91cHMoKS52YWx1ZXMoKSk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dOb0l0ZW1zRm91bmQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kKCkgJiYgIXRoaXMuaXNMb2FkaW5nKCkgJiYgIXRoaXMuc2hvdWxkU2hvd0FkZEN1c3RvbSgpXG4gICk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbXMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMoKS5sZW5ndGgpO1xuICByZWFkb25seSBmb3VuZEl0ZW1zID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PlxuICAgIHRoaXMuc2VhcmNoYWJsZSgpID8gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoIDogdW5kZWZpbmVkXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiZcbiAgICAgIHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpICE9PSBJbmZpbml0eSAmJlxuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gdGhpcy5pdGVtRGlzcGxheUxpbWl0KClcbiAgKTtcbiAgcmVhZG9ubHkgaXNJbnB1dEVsZW1lbnRSZWFkb25seSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+ICF0aGlzLmFkZEN1c3RvbSgpICYmICghdGhpcy5zZWFyY2hhYmxlKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc0l0ZW1MaW1pdFJlYWNoZWQoKSlcbiAgKTtcblxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLml0ZW1EaXNwbGF5TGltaXQoKSA9PT0gSW5maW5pdHkgfHwgaSA8IHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpO1xuICB9XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlcigpICYmIHRoaXMuc2VhcmNoYWJsZSgpICYmICh0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKCkgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKCkpKVxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpO1xuICB9KTtcblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoZmlsdGVyVGVybSk7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLml0ZW1TdG9yYWdlLmZpbHRlcihmaWx0ZXJUZXJtKTtcbiAgICBpZiAoIXN1cHByZXNzU2VhcmNoRXZlbnQpIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh7IHNlYXJjaDogZmlsdGVyVGVybSwgbWF0Y2hpbmcgfSk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgb25TZWFyY2hJbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KHRydWUpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICB9XG4gIHNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgY29uc3QgW3NlbGVjdGVkLCB1bnNlbGVjdGVkLCBmYWlsZWRUb1NlbGVjdF0gPSB0aGlzLml0ZW1TdG9yYWdlLnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRFdmVudC5lbWl0KHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgaWYgKCF0aGlzLmtlZXBTZWFyY2hBZnRlclNlbGVjdCgpKSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCB8fCBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHVuc2VsZWN0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KCkpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4oKSB8fCB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc1RvU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJBbGxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckxhc3RTZWxlY3RlZCgpLnZhbHVlKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoW2NsZWFyZWRWYWx1ZV0pO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgfVxuICAvLyEgaGlnaGxpZ2gtcmVsYXRlZFxuICBvbk1vdXNlTW92ZSgpIHtcbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwTW91c2VvdmVyKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKCkpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEdyb3VwKGdyb3VwKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUVudGVyKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCgpKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRTaW5nbGVJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VMZWF2ZShvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ2xpY2tlZFdpdGhpbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIG9uSXRlbUNsaWNrKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpKSB0aGlzLnRvZ2dsZUl0ZW0ob3B0aW9uKTtcbiAgICBlbHNlIHRoaXMuc2VsZWN0SXRlbShvcHRpb24pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwQ2xpY2soZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSgpIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMoKSkgcmV0dXJuO1xuICAgIGlmIChncm91cC5jaGlsZHJlbigpLmV2ZXJ5KG8gPT4gby5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMudW5zZWxlY3RJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4oKSk7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4uc2V0KHRydWUpO1xuICB9XG4gIGhhbmRsZUNsZWFyQnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtKCkpIHtcbiAgICAgIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBoYW5kbGVEcm9wZG93bkFycm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICB9XG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnSU5QVVQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYXJjaGFibGUoKSkge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnKVxuICBvbk1vdXNldXAoKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldChmYWxzZSk7XG4gIH1cbiAgLy8hIGRyb3Bkb3duIHN0YXRlIGhhbmRsZXJzXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dG9IaWdobGlnaHRGaXJzdCgpKSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICAvLyEgQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoISh0aGlzLl9jZCBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICAvLyEgc2VhcmNoXG4gIHByaXZhdGUgX2NsZWFyU2VhcmNoKHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3NldFNlYXJjaCgnJywgc3VwcHJlc3NTZWFyY2hFdmVudCk7XG4gIH1cbiAgcHJpdmF0ZSBfc2V0U2VhcmNoKHNlYXJjaFRlcm06IHN0cmluZywgc3VwcHJlc3NTZWFyY2hFdmVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChzZWFyY2hUZXJtKTtcbiAgICB0aGlzLmZpbHRlcihzZWFyY2hUZXJtLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaElucHV0KCkhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGF1dG9jb3JyZWN0OiAnb2ZmJyxcbiAgICAgIGF1dG9jYXBpdGFsaXplOiAnb2ZmJyxcbiAgICAgIGF1dG9jb21wbGV0ZTogJ29mZicsXG4gICAgICAuLi50aGlzLmlucHV0QXR0cnMoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc2hvdWxkQ2xvc2UgPSB0cnVlO1xuXG4gICAgLy9zZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmZpcnN0SGlnaGxpZ2h0ZWRJdGVtKCkpIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpICYmIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4udGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9hZGQgYSBjdXN0b20gb3B0aW9uXG4gICAgZWxzZSBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLnNob3VsZFNob3dBZGRDdXN0b20oKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDdXN0b21PcHRpb24odGhpcy5zZWFyY2hUZXJtKCkpO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbigpICYmIHNob3VsZENsb3NlKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25TcGFjZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldChmYWxzZSk7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHROZXh0SXRlbSgrMSwgZXZlbnQuc2hpZnRLZXkpO1xuICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd1VwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZC5zZXQoZmFsc2UpO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oLTEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNPcGVuKCkgfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9PSAwICYmIHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gMClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc09wZW4oKSB8fFxuICAgICAgKHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCAmJlxuICAgICAgICB0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodExhc3RJdGVtKCk7XG4gICAgaWYgKCFyZWNlbnRseUhpZ2hsaWdodGVkKSByZXR1cm47XG5cbiAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSgpIHx8ICF0aGlzLmNsZWFyYWJsZSgpIHx8IHRoaXMubm9CYWNrc3BhY2VDbGVhcigpIHx8ICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY2xlYXJMYXN0SXRlbSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFsbEl0ZW1zKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25DdHJsQVByZXNzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0QWxsSXRlbXMoKTtcbiAgfVxufVxuIiwiPGFyZC1mb3JtLWZpZWxkLWZyYW1lXHJcbiAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZSgpXCJcclxuICBbdmFyaWFudF09XCJ2YXJpYW50KClcIlxyXG4gIFtjb21wYWN0XT1cImNvbXBhY3QoKVwiXHJcbiAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gIFtwcmVmaXhUZW1wbGF0ZV09XCJwcmVmaXhUZW1wbGF0ZSgpPy50ZW1wbGF0ZVwiXHJcbiAgW3N1ZmZpeFRlbXBsYXRlXT1cInN1ZmZpeFRlbXBsYXRlKCk/LnRlbXBsYXRlXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYXJkLXNlbGVjdFwiXHJcbiAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAoY2xpY2spPVwiaGFuZGxlQW55d2hlcmVDbGljaygkZXZlbnQpXCJcclxuICAgIFtjbGFzcy5hcmQtaGFzLXZhbHVlXT1cIml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKClcIlxyXG4gICAgW25nQ2xhc3NdPVwibmdDbGFzc2VzKClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0LXZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICBAaWYgKHNob3VsZERpc3BsYXlQbGFjZWhvbGRlcigpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1wbGNobGRyXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1wbGFjZWhvbGRlclwiPnt7IHBsY2hsZHIgfX08L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFBsYWNlaG9sZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvdWxkRGlzcGxheVZhbHVlKCkpIHtcclxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1TdG9yYWdlLnNlbGVjdGVkSXRlbXMoKTsgdHJhY2sgaXRlbS5pbmRleCgpKSB7XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hcmQtdmFsdWUtZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2F0dHIuaGlkZGVuXT1cIiFpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KCRpbmRleClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidmFsdWVUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCAobXVsdGlzZWxlY3RhYmxlKCkgPyBkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIDogZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0VmFsdWVDb250ZXh0KGl0ZW0pXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFZhbHVlVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1pdGVtXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlXHJcbiAgICAgICAgICBsZXQtaXRlbVxyXG4gICAgICAgICAgbGV0LXVuc2VsZWN0PVwidW5zZWxlY3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxhcmQtZGVsZXRhYmxlLWNoaXBcclxuICAgICAgICAgICAgKGRlbGV0ZSk9XCJ1bnNlbGVjdChpdGVtKVwiXHJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cInZhcmlhbnQoKVwiXHJcbiAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIFRPRE8gY2hlY2sgaWYgY2FuIHJlbW92ZSBkaXYgLS0+XHJcbiAgICAgICAgICA8L2FyZC1kZWxldGFibGUtY2hpcD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGl0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXQoKSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SXRlbURpc3BsYXlMaW1pdENvbnRleHQoKVwiXHJcbiAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAjZGVmYXVsdEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZVxyXG4gICAgICAgICAgICBsZXQtY291bnQ9XCJvdmVyZmxvd0NvdW50XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdj57eyBjb3VudCB9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICAgICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBbYXR0ci5pZF09XCJzZWFyY2hJbnB1dElkKClcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXgoKVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwiaXNJbnB1dEVsZW1lbnRSZWFkb25seSgpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxyXG4gICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICAgICAgKGlucHV0KT1cImZpbHRlcihzZWFyY2hJbnB1dC52YWx1ZSlcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwib25TZWFyY2hJbnB1dEZvY3VzKClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25TZWFyY2hJbnB1dEJsdXIoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2ltcGxlLXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1NwaW5uZXJUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZVwiIC8+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0NsZWFyQnV0dG9uKCkpIHtcclxuICAgICAgICA8YXJkLWNsZWFyLWJ1dHRvblxyXG4gICAgICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGUoKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZURyb3Bkb3duQXJyb3dDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duVGVtcGxhdGU+XHJcbiAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tcGFuZWwgYXJkLXNlbGVjdC1kcm9wZG93bi1wYW5lbFwiXHJcbiAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgIFtoZWFkZXJUZW1wbGF0ZV09XCJkcm9wZG93bkhlYWRlclRlbXBsYXRlKCk/LnRlbXBsYXRlID8/IG51bGxcIlxyXG4gICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgPz8gbnVsbFwiXHJcbiAgICBbYXBwZWFyYW5jZV09XCJkcm9wZG93bkFwcGVhcmFuY2VPckRlZmF1bHQoKVwiXHJcbiAgICBbdmFyaWFudF09XCJkcm9wZG93blZhcmlhbnRPckRlZmF1bHQoKVwiXHJcbiAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgW2ZpbHRlclZhbHVlXT1cInNlYXJjaFRlcm0oKVwiXHJcbiAgICBbcGFuZWxJZF09XCJodG1sSWQoKVwiXHJcbiAgICBbY29tcGFjdF09XCJjb21wYWN0KClcIlxyXG4gICAgKGFyZENsaWNrT3V0c2lkZSk9XCJoYW5kbGVPdXRzaWRlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKClcIlxyXG4gICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgKHNjcm9sbFRvRW5kKT1cInNjcm9sbFRvRW5kRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICA+XHJcbiAgICBAaWYgKCFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgQGZvciAoZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzKCk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWRpc2FibGVkXT1cImdyb3VwLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtaGlnaGxpZ2h0ZWRdPVwiZ3JvdXAuaGlnaGxpZ2h0ZWQoKVwiXHJcbiAgICAgICAgICAobW91c2VvdmVyKT1cIm9uR3JvdXBNb3VzZW92ZXIoZ3JvdXApXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZ3JvdXApXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBAaWYgKGdyb3VwLmxhYmVsKCkgIT09ICcnICYmIGdyb3VwLmxhYmVsKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAjZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcclxuICAgICAgICAgICAgICBsZXQtZ3JvdXBcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cImdyb3VwLmxhYmVsKClcIlxyXG4gICAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0Z3JvdXBUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0Z3JvdXBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEdyb3VwQ29udGV4dChncm91cClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0Z3JvdXAtY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGdyb3VwLmNoaWxkcmVuKCk7IHRyYWNrIG9wdGlvbi5pbmRleCgpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWRdPVwib3B0aW9uLmhpZ2hsaWdodGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWQtcmVjZW50XT1cIm9wdGlvbi5oaWdobGlnaHRlZF9yZWNlbnRseSgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaHRtbElkKCkgKyAnLScgKyBvcHRpb24uaW5kZXgoKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2sob3B0aW9uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25JdGVtTW91c2VPdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25JdGVtTW91c2VMZWF2ZShvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNkZWZhdWx0T3B0aW9uVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBsZXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25UZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRPcHRpb25Db250ZXh0KG9wdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm9JdGVtc0ZvdW5kVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7IG5vSXRlbXNGb3VuZFRleHQoKSB9fTwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0U2VhcmNoQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKHNob3VsZFNob3dBZGRDdXN0b20oKSkge1xyXG4gICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAjZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXHJcbiAgICAgICAgbGV0LXNlYXJjaFRlcm1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRDdXN0b21PcHRpb24oc2VhcmNoVGVybSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcmQtYWRkLWN1c3RvbS12YWx1ZVwiPlwie3sgc2VhcmNoVGVybSB9fVwiPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQ3VzdG9tVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uIGFyZC1vcHRpb24tZGlzYWJsZWRcIj57eyBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0KCkgfX08L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFNlYXJjaENvbnRleHQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcbiAgPC9hcmQtZHJvcGRvd24tcGFuZWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|