@ardium-ui/ui 1.0.3 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -25
- package/esm2022/lib/_internal/boolean-component.mjs +28 -42
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +5 -5
- package/esm2022/lib/_internal/disablable-component.mjs +24 -22
- package/esm2022/lib/_internal/focusable-component.mjs +12 -25
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
- package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
- package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
- package/esm2022/lib/_internal/queue.mjs +1 -1
- package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
- package/esm2022/lib/badge/badge.directive.mjs +70 -99
- package/esm2022/lib/badge/badge.module.mjs +5 -5
- package/esm2022/lib/badge/badge.types.mjs +1 -1
- package/esm2022/lib/badge/index.mjs +4 -0
- package/esm2022/lib/buttons/_button-base.mjs +13 -35
- package/esm2022/lib/buttons/button/button.component.mjs +22 -37
- package/esm2022/lib/buttons/button/button.module.mjs +5 -5
- package/esm2022/lib/buttons/button/index.mjs +3 -0
- package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
- package/esm2022/lib/buttons/fab/fab.module.mjs +5 -5
- package/esm2022/lib/buttons/fab/index.mjs +3 -0
- package/esm2022/lib/buttons/general-button.types.mjs +1 -1
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +5 -5
- package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
- package/esm2022/lib/card/card.children.mjs +32 -33
- package/esm2022/lib/card/card.component.mjs +14 -17
- package/esm2022/lib/card/card.module.mjs +5 -5
- package/esm2022/lib/card/card.types.mjs +1 -1
- package/esm2022/lib/card/index.mjs +5 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
- package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
- package/esm2022/lib/checkbox/checkbox.types.mjs +1 -1
- package/esm2022/lib/checkbox/index.mjs +4 -0
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +5 -5
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +1 -1
- package/esm2022/lib/checkbox-list/index.mjs +4 -0
- package/esm2022/lib/chip/chip.component.mjs +22 -42
- package/esm2022/lib/chip/chip.module.mjs +5 -5
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
- package/esm2022/lib/chip/index.mjs +5 -0
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
- package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
- package/esm2022/lib/color/color-display/color-display.module.mjs +5 -5
- package/esm2022/lib/color/color-display/color-display.types.mjs +1 -1
- package/esm2022/lib/color/color-display/index.mjs +4 -0
- package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
- package/esm2022/lib/dialog/dialog.component.mjs +54 -130
- package/esm2022/lib/dialog/dialog.directives.mjs +4 -4
- package/esm2022/lib/dialog/dialog.module.mjs +5 -5
- package/esm2022/lib/dialog/dialog.types.mjs +1 -1
- package/esm2022/lib/dialog/index.mjs +5 -0
- package/esm2022/lib/divider/divider.component.mjs +9 -14
- package/esm2022/lib/divider/divider.module.mjs +5 -5
- package/esm2022/lib/divider/index.mjs +3 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +5 -5
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +1 -1
- package/esm2022/lib/dropdown-panel/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +10 -10
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
- package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +19 -19
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +5 -5
- package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
- package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
- package/esm2022/lib/file-inputs/file-input-types.mjs +1 -1
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +7 -7
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +5 -5
- package/esm2022/lib/form-field-frame/index.mjs +4 -0
- package/esm2022/lib/icon/icon.component.mjs +32 -67
- package/esm2022/lib/icon/icon.module.mjs +5 -5
- package/esm2022/lib/icon/icon.pipe.mjs +4 -4
- package/esm2022/lib/icon/index.mjs +4 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +25 -25
- package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +5 -5
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
- package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +10 -10
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
- package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
- package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
- package/esm2022/lib/inputs/input/index.mjs +4 -0
- package/esm2022/lib/inputs/input/input.component.mjs +95 -154
- package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
- package/esm2022/lib/inputs/input/input.module.mjs +21 -7
- package/esm2022/lib/inputs/input-transformers.mjs +6 -6
- package/esm2022/lib/inputs/input-types.mjs +1 -1
- package/esm2022/lib/inputs/input-utils.mjs +75 -94
- package/esm2022/lib/inputs/number-input/index.mjs +4 -0
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +4 -4
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +5 -5
- package/esm2022/lib/inputs/password-input/index.mjs +5 -0
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +13 -13
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +5 -5
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
- package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +10 -10
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +5 -5
- package/esm2022/lib/kbd/index.mjs +4 -0
- package/esm2022/lib/kbd/kbd.component.mjs +15 -29
- package/esm2022/lib/kbd/kbd.module.mjs +5 -5
- package/esm2022/lib/kbd/kbd.pipe.mjs +4 -4
- package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +5 -5
- package/esm2022/lib/modal/index.mjs +3 -0
- package/esm2022/lib/modal/modal.component.mjs +42 -83
- package/esm2022/lib/modal/modal.module.mjs +5 -5
- package/esm2022/lib/option/index.mjs +3 -0
- package/esm2022/lib/option/option.component.mjs +24 -46
- package/esm2022/lib/option/option.module.mjs +5 -5
- package/esm2022/lib/progress-bar/index.mjs +5 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +4 -4
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +5 -5
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
- package/esm2022/lib/progress-circle/index.mjs +5 -0
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +4 -4
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +5 -5
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
- package/esm2022/lib/radio/index.mjs +4 -0
- package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
- package/esm2022/lib/radio/radio-group.component.mjs +71 -85
- package/esm2022/lib/radio/radio.module.mjs +5 -5
- package/esm2022/lib/search-functions.mjs +7 -7
- package/esm2022/lib/segment/index.mjs +5 -0
- package/esm2022/lib/segment/segment.component.mjs +70 -137
- package/esm2022/lib/segment/segment.directives.mjs +4 -4
- package/esm2022/lib/segment/segment.module.mjs +5 -5
- package/esm2022/lib/segment/segment.types.mjs +1 -1
- package/esm2022/lib/select/index.mjs +5 -0
- package/esm2022/lib/select/select.component.mjs +348 -655
- package/esm2022/lib/select/select.directive.mjs +46 -46
- package/esm2022/lib/select/select.module.mjs +5 -5
- package/esm2022/lib/select/select.types.mjs +1 -1
- package/esm2022/lib/slide-toggle/index.mjs +4 -0
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +5 -5
- package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
- package/esm2022/lib/slider/abstract-slider.mjs +111 -200
- package/esm2022/lib/slider/index.mjs +7 -0
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +5 -5
- package/esm2022/lib/slider/slider.component.mjs +13 -10
- package/esm2022/lib/slider/slider.directive.mjs +4 -4
- package/esm2022/lib/slider/slider.module.mjs +7 -7
- package/esm2022/lib/slider/slider.types.mjs +1 -1
- package/esm2022/lib/snackbar/index.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
- package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
- package/esm2022/lib/snackbar/snackbar.token.mjs +1 -1
- package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
- package/esm2022/lib/spinner/index.mjs +3 -0
- package/esm2022/lib/spinner/spinner.component.mjs +9 -13
- package/esm2022/lib/spinner/spinner.module.mjs +5 -5
- package/esm2022/lib/star/index.mjs +4 -0
- package/esm2022/lib/star/star-button/index.mjs +3 -0
- package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
- package/esm2022/lib/star/star-button/star-button.module.mjs +5 -5
- package/esm2022/lib/star/star-display/index.mjs +3 -0
- package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
- package/esm2022/lib/star/star-display/star-display.module.mjs +5 -5
- package/esm2022/lib/star/star-input/index.mjs +3 -0
- package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
- package/esm2022/lib/star/star-input/star-input.module.mjs +5 -5
- package/esm2022/lib/star/star.component.mjs +12 -20
- package/esm2022/lib/star/star.module.mjs +5 -5
- package/esm2022/lib/star/star.types.mjs +1 -1
- package/esm2022/lib/statebox/index.mjs +3 -0
- package/esm2022/lib/statebox/statebox.component.mjs +64 -102
- package/esm2022/lib/statebox/statebox.module.mjs +5 -5
- package/esm2022/lib/statebox/statebox.types.mjs +1 -1
- package/esm2022/lib/tabber/index.mjs +4 -0
- package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
- package/esm2022/lib/tabber/tabber.component.mjs +83 -0
- package/esm2022/lib/tabber/tabber.module.mjs +19 -0
- package/esm2022/lib/table/index.mjs +5 -0
- package/esm2022/lib/table/table-item-storage.mjs +204 -200
- package/esm2022/lib/table/table.component.mjs +184 -304
- package/esm2022/lib/table/table.directives.mjs +19 -21
- package/esm2022/lib/table/table.module.mjs +5 -5
- package/esm2022/lib/table/table.types.mjs +1 -1
- package/esm2022/lib/table/utils.mjs +1 -1
- package/esm2022/lib/table-from-csv/index.mjs +3 -0
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +5 -5
- package/esm2022/lib/table-pagination/index.mjs +4 -0
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +5 -5
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +1 -1
- package/esm2022/lib/types/alignment.types.mjs +1 -1
- package/esm2022/lib/types/colors.types.mjs +1 -1
- package/esm2022/lib/types/item-storage.types.mjs +1 -1
- package/esm2022/lib/types/theming.types.mjs +1 -1
- package/esm2022/lib/types/utility.types.mjs +2 -2
- package/esm2022/public-api.mjs +58 -182
- package/fesm2022/ardium-ui-ui.mjs +7847 -11692
- package/fesm2022/ardium-ui-ui.mjs.map +1 -1
- package/lib/_internal/boolean-component.d.ts +8 -9
- package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
- package/lib/_internal/disablable-component.d.ts +12 -7
- package/lib/_internal/focusable-component.d.ts +5 -7
- package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
- package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
- package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
- package/lib/_internal/models/pagination.model.d.ts +38 -42
- package/lib/_internal/ngmodel-component.d.ts +1 -1
- package/lib/_internal/selectable-list-component.d.ts +30 -30
- package/lib/badge/badge.directive.d.ts +15 -20
- package/lib/badge/index.d.ts +3 -0
- package/lib/buttons/_button-base.d.ts +9 -12
- package/lib/buttons/button/button.component.d.ts +6 -8
- package/lib/buttons/button/index.d.ts +2 -0
- package/lib/buttons/fab/fab.component.d.ts +4 -6
- package/lib/buttons/fab/index.d.ts +2 -0
- package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
- package/lib/buttons/icon-button/index.d.ts +2 -0
- package/lib/card/card.children.d.ts +4 -3
- package/lib/card/card.component.d.ts +5 -4
- package/lib/card/index.d.ts +4 -0
- package/lib/checkbox/checkbox.component.d.ts +8 -12
- package/lib/checkbox/index.d.ts +3 -0
- package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
- package/lib/checkbox-list/index.d.ts +3 -0
- package/lib/chip/chip.component.d.ts +8 -10
- package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
- package/lib/chip/index.d.ts +4 -0
- package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
- package/lib/color/color-display/color-display.component.d.ts +6 -9
- package/lib/color/color-display/index.d.ts +3 -0
- package/lib/color/color-picker/color-picker.types.d.ts +4 -4
- package/lib/dialog/dialog.component.d.ts +25 -35
- package/lib/dialog/dialog.types.d.ts +2 -2
- package/lib/dialog/index.d.ts +4 -0
- package/lib/divider/divider.component.d.ts +3 -4
- package/lib/divider/index.d.ts +2 -0
- package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
- package/lib/dropdown-panel/index.d.ts +3 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
- package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
- package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
- package/lib/file-inputs/file-input/index.d.ts +3 -0
- package/lib/file-inputs/file-input-base.d.ts +13 -18
- package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
- package/lib/form-field-frame/index.d.ts +3 -0
- package/lib/icon/icon.component.d.ts +10 -19
- package/lib/icon/index.d.ts +3 -0
- package/lib/inputs/color-input/color-input.types.d.ts +2 -2
- package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
- package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
- package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
- package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
- package/lib/inputs/digit-input/index.d.ts +3 -0
- package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
- package/lib/inputs/hex-input/index.d.ts +3 -0
- package/lib/inputs/hex-input.model.d.ts +10 -11
- package/lib/inputs/input/index.d.ts +3 -0
- package/lib/inputs/input/input.component.d.ts +34 -40
- package/lib/inputs/input/input.directives.d.ts +3 -3
- package/lib/inputs/input-utils.d.ts +24 -27
- package/lib/inputs/number-input/index.d.ts +3 -0
- package/lib/inputs/number-input/number-input.component.d.ts +38 -48
- package/lib/inputs/password-input/index.d.ts +4 -0
- package/lib/inputs/password-input/password-input.component.d.ts +28 -40
- package/lib/inputs/password-input/password-input.types.d.ts +2 -2
- package/lib/inputs/simple-input/index.d.ts +3 -0
- package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
- package/lib/kbd/index.d.ts +3 -0
- package/lib/kbd/kbd.component.d.ts +6 -8
- package/lib/kbd-shortcut/index.d.ts +2 -0
- package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
- package/lib/modal/index.d.ts +2 -0
- package/lib/modal/modal.component.d.ts +22 -30
- package/lib/option/index.d.ts +2 -0
- package/lib/option/option.component.d.ts +11 -16
- package/lib/progress-bar/index.d.ts +4 -0
- package/lib/progress-bar/progress-bar.component.d.ts +14 -20
- package/lib/progress-bar/progress-bar.types.d.ts +2 -2
- package/lib/progress-circle/index.d.ts +4 -0
- package/lib/progress-circle/progress-circle.component.d.ts +12 -20
- package/lib/progress-circle/progress-circle.types.d.ts +2 -2
- package/lib/radio/index.d.ts +3 -0
- package/lib/radio/radio/radio.component.d.ts +7 -8
- package/lib/radio/radio-group.component.d.ts +13 -16
- package/lib/segment/index.d.ts +4 -0
- package/lib/segment/segment.component.d.ts +22 -34
- package/lib/segment/segment.directives.d.ts +2 -3
- package/lib/select/index.d.ts +4 -0
- package/lib/select/select.component.d.ts +114 -160
- package/lib/select/select.directive.d.ts +3 -3
- package/lib/select/select.types.d.ts +2 -76
- package/lib/slide-toggle/index.d.ts +3 -0
- package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
- package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
- package/lib/slider/abstract-slider.d.ts +38 -55
- package/lib/slider/index.d.ts +6 -0
- package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
- package/lib/slider/slider.component.d.ts +2 -0
- package/lib/slider/slider.types.d.ts +8 -8
- package/lib/snackbar/snackbar-ref.d.ts +1 -2
- package/lib/snackbar/snackbar.component.d.ts +3 -3
- package/lib/snackbar/snackbar.service.d.ts +2 -2
- package/lib/snackbar/snackbar.types.d.ts +4 -4
- package/lib/spinner/index.d.ts +2 -0
- package/lib/spinner/spinner.component.d.ts +3 -3
- package/lib/star/index.d.ts +3 -0
- package/lib/star/star-button/index.d.ts +2 -0
- package/lib/star/star-button/star-button.component.d.ts +7 -7
- package/lib/star/star-display/index.d.ts +2 -0
- package/lib/star/star-display/star-display.component.d.ts +8 -12
- package/lib/star/star-input/index.d.ts +2 -0
- package/lib/star/star-input/star-input.component.d.ts +17 -22
- package/lib/star/star.component.d.ts +5 -5
- package/lib/statebox/index.d.ts +3 -0
- package/lib/statebox/statebox.component.d.ts +15 -21
- package/lib/statebox/statebox.types.d.ts +12 -8
- package/lib/tabber/index.d.ts +3 -0
- package/lib/tabber/tab/tab.component.d.ts +18 -0
- package/lib/tabber/tabber.component.d.ts +25 -0
- package/lib/tabber/tabber.module.d.ts +9 -0
- package/lib/table/index.d.ts +4 -0
- package/lib/table/table-item-storage.d.ts +70 -58
- package/lib/table/table.component.d.ts +59 -78
- package/lib/table/table.directives.d.ts +4 -3
- package/lib/table-from-csv/index.d.ts +2 -0
- package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
- package/lib/table-pagination/index.d.ts +3 -0
- package/lib/table-pagination/table-pagination.component.d.ts +21 -30
- package/lib/types/item-storage.types.d.ts +19 -18
- package/lib/types/utility.types.d.ts +2 -1
- package/package.json +8 -9
- package/prebuilt-themes/default/badge.css +5 -5
- package/prebuilt-themes/default/buttons/fab.css +4 -3
- package/prebuilt-themes/default/buttons/fab.css.map +1 -1
- package/prebuilt-themes/default/card.css +7 -7
- package/prebuilt-themes/default/chips.css +3 -8
- package/prebuilt-themes/default/chips.css.map +1 -1
- package/prebuilt-themes/default/core.css +6 -3
- package/prebuilt-themes/default/core.css.map +1 -1
- package/prebuilt-themes/default/inputs/color-input.css +1 -1
- package/prebuilt-themes/default/inputs/digit-input.css +1 -1
- package/prebuilt-themes/default/inputs/file-input.css +139 -2
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
- package/prebuilt-themes/default/inputs/hex-input.css +2 -2
- package/prebuilt-themes/default/inputs/input.css +1 -1
- package/prebuilt-themes/default/inputs/search-bar.css +1 -1
- package/prebuilt-themes/default/inputs/simple-input.css +1 -1
- package/prebuilt-themes/default/modal.css +1 -1
- package/prebuilt-themes/default/segment.css +2 -2
- package/prebuilt-themes/default/segment.css.map +1 -1
- package/prebuilt-themes/default/select.css +5 -3
- package/prebuilt-themes/default/select.css.map +1 -1
- package/prebuilt-themes/default/snackbar.css +0 -1
- package/prebuilt-themes/default/snackbar.css.map +1 -1
- package/prebuilt-themes/default/tabber.css +207 -0
- package/prebuilt-themes/default/tabber.css.map +1 -0
- package/public-api.d.ts +43 -136
- package/themes/_variables.scss +121 -121
- package/themes/default/_clear-button.scss +73 -73
- package/themes/default/_coloring.scss +137 -137
- package/themes/default/_dropdown-arrow.scss +12 -12
- package/themes/default/_mixins.scss +70 -70
- package/themes/default/badge.scss +94 -94
- package/themes/default/buttons/_button-mixins.scss +144 -144
- package/themes/default/buttons/button.scss +62 -62
- package/themes/default/buttons/fab.scss +74 -72
- package/themes/default/buttons/icon-button.scss +59 -59
- package/themes/default/calendar.scss +182 -182
- package/themes/default/card.scss +126 -126
- package/themes/default/checkbox-list.scss +83 -83
- package/themes/default/checkbox.scss +109 -109
- package/themes/default/chips.scss +200 -206
- package/themes/default/color-display.scss +41 -41
- package/themes/default/color-picker.scss +111 -111
- package/themes/default/core.scss +99 -96
- package/themes/default/dialog.scss +16 -16
- package/themes/default/divider.scss +13 -13
- package/themes/default/dropdown-panel.scss +45 -45
- package/themes/default/file-drop-area.scss +162 -162
- package/themes/default/form-field-frame.scss +78 -78
- package/themes/default/inputs/_shared.scss +46 -46
- package/themes/default/inputs/color-input.scss +46 -46
- package/themes/default/inputs/digit-input.scss +56 -56
- package/themes/default/inputs/file-input.scss +85 -78
- package/themes/default/inputs/hex-input.scss +27 -27
- package/themes/default/inputs/input.scss +52 -52
- package/themes/default/inputs/number-input.scss +121 -121
- package/themes/default/inputs/password-input.scss +43 -43
- package/themes/default/inputs/search-bar.scss +19 -19
- package/themes/default/inputs/simple-input.scss +19 -19
- package/themes/default/kbd-shortcut.scss +13 -13
- package/themes/default/kbd.scss +20 -20
- package/themes/default/modal.scss +93 -93
- package/themes/default/progress-bar.scss +166 -166
- package/themes/default/progress-circle.scss +56 -56
- package/themes/default/radio.scss +112 -112
- package/themes/default/segment.scss +340 -339
- package/themes/default/select.scss +255 -253
- package/themes/default/slide-toggle.scss +151 -151
- package/themes/default/slider.scss +224 -224
- package/themes/default/snackbar.scss +58 -60
- package/themes/default/spinner.scss +21 -21
- package/themes/default/stars.scss +122 -122
- package/themes/default/statebox.scss +109 -109
- package/themes/default/tabber.scss +86 -0
- package/themes/default/table-pagination.scss +56 -56
- package/themes/default/table.scss +403 -403
- package/esm2022/lib/calendar/calendar.component.mjs +0 -979
- package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
- package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
- package/esm2022/lib/calendar/calendar.module.mjs +0 -21
- package/esm2022/lib/calendar/calendar.types.mjs +0 -11
- package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
- package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
- package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
- package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
- package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
- package/lib/calendar/calendar.component.d.ts +0 -155
- package/lib/calendar/calendar.directives.d.ts +0 -51
- package/lib/calendar/calendar.helpers.d.ts +0 -15
- package/lib/calendar/calendar.module.d.ts +0 -11
- package/lib/calendar/calendar.types.d.ts +0 -80
- package/lib/color/color-picker/color-picker.component.d.ts +0 -125
- package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
- package/lib/color/color-picker/color-picker.module.d.ts +0 -13
- package/lib/inputs/color-input/color-input.component.d.ts +0 -147
- package/lib/inputs/color-input/color-input.module.d.ts +0 -16
|
@@ -1,68 +1,49 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
1
2
|
import resolvePath from 'resolve-object-path';
|
|
2
3
|
import { any, evaluate, isArray, isDefined, isObject, isPrimitive, isPromise } from 'simple-bool';
|
|
3
4
|
export class ItemStorage {
|
|
4
5
|
constructor(_ardParentComp) {
|
|
5
6
|
this._ardParentComp = _ardParentComp;
|
|
6
|
-
this._groups = this._createEmptyGroupMap();
|
|
7
|
-
this._items = [];
|
|
8
|
-
this._filteredItems = [];
|
|
9
|
-
this._highlightedItems = [];
|
|
10
|
-
this._highlightedGroups = [];
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
get value() {
|
|
40
|
-
return this._itemsToValue(this.selectedItems);
|
|
7
|
+
this._groups = signal(this._createEmptyGroupMap());
|
|
8
|
+
this._items = signal([]);
|
|
9
|
+
this._filteredItems = signal([]);
|
|
10
|
+
this._highlightedItems = signal([]);
|
|
11
|
+
this._highlightedGroups = signal([]);
|
|
12
|
+
this._recentlyHighlightedItem = signal(undefined);
|
|
13
|
+
this._selectedItems = signal([]);
|
|
14
|
+
this.groups = computed(() => Array.from(this._groups().entries())
|
|
15
|
+
.map(([, group]) => group)
|
|
16
|
+
.filter(group => group.children().length));
|
|
17
|
+
this.items = this._items.asReadonly();
|
|
18
|
+
this.filteredItems = this._filteredItems.asReadonly();
|
|
19
|
+
this.highlightedItems = this._highlightedItems.asReadonly();
|
|
20
|
+
this.selectedItems = computed(() => {
|
|
21
|
+
if (this._ardParentComp.sortMultipleValues()) {
|
|
22
|
+
return this._selectedItems().sort((a, b) => {
|
|
23
|
+
return a.index() - b.index();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return this._selectedItems();
|
|
27
|
+
});
|
|
28
|
+
this.lastSelectedItem = computed(() => this._filteredItems().last(1, item => !item.disabled()));
|
|
29
|
+
this.value = computed(() => this._itemsToValue(this.selectedItems()));
|
|
30
|
+
this.isNoItemsToSelect = computed(() => this._items().length === this._selectedItems().length);
|
|
31
|
+
this.isNoItemsFound = computed(() => this._filteredItems().length === 0);
|
|
32
|
+
this.isAnyItemSelected = computed(() => this._selectedItems().length > 0);
|
|
33
|
+
this.isAnyItemHighlighted = computed(() => this._highlightedItems().length > 0);
|
|
34
|
+
this.isItemLimitReached = computed(() => this._ardParentComp.multiselectable() &&
|
|
35
|
+
isDefined(this._ardParentComp.maxSelectedItems()) &&
|
|
36
|
+
this._ardParentComp.maxSelectedItems() <= this.selectedItems().length);
|
|
37
|
+
this._valueToWriteAfterItemsLoad = signal(undefined);
|
|
38
|
+
this._wasValueWriteDeferred = signal(false);
|
|
41
39
|
}
|
|
42
40
|
_itemsToValue(items) {
|
|
43
|
-
return items.map(item => item.value);
|
|
44
|
-
}
|
|
45
|
-
get isNoItemsToSelect() {
|
|
46
|
-
return this._items.length == this._selectedItems.length;
|
|
47
|
-
}
|
|
48
|
-
get isNoItemsFound() {
|
|
49
|
-
return this._filteredItems.length == 0;
|
|
50
|
-
}
|
|
51
|
-
get isAnyItemSelected() {
|
|
52
|
-
return this._selectedItems.length > 0;
|
|
53
|
-
}
|
|
54
|
-
get isAnyItemHighlighted() {
|
|
55
|
-
return this._highlightedItems.length > 0;
|
|
56
|
-
}
|
|
57
|
-
get isItemLimitReached() {
|
|
58
|
-
return (this._ardParentComp.multiselectable &&
|
|
59
|
-
isDefined(this._ardParentComp.maxSelectedItems) &&
|
|
60
|
-
this._ardParentComp.maxSelectedItems <= this.selectedItems.length);
|
|
41
|
+
return items.map(item => item.value());
|
|
61
42
|
}
|
|
62
43
|
setItems(items) {
|
|
63
44
|
let areItemsPrimitive = false;
|
|
64
|
-
if (this._ardParentComp.
|
|
65
|
-
|
|
45
|
+
if (this._ardParentComp.groupLabelFrom() && this._ardParentComp.itemsAlreadyGrouped()) {
|
|
46
|
+
const newItems = [];
|
|
66
47
|
for (const group of items) {
|
|
67
48
|
let children;
|
|
68
49
|
[children, areItemsPrimitive] = this._ungroupAlreadyGroupedItems(group);
|
|
@@ -74,29 +55,30 @@ export class ItemStorage {
|
|
|
74
55
|
items = items.map(this._primitiveItemsMapFn);
|
|
75
56
|
areItemsPrimitive = true;
|
|
76
57
|
}
|
|
77
|
-
this._items
|
|
58
|
+
this._items.set(items.map((item, index) => {
|
|
78
59
|
return this._setItemsMapFn(item, index, areItemsPrimitive);
|
|
79
|
-
});
|
|
60
|
+
}));
|
|
80
61
|
//add all items to filter array
|
|
81
|
-
this._filteredItems
|
|
62
|
+
this._filteredItems.set(this._items());
|
|
82
63
|
//add items to groups
|
|
83
64
|
this._populateGroups();
|
|
84
65
|
//write value if it was
|
|
85
|
-
|
|
86
|
-
|
|
66
|
+
const toWrite = this._valueToWriteAfterItemsLoad();
|
|
67
|
+
if (toWrite !== undefined) {
|
|
68
|
+
this.handleWriteValue(toWrite);
|
|
87
69
|
}
|
|
88
70
|
return areItemsPrimitive;
|
|
89
71
|
}
|
|
90
72
|
_addSingleItem(item) {
|
|
91
|
-
|
|
73
|
+
const isItemPrimitive = isPrimitive(item);
|
|
92
74
|
//map a primitive item to a usable object
|
|
93
75
|
if (isItemPrimitive) {
|
|
94
76
|
item = this._primitiveItemsMapFn(item);
|
|
95
77
|
}
|
|
96
78
|
//map the item to create data bindings
|
|
97
|
-
const ardOption = this._setItemsMapFn(item, this._items.last()?.index + 1, isItemPrimitive);
|
|
79
|
+
const ardOption = this._setItemsMapFn(item, (this._items().last()?.index() ?? 0) + 1, isItemPrimitive);
|
|
98
80
|
//push the item into all items
|
|
99
|
-
this._items.
|
|
81
|
+
this._items.update(v => [...v, ardOption]);
|
|
100
82
|
//add item to groups
|
|
101
83
|
this._populateGroups();
|
|
102
84
|
return ardOption;
|
|
@@ -106,24 +88,24 @@ export class ItemStorage {
|
|
|
106
88
|
}
|
|
107
89
|
_ungroupAlreadyGroupedItems(group) {
|
|
108
90
|
//determine groupBy (groupLabel) path
|
|
109
|
-
|
|
91
|
+
const groupBy = this._ardParentComp.groupLabelFrom() ?? this._ardParentComp.DEFAULTS.groupLabelFrom;
|
|
110
92
|
//get group label from object
|
|
111
93
|
let groupName;
|
|
112
|
-
if (typeof groupBy
|
|
94
|
+
if (typeof groupBy === 'string') {
|
|
113
95
|
groupName = resolvePath(group, groupBy);
|
|
114
96
|
}
|
|
115
97
|
else {
|
|
116
98
|
groupName = groupBy(group);
|
|
117
99
|
}
|
|
118
100
|
//determine group children path
|
|
119
|
-
|
|
101
|
+
const childrenPath = this._ardParentComp.childrenFrom() ?? this._ardParentComp.DEFAULTS.childrenFrom;
|
|
120
102
|
//get group children
|
|
121
103
|
let groupItems = resolvePath(group, childrenPath);
|
|
122
104
|
//return empty array if groupItems is not an array or is empty
|
|
123
|
-
if (!isArray(groupItems) || groupItems.length
|
|
105
|
+
if (!isArray(groupItems) || groupItems.length === 0)
|
|
124
106
|
return [[], false];
|
|
125
107
|
//check if the array is an array of primitives, and map it if needed
|
|
126
|
-
|
|
108
|
+
const areItemsPrimitive = false;
|
|
127
109
|
if (any(groupItems, isPrimitive)) {
|
|
128
110
|
groupItems = groupItems.map(this._primitiveItemsMapFn);
|
|
129
111
|
}
|
|
@@ -137,33 +119,38 @@ export class ItemStorage {
|
|
|
137
119
|
_setItemsMapFn(rawItemData, index, areItemsPrimitive) {
|
|
138
120
|
if (areItemsPrimitive) {
|
|
139
121
|
return {
|
|
140
|
-
itemData: rawItemData,
|
|
141
|
-
index,
|
|
142
|
-
value: rawItemData.value,
|
|
143
|
-
label: rawItemData.value?.toString?.() ?? String(rawItemData.value),
|
|
122
|
+
itemData: signal(rawItemData),
|
|
123
|
+
index: signal(index),
|
|
124
|
+
value: signal(rawItemData.value),
|
|
125
|
+
label: signal(rawItemData.value?.toString?.() ?? String(rawItemData.value)),
|
|
126
|
+
disabled: signal(false),
|
|
127
|
+
selected: signal(false),
|
|
128
|
+
highlighted: signal(false),
|
|
129
|
+
group: signal(undefined),
|
|
130
|
+
highlighted_recently: signal(false),
|
|
144
131
|
};
|
|
145
132
|
}
|
|
146
133
|
//get value
|
|
147
|
-
const valuePath = this._ardParentComp.valueFrom ?? this._ardParentComp.labelFrom ?? this._ardParentComp.DEFAULTS.valueFrom;
|
|
134
|
+
const valuePath = this._ardParentComp.valueFrom() ?? this._ardParentComp.labelFrom() ?? this._ardParentComp.DEFAULTS.valueFrom;
|
|
148
135
|
const value = resolvePath(rawItemData, valuePath);
|
|
149
136
|
//get label
|
|
150
|
-
const labelPath = this._ardParentComp.labelFrom ?? this._ardParentComp.valueFrom ?? this._ardParentComp.DEFAULTS.labelFrom;
|
|
137
|
+
const labelPath = this._ardParentComp.labelFrom() ?? this._ardParentComp.valueFrom() ?? this._ardParentComp.DEFAULTS.labelFrom;
|
|
151
138
|
const label = resolvePath(rawItemData, labelPath) ?? value;
|
|
152
139
|
//get disabled
|
|
153
|
-
const disabledPath = this._ardParentComp.disabledFrom ?? this._ardParentComp.DEFAULTS.disabledFrom;
|
|
140
|
+
const disabledPath = this._ardParentComp.disabledFrom() ?? this._ardParentComp.DEFAULTS.disabledFrom;
|
|
154
141
|
let disabled = evaluate(resolvePath(rawItemData, disabledPath));
|
|
155
|
-
if (this._ardParentComp.invertDisabled) {
|
|
142
|
+
if (this._ardParentComp.invertDisabled()) {
|
|
156
143
|
disabled = !disabled;
|
|
157
144
|
}
|
|
158
145
|
//get groups
|
|
159
146
|
let group = undefined;
|
|
160
|
-
|
|
147
|
+
const groupBy = this._ardParentComp.groupLabelFrom();
|
|
148
|
+
if (groupBy) {
|
|
161
149
|
if (rawItemData.$ardgroup) {
|
|
162
150
|
group = rawItemData.$ardgroup;
|
|
163
151
|
}
|
|
164
152
|
else {
|
|
165
|
-
|
|
166
|
-
if (typeof groupBy == 'string') {
|
|
153
|
+
if (typeof groupBy === 'string') {
|
|
167
154
|
group = resolvePath(rawItemData, groupBy);
|
|
168
155
|
}
|
|
169
156
|
else {
|
|
@@ -171,45 +158,65 @@ export class ItemStorage {
|
|
|
171
158
|
}
|
|
172
159
|
}
|
|
173
160
|
}
|
|
174
|
-
const itemData = areItemsPrimitive ? rawItemData.value : rawItemData;
|
|
175
161
|
//return
|
|
176
162
|
return {
|
|
177
|
-
itemData,
|
|
178
|
-
index,
|
|
179
|
-
value,
|
|
180
|
-
label: label?.toString?.() ?? String(label),
|
|
181
|
-
disabled,
|
|
182
|
-
group,
|
|
163
|
+
itemData: signal(rawItemData),
|
|
164
|
+
index: signal(index),
|
|
165
|
+
value: signal(value),
|
|
166
|
+
label: signal(label?.toString?.() ?? String(label)),
|
|
167
|
+
disabled: signal(disabled),
|
|
168
|
+
group: signal(group),
|
|
169
|
+
selected: signal(false),
|
|
170
|
+
highlighted: signal(false),
|
|
171
|
+
highlighted_recently: signal(false),
|
|
183
172
|
};
|
|
184
173
|
}
|
|
185
174
|
_populateGroups() {
|
|
186
|
-
this._groups
|
|
187
|
-
for (const item of this._filteredItems) {
|
|
188
|
-
if (this._ardParentComp.hideSelected && item.selected)
|
|
175
|
+
this._groups.set(this._createEmptyGroupMap());
|
|
176
|
+
for (const item of this._filteredItems()) {
|
|
177
|
+
if (this._ardParentComp.hideSelected() && item.selected())
|
|
189
178
|
continue;
|
|
190
179
|
this._addToGroup(item);
|
|
191
180
|
}
|
|
192
181
|
}
|
|
193
182
|
_addToGroup(item) {
|
|
194
|
-
const groupKey = item.group;
|
|
195
|
-
|
|
183
|
+
const groupKey = item.group();
|
|
184
|
+
const targetGroup = this._groups().get(groupKey);
|
|
196
185
|
//create new group if needed
|
|
197
186
|
if (!targetGroup) {
|
|
198
|
-
this._groups.
|
|
199
|
-
|
|
200
|
-
|
|
187
|
+
this._groups.update(v => {
|
|
188
|
+
const map = new Map(v);
|
|
189
|
+
map.set(groupKey, {
|
|
190
|
+
label: signal(String(groupKey ?? '')),
|
|
191
|
+
children: signal([item]),
|
|
192
|
+
disabled: signal(false),
|
|
193
|
+
selected: signal(false),
|
|
194
|
+
highlighted: signal(false),
|
|
195
|
+
});
|
|
196
|
+
return map;
|
|
201
197
|
});
|
|
202
198
|
return;
|
|
203
199
|
}
|
|
204
|
-
targetGroup.children.
|
|
200
|
+
targetGroup.children.update(v => [...v, item]);
|
|
205
201
|
}
|
|
206
202
|
_createEmptyGroupMap() {
|
|
207
|
-
return new Map([
|
|
203
|
+
return new Map([
|
|
204
|
+
[
|
|
205
|
+
undefined,
|
|
206
|
+
{
|
|
207
|
+
label: signal(''),
|
|
208
|
+
children: signal([]),
|
|
209
|
+
disabled: signal(false),
|
|
210
|
+
selected: signal(false),
|
|
211
|
+
highlighted: signal(false),
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
]);
|
|
208
215
|
}
|
|
209
216
|
_isWriteValueValid(ngModel) {
|
|
210
217
|
return ngModel.every(item => {
|
|
211
|
-
if (!isDefined(this._ardParentComp.compareWith) && isObject(item) && this._ardParentComp.valueFrom) {
|
|
212
|
-
console.warn(`Setting object(${JSON.stringify(item)}) as your model with [valueFrom] is not allowed unless [compareWith] is used.`);
|
|
218
|
+
if (!isDefined(this._ardParentComp.compareWith) && isObject(item) && this._ardParentComp.valueFrom()) {
|
|
219
|
+
console.warn(`ARD-WA${this._ardParentComp._componentId}0: Setting object(${JSON.stringify(item)}) as your model with [valueFrom] is not allowed unless [compareWith] is used.`);
|
|
213
220
|
return false;
|
|
214
221
|
}
|
|
215
222
|
return true;
|
|
@@ -217,8 +224,8 @@ export class ItemStorage {
|
|
|
217
224
|
}
|
|
218
225
|
handleWriteValue(ngModel) {
|
|
219
226
|
//defer writing the value if no options are yet loaded
|
|
220
|
-
if (!this._wasValueWriteDeferred && this._items.length
|
|
221
|
-
this._valueToWriteAfterItemsLoad
|
|
227
|
+
if (!this._wasValueWriteDeferred() && this._items().length === 0) {
|
|
228
|
+
this._valueToWriteAfterItemsLoad.set(ngModel);
|
|
222
229
|
return;
|
|
223
230
|
}
|
|
224
231
|
this.clearAllSelected();
|
|
@@ -226,12 +233,12 @@ export class ItemStorage {
|
|
|
226
233
|
return;
|
|
227
234
|
}
|
|
228
235
|
const selectItemByValue = (value) => {
|
|
229
|
-
|
|
236
|
+
const item = this.findItemByValue(value);
|
|
230
237
|
if (item) {
|
|
231
238
|
this.selectItem(item);
|
|
232
239
|
return;
|
|
233
240
|
}
|
|
234
|
-
console.warn(`Couldn't find an item with value ${value?.toString?.() || String(value)}.`);
|
|
241
|
+
console.warn(`ARD-WA${this._ardParentComp._componentId}1: Couldn't find an item with value ${value?.toString?.() || String(value)}.`);
|
|
235
242
|
};
|
|
236
243
|
for (const modelValue of ngModel) {
|
|
237
244
|
selectItemByValue(modelValue);
|
|
@@ -239,13 +246,13 @@ export class ItemStorage {
|
|
|
239
246
|
}
|
|
240
247
|
findItemByValue(valueToFind) {
|
|
241
248
|
let findBy;
|
|
242
|
-
if (this._ardParentComp.compareWith) {
|
|
243
|
-
findBy = item => this._ardParentComp.compareWith(valueToFind, item.value);
|
|
249
|
+
if (this._ardParentComp.compareWith()) {
|
|
250
|
+
findBy = item => this._ardParentComp.compareWith()(valueToFind, item.value);
|
|
244
251
|
}
|
|
245
252
|
else {
|
|
246
253
|
findBy = item => item.value === valueToFind;
|
|
247
254
|
}
|
|
248
|
-
return this._items.find(item => findBy(item));
|
|
255
|
+
return this._items().find(item => findBy(item));
|
|
249
256
|
}
|
|
250
257
|
async addCustomOption(value, fn) {
|
|
251
258
|
const fnResult = fn(value);
|
|
@@ -256,44 +263,44 @@ export class ItemStorage {
|
|
|
256
263
|
return newOptionObj;
|
|
257
264
|
}
|
|
258
265
|
clearAllSelected(repopulateGroups = false) {
|
|
259
|
-
for (const item of this._selectedItems) {
|
|
260
|
-
item.selected
|
|
266
|
+
for (const item of this._selectedItems()) {
|
|
267
|
+
item.selected.set(false);
|
|
261
268
|
}
|
|
262
|
-
|
|
263
|
-
this._selectedItems
|
|
264
|
-
if (repopulateGroups && this._ardParentComp.hideSelected)
|
|
269
|
+
const removedItemValues = this._itemsToValue(this._selectedItems());
|
|
270
|
+
this._selectedItems.set([]);
|
|
271
|
+
if (repopulateGroups && this._ardParentComp.hideSelected())
|
|
265
272
|
this._populateGroups();
|
|
266
273
|
return removedItemValues;
|
|
267
274
|
}
|
|
268
275
|
clearLastSelected() {
|
|
269
|
-
|
|
276
|
+
const item = this._selectedItems().last();
|
|
270
277
|
if (!item)
|
|
271
278
|
return item;
|
|
272
279
|
this.unselectItem(item);
|
|
273
280
|
return item;
|
|
274
281
|
}
|
|
275
282
|
selectItem(...items) {
|
|
276
|
-
if (this.isItemLimitReached) {
|
|
283
|
+
if (this.isItemLimitReached()) {
|
|
277
284
|
return [[], [], this._itemsToValue(items)];
|
|
278
285
|
}
|
|
279
286
|
let unselected = [];
|
|
280
|
-
if (!this._ardParentComp.multiselectable) {
|
|
287
|
+
if (!this._ardParentComp.multiselectable()) {
|
|
281
288
|
unselected = this.clearAllSelected(false);
|
|
282
289
|
}
|
|
283
290
|
let itemsSelectedCount = 0;
|
|
284
291
|
const itemsSelected = [];
|
|
285
292
|
for (const item of items) {
|
|
286
293
|
itemsSelectedCount++;
|
|
287
|
-
if (item.selected)
|
|
294
|
+
if (item.selected())
|
|
288
295
|
continue;
|
|
289
|
-
if (this.isItemLimitReached) {
|
|
296
|
+
if (this.isItemLimitReached()) {
|
|
290
297
|
break;
|
|
291
298
|
}
|
|
292
|
-
item.selected
|
|
293
|
-
this._selectedItems.
|
|
299
|
+
item.selected.set(true);
|
|
300
|
+
this._selectedItems.update(v => [...v, item]);
|
|
294
301
|
itemsSelected.push(item);
|
|
295
302
|
}
|
|
296
|
-
if (this._ardParentComp.hideSelected) {
|
|
303
|
+
if (this._ardParentComp.hideSelected()) {
|
|
297
304
|
this._populateGroups();
|
|
298
305
|
}
|
|
299
306
|
const itemsFailedToSelect = items.slice(itemsSelectedCount - 1);
|
|
@@ -301,93 +308,90 @@ export class ItemStorage {
|
|
|
301
308
|
}
|
|
302
309
|
unselectItem(...items) {
|
|
303
310
|
for (const item of items) {
|
|
304
|
-
if (!item.selected)
|
|
311
|
+
if (!item.selected())
|
|
305
312
|
continue;
|
|
306
|
-
item.selected
|
|
313
|
+
item.selected.set(false);
|
|
307
314
|
}
|
|
308
|
-
this._selectedItems
|
|
309
|
-
if (this._ardParentComp.hideSelected)
|
|
315
|
+
this._selectedItems.update(v => v.filter(v => v.selected()));
|
|
316
|
+
if (this._ardParentComp.hideSelected()) {
|
|
310
317
|
this._populateGroups();
|
|
318
|
+
}
|
|
311
319
|
return this._itemsToValue(items);
|
|
312
320
|
}
|
|
313
321
|
clearAllHighlights() {
|
|
314
|
-
for (const item of this._highlightedItems) {
|
|
315
|
-
item.highlighted
|
|
322
|
+
for (const item of this._highlightedItems()) {
|
|
323
|
+
item.highlighted.set(false);
|
|
316
324
|
}
|
|
317
|
-
for (const group of this._highlightedGroups) {
|
|
318
|
-
group.highlighted
|
|
325
|
+
for (const group of this._highlightedGroups()) {
|
|
326
|
+
group.highlighted.set(false);
|
|
319
327
|
}
|
|
320
|
-
this._highlightedItems
|
|
321
|
-
this._highlightedGroups
|
|
328
|
+
this._highlightedItems.set([]);
|
|
329
|
+
this._highlightedGroups.set([]);
|
|
322
330
|
}
|
|
323
331
|
highlightGroup(group) {
|
|
324
332
|
this.clearAllHighlights();
|
|
325
|
-
group.highlighted
|
|
326
|
-
this.highlightItem(...group.children);
|
|
327
|
-
return group.children.first();
|
|
333
|
+
group.highlighted.set(true);
|
|
334
|
+
this.highlightItem(...group.children());
|
|
335
|
+
return group.children().first();
|
|
328
336
|
}
|
|
329
337
|
highlightSingleItem(item) {
|
|
330
|
-
if (!item || item.disabled)
|
|
338
|
+
if (!item || item.disabled())
|
|
331
339
|
return null;
|
|
332
340
|
this.clearAllHighlights();
|
|
333
341
|
return this.highlightItem(item);
|
|
334
342
|
}
|
|
335
343
|
highlightItem(...items) {
|
|
336
344
|
for (const item of items) {
|
|
337
|
-
item.highlighted
|
|
345
|
+
item.highlighted.set(true);
|
|
338
346
|
}
|
|
339
|
-
this._highlightedItems.
|
|
347
|
+
this._highlightedItems.update(v => [...v, ...items]);
|
|
340
348
|
return items.last();
|
|
341
349
|
}
|
|
342
350
|
unhighlightItem(...items) {
|
|
343
351
|
for (const item of items) {
|
|
344
352
|
if (!item || !item.highlighted)
|
|
345
353
|
return;
|
|
346
|
-
item.highlighted
|
|
354
|
+
item.highlighted.set(false);
|
|
347
355
|
}
|
|
348
|
-
this._highlightedItems
|
|
356
|
+
this._highlightedItems.update(v => v.filter(v => v.highlighted()));
|
|
349
357
|
}
|
|
350
358
|
highlightFirstItem() {
|
|
351
359
|
this.clearAllHighlights();
|
|
352
|
-
|
|
360
|
+
const itemsToHighlight = this._getHiglightableItems();
|
|
353
361
|
return this.highlightSingleItem(itemsToHighlight.first());
|
|
354
362
|
}
|
|
355
363
|
highlightLastItem() {
|
|
356
364
|
this.clearAllHighlights();
|
|
357
|
-
|
|
365
|
+
const itemsToHighlight = this._getHiglightableItems();
|
|
358
366
|
return this.highlightSingleItem(itemsToHighlight.last());
|
|
359
367
|
}
|
|
360
368
|
_getHiglightableItems() {
|
|
361
|
-
let itemsToHighlight = this._filteredItems.filter(item => !item.disabled);
|
|
362
|
-
if (this._ardParentComp.hideSelected) {
|
|
363
|
-
itemsToHighlight = itemsToHighlight.filter(item => !item.selected);
|
|
369
|
+
let itemsToHighlight = this._filteredItems().filter(item => !item.disabled());
|
|
370
|
+
if (this._ardParentComp.hideSelected()) {
|
|
371
|
+
itemsToHighlight = itemsToHighlight.filter(item => !item.selected());
|
|
364
372
|
}
|
|
365
373
|
return itemsToHighlight;
|
|
366
374
|
}
|
|
367
375
|
highlightAllItems() {
|
|
368
|
-
|
|
369
|
-
if (this._ardParentComp.hideSelected) {
|
|
370
|
-
itemsToHighlight = itemsToHighlight.filter(item => !item.selected);
|
|
371
|
-
}
|
|
372
|
-
this.highlightItem(...itemsToHighlight);
|
|
376
|
+
this.highlightItem(...this._getHiglightableItems());
|
|
373
377
|
}
|
|
374
378
|
_clearRecentlyHighlighted() {
|
|
375
|
-
if (this._recentlyHighlightedItem) {
|
|
376
|
-
this._recentlyHighlightedItem.highlighted_recently
|
|
379
|
+
if (this._recentlyHighlightedItem()) {
|
|
380
|
+
this._recentlyHighlightedItem().highlighted_recently.set(false);
|
|
377
381
|
}
|
|
378
382
|
}
|
|
379
383
|
setRecentlyHighlighted(item) {
|
|
380
384
|
this._clearRecentlyHighlighted();
|
|
381
|
-
|
|
382
|
-
this._recentlyHighlightedItem.
|
|
385
|
+
item.highlighted_recently.set(true);
|
|
386
|
+
this._recentlyHighlightedItem.set(item);
|
|
383
387
|
}
|
|
384
388
|
highlightNextItem(offset, hasShift) {
|
|
385
|
-
if (!this.isAnyItemHighlighted) {
|
|
389
|
+
if (!this.isAnyItemHighlighted()) {
|
|
386
390
|
return this.highlightFirstItem();
|
|
387
391
|
}
|
|
388
|
-
const currentItem = this.highlightedItems.last();
|
|
392
|
+
const currentItem = this.highlightedItems().last();
|
|
389
393
|
const highlightableItems = this._getHiglightableItems();
|
|
390
|
-
const currentIndexInFiltered = highlightableItems.findIndex(item => item.index
|
|
394
|
+
const currentIndexInFiltered = highlightableItems.findIndex(item => item.index() === currentItem.index());
|
|
391
395
|
let nextItemIndex = currentIndexInFiltered + offset;
|
|
392
396
|
if (nextItemIndex >= highlightableItems.length) {
|
|
393
397
|
nextItemIndex -= highlightableItems.length;
|
|
@@ -396,8 +400,8 @@ export class ItemStorage {
|
|
|
396
400
|
nextItemIndex += highlightableItems.length;
|
|
397
401
|
}
|
|
398
402
|
const itemToHighlight = highlightableItems[nextItemIndex];
|
|
399
|
-
if (hasShift && this._ardParentComp.multiselectable) {
|
|
400
|
-
if (itemToHighlight.highlighted) {
|
|
403
|
+
if (hasShift && this._ardParentComp.multiselectable()) {
|
|
404
|
+
if (itemToHighlight.highlighted()) {
|
|
401
405
|
this.unhighlightItem(currentItem);
|
|
402
406
|
}
|
|
403
407
|
return this.highlightItem(itemToHighlight);
|
|
@@ -406,31 +410,30 @@ export class ItemStorage {
|
|
|
406
410
|
}
|
|
407
411
|
filter(filterTerm) {
|
|
408
412
|
if (!filterTerm) {
|
|
409
|
-
this.resetFiltered();
|
|
410
|
-
return this._itemsToValue(this._filteredItems);
|
|
413
|
+
return this._itemsToValue(this.resetFiltered());
|
|
411
414
|
}
|
|
412
|
-
if (!this._ardParentComp.searchCaseSensitive) {
|
|
415
|
+
if (!this._ardParentComp.searchCaseSensitive()) {
|
|
413
416
|
filterTerm = filterTerm.toLocaleLowerCase();
|
|
414
417
|
}
|
|
415
|
-
const searchFn = this._ardParentComp.searchFn;
|
|
416
|
-
|
|
418
|
+
const searchFn = this._ardParentComp.searchFn();
|
|
419
|
+
const newFilteredItems = this._items().filter(item => searchFn(filterTerm, item));
|
|
420
|
+
this._filteredItems.set(newFilteredItems);
|
|
417
421
|
this._populateGroups();
|
|
418
422
|
if (!this.isNoItemsFound)
|
|
419
423
|
this.highlightFirstItem();
|
|
420
424
|
else
|
|
421
425
|
this.clearAllHighlights();
|
|
422
|
-
return this._itemsToValue(
|
|
426
|
+
return this._itemsToValue(newFilteredItems);
|
|
423
427
|
}
|
|
424
428
|
resetFiltered() {
|
|
425
|
-
if (this._filteredItems.length
|
|
426
|
-
return;
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
else {
|
|
431
|
-
this._filteredItems = this._items;
|
|
429
|
+
if (this._filteredItems().length === this._items().length)
|
|
430
|
+
return this._items();
|
|
431
|
+
let newFilteredItems = this._items();
|
|
432
|
+
if (this._ardParentComp.hideSelected() && this.isAnyItemSelected()) {
|
|
433
|
+
newFilteredItems = newFilteredItems.filter(item => !item.selected());
|
|
432
434
|
}
|
|
433
435
|
this._populateGroups();
|
|
436
|
+
return newFilteredItems;
|
|
434
437
|
}
|
|
435
438
|
}
|
|
436
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9faW50ZXJuYWwvaXRlbS1zdG9yYWdlcy9kcm9wZG93bi1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWlDbEcsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFBb0IsY0FBK0I7UUFBL0IsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBUjNDLFlBQU8sR0FBb0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFDekIsbUJBQWMsR0FBZ0IsRUFBRSxDQUFDO1FBQ2pDLHNCQUFpQixHQUFnQixFQUFFLENBQUM7UUFDcEMsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQztRQUUxQyxtQkFBYyxHQUFnQixFQUFFLENBQUM7UUFxT2pDLDJCQUFzQixHQUFZLEtBQUssQ0FBQztJQW5PTSxDQUFDO0lBRXZELElBQUksTUFBTTtRQUNSLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ08sYUFBYSxDQUFDLEtBQWtCO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztJQUMxRCxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxDQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZTtZQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFpQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFZO1FBQ25CLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtZQUM3RSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQ3pCLElBQUksUUFBZSxDQUFDO2dCQUNwQixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsS0FBSyxHQUFHLFFBQVEsQ0FBQztTQUNsQjtRQUNELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBRTtZQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM3QyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILCtCQUErQjtRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFbEMscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2Qix1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssU0FBUyxFQUFFO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUN6RDtRQUVELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNPLGNBQWMsQ0FBQyxJQUFTO1FBQzlCLElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4Qyx5Q0FBeUM7UUFDekMsSUFBSSxlQUFlLEVBQUU7WUFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QztRQUNELHNDQUFzQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFNUYsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVCLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNPLG9CQUFvQixDQUFJLElBQU87UUFDckMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ08sMkJBQTJCLENBQW1CLEtBQVE7UUFDNUQscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUVoRyw2QkFBNkI7UUFDN0IsSUFBSSxTQUFjLENBQUM7UUFDbkIsSUFBSSxPQUFPLE9BQU8sSUFBSSxRQUFRLEVBQUU7WUFDOUIsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7UUFFRCwrQkFBK0I7UUFDL0IsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBRWpHLG9CQUFvQjtRQUNwQixJQUFJLFVBQVUsR0FBUSxXQUFXLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXZELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdkUsb0VBQW9FO1FBQ3BFLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRTtZQUNoQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN4RDtRQUNELCtCQUErQjtRQUMvQixVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNPLGNBQWMsQ0FBQyxXQUFnQixFQUFFLEtBQWEsRUFBRSxpQkFBMEI7UUFDaEYsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixPQUFPO2dCQUNMLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixLQUFLO2dCQUNMLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztnQkFDeEIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzthQUNwRSxDQUFDO1NBQ0g7UUFDRCxXQUFXO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQzNILE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbEQsV0FBVztRQUNYLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzSCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUUzRCxjQUFjO1FBQ2QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ25HLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRTtZQUN0QyxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDdEI7UUFFRCxZQUFZO1FBQ1osSUFBSSxLQUFLLEdBQVEsU0FBUyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDbEMsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO2dCQUN6QixLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQ2hHLElBQUksT0FBTyxPQUFPLElBQUksUUFBUSxFQUFFO29CQUM5QixLQUFLLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDM0M7cUJBQU07b0JBQ0wsS0FBSyxHQUFJLE9BQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRjtRQUVELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFFckUsUUFBUTtRQUNSLE9BQU87WUFDTCxRQUFRO1lBQ1IsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztZQUMzQyxRQUFRO1lBQ1IsS0FBSztTQUNOLENBQUM7SUFDSixDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTNDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLFNBQVM7WUFFaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDTyxXQUFXLENBQUMsSUFBZTtRQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzVCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUM3QixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsT0FBTztTQUNSO1FBQ0QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ08sa0JBQWtCLENBQUMsT0FBYztRQUN2QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTtnQkFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztnQkFDcEksT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsT0FBYztRQUM3QixzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDM0QsSUFBSSxDQUFDLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztZQUMzQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JDLE9BQU87U0FDUjtRQUVELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUN2QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXZDLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RCLE9BQU87YUFDUjtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUYsQ0FBQyxDQUFDO1FBRUYsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLEVBQUU7WUFDaEMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBQ0QsZUFBZSxDQUFDLFdBQWdCO1FBQzlCLElBQUksTUFBb0MsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO1lBQ25DLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNMLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWEsRUFBRSxFQUFnRDtRQUNuRixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0IsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQzNCLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUFFLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQztRQUU1RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxtQkFBNEIsS0FBSztRQUNoRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFDRCxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRWpGLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFHLEtBQWtCO1FBQzlCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUU7WUFDeEMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsU0FBUztZQUM1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDM0IsTUFBTTthQUNQO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsWUFBWSxDQUFDLEdBQUcsS0FBa0I7UUFDaEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUFFLFNBQVM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTdELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzFCO1FBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0MsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFxQjtRQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsSUFBZTtRQUNqQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxhQUFhLENBQUMsR0FBRyxLQUFrQjtRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsZUFBZSxDQUFDLEdBQUcsS0FBa0I7UUFDbkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFFdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDTyxxQkFBcUI7UUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDcEMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEU7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDRCxpQkFBaUI7UUFDZixJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRTtZQUNwQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDTyx5QkFBeUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztTQUM1RDtJQUNILENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxJQUFlO1FBQ3BDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsTUFBYyxFQUFFLFFBQWtCO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUNsQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckcsSUFBSSxhQUFhLEdBQUcsc0JBQXNCLEdBQUcsTUFBTSxDQUFDO1FBQ3BELElBQUksYUFBYSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtZQUM5QyxhQUFhLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7U0FDNUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUxRCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRTtZQUNuRCxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbkM7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDNUM7UUFDRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFVBQWtCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFO1lBQzVDLFVBQVUsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM3QztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFN0UsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztZQUMvQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRTdELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzlELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsRTthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZE9wdGlvbkdyb3VwLCBBcmRPcHRpb24sIEdyb3VwQnlGbiwgQXJkSXRlbUdyb3VwTWFwLCBTZWFyY2hGbiwgQ29tcGFyZVdpdGhGbiB9IGZyb20gJy4uLy4uL3R5cGVzL2l0ZW0tc3RvcmFnZS50eXBlcyc7XHJcbmltcG9ydCByZXNvbHZlUGF0aCBmcm9tICdyZXNvbHZlLW9iamVjdC1wYXRoJztcclxuaW1wb3J0IHsgYW55LCBldmFsdWF0ZSwgaXNBcnJheSwgaXNEZWZpbmVkLCBpc09iamVjdCwgaXNQcmltaXRpdmUsIGlzUHJvbWlzZSB9IGZyb20gJ3NpbXBsZS1ib29sJztcclxuaW1wb3J0IHsgQWRkQ3VzdG9tRm4gfSBmcm9tICcuLi8uLi9zZWxlY3Qvc2VsZWN0LnR5cGVzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0b3JhZ2VIb3N0RGVmYXVsdHMge1xyXG4gIHZhbHVlRnJvbTogc3RyaW5nO1xyXG4gIGxhYmVsRnJvbTogc3RyaW5nO1xyXG4gIGRpc2FibGVkRnJvbTogc3RyaW5nO1xyXG4gIGdyb3VwTGFiZWxGcm9tOiBzdHJpbmc7XHJcbiAgZ3JvdXBEaXNhYmxlZEZyb206IHN0cmluZztcclxuICBjaGlsZHJlbkZyb206IHN0cmluZztcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RvcmFnZUhvc3Qge1xyXG4gIHZhbHVlRnJvbT86IHN0cmluZztcclxuICBsYWJlbEZyb20/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZWRGcm9tPzogc3RyaW5nO1xyXG4gIGludmVydERpc2FibGVkPzogYm9vbGVhbjtcclxuICBncm91cExhYmVsRnJvbT86IHN0cmluZyB8IEdyb3VwQnlGbjtcclxuICBncm91cERpc2FibGVkRnJvbT86IHN0cmluZztcclxuICBjaGlsZHJlbkZyb20/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgREVGQVVMVFM6IEl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzO1xyXG4gIGdyb3VwSXRlbXM/OiBib29sZWFuO1xyXG4gIGl0ZW1zQWxyZWFkeUdyb3VwZWQ/OiBib29sZWFuO1xyXG4gIGhpZGVTZWxlY3RlZDogYm9vbGVhbjtcclxuICBzZWFyY2hDYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xyXG4gIHNlYXJjaEZuOiBTZWFyY2hGbjtcclxuICBjb21wYXJlV2l0aD86IENvbXBhcmVXaXRoRm47XHJcbiAgbXVsdGlzZWxlY3RhYmxlOiBib29sZWFuO1xyXG4gIHNvcnRNdWx0aXBsZVZhbHVlczogYm9vbGVhbjtcclxuICBtYXhTZWxlY3RlZEl0ZW1zPzogbnVtYmVyO1xyXG4gIGFkZEN1c3RvbTogYm9vbGVhbiB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSXRlbVN0b3JhZ2Uge1xyXG4gIHByaXZhdGUgX2dyb3VwczogQXJkSXRlbUdyb3VwTWFwID0gdGhpcy5fY3JlYXRlRW1wdHlHcm91cE1hcCgpO1xyXG4gIHByaXZhdGUgX2l0ZW1zOiBBcmRPcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2ZpbHRlcmVkSXRlbXM6IEFyZE9wdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0ZWRJdGVtczogQXJkT3B0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9oaWdobGlnaHRlZEdyb3VwczogQXJkT3B0aW9uR3JvdXBbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3JlY2VudGx5SGlnaGxpZ2h0ZWRJdGVtPzogQXJkT3B0aW9uO1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkSXRlbXM6IEFyZE9wdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FyZFBhcmVudENvbXA6IEl0ZW1TdG9yYWdlSG9zdCkge31cclxuXHJcbiAgZ2V0IGdyb3VwcygpOiBBcmRPcHRpb25Hcm91cFtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dyb3Vwcy5lbnRyaWVzKCkpXHJcbiAgICAgIC5tYXAoKFtfLCBncm91cF0pID0+IGdyb3VwKVxyXG4gICAgICAuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgfVxyXG4gIGdldCBpdGVtcygpOiBBcmRPcHRpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG4gIGdldCBmaWx0ZXJlZEl0ZW1zKCk6IEFyZE9wdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZEl0ZW1zO1xyXG4gIH1cclxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBBcmRPcHRpb25bXSB7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5zb3J0TXVsdGlwbGVWYWx1ZXMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtcztcclxuICB9XHJcbiAgZ2V0IGhpZ2hsaWdodGVkSXRlbXMoKTogQXJkT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXM7XHJcbiAgfVxyXG4gIGdldCBsYXN0U2VsZWN0ZWRJdGVtKCk6IEFyZE9wdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWRJdGVtcy5sYXN0KDEsIGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xyXG4gIH1cclxuICBnZXQgdmFsdWUoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gIH1cclxuICBwcml2YXRlIF9pdGVtc1RvVmFsdWUoaXRlbXM6IEFyZE9wdGlvbltdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTm9JdGVtc1RvU2VsZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aCA9PSB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICB9XHJcbiAgZ2V0IGlzTm9JdGVtc0ZvdW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkSXRlbXMubGVuZ3RoID09IDA7XHJcbiAgfVxyXG4gIGdldCBpc0FueUl0ZW1TZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIGdldCBpc0FueUl0ZW1IaWdobGlnaHRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIGdldCBpc0l0ZW1MaW1pdFJlYWNoZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSAmJlxyXG4gICAgICBpc0RlZmluZWQodGhpcy5fYXJkUGFyZW50Q29tcC5tYXhTZWxlY3RlZEl0ZW1zKSAmJlxyXG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMhIDw9IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRJdGVtcyhpdGVtczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGxldCBhcmVJdGVtc1ByaW1pdGl2ZSA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuZ3JvdXBJdGVtcyAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLml0ZW1zQWxyZWFkeUdyb3VwZWQpIHtcclxuICAgICAgbGV0IG5ld0l0ZW1zID0gW107XHJcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgaXRlbXMpIHtcclxuICAgICAgICBsZXQgY2hpbGRyZW46IGFueVtdO1xyXG4gICAgICAgIFtjaGlsZHJlbiwgYXJlSXRlbXNQcmltaXRpdmVdID0gdGhpcy5fdW5ncm91cEFscmVhZHlHcm91cGVkSXRlbXMoZ3JvdXApO1xyXG4gICAgICAgIG5ld0l0ZW1zLnB1c2goLi4uY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZW1zID0gbmV3SXRlbXM7XHJcbiAgICB9XHJcbiAgICBpZiAoYW55KGl0ZW1zLCBpc1ByaW1pdGl2ZSkpIHtcclxuICAgICAgaXRlbXMgPSBpdGVtcy5tYXAodGhpcy5fcHJpbWl0aXZlSXRlbXNNYXBGbik7XHJcbiAgICAgIGFyZUl0ZW1zUHJpbWl0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NldEl0ZW1zTWFwRm4oaXRlbSwgaW5kZXgsIGFyZUl0ZW1zUHJpbWl0aXZlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vYWRkIGFsbCBpdGVtcyB0byBmaWx0ZXIgYXJyYXlcclxuICAgIHRoaXMuX2ZpbHRlcmVkSXRlbXMgPSB0aGlzLl9pdGVtcztcclxuXHJcbiAgICAvL2FkZCBpdGVtcyB0byBncm91cHNcclxuICAgIHRoaXMuX3BvcHVsYXRlR3JvdXBzKCk7XHJcblxyXG4gICAgLy93cml0ZSB2YWx1ZSBpZiBpdCB3YXNcclxuICAgIGlmICh0aGlzLl92YWx1ZVRvV3JpdGVBZnRlckl0ZW1zTG9hZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlV3JpdGVWYWx1ZSh0aGlzLl92YWx1ZVRvV3JpdGVBZnRlckl0ZW1zTG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFyZUl0ZW1zUHJpbWl0aXZlO1xyXG4gIH1cclxuICBwcml2YXRlIF9hZGRTaW5nbGVJdGVtKGl0ZW06IGFueSk6IEFyZE9wdGlvbiB7XHJcbiAgICBsZXQgaXNJdGVtUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaXRlbSk7XHJcbiAgICAvL21hcCBhIHByaW1pdGl2ZSBpdGVtIHRvIGEgdXNhYmxlIG9iamVjdFxyXG4gICAgaWYgKGlzSXRlbVByaW1pdGl2ZSkge1xyXG4gICAgICBpdGVtID0gdGhpcy5fcHJpbWl0aXZlSXRlbXNNYXBGbihpdGVtKTtcclxuICAgIH1cclxuICAgIC8vbWFwIHRoZSBpdGVtIHRvIGNyZWF0ZSBkYXRhIGJpbmRpbmdzXHJcbiAgICBjb25zdCBhcmRPcHRpb24gPSB0aGlzLl9zZXRJdGVtc01hcEZuKGl0ZW0sIHRoaXMuX2l0ZW1zLmxhc3QoKT8uaW5kZXggKyAxLCBpc0l0ZW1QcmltaXRpdmUpO1xyXG5cclxuICAgIC8vcHVzaCB0aGUgaXRlbSBpbnRvIGFsbCBpdGVtc1xyXG4gICAgdGhpcy5faXRlbXMucHVzaChhcmRPcHRpb24pO1xyXG5cclxuICAgIC8vYWRkIGl0ZW0gdG8gZ3JvdXBzXHJcbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xyXG5cclxuICAgIHJldHVybiBhcmRPcHRpb247XHJcbiAgfVxyXG4gIHByaXZhdGUgX3ByaW1pdGl2ZUl0ZW1zTWFwRm48VD4oaXRlbTogVCk6IHsgdmFsdWU6IFQgfSB7XHJcbiAgICByZXR1cm4geyB2YWx1ZTogaXRlbSB9O1xyXG4gIH1cclxuICBwcml2YXRlIF91bmdyb3VwQWxyZWFkeUdyb3VwZWRJdGVtczxUIGV4dGVuZHMgb2JqZWN0Pihncm91cDogVCk6IFthbnlbXSwgYm9vbGVhbl0ge1xyXG4gICAgLy9kZXRlcm1pbmUgZ3JvdXBCeSAoZ3JvdXBMYWJlbCkgcGF0aFxyXG4gICAgbGV0IGdyb3VwQnkgPSB0aGlzLl9hcmRQYXJlbnRDb21wLmdyb3VwTGFiZWxGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMuZ3JvdXBMYWJlbEZyb207XHJcblxyXG4gICAgLy9nZXQgZ3JvdXAgbGFiZWwgZnJvbSBvYmplY3RcclxuICAgIGxldCBncm91cE5hbWU6IGFueTtcclxuICAgIGlmICh0eXBlb2YgZ3JvdXBCeSA9PSAnc3RyaW5nJykge1xyXG4gICAgICBncm91cE5hbWUgPSByZXNvbHZlUGF0aChncm91cCwgZ3JvdXBCeSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91cE5hbWUgPSBncm91cEJ5KGdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2RldGVybWluZSBncm91cCBjaGlsZHJlbiBwYXRoXHJcbiAgICBsZXQgY2hpbGRyZW5QYXRoID0gdGhpcy5fYXJkUGFyZW50Q29tcC5jaGlsZHJlbkZyb20gPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5ERUZBVUxUUy5jaGlsZHJlbkZyb207XHJcblxyXG4gICAgLy9nZXQgZ3JvdXAgY2hpbGRyZW5cclxuICAgIGxldCBncm91cEl0ZW1zOiBhbnkgPSByZXNvbHZlUGF0aChncm91cCwgY2hpbGRyZW5QYXRoKTtcclxuXHJcbiAgICAvL3JldHVybiBlbXB0eSBhcnJheSBpZiBncm91cEl0ZW1zIGlzIG5vdCBhbiBhcnJheSBvciBpcyBlbXB0eVxyXG4gICAgaWYgKCFpc0FycmF5KGdyb3VwSXRlbXMpIHx8IGdyb3VwSXRlbXMubGVuZ3RoID09IDApIHJldHVybiBbW10sIGZhbHNlXTtcclxuXHJcbiAgICAvL2NoZWNrIGlmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiBwcmltaXRpdmVzLCBhbmQgbWFwIGl0IGlmIG5lZWRlZFxyXG4gICAgbGV0IGFyZUl0ZW1zUHJpbWl0aXZlID0gZmFsc2U7XHJcbiAgICBpZiAoYW55KGdyb3VwSXRlbXMsIGlzUHJpbWl0aXZlKSkge1xyXG4gICAgICBncm91cEl0ZW1zID0gZ3JvdXBJdGVtcy5tYXAodGhpcy5fcHJpbWl0aXZlSXRlbXNNYXBGbik7XHJcbiAgICB9XHJcbiAgICAvL2FkZCBncm91cCBuYW1lIHRvIGV2ZXJ5IGNoaWxkXHJcbiAgICBncm91cEl0ZW1zID0gZ3JvdXBJdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpdGVtLiRhcmRncm91cCA9IGdyb3VwTmFtZTtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gW2dyb3VwSXRlbXMsIGFyZUl0ZW1zUHJpbWl0aXZlXTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfc2V0SXRlbXNNYXBGbihyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyLCBhcmVJdGVtc1ByaW1pdGl2ZTogYm9vbGVhbik6IEFyZE9wdGlvbiB7XHJcbiAgICBpZiAoYXJlSXRlbXNQcmltaXRpdmUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpdGVtRGF0YTogcmF3SXRlbURhdGEsXHJcbiAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgdmFsdWU6IHJhd0l0ZW1EYXRhLnZhbHVlLFxyXG4gICAgICAgIGxhYmVsOiByYXdJdGVtRGF0YS52YWx1ZT8udG9TdHJpbmc/LigpID8/IFN0cmluZyhyYXdJdGVtRGF0YS52YWx1ZSksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvL2dldCB2YWx1ZVxyXG4gICAgY29uc3QgdmFsdWVQYXRoID0gdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20gPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5sYWJlbEZyb20gPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5ERUZBVUxUUy52YWx1ZUZyb207XHJcbiAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCB2YWx1ZVBhdGgpO1xyXG5cclxuICAgIC8vZ2V0IGxhYmVsXHJcbiAgICBjb25zdCBsYWJlbFBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLmxhYmVsRnJvbSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLnZhbHVlRnJvbSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLmxhYmVsRnJvbTtcclxuICAgIGNvbnN0IGxhYmVsID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGxhYmVsUGF0aCkgPz8gdmFsdWU7XHJcblxyXG4gICAgLy9nZXQgZGlzYWJsZWRcclxuICAgIGNvbnN0IGRpc2FibGVkUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAuZGlzYWJsZWRGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMuZGlzYWJsZWRGcm9tO1xyXG4gICAgbGV0IGRpc2FibGVkID0gZXZhbHVhdGUocmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGRpc2FibGVkUGF0aCkpO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaW52ZXJ0RGlzYWJsZWQpIHtcclxuICAgICAgZGlzYWJsZWQgPSAhZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXQgZ3JvdXBzXHJcbiAgICBsZXQgZ3JvdXA6IGFueSA9IHVuZGVmaW5lZDtcclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmdyb3VwSXRlbXMpIHtcclxuICAgICAgaWYgKHJhd0l0ZW1EYXRhLiRhcmRncm91cCkge1xyXG4gICAgICAgIGdyb3VwID0gcmF3SXRlbURhdGEuJGFyZGdyb3VwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBncm91cEJ5ID0gdGhpcy5fYXJkUGFyZW50Q29tcC5ncm91cExhYmVsRnJvbSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLmdyb3VwTGFiZWxGcm9tO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZ3JvdXBCeSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgZ3JvdXAgPSByZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgZ3JvdXBCeSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGdyb3VwID0gKGdyb3VwQnkgYXMgR3JvdXBCeUZuKShyYXdJdGVtRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXRlbURhdGEgPSBhcmVJdGVtc1ByaW1pdGl2ZSA/IHJhd0l0ZW1EYXRhLnZhbHVlIDogcmF3SXRlbURhdGE7XHJcblxyXG4gICAgLy9yZXR1cm5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1EYXRhLFxyXG4gICAgICBpbmRleCxcclxuICAgICAgdmFsdWUsXHJcbiAgICAgIGxhYmVsOiBsYWJlbD8udG9TdHJpbmc/LigpID8/IFN0cmluZyhsYWJlbCksXHJcbiAgICAgIGRpc2FibGVkLFxyXG4gICAgICBncm91cCxcclxuICAgIH07XHJcbiAgfVxyXG4gIHByaXZhdGUgX3BvcHVsYXRlR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZ3JvdXBzID0gdGhpcy5fY3JlYXRlRW1wdHlHcm91cE1hcCgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCAmJiBpdGVtLnNlbGVjdGVkKSBjb250aW51ZTtcclxuXHJcbiAgICAgIHRoaXMuX2FkZFRvR3JvdXAoaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FkZFRvR3JvdXAoaXRlbTogQXJkT3B0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBncm91cEtleSA9IGl0ZW0uZ3JvdXA7XHJcbiAgICBsZXQgdGFyZ2V0R3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGdyb3VwS2V5KTtcclxuICAgIC8vY3JlYXRlIG5ldyBncm91cCBpZiBuZWVkZWRcclxuICAgIGlmICghdGFyZ2V0R3JvdXApIHtcclxuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cEtleSwge1xyXG4gICAgICAgIGxhYmVsOiBTdHJpbmcoZ3JvdXBLZXkgPz8gJycpLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbaXRlbV0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0YXJnZXRHcm91cC5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xyXG4gIH1cclxuICBwcml2YXRlIF9jcmVhdGVFbXB0eUdyb3VwTWFwKCkge1xyXG4gICAgcmV0dXJuIG5ldyBNYXAoW1t1bmRlZmluZWQsIHsgbGFiZWw6ICcnLCBjaGlsZHJlbjogW10gfV1dKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaXNXcml0ZVZhbHVlVmFsaWQobmdNb2RlbDogYW55W10pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBuZ01vZGVsLmV2ZXJ5KGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoIWlzRGVmaW5lZCh0aGlzLl9hcmRQYXJlbnRDb21wLmNvbXBhcmVXaXRoKSAmJiBpc09iamVjdChpdGVtKSAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLnZhbHVlRnJvbSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgU2V0dGluZyBvYmplY3QoJHtKU09OLnN0cmluZ2lmeShpdGVtKX0pIGFzIHlvdXIgbW9kZWwgd2l0aCBbdmFsdWVGcm9tXSBpcyBub3QgYWxsb3dlZCB1bmxlc3MgW2NvbXBhcmVXaXRoXSBpcyB1c2VkLmApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIF92YWx1ZVRvV3JpdGVBZnRlckl0ZW1zTG9hZDogYW55O1xyXG4gIHByaXZhdGUgX3dhc1ZhbHVlV3JpdGVEZWZlcnJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcclxuICAgIC8vZGVmZXIgd3JpdGluZyB0aGUgdmFsdWUgaWYgbm8gb3B0aW9ucyBhcmUgeWV0IGxvYWRlZFxyXG4gICAgaWYgKCF0aGlzLl93YXNWYWx1ZVdyaXRlRGVmZXJyZWQgJiYgdGhpcy5faXRlbXMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5fdmFsdWVUb1dyaXRlQWZ0ZXJJdGVtc0xvYWQgPSBuZ01vZGVsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFsbFNlbGVjdGVkKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1dyaXRlVmFsdWVWYWxpZChuZ01vZGVsKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0SXRlbUJ5VmFsdWUgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaXRlbSA9IHRoaXMuZmluZEl0ZW1CeVZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLndhcm4oYENvdWxkbid0IGZpbmQgYW4gaXRlbSB3aXRoIHZhbHVlICR7dmFsdWU/LnRvU3RyaW5nPy4oKSB8fCBTdHJpbmcodmFsdWUpfS5gKTtcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBtb2RlbFZhbHVlIG9mIG5nTW9kZWwpIHtcclxuICAgICAgc2VsZWN0SXRlbUJ5VmFsdWUobW9kZWxWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZpbmRJdGVtQnlWYWx1ZSh2YWx1ZVRvRmluZDogYW55KTogQXJkT3B0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBmaW5kQnk6IChpdGVtOiBBcmRPcHRpb24pID0+IGJvb2xlYW47XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5jb21wYXJlV2l0aCkge1xyXG4gICAgICBmaW5kQnkgPSBpdGVtID0+IHRoaXMuX2FyZFBhcmVudENvbXAuY29tcGFyZVdpdGghKHZhbHVlVG9GaW5kLCBpdGVtLnZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbmRCeSA9IGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWVUb0ZpbmQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXMuZmluZChpdGVtID0+IGZpbmRCeShpdGVtKSk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZEN1c3RvbU9wdGlvbih2YWx1ZTogc3RyaW5nLCBmbjogQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4pOiBQcm9taXNlPEFyZE9wdGlvbj4ge1xyXG4gICAgY29uc3QgZm5SZXN1bHQgPSBmbih2YWx1ZSk7XHJcblxyXG4gICAgbGV0IG9wdGlvblZhbHVlID0gZm5SZXN1bHQ7XHJcbiAgICBpZiAoaXNQcm9taXNlKG9wdGlvblZhbHVlKSkgb3B0aW9uVmFsdWUgPSBhd2FpdCBvcHRpb25WYWx1ZTtcclxuXHJcbiAgICBjb25zdCBuZXdPcHRpb25PYmogPSB0aGlzLl9hZGRTaW5nbGVJdGVtKG9wdGlvblZhbHVlKTtcclxuXHJcbiAgICByZXR1cm4gbmV3T3B0aW9uT2JqO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJBbGxTZWxlY3RlZChyZXBvcHVsYXRlR3JvdXBzOiBib29sZWFuID0gZmFsc2UpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVtb3ZlZEl0ZW1WYWx1ZXMgPSB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zID0gW107XHJcblxyXG4gICAgaWYgKHJlcG9wdWxhdGVHcm91cHMgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQpIHRoaXMuX3BvcHVsYXRlR3JvdXBzKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlbW92ZWRJdGVtVmFsdWVzO1xyXG4gIH1cclxuICBjbGVhckxhc3RTZWxlY3RlZCgpOiBBcmRPcHRpb24ge1xyXG4gICAgbGV0IGl0ZW0gPSB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxhc3QoKTtcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIGl0ZW07XHJcbiAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IFthbnlbXSwgYW55W10sIGFueVtdXSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIFtbXSwgW10sIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtcyldO1xyXG4gICAgfVxyXG4gICAgbGV0IHVuc2VsZWN0ZWQgPSBbXTtcclxuICAgIGlmICghdGhpcy5fYXJkUGFyZW50Q29tcC5tdWx0aXNlbGVjdGFibGUpIHtcclxuICAgICAgdW5zZWxlY3RlZCA9IHRoaXMuY2xlYXJBbGxTZWxlY3RlZChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGl0ZW1zU2VsZWN0ZWRDb3VudCA9IDA7XHJcbiAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaXRlbXNTZWxlY3RlZENvdW50Kys7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSBjb250aW51ZTtcclxuICAgICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgaXRlbXNTZWxlY3RlZC5wdXNoKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zRmFpbGVkVG9TZWxlY3QgPSBpdGVtcy5zbGljZShpdGVtc1NlbGVjdGVkQ291bnQgLSAxKTtcclxuICAgIHJldHVybiBbdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zU2VsZWN0ZWQpLCB1bnNlbGVjdGVkLCB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNGYWlsZWRUb1NlbGVjdCldO1xyXG4gIH1cclxuICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogYW55W10ge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmICghaXRlbS5zZWxlY3RlZCkgY29udGludWU7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMgPSB0aGlzLl9zZWxlY3RlZEl0ZW1zLmZpbHRlcih2ID0+IHYuc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCkgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQWxsSGlnaGxpZ2h0cygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zKSB7XHJcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5faGlnaGxpZ2h0ZWRHcm91cHMpIHtcclxuICAgICAgZ3JvdXAuaGlnaGxpZ2h0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMgPSBbXTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkR3JvdXBzID0gW107XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEdyb3VwKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEFyZE9wdGlvbiB7XHJcbiAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xyXG4gICAgZ3JvdXAuaGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5oaWdobGlnaHRJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKTtcclxuICAgIHJldHVybiBncm91cC5jaGlsZHJlbi5maXJzdCgpO1xyXG4gIH1cclxuICBoaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW06IEFyZE9wdGlvbik6IEFyZE9wdGlvbiB8IG51bGwge1xyXG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGlzYWJsZWQpIHJldHVybiBudWxsO1xyXG4gICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogQXJkT3B0aW9uIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMucHVzaCguLi5pdGVtcyk7XHJcbiAgICByZXR1cm4gaXRlbXMubGFzdCgpO1xyXG4gIH1cclxuICB1bmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmhpZ2hsaWdodGVkKSByZXR1cm47XHJcblxyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zID0gdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcy5maWx0ZXIodiA9PiB2LmhpZ2hsaWdodGVkKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0Rmlyc3RJdGVtKCk6IEFyZE9wdGlvbiB8IG51bGwge1xyXG4gICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcclxuICAgIGxldCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodFNpbmdsZUl0ZW0oaXRlbXNUb0hpZ2hsaWdodC5maXJzdCgpKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TGFzdEl0ZW0oKTogQXJkT3B0aW9uIHwgbnVsbCB7XHJcbiAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xyXG4gICAgbGV0IGl0ZW1zVG9IaWdobGlnaHQgPSB0aGlzLl9nZXRIaWdsaWdodGFibGVJdGVtcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtc1RvSGlnaGxpZ2h0Lmxhc3QoKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2dldEhpZ2xpZ2h0YWJsZUl0ZW1zKCk6IEFyZE9wdGlvbltdIHtcclxuICAgIGxldCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZmlsdGVyZWRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCk7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQpIHtcclxuICAgICAgaXRlbXNUb0hpZ2hsaWdodCA9IGl0ZW1zVG9IaWdobGlnaHQuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW1zVG9IaWdobGlnaHQ7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEFsbEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgbGV0IGl0ZW1zVG9IaWdobGlnaHQgPSB0aGlzLl9maWx0ZXJlZEl0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKTtcclxuXHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQpIHtcclxuICAgICAgaXRlbXNUb0hpZ2hsaWdodCA9IGl0ZW1zVG9IaWdobGlnaHQuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oaWdobGlnaHRJdGVtKC4uLml0ZW1zVG9IaWdobGlnaHQpO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGVhclJlY2VudGx5SGlnaGxpZ2h0ZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmVjZW50bHlIaWdobGlnaHRlZEl0ZW0pIHtcclxuICAgICAgdGhpcy5fcmVjZW50bHlIaWdobGlnaHRlZEl0ZW0uaGlnaGxpZ2h0ZWRfcmVjZW50bHkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0UmVjZW50bHlIaWdobGlnaHRlZChpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NsZWFyUmVjZW50bHlIaWdobGlnaHRlZCgpO1xyXG4gICAgdGhpcy5fcmVjZW50bHlIaWdobGlnaHRlZEl0ZW0gPSBpdGVtO1xyXG4gICAgdGhpcy5fcmVjZW50bHlIaWdobGlnaHRlZEl0ZW0uaGlnaGxpZ2h0ZWRfcmVjZW50bHkgPSB0cnVlO1xyXG4gIH1cclxuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkT3B0aW9uIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuaXNBbnlJdGVtSGlnaGxpZ2h0ZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0Rmlyc3RJdGVtKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtcy5sYXN0KCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRhYmxlSXRlbXMgPSB0aGlzLl9nZXRIaWdsaWdodGFibGVJdGVtcygpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4SW5GaWx0ZXJlZCA9IGhpZ2hsaWdodGFibGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmluZGV4ID09IGN1cnJlbnRJdGVtLmluZGV4KTtcclxuXHJcbiAgICBsZXQgbmV4dEl0ZW1JbmRleCA9IGN1cnJlbnRJbmRleEluRmlsdGVyZWQgKyBvZmZzZXQ7XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA+PSBoaWdobGlnaHRhYmxlSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIG5leHRJdGVtSW5kZXggLT0gaGlnaGxpZ2h0YWJsZUl0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGlmIChuZXh0SXRlbUluZGV4IDwgMCkge1xyXG4gICAgICBuZXh0SXRlbUluZGV4ICs9IGhpZ2hsaWdodGFibGVJdGVtcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSBoaWdobGlnaHRhYmxlSXRlbXNbbmV4dEl0ZW1JbmRleF07XHJcblxyXG4gICAgaWYgKGhhc1NoaWZ0ICYmIHRoaXMuX2FyZFBhcmVudENvbXAubXVsdGlzZWxlY3RhYmxlKSB7XHJcbiAgICAgIGlmIChpdGVtVG9IaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHtcclxuICAgICAgICB0aGlzLnVuaGlnaGxpZ2h0SXRlbShjdXJyZW50SXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gIH1cclxuICBmaWx0ZXIoZmlsdGVyVGVybTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgaWYgKCFmaWx0ZXJUZXJtKSB7XHJcbiAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZCgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuX2ZpbHRlcmVkSXRlbXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLl9hcmRQYXJlbnRDb21wLnNlYXJjaENhc2VTZW5zaXRpdmUpIHtcclxuICAgICAgZmlsdGVyVGVybSA9IGZpbHRlclRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWFyY2hGbiA9IHRoaXMuX2FyZFBhcmVudENvbXAuc2VhcmNoRm47XHJcbiAgICB0aGlzLl9maWx0ZXJlZEl0ZW1zID0gdGhpcy5faXRlbXMuZmlsdGVyKGl0ZW0gPT4gc2VhcmNoRm4oZmlsdGVyVGVybSwgaXRlbSkpO1xyXG5cclxuICAgIHRoaXMuX3BvcHVsYXRlR3JvdXBzKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzTm9JdGVtc0ZvdW5kKSB0aGlzLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xyXG4gICAgZWxzZSB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fZmlsdGVyZWRJdGVtcyk7XHJcbiAgfVxyXG4gIHJlc2V0RmlsdGVyZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyZWRJdGVtcy5sZW5ndGggPT0gdGhpcy5faXRlbXMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaGlkZVNlbGVjdGVkICYmIHRoaXMuaXNBbnlJdGVtU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5fZmlsdGVyZWRJdGVtcyA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLnNlbGVjdGVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcmVkSXRlbXMgPSB0aGlzLl9pdGVtcztcclxuICAgIH1cclxuICAgIHRoaXMuX3BvcHVsYXRlR3JvdXBzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9faW50ZXJuYWwvaXRlbS1zdG9yYWdlcy9kcm9wZG93bi1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQW1DbEcsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFBNkIsY0FBK0I7UUFBL0IsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBUjNDLFlBQU8sR0FBRyxNQUFNLENBQWtCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsV0FBTSxHQUFHLE1BQU0sQ0FBYyxFQUFFLENBQUMsQ0FBQztRQUNqQyxtQkFBYyxHQUFHLE1BQU0sQ0FBYyxFQUFFLENBQUMsQ0FBQztRQUN6QyxzQkFBaUIsR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUMsdUJBQWtCLEdBQUcsTUFBTSxDQUFtQixFQUFFLENBQUMsQ0FBQztRQUNsRCw2QkFBd0IsR0FBRyxNQUFNLENBQXNCLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLG1CQUFjLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO1FBSWpELFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FDNUMsQ0FBQztRQUNPLFVBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLGtCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqRCxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkQsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDekMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNNLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUzRixVQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUtqRSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUYsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSx5QkFBb0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLHVCQUFrQixHQUFHLFFBQVEsQ0FDcEMsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUU7WUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FDekUsQ0FBQztRQStNZSxnQ0FBMkIsR0FBRyxNQUFNLENBQU0sU0FBUyxDQUFDLENBQUM7UUFDckQsMkJBQXNCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBblBGLENBQUM7SUFzQnhELGFBQWEsQ0FBQyxLQUFrQjtRQUN0QyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBYUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQ3RGLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUMxQixJQUFJLFFBQWUsQ0FBQztnQkFDcEIsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDN0MsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDYixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV2QyxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLHVCQUF1QjtRQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNPLGNBQWMsQ0FBQyxJQUFTO1FBQzlCLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyx5Q0FBeUM7UUFDekMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxzQ0FBc0M7UUFDdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRXZHLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzQyxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDTyxvQkFBb0IsQ0FBSSxJQUFPO1FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNPLDJCQUEyQixDQUFtQixLQUFRO1FBQzVELHFDQUFxQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUVwRyw2QkFBNkI7UUFDN0IsSUFBSSxTQUFjLENBQUM7UUFDbkIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELCtCQUErQjtRQUMvQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUVyRyxvQkFBb0I7UUFDcEIsSUFBSSxVQUFVLEdBQVEsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV2RCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhFLG9FQUFvRTtRQUNwRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsK0JBQStCO1FBQy9CLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ08sY0FBYyxDQUFDLFdBQWdCLEVBQUUsS0FBYSxFQUFFLGlCQUEwQjtRQUNoRixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsT0FBTztnQkFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0UsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUN2QixXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3hCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDcEMsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXO1FBQ1gsTUFBTSxTQUFTLEdBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMvRyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWxELFdBQVc7UUFDWCxNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQy9HLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDO1FBRTNELGNBQWM7UUFDZCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNyRyxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBRUQsWUFBWTtRQUNaLElBQUksS0FBSyxHQUFRLFNBQVMsQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2hDLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUTtRQUNSLE9BQU87WUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUM3QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMxQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN2QixXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUMxQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3BDLENBQUM7SUFDSixDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQUUsU0FBUztZQUVwRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBQ08sV0FBVyxDQUFDLElBQWU7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO29CQUNoQixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3JDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN2QixXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2dCQUNILE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUNELFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsT0FBTyxJQUFJLEdBQUcsQ0FBQztZQUNiO2dCQUNFLFNBQVM7Z0JBQ1Q7b0JBQ0UsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDdkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUMzQjthQUNGO1NBQ0YsQ0FBb0IsQ0FBQztJQUN4QixDQUFDO0lBQ08sa0JBQWtCLENBQUMsT0FBYztRQUN2QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JHLE9BQU8sQ0FBQyxJQUFJLENBQ1YsU0FBUyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVkscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQzFFLElBQUksQ0FDTCwrRUFBK0UsQ0FDakYsQ0FBQztnQkFDRixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELGdCQUFnQixDQUFDLE9BQWM7UUFDN0Isc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FDVixTQUFTLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSx1Q0FBdUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ3hILENBQUM7UUFDSixDQUFDLENBQUM7UUFFRixLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsZUFBZSxDQUFDLFdBQWdCO1FBQzlCLElBQUksTUFBb0MsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0UsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBYSxFQUFFLEVBQWdEO1FBQ25GLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQixJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDM0IsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQUUsV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDO1FBRTVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdEQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLEtBQUs7UUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVCLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFbkYsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxVQUFVLENBQUMsR0FBRyxLQUFrQjtRQUM5QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFBRSxTQUFTO1lBQzlCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztnQkFDOUIsTUFBTTtZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5QyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFHLEtBQWtCO1FBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQUUsU0FBUztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQzlDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFxQjtRQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELG1CQUFtQixDQUFDLElBQWU7UUFDakMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxhQUFhLENBQUMsR0FBRyxLQUFrQjtRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckQsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELGVBQWUsQ0FBQyxHQUFHLEtBQWtCO1FBQ25DLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFFdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDTyxxQkFBcUI7UUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ08seUJBQXlCO1FBQy9CLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsd0JBQXdCLEVBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxJQUFlO1FBQ3BDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsTUFBYyxFQUFFLFFBQWtCO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEQsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFMUcsSUFBSSxhQUFhLEdBQUcsc0JBQXNCLEdBQUcsTUFBTSxDQUFDO1FBQ3BELElBQUksYUFBYSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTFELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLENBQUMsVUFBa0I7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQy9DLFVBQVUsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEYsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDbkUsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgcmVzb2x2ZVBhdGggZnJvbSAncmVzb2x2ZS1vYmplY3QtcGF0aCc7XG5pbXBvcnQgeyBhbnksIGV2YWx1YXRlLCBpc0FycmF5LCBpc0RlZmluZWQsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNQcm9taXNlIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgQWRkQ3VzdG9tRm4gfSBmcm9tICcuLi8uLi9zZWxlY3Qvc2VsZWN0LnR5cGVzJztcbmltcG9ydCB7IEFyZEl0ZW1Hcm91cE1hcCwgQXJkT3B0aW9uLCBBcmRPcHRpb25Hcm91cCwgQ29tcGFyZVdpdGhGbiwgR3JvdXBCeUZuLCBTZWFyY2hGbiB9IGZyb20gJy4uLy4uL3R5cGVzL2l0ZW0tc3RvcmFnZS50eXBlcyc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzIHtcbiAgdmFsdWVGcm9tOiBzdHJpbmc7XG4gIGxhYmVsRnJvbTogc3RyaW5nO1xuICBkaXNhYmxlZEZyb206IHN0cmluZztcbiAgZ3JvdXBMYWJlbEZyb206IHN0cmluZztcbiAgZ3JvdXBEaXNhYmxlZEZyb206IHN0cmluZztcbiAgY2hpbGRyZW5Gcm9tOiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0b3JhZ2VIb3N0IHtcbiAgcmVhZG9ubHkgdmFsdWVGcm9tOiBTaWduYWw8TnVsbGFibGU8c3RyaW5nPj47XG4gIHJlYWRvbmx5IGxhYmVsRnJvbTogU2lnbmFsPE51bGxhYmxlPHN0cmluZz4+O1xuICByZWFkb25seSBkaXNhYmxlZEZyb206IFNpZ25hbDxOdWxsYWJsZTxzdHJpbmc+PjtcbiAgcmVhZG9ubHkgaW52ZXJ0RGlzYWJsZWQ6IFNpZ25hbDxOdWxsYWJsZTxib29sZWFuPj47XG4gIHJlYWRvbmx5IGdyb3VwTGFiZWxGcm9tOiBTaWduYWw8TnVsbGFibGU8c3RyaW5nIHwgR3JvdXBCeUZuPj47XG4gIHJlYWRvbmx5IGdyb3VwRGlzYWJsZWRGcm9tOiBTaWduYWw8TnVsbGFibGU8c3RyaW5nPj47XG4gIHJlYWRvbmx5IGNoaWxkcmVuRnJvbTogU2lnbmFsPE51bGxhYmxlPHN0cmluZz4+O1xuICByZWFkb25seSBERUZBVUxUUzogSXRlbVN0b3JhZ2VIb3N0RGVmYXVsdHM7XG4gIHJlYWRvbmx5IGl0ZW1zQWxyZWFkeUdyb3VwZWQ6IFNpZ25hbDxOdWxsYWJsZTxib29sZWFuPj47XG4gIHJlYWRvbmx5IGhpZGVTZWxlY3RlZDogU2lnbmFsPGJvb2xlYW4+O1xuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlOiBTaWduYWw8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IHNlYXJjaEZuOiBTaWduYWw8U2VhcmNoRm4+O1xuICByZWFkb25seSBjb21wYXJlV2l0aDogU2lnbmFsPE51bGxhYmxlPENvbXBhcmVXaXRoRm4+PjtcbiAgcmVhZG9ubHkgbXVsdGlzZWxlY3RhYmxlOiBTaWduYWw8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IHNvcnRNdWx0aXBsZVZhbHVlczogU2lnbmFsPGJvb2xlYW4+O1xuICByZWFkb25seSBtYXhTZWxlY3RlZEl0ZW1zOiBTaWduYWw8TnVsbGFibGU8bnVtYmVyPj47XG4gIHJlYWRvbmx5IGFkZEN1c3RvbTogU2lnbmFsPGJvb2xlYW4gfCBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+Pj47XG4gIHJlYWRvbmx5IF9jb21wb25lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgSXRlbVN0b3JhZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ncm91cHMgPSBzaWduYWw8QXJkSXRlbUdyb3VwTWFwPih0aGlzLl9jcmVhdGVFbXB0eUdyb3VwTWFwKCkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pdGVtcyA9IHNpZ25hbDxBcmRPcHRpb25bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJlZEl0ZW1zID0gc2lnbmFsPEFyZE9wdGlvbltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hpZ2hsaWdodGVkSXRlbXMgPSBzaWduYWw8QXJkT3B0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGlnaGxpZ2h0ZWRHcm91cHMgPSBzaWduYWw8QXJkT3B0aW9uR3JvdXBbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWNlbnRseUhpZ2hsaWdodGVkSXRlbSA9IHNpZ25hbDxOdWxsYWJsZTxBcmRPcHRpb24+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZEl0ZW1zID0gc2lnbmFsPEFyZE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfYXJkUGFyZW50Q29tcDogSXRlbVN0b3JhZ2VIb3N0KSB7fVxuXG4gIHJlYWRvbmx5IGdyb3VwcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgQXJyYXkuZnJvbSh0aGlzLl9ncm91cHMoKS5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbLCBncm91cF0pID0+IGdyb3VwKVxuICAgICAgLmZpbHRlcihncm91cCA9PiBncm91cC5jaGlsZHJlbigpLmxlbmd0aClcbiAgKTtcbiAgcmVhZG9ubHkgaXRlbXMgPSB0aGlzLl9pdGVtcy5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkSXRlbXMgPSB0aGlzLl9maWx0ZXJlZEl0ZW1zLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgaGlnaGxpZ2h0ZWRJdGVtcyA9IHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMuYXNSZWFkb25seSgpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuc29ydE11bHRpcGxlVmFsdWVzKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zKCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gYS5pbmRleCgpIC0gYi5pbmRleCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zKCk7XG4gIH0pO1xuICByZWFkb25seSBsYXN0U2VsZWN0ZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyZWRJdGVtcygpLmxhc3QoMSwgaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCgpKSk7XG5cbiAgcmVhZG9ubHkgdmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKCkpKTtcbiAgcHJpdmF0ZSBfaXRlbXNUb1ZhbHVlKGl0ZW1zOiBBcmRPcHRpb25bXSk6IGFueVtdIHtcbiAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSgpKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGlzTm9JdGVtc1RvU2VsZWN0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXRlbXMoKS5sZW5ndGggPT09IHRoaXMuX3NlbGVjdGVkSXRlbXMoKS5sZW5ndGgpO1xuICByZWFkb25seSBpc05vSXRlbXNGb3VuZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2ZpbHRlcmVkSXRlbXMoKS5sZW5ndGggPT09IDApO1xuICByZWFkb25seSBpc0FueUl0ZW1TZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3NlbGVjdGVkSXRlbXMoKS5sZW5ndGggPiAwKTtcbiAgcmVhZG9ubHkgaXNBbnlJdGVtSGlnaGxpZ2h0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zKCkubGVuZ3RoID4gMCk7XG4gIHJlYWRvbmx5IGlzSXRlbUxpbWl0UmVhY2hlZCA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSgpICYmXG4gICAgICBpc0RlZmluZWQodGhpcy5fYXJkUGFyZW50Q29tcC5tYXhTZWxlY3RlZEl0ZW1zKCkpICYmXG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMoKSEgPD0gdGhpcy5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoXG4gICk7XG5cbiAgc2V0SXRlbXMoaXRlbXM6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgbGV0IGFyZUl0ZW1zUHJpbWl0aXZlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuZ3JvdXBMYWJlbEZyb20oKSAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLml0ZW1zQWxyZWFkeUdyb3VwZWQoKSkge1xuICAgICAgY29uc3QgbmV3SXRlbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgaXRlbXMpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuOiBhbnlbXTtcbiAgICAgICAgW2NoaWxkcmVuLCBhcmVJdGVtc1ByaW1pdGl2ZV0gPSB0aGlzLl91bmdyb3VwQWxyZWFkeUdyb3VwZWRJdGVtcyhncm91cCk7XG4gICAgICAgIG5ld0l0ZW1zLnB1c2goLi4uY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgaXRlbXMgPSBuZXdJdGVtcztcbiAgICB9XG4gICAgaWYgKGFueShpdGVtcywgaXNQcmltaXRpdmUpKSB7XG4gICAgICBpdGVtcyA9IGl0ZW1zLm1hcCh0aGlzLl9wcmltaXRpdmVJdGVtc01hcEZuKTtcbiAgICAgIGFyZUl0ZW1zUHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9pdGVtcy5zZXQoXG4gICAgICBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRJdGVtc01hcEZuKGl0ZW0sIGluZGV4LCBhcmVJdGVtc1ByaW1pdGl2ZSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvL2FkZCBhbGwgaXRlbXMgdG8gZmlsdGVyIGFycmF5XG4gICAgdGhpcy5fZmlsdGVyZWRJdGVtcy5zZXQodGhpcy5faXRlbXMoKSk7XG5cbiAgICAvL2FkZCBpdGVtcyB0byBncm91cHNcbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xuXG4gICAgLy93cml0ZSB2YWx1ZSBpZiBpdCB3YXNcbiAgICBjb25zdCB0b1dyaXRlID0gdGhpcy5fdmFsdWVUb1dyaXRlQWZ0ZXJJdGVtc0xvYWQoKTtcbiAgICBpZiAodG9Xcml0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhhbmRsZVdyaXRlVmFsdWUodG9Xcml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZUl0ZW1zUHJpbWl0aXZlO1xuICB9XG4gIHByaXZhdGUgX2FkZFNpbmdsZUl0ZW0oaXRlbTogYW55KTogQXJkT3B0aW9uIHtcbiAgICBjb25zdCBpc0l0ZW1QcmltaXRpdmUgPSBpc1ByaW1pdGl2ZShpdGVtKTtcbiAgICAvL21hcCBhIHByaW1pdGl2ZSBpdGVtIHRvIGEgdXNhYmxlIG9iamVjdFxuICAgIGlmIChpc0l0ZW1QcmltaXRpdmUpIHtcbiAgICAgIGl0ZW0gPSB0aGlzLl9wcmltaXRpdmVJdGVtc01hcEZuKGl0ZW0pO1xuICAgIH1cbiAgICAvL21hcCB0aGUgaXRlbSB0byBjcmVhdGUgZGF0YSBiaW5kaW5nc1xuICAgIGNvbnN0IGFyZE9wdGlvbiA9IHRoaXMuX3NldEl0ZW1zTWFwRm4oaXRlbSwgKHRoaXMuX2l0ZW1zKCkubGFzdCgpPy5pbmRleCgpID8/IDApICsgMSwgaXNJdGVtUHJpbWl0aXZlKTtcblxuICAgIC8vcHVzaCB0aGUgaXRlbSBpbnRvIGFsbCBpdGVtc1xuICAgIHRoaXMuX2l0ZW1zLnVwZGF0ZSh2ID0+IFsuLi52LCBhcmRPcHRpb25dKTtcblxuICAgIC8vYWRkIGl0ZW0gdG8gZ3JvdXBzXG4gICAgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcblxuICAgIHJldHVybiBhcmRPcHRpb247XG4gIH1cbiAgcHJpdmF0ZSBfcHJpbWl0aXZlSXRlbXNNYXBGbjxUPihpdGVtOiBUKTogeyB2YWx1ZTogVCB9IHtcbiAgICByZXR1cm4geyB2YWx1ZTogaXRlbSB9O1xuICB9XG4gIHByaXZhdGUgX3VuZ3JvdXBBbHJlYWR5R3JvdXBlZEl0ZW1zPFQgZXh0ZW5kcyBvYmplY3Q+KGdyb3VwOiBUKTogW2FueVtdLCBib29sZWFuXSB7XG4gICAgLy9kZXRlcm1pbmUgZ3JvdXBCeSAoZ3JvdXBMYWJlbCkgcGF0aFxuICAgIGNvbnN0IGdyb3VwQnkgPSB0aGlzLl9hcmRQYXJlbnRDb21wLmdyb3VwTGFiZWxGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5ERUZBVUxUUy5ncm91cExhYmVsRnJvbTtcblxuICAgIC8vZ2V0IGdyb3VwIGxhYmVsIGZyb20gb2JqZWN0XG4gICAgbGV0IGdyb3VwTmFtZTogYW55O1xuICAgIGlmICh0eXBlb2YgZ3JvdXBCeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGdyb3VwTmFtZSA9IHJlc29sdmVQYXRoKGdyb3VwLCBncm91cEJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBOYW1lID0gZ3JvdXBCeShncm91cCk7XG4gICAgfVxuXG4gICAgLy9kZXRlcm1pbmUgZ3JvdXAgY2hpbGRyZW4gcGF0aFxuICAgIGNvbnN0IGNoaWxkcmVuUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAuY2hpbGRyZW5Gcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5ERUZBVUxUUy5jaGlsZHJlbkZyb207XG5cbiAgICAvL2dldCBncm91cCBjaGlsZHJlblxuICAgIGxldCBncm91cEl0ZW1zOiBhbnkgPSByZXNvbHZlUGF0aChncm91cCwgY2hpbGRyZW5QYXRoKTtcblxuICAgIC8vcmV0dXJuIGVtcHR5IGFycmF5IGlmIGdyb3VwSXRlbXMgaXMgbm90IGFuIGFycmF5IG9yIGlzIGVtcHR5XG4gICAgaWYgKCFpc0FycmF5KGdyb3VwSXRlbXMpIHx8IGdyb3VwSXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gW1tdLCBmYWxzZV07XG5cbiAgICAvL2NoZWNrIGlmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiBwcmltaXRpdmVzLCBhbmQgbWFwIGl0IGlmIG5lZWRlZFxuICAgIGNvbnN0IGFyZUl0ZW1zUHJpbWl0aXZlID0gZmFsc2U7XG4gICAgaWYgKGFueShncm91cEl0ZW1zLCBpc1ByaW1pdGl2ZSkpIHtcbiAgICAgIGdyb3VwSXRlbXMgPSBncm91cEl0ZW1zLm1hcCh0aGlzLl9wcmltaXRpdmVJdGVtc01hcEZuKTtcbiAgICB9XG4gICAgLy9hZGQgZ3JvdXAgbmFtZSB0byBldmVyeSBjaGlsZFxuICAgIGdyb3VwSXRlbXMgPSBncm91cEl0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBpdGVtLiRhcmRncm91cCA9IGdyb3VwTmFtZTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtncm91cEl0ZW1zLCBhcmVJdGVtc1ByaW1pdGl2ZV07XG4gIH1cbiAgcHJpdmF0ZSBfc2V0SXRlbXNNYXBGbihyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyLCBhcmVJdGVtc1ByaW1pdGl2ZTogYm9vbGVhbik6IEFyZE9wdGlvbiB7XG4gICAgaWYgKGFyZUl0ZW1zUHJpbWl0aXZlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpdGVtRGF0YTogc2lnbmFsKHJhd0l0ZW1EYXRhKSxcbiAgICAgICAgaW5kZXg6IHNpZ25hbChpbmRleCksXG4gICAgICAgIHZhbHVlOiBzaWduYWwocmF3SXRlbURhdGEudmFsdWUpLFxuICAgICAgICBsYWJlbDogc2lnbmFsKHJhd0l0ZW1EYXRhLnZhbHVlPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKHJhd0l0ZW1EYXRhLnZhbHVlKSksXG4gICAgICAgIGRpc2FibGVkOiBzaWduYWwoZmFsc2UpLFxuICAgICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgaGlnaGxpZ2h0ZWQ6IHNpZ25hbChmYWxzZSksXG4gICAgICAgIGdyb3VwOiBzaWduYWwodW5kZWZpbmVkKSxcbiAgICAgICAgaGlnaGxpZ2h0ZWRfcmVjZW50bHk6IHNpZ25hbChmYWxzZSksXG4gICAgICB9O1xuICAgIH1cbiAgICAvL2dldCB2YWx1ZVxuICAgIGNvbnN0IHZhbHVlUGF0aCA9XG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLnZhbHVlRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAubGFiZWxGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5ERUZBVUxUUy52YWx1ZUZyb207XG4gICAgY29uc3QgdmFsdWUgPSByZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgdmFsdWVQYXRoKTtcblxuICAgIC8vZ2V0IGxhYmVsXG4gICAgY29uc3QgbGFiZWxQYXRoID1cbiAgICAgIHRoaXMuX2FyZFBhcmVudENvbXAubGFiZWxGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLmxhYmVsRnJvbTtcbiAgICBjb25zdCBsYWJlbCA9IHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBsYWJlbFBhdGgpID8/IHZhbHVlO1xuXG4gICAgLy9nZXQgZGlzYWJsZWRcbiAgICBjb25zdCBkaXNhYmxlZFBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLmRpc2FibGVkRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMuZGlzYWJsZWRGcm9tO1xuICAgIGxldCBkaXNhYmxlZCA9IGV2YWx1YXRlKHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBkaXNhYmxlZFBhdGgpKTtcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5pbnZlcnREaXNhYmxlZCgpKSB7XG4gICAgICBkaXNhYmxlZCA9ICFkaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvL2dldCBncm91cHNcbiAgICBsZXQgZ3JvdXA6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBncm91cEJ5ID0gdGhpcy5fYXJkUGFyZW50Q29tcC5ncm91cExhYmVsRnJvbSgpO1xuICAgIGlmIChncm91cEJ5KSB7XG4gICAgICBpZiAocmF3SXRlbURhdGEuJGFyZGdyb3VwKSB7XG4gICAgICAgIGdyb3VwID0gcmF3SXRlbURhdGEuJGFyZGdyb3VwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBncm91cEJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGdyb3VwID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGdyb3VwQnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyb3VwID0gZ3JvdXBCeShyYXdJdGVtRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3JldHVyblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtRGF0YTogc2lnbmFsKHJhd0l0ZW1EYXRhKSxcbiAgICAgIGluZGV4OiBzaWduYWwoaW5kZXgpLFxuICAgICAgdmFsdWU6IHNpZ25hbCh2YWx1ZSksXG4gICAgICBsYWJlbDogc2lnbmFsKGxhYmVsPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKGxhYmVsKSksXG4gICAgICBkaXNhYmxlZDogc2lnbmFsKGRpc2FibGVkKSxcbiAgICAgIGdyb3VwOiBzaWduYWwoZ3JvdXApLFxuICAgICAgc2VsZWN0ZWQ6IHNpZ25hbChmYWxzZSksXG4gICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgIGhpZ2hsaWdodGVkX3JlY2VudGx5OiBzaWduYWwoZmFsc2UpLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBfcG9wdWxhdGVHcm91cHMoKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBzLnNldCh0aGlzLl9jcmVhdGVFbXB0eUdyb3VwTWFwKCkpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX2ZpbHRlcmVkSXRlbXMoKSkge1xuICAgICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaGlkZVNlbGVjdGVkKCkgJiYgaXRlbS5zZWxlY3RlZCgpKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5fYWRkVG9Hcm91cChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfYWRkVG9Hcm91cChpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBncm91cEtleSA9IGl0ZW0uZ3JvdXAoKTtcbiAgICBjb25zdCB0YXJnZXRHcm91cCA9IHRoaXMuX2dyb3VwcygpLmdldChncm91cEtleSk7XG4gICAgLy9jcmVhdGUgbmV3IGdyb3VwIGlmIG5lZWRlZFxuICAgIGlmICghdGFyZ2V0R3JvdXApIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy51cGRhdGUodiA9PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAodik7XG4gICAgICAgIG1hcC5zZXQoZ3JvdXBLZXksIHtcbiAgICAgICAgICBsYWJlbDogc2lnbmFsKFN0cmluZyhncm91cEtleSA/PyAnJykpLFxuICAgICAgICAgIGNoaWxkcmVuOiBzaWduYWwoW2l0ZW1dKSxcbiAgICAgICAgICBkaXNhYmxlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGFyZ2V0R3JvdXAuY2hpbGRyZW4udXBkYXRlKHYgPT4gWy4uLnYsIGl0ZW1dKTtcbiAgfVxuICBwcml2YXRlIF9jcmVhdGVFbXB0eUdyb3VwTWFwKCk6IEFyZEl0ZW1Hcm91cE1hcCB7XG4gICAgcmV0dXJuIG5ldyBNYXAoW1xuICAgICAgW1xuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogc2lnbmFsKCcnKSxcbiAgICAgICAgICBjaGlsZHJlbjogc2lnbmFsKFtdKSxcbiAgICAgICAgICBkaXNhYmxlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgXSkgYXMgQXJkSXRlbUdyb3VwTWFwO1xuICB9XG4gIHByaXZhdGUgX2lzV3JpdGVWYWx1ZVZhbGlkKG5nTW9kZWw6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5nTW9kZWwuZXZlcnkoaXRlbSA9PiB7XG4gICAgICBpZiAoIWlzRGVmaW5lZCh0aGlzLl9hcmRQYXJlbnRDb21wLmNvbXBhcmVXaXRoKSAmJiBpc09iamVjdChpdGVtKSAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLnZhbHVlRnJvbSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQVJELVdBJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnRJZH0wOiBTZXR0aW5nIG9iamVjdCgke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICl9KSBhcyB5b3VyIG1vZGVsIHdpdGggW3ZhbHVlRnJvbV0gaXMgbm90IGFsbG93ZWQgdW5sZXNzIFtjb21wYXJlV2l0aF0gaXMgdXNlZC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlVG9Xcml0ZUFmdGVySXRlbXNMb2FkID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd2FzVmFsdWVXcml0ZURlZmVycmVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgaGFuZGxlV3JpdGVWYWx1ZShuZ01vZGVsOiBhbnlbXSk6IHZvaWQge1xuICAgIC8vZGVmZXIgd3JpdGluZyB0aGUgdmFsdWUgaWYgbm8gb3B0aW9ucyBhcmUgeWV0IGxvYWRlZFxuICAgIGlmICghdGhpcy5fd2FzVmFsdWVXcml0ZURlZmVycmVkKCkgJiYgdGhpcy5faXRlbXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3ZhbHVlVG9Xcml0ZUFmdGVySXRlbXNMb2FkLnNldChuZ01vZGVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyQWxsU2VsZWN0ZWQoKTtcblxuICAgIGlmICghdGhpcy5faXNXcml0ZVZhbHVlVmFsaWQobmdNb2RlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RJdGVtQnlWYWx1ZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5maW5kSXRlbUJ5VmFsdWUodmFsdWUpO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEFSRC1XQSR7dGhpcy5fYXJkUGFyZW50Q29tcC5fY29tcG9uZW50SWR9MTogQ291bGRuJ3QgZmluZCBhbiBpdGVtIHdpdGggdmFsdWUgJHt2YWx1ZT8udG9TdHJpbmc/LigpIHx8IFN0cmluZyh2YWx1ZSl9LmBcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgbW9kZWxWYWx1ZSBvZiBuZ01vZGVsKSB7XG4gICAgICBzZWxlY3RJdGVtQnlWYWx1ZShtb2RlbFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZmluZEl0ZW1CeVZhbHVlKHZhbHVlVG9GaW5kOiBhbnkpOiBBcmRPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBmaW5kQnk6IChpdGVtOiBBcmRPcHRpb24pID0+IGJvb2xlYW47XG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuY29tcGFyZVdpdGgoKSkge1xuICAgICAgZmluZEJ5ID0gaXRlbSA9PiB0aGlzLl9hcmRQYXJlbnRDb21wLmNvbXBhcmVXaXRoKCkhKHZhbHVlVG9GaW5kLCBpdGVtLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluZEJ5ID0gaXRlbSA9PiBpdGVtLnZhbHVlID09PSB2YWx1ZVRvRmluZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zKCkuZmluZChpdGVtID0+IGZpbmRCeShpdGVtKSk7XG4gIH1cbiAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcsIGZuOiBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+Pik6IFByb21pc2U8QXJkT3B0aW9uPiB7XG4gICAgY29uc3QgZm5SZXN1bHQgPSBmbih2YWx1ZSk7XG5cbiAgICBsZXQgb3B0aW9uVmFsdWUgPSBmblJlc3VsdDtcbiAgICBpZiAoaXNQcm9taXNlKG9wdGlvblZhbHVlKSkgb3B0aW9uVmFsdWUgPSBhd2FpdCBvcHRpb25WYWx1ZTtcblxuICAgIGNvbnN0IG5ld09wdGlvbk9iaiA9IHRoaXMuX2FkZFNpbmdsZUl0ZW0ob3B0aW9uVmFsdWUpO1xuXG4gICAgcmV0dXJuIG5ld09wdGlvbk9iajtcbiAgfVxuXG4gIGNsZWFyQWxsU2VsZWN0ZWQocmVwb3B1bGF0ZUdyb3VwcyA9IGZhbHNlKTogYW55W10ge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9zZWxlY3RlZEl0ZW1zKCkpIHtcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZEl0ZW1WYWx1ZXMgPSB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fc2VsZWN0ZWRJdGVtcygpKTtcbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnNldChbXSk7XG5cbiAgICBpZiAocmVwb3B1bGF0ZUdyb3VwcyAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCgpKSB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRJdGVtVmFsdWVzO1xuICB9XG4gIGNsZWFyTGFzdFNlbGVjdGVkKCk6IEFyZE9wdGlvbiB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX3NlbGVjdGVkSXRlbXMoKS5sYXN0KCk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gaXRlbTtcbiAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IFthbnlbXSwgYW55W10sIGFueVtdXSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKCkpIHtcbiAgICAgIHJldHVybiBbW10sIFtdLCB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXMpXTtcbiAgICB9XG4gICAgbGV0IHVuc2VsZWN0ZWQgPSBbXTtcbiAgICBpZiAoIXRoaXMuX2FyZFBhcmVudENvbXAubXVsdGlzZWxlY3RhYmxlKCkpIHtcbiAgICAgIHVuc2VsZWN0ZWQgPSB0aGlzLmNsZWFyQWxsU2VsZWN0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGxldCBpdGVtc1NlbGVjdGVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGl0ZW1zU2VsZWN0ZWRDb3VudCsrO1xuICAgICAgaWYgKGl0ZW0uc2VsZWN0ZWQoKSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcy51cGRhdGUodiA9PiBbLi4udiwgaXRlbV0pO1xuICAgICAgaXRlbXNTZWxlY3RlZC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zRmFpbGVkVG9TZWxlY3QgPSBpdGVtcy5zbGljZShpdGVtc1NlbGVjdGVkQ291bnQgLSAxKTtcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1NlbGVjdGVkKSwgdW5zZWxlY3RlZCwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zRmFpbGVkVG9TZWxlY3QpXTtcbiAgfVxuICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogYW55W10ge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCFpdGVtLnNlbGVjdGVkKCkpIGNvbnRpbnVlO1xuICAgICAgaXRlbS5zZWxlY3RlZC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnVwZGF0ZSh2ID0+IHYuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCgpKSk7XG5cbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zKTtcbiAgfVxuXG4gIGNsZWFyQWxsSGlnaGxpZ2h0cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcygpKSB7XG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5faGlnaGxpZ2h0ZWRHcm91cHMoKSkge1xuICAgICAgZ3JvdXAuaGlnaGxpZ2h0ZWQuc2V0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcy5zZXQoW10pO1xuICAgIHRoaXMuX2hpZ2hsaWdodGVkR3JvdXBzLnNldChbXSk7XG4gIH1cbiAgaGlnaGxpZ2h0R3JvdXAoZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogQXJkT3B0aW9uIHtcbiAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgIGdyb3VwLmhpZ2hsaWdodGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4oKSk7XG4gICAgcmV0dXJuIGdyb3VwLmNoaWxkcmVuKCkuZmlyc3QoKTtcbiAgfVxuICBoaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW06IEFyZE9wdGlvbik6IEFyZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICghaXRlbSB8fCBpdGVtLmRpc2FibGVkKCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMuY2xlYXJBbGxIaWdobGlnaHRzKCk7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtKTtcbiAgfVxuICBoaWdobGlnaHRJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IEFyZE9wdGlvbiB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcy51cGRhdGUodiA9PiBbLi4udiwgLi4uaXRlbXNdKTtcbiAgICByZXR1cm4gaXRlbXMubGFzdCgpO1xuICB9XG4gIHVuaGlnaGxpZ2h0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5oaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMudXBkYXRlKHYgPT4gdi5maWx0ZXIodiA9PiB2LmhpZ2hsaWdodGVkKCkpKTtcbiAgfVxuICBoaWdobGlnaHRGaXJzdEl0ZW0oKTogQXJkT3B0aW9uIHwgbnVsbCB7XG4gICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcbiAgICBjb25zdCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW1zVG9IaWdobGlnaHQuZmlyc3QoKSk7XG4gIH1cbiAgaGlnaGxpZ2h0TGFzdEl0ZW0oKTogQXJkT3B0aW9uIHwgbnVsbCB7XG4gICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcbiAgICBjb25zdCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW1zVG9IaWdobGlnaHQubGFzdCgpKTtcbiAgfVxuICBwcml2YXRlIF9nZXRIaWdsaWdodGFibGVJdGVtcygpOiBBcmRPcHRpb25bXSB7XG4gICAgbGV0IGl0ZW1zVG9IaWdobGlnaHQgPSB0aGlzLl9maWx0ZXJlZEl0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSk7XG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaGlkZVNlbGVjdGVkKCkpIHtcbiAgICAgIGl0ZW1zVG9IaWdobGlnaHQgPSBpdGVtc1RvSGlnaGxpZ2h0LmZpbHRlcihpdGVtID0+ICFpdGVtLnNlbGVjdGVkKCkpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXNUb0hpZ2hsaWdodDtcbiAgfVxuICBoaWdobGlnaHRBbGxJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oLi4udGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKSk7XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJSZWNlbnRseUhpZ2hsaWdodGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWNlbnRseUhpZ2hsaWdodGVkSXRlbSgpKSB7XG4gICAgICB0aGlzLl9yZWNlbnRseUhpZ2hsaWdodGVkSXRlbSgpIS5oaWdobGlnaHRlZF9yZWNlbnRseS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuICBzZXRSZWNlbnRseUhpZ2hsaWdodGVkKGl0ZW06IEFyZE9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyUmVjZW50bHlIaWdobGlnaHRlZCgpO1xuICAgIGl0ZW0uaGlnaGxpZ2h0ZWRfcmVjZW50bHkuc2V0KHRydWUpO1xuICAgIHRoaXMuX3JlY2VudGx5SGlnaGxpZ2h0ZWRJdGVtLnNldChpdGVtKTtcbiAgfVxuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkT3B0aW9uIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmlzQW55SXRlbUhpZ2hsaWdodGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtcygpLmxhc3QoKTtcbiAgICBjb25zdCBoaWdobGlnaHRhYmxlSXRlbXMgPSB0aGlzLl9nZXRIaWdsaWdodGFibGVJdGVtcygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleEluRmlsdGVyZWQgPSBoaWdobGlnaHRhYmxlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pbmRleCgpID09PSBjdXJyZW50SXRlbS5pbmRleCgpKTtcblxuICAgIGxldCBuZXh0SXRlbUluZGV4ID0gY3VycmVudEluZGV4SW5GaWx0ZXJlZCArIG9mZnNldDtcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA+PSBoaWdobGlnaHRhYmxlSXRlbXMubGVuZ3RoKSB7XG4gICAgICBuZXh0SXRlbUluZGV4IC09IGhpZ2hsaWdodGFibGVJdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChuZXh0SXRlbUluZGV4IDwgMCkge1xuICAgICAgbmV4dEl0ZW1JbmRleCArPSBoaWdobGlnaHRhYmxlSXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSBoaWdobGlnaHRhYmxlSXRlbXNbbmV4dEl0ZW1JbmRleF07XG5cbiAgICBpZiAoaGFzU2hpZnQgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC5tdWx0aXNlbGVjdGFibGUoKSkge1xuICAgICAgaWYgKGl0ZW1Ub0hpZ2hsaWdodC5oaWdobGlnaHRlZCgpKSB7XG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRJdGVtKGN1cnJlbnRJdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbVRvSGlnaGxpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtVG9IaWdobGlnaHQpO1xuICB9XG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgaWYgKCFmaWx0ZXJUZXJtKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMucmVzZXRGaWx0ZXJlZCgpKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9hcmRQYXJlbnRDb21wLnNlYXJjaENhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgZmlsdGVyVGVybSA9IGZpbHRlclRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hGbiA9IHRoaXMuX2FyZFBhcmVudENvbXAuc2VhcmNoRm4oKTtcbiAgICBjb25zdCBuZXdGaWx0ZXJlZEl0ZW1zID0gdGhpcy5faXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBzZWFyY2hGbihmaWx0ZXJUZXJtLCBpdGVtKSk7XG4gICAgdGhpcy5fZmlsdGVyZWRJdGVtcy5zZXQobmV3RmlsdGVyZWRJdGVtcyk7XG5cbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xuXG4gICAgaWYgKCF0aGlzLmlzTm9JdGVtc0ZvdW5kKSB0aGlzLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIGVsc2UgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcblxuICAgIHJldHVybiB0aGlzLl9pdGVtc1RvVmFsdWUobmV3RmlsdGVyZWRJdGVtcyk7XG4gIH1cbiAgcmVzZXRGaWx0ZXJlZCgpOiBBcmRPcHRpb25bXSB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlcmVkSXRlbXMoKS5sZW5ndGggPT09IHRoaXMuX2l0ZW1zKCkubGVuZ3RoKSByZXR1cm4gdGhpcy5faXRlbXMoKTtcblxuICAgIGxldCBuZXdGaWx0ZXJlZEl0ZW1zID0gdGhpcy5faXRlbXMoKTtcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQoKSAmJiB0aGlzLmlzQW55SXRlbVNlbGVjdGVkKCkpIHtcbiAgICAgIG5ld0ZpbHRlcmVkSXRlbXMgPSBuZXdGaWx0ZXJlZEl0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLnNlbGVjdGVkKCkpO1xuICAgIH1cbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xuICAgIHJldHVybiBuZXdGaWx0ZXJlZEl0ZW1zO1xuICB9XG59XG4iXX0=
|