@ptsecurity/mosaic 15.5.0 → 16.0.0
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/_theming.scss +29 -6
- package/_visual.scss +6 -4
- package/autocomplete/autocomplete-trigger.directive.d.ts +6 -16
- package/autocomplete/autocomplete.component.d.ts +1 -1
- package/button/_button-theme.scss +2 -5
- package/button/button.component.d.ts +1 -1
- package/button-toggle/_button-toggle-theme.scss +2 -5
- package/button-toggle/button-toggle.component.d.ts +3 -3
- package/card/card.component.d.ts +1 -1
- package/checkbox/_checkbox-theme.scss +6 -5
- package/checkbox/checkbox-config.d.ts +1 -1
- package/checkbox/checkbox.d.ts +1 -1
- package/code-block/_code-block-theme.scss +2 -6
- package/code-block/actionbar.component.d.ts +1 -1
- package/code-block/code-block.component.d.ts +1 -1
- package/core/common-behaviors/color.d.ts +1 -1
- package/core/common-behaviors/constructor.d.ts +2 -2
- package/core/common-behaviors/disabled.d.ts +1 -1
- package/core/common-behaviors/error-state.d.ts +1 -1
- package/core/common-behaviors/tabindex.d.ts +1 -1
- package/core/datetime/date-formats.d.ts +1 -1
- package/core/formatters/index.d.ts +1 -1
- package/core/formatters/number/formatter.d.ts +55 -0
- package/core/forms/_forms-theme.scss +2 -4
- package/core/label/label-options.d.ts +1 -1
- package/core/locales/en-US.d.ts +13 -2
- package/core/locales/es-LA.d.ts +21 -0
- package/core/locales/fa-IR.d.ts +22 -0
- package/core/locales/locale-service.d.ts +111 -5
- package/core/locales/pt-BR.d.ts +21 -0
- package/core/locales/ru-RU.d.ts +13 -2
- package/core/locales/zh-CN.d.ts +20 -0
- package/core/option/_optgroup-theme.scss +2 -4
- package/core/option/_option-theme.scss +2 -5
- package/core/option/action.d.ts +1 -1
- package/core/option/optgroup.d.ts +1 -1
- package/core/option/option.d.ts +37 -8
- package/core/overlay/overlay-position-map.d.ts +7 -1
- package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +2 -2
- package/core/styles/_variables.scss +1 -0
- package/core/styles/theming/_badges.scss +2 -1
- package/core/styles/theming/_theming.scss +1 -0
- package/datepicker/_datepicker-theme.scss +2 -5
- package/datepicker/calendar-body.component.d.ts +2 -2
- package/datepicker/calendar-header.component.d.ts +9 -3
- package/datepicker/calendar.component.d.ts +4 -5
- package/datepicker/datepicker-input.directive.d.ts +1 -1
- package/datepicker/datepicker-toggle.component.d.ts +1 -1
- package/datepicker/datepicker.component.d.ts +1 -1
- package/datepicker/month-view.component.d.ts +4 -5
- package/divider/divider.component.d.ts +1 -1
- package/dl/_dl-theme.scss +2 -5
- package/dl/dl.component.d.ts +1 -1
- package/dropdown/_dropdown-theme.scss +2 -5
- package/dropdown/dropdown-item.component.d.ts +1 -1
- package/dropdown/dropdown-trigger.directive.d.ts +1 -1
- package/dropdown/dropdown.component.d.ts +1 -1
- package/dropdown/dropdown.types.d.ts +3 -3
- package/ellipsis-center/ellipsis-center.directive.d.ts +1 -1
- package/{esm2020 → esm2022}/autocomplete/autocomplete-origin.directive.mjs +4 -4
- package/esm2022/autocomplete/autocomplete-trigger.directive.mjs +555 -0
- package/{esm2020 → esm2022}/autocomplete/autocomplete.component.mjs +26 -26
- package/{esm2020 → esm2022}/autocomplete/autocomplete.module.mjs +10 -10
- package/esm2022/button/button.component.mjs +148 -0
- package/{esm2020 → esm2022}/button/button.module.mjs +13 -13
- package/esm2022/button-toggle/button-toggle.component.mjs +381 -0
- package/{esm2020 → esm2022}/button-toggle/button-toggle.module.mjs +5 -5
- package/esm2022/card/card.component.mjs +80 -0
- package/{esm2020 → esm2022}/card/card.module.mjs +9 -9
- package/{esm2020 → esm2022}/checkbox/checkbox-module.mjs +5 -5
- package/{esm2020 → esm2022}/checkbox/checkbox-required-validator.mjs +4 -4
- package/esm2022/checkbox/checkbox.mjs +300 -0
- package/{esm2020 → esm2022}/code-block/actionbar.component.mjs +4 -4
- package/esm2022/code-block/code-block.component.mjs +157 -0
- package/esm2022/code-block/code-block.module.mjs +60 -0
- package/esm2022/core/common-behaviors/color.mjs +33 -0
- package/{esm2020 → esm2022}/core/common-behaviors/common-module.mjs +5 -5
- package/{esm2020 → esm2022}/core/common-behaviors/disabled.mjs +6 -6
- package/{esm2020 → esm2022}/core/common-behaviors/tabindex.mjs +6 -6
- package/{esm2020 → esm2022}/core/error/error-options.mjs +7 -7
- package/{esm2020 → esm2022}/core/formatters/date/formatter.mjs +4 -4
- package/{esm2020 → esm2022}/core/formatters/date/formatter.pipe.mjs +40 -40
- package/esm2022/core/formatters/index.mjs +86 -0
- package/esm2022/core/formatters/number/formatter.mjs +350 -0
- package/{esm2020 → esm2022}/core/forms/forms-module.mjs +7 -7
- package/{esm2020 → esm2022}/core/forms/forms.directive.mjs +7 -7
- package/{esm2020 → esm2022}/core/highlight/highlight.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/core/highlight/index.mjs +5 -5
- package/{esm2020 → esm2022}/core/line/line.mjs +8 -8
- package/esm2022/core/locales/en-US.mjs +21 -0
- package/esm2022/core/locales/es-LA.mjs +27 -0
- package/esm2022/core/locales/fa-IR.mjs +28 -0
- package/{esm2020 → esm2022}/core/locales/locale-service.mjs +7 -7
- package/{esm2020 → esm2022}/core/locales/locale-service.module.mjs +7 -7
- package/esm2022/core/locales/pt-BR.mjs +27 -0
- package/esm2022/core/locales/ru-RU.mjs +21 -0
- package/esm2022/core/locales/zh-CN.mjs +26 -0
- package/{esm2020 → esm2022}/core/option/action.mjs +9 -9
- package/{esm2020 → esm2022}/core/option/optgroup.mjs +5 -5
- package/{esm2020 → esm2022}/core/option/option-module.mjs +5 -5
- package/esm2022/core/option/option.mjs +298 -0
- package/esm2022/core/overlay/overlay-position-map.mjs +251 -0
- package/{esm2020 → esm2022}/core/pop-up/pop-up-trigger.mjs +4 -4
- package/{esm2020 → esm2022}/core/pop-up/pop-up.mjs +4 -4
- package/{esm2020 → esm2022}/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +4 -4
- package/{esm2020 → esm2022}/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +5 -5
- package/esm2022/core/services/measure-scrollbar.service.mjs +48 -0
- package/{esm2020 → esm2022}/core/utils/data-size/data-size.pipe.mjs +8 -8
- package/{esm2020 → esm2022}/core/version.mjs +2 -2
- package/{esm2020 → esm2022}/datepicker/calendar-body.component.mjs +4 -4
- package/esm2022/datepicker/calendar-header.component.mjs +135 -0
- package/esm2022/datepicker/calendar.component.mjs +166 -0
- package/esm2022/datepicker/datepicker-input.directive.mjs +955 -0
- package/{esm2020 → esm2022}/datepicker/datepicker-intl.mjs +4 -4
- package/{esm2020 → esm2022}/datepicker/datepicker-module.mjs +38 -38
- package/esm2022/datepicker/datepicker-toggle.component.mjs +86 -0
- package/esm2022/datepicker/datepicker.component.mjs +393 -0
- package/esm2022/datepicker/month-view.component.mjs +149 -0
- package/{esm2020 → esm2022}/divider/divider.component.mjs +4 -4
- package/{esm2020 → esm2022}/divider/divider.module.mjs +5 -5
- package/{esm2020 → esm2022}/dl/dl.component.mjs +10 -10
- package/{esm2020 → esm2022}/dl/dl.module.mjs +13 -13
- package/{esm2020 → esm2022}/dropdown/dropdown-content.directive.mjs +4 -4
- package/{esm2020 → esm2022}/dropdown/dropdown-item.component.mjs +6 -6
- package/esm2022/dropdown/dropdown-trigger.directive.mjs +489 -0
- package/esm2022/dropdown/dropdown.component.mjs +292 -0
- package/{esm2020 → esm2022}/dropdown/dropdown.module.mjs +15 -15
- package/esm2022/ellipsis-center/ellipsis-center.directive.mjs +106 -0
- package/{esm2020 → esm2022}/file-upload/file-drop.mjs +4 -4
- package/{esm2020 → esm2022}/file-upload/file-upload.module.mjs +25 -25
- package/esm2022/file-upload/multiple-file-upload.component.mjs +165 -0
- package/esm2022/file-upload/single-file-upload.component.mjs +134 -0
- package/{esm2020 → esm2022}/form-field/cleaner.mjs +4 -4
- package/esm2022/form-field/form-field.mjs +267 -0
- package/{esm2020 → esm2022}/form-field/form-field.module.mjs +23 -23
- package/{esm2020 → esm2022}/form-field/hint.mjs +4 -4
- package/esm2022/form-field/password-hint.mjs +146 -0
- package/{esm2020 → esm2022}/form-field/prefix.mjs +4 -4
- package/{esm2020 → esm2022}/form-field/stepper.mjs +6 -6
- package/{esm2020 → esm2022}/form-field/suffix.mjs +4 -4
- package/esm2022/form-field/validate.directive.mjs +158 -0
- package/{esm2020 → esm2022}/icon/icon.component.mjs +7 -7
- package/{esm2020 → esm2022}/icon/icon.module.mjs +11 -11
- package/{esm2020 → esm2022}/input/input-number-validators.mjs +7 -7
- package/esm2022/input/input-number.mjs +168 -0
- package/esm2022/input/input-password.mjs +343 -0
- package/esm2022/input/input.mjs +297 -0
- package/{esm2020 → esm2022}/input/input.module.mjs +23 -23
- package/esm2022/link/link.component.mjs +122 -0
- package/{esm2020 → esm2022}/link/link.module.mjs +7 -7
- package/esm2022/list/list-selection.component.mjs +705 -0
- package/{esm2020 → esm2022}/list/list.component.mjs +8 -8
- package/{esm2020 → esm2022}/list/list.module.mjs +20 -20
- package/esm2022/loader-overlay/loader-overlay.component.mjs +103 -0
- package/{esm2020 → esm2022}/loader-overlay/loader-overlay.module.mjs +17 -17
- package/{esm2020 → esm2022}/markdown/markdown.component.mjs +13 -13
- package/{esm2020 → esm2022}/markdown/markdown.module.mjs +5 -5
- package/{esm2020 → esm2022}/markdown/markdown.service.mjs +4 -4
- package/{esm2020 → esm2022}/modal/css-unit.pipe.mjs +4 -4
- package/esm2022/modal/modal-control.service.mjs +85 -0
- package/esm2022/modal/modal.component.mjs +520 -0
- package/{esm2020 → esm2022}/modal/modal.directive.mjs +13 -13
- package/esm2022/modal/modal.module.mjs +75 -0
- package/{esm2020 → esm2022}/modal/modal.service.mjs +8 -8
- package/esm2022/navbar/navbar-item.component.mjs +606 -0
- package/esm2022/navbar/navbar.component.mjs +248 -0
- package/{esm2020 → esm2022}/navbar/navbar.module.mjs +37 -37
- package/{esm2020 → esm2022}/navbar/vertical-navbar.component.mjs +20 -17
- package/esm2022/popover/popover-confirm.component.mjs +108 -0
- package/esm2022/popover/popover.component.mjs +266 -0
- package/{esm2020 → esm2022}/popover/popover.module.mjs +8 -8
- package/{esm2020 → esm2022}/progress-bar/progress-bar.component.mjs +4 -4
- package/{esm2020 → esm2022}/progress-bar/progress-bar.module.mjs +7 -7
- package/{esm2020 → esm2022}/progress-spinner/progress-spinner.component.mjs +12 -12
- package/{esm2020 → esm2022}/progress-spinner/progress-spinner.module.mjs +7 -7
- package/esm2022/radio/radio.component.mjs +457 -0
- package/{esm2020 → esm2022}/radio/radio.module.mjs +5 -5
- package/esm2022/select/select-option.directive.mjs +65 -0
- package/esm2022/select/select.component.mjs +1160 -0
- package/{esm2020 → esm2022}/select/select.module.mjs +32 -32
- package/esm2022/sidebar/sidebar.component.mjs +146 -0
- package/{esm2020 → esm2022}/sidebar/sidebar.module.mjs +9 -9
- package/esm2022/sidepanel/sidepanel-container.component.mjs +110 -0
- package/{esm2020 → esm2022}/sidepanel/sidepanel-directives.mjs +18 -18
- package/{esm2020 → esm2022}/sidepanel/sidepanel.module.mjs +32 -32
- package/{esm2020 → esm2022}/sidepanel/sidepanel.service.mjs +10 -10
- package/esm2022/splitter/splitter.component.mjs +482 -0
- package/{esm2020 → esm2022}/splitter/splitter.module.mjs +12 -12
- package/{esm2020 → esm2022}/table/table.component.mjs +4 -4
- package/{esm2020 → esm2022}/table/table.module.mjs +9 -9
- package/esm2022/tabs/paginated-tab-header.mjs +488 -0
- package/esm2022/tabs/tab-body.component.mjs +179 -0
- package/{esm2020 → esm2022}/tabs/tab-content.directive.mjs +4 -4
- package/esm2022/tabs/tab-group.component.mjs +349 -0
- package/{esm2020 → esm2022}/tabs/tab-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/tabs/tab-label-wrapper.directive.mjs +4 -4
- package/{esm2020 → esm2022}/tabs/tab-label.directive.mjs +4 -4
- package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +111 -0
- package/{esm2020 → esm2022}/tabs/tab.component.mjs +43 -34
- package/{esm2020 → esm2022}/tabs/tabs.module.mjs +42 -42
- package/esm2022/tags/tag-default-options.mjs +4 -0
- package/esm2022/tags/tag-input.mjs +250 -0
- package/esm2022/tags/tag-list.component.mjs +718 -0
- package/esm2022/tags/tag.component.mjs +381 -0
- package/esm2022/tags/tag.module.mjs +56 -0
- package/esm2022/textarea/textarea.component.mjs +254 -0
- package/{esm2020 → esm2022}/textarea/textarea.module.mjs +5 -5
- package/esm2022/timepicker/timepicker.directive.mjs +647 -0
- package/{esm2020 → esm2022}/timepicker/timepicker.module.mjs +11 -11
- package/{esm2020 → esm2022}/timezone/cities-by-filter.pipe.mjs +4 -4
- package/esm2022/timezone/timezone-option.component.mjs +48 -0
- package/{esm2020 → esm2022}/timezone/timezone-option.directive.mjs +4 -4
- package/{esm2020 → esm2022}/timezone/timezone-select.component.mjs +11 -11
- package/{esm2020 → esm2022}/timezone/timezone.module.mjs +29 -29
- package/{esm2020 → esm2022}/timezone/utc-offset.pipe.mjs +4 -4
- package/esm2022/title/title.directive.mjs +107 -0
- package/{esm2020 → esm2022}/title/title.module.mjs +5 -5
- package/{esm2020 → esm2022}/toast/toast-container.component.mjs +4 -4
- package/esm2022/toast/toast.component.mjs +92 -0
- package/esm2022/toast/toast.module.mjs +48 -0
- package/esm2022/toast/toast.service.mjs +188 -0
- package/esm2022/toggle/toggle.component.mjs +156 -0
- package/{esm2020 → esm2022}/toggle/toggle.module.mjs +5 -5
- package/esm2022/tooltip/tooltip.component.mjs +299 -0
- package/{esm2020 → esm2022}/tooltip/tooltip.module.mjs +14 -14
- package/esm2022/tree/data-source/flat-data-source.mjs +162 -0
- package/{esm2020 → esm2022}/tree/node.mjs +4 -4
- package/{esm2020 → esm2022}/tree/outlet.mjs +4 -4
- package/esm2022/tree/padding.directive.mjs +113 -0
- package/esm2022/tree/toggle.mjs +81 -0
- package/esm2022/tree/tree-base.mjs +243 -0
- package/esm2022/tree/tree-option.component.mjs +303 -0
- package/esm2022/tree/tree-selection.component.mjs +558 -0
- package/{esm2020 → esm2022}/tree/tree.mjs +4 -4
- package/{esm2020 → esm2022}/tree/tree.module.mjs +21 -21
- package/esm2022/tree-select/tree-select.component.mjs +936 -0
- package/{esm2020 → esm2022}/tree-select/tree-select.module.mjs +17 -17
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-autocomplete.mjs +80 -77
- package/fesm2022/ptsecurity-mosaic-autocomplete.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button-toggle.mjs +47 -47
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button.mjs +25 -25
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-card.mjs +17 -17
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-card.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-checkbox.mjs +39 -39
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-checkbox.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-code-block.mjs +34 -34
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-code-block.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-core.mjs +600 -224
- package/fesm2022/ptsecurity-mosaic-core.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-datepicker.mjs +335 -351
- package/fesm2022/ptsecurity-mosaic-datepicker.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-divider.mjs +7 -7
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-divider.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dl.mjs +21 -21
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dl.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dropdown.mjs +89 -89
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dropdown.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-ellipsis-center.mjs +11 -11
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-ellipsis-center.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-file-upload.mjs +55 -47
- package/fesm2022/ptsecurity-mosaic-file-upload.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-form-field.mjs +92 -87
- package/fesm2022/ptsecurity-mosaic-form-field.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-icon.mjs +16 -16
- package/fesm2022/ptsecurity-mosaic-icon.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-input.mjs +128 -128
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-input.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-link.mjs +22 -22
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-link.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-list.mjs +88 -88
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-list.mjs.map +1 -1
- package/fesm2022/ptsecurity-mosaic-loader-overlay.mjs +155 -0
- package/{fesm2015 → fesm2022}/ptsecurity-mosaic-loader-overlay.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-markdown.mjs +19 -19
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-markdown.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-modal.mjs +157 -144
- package/fesm2022/ptsecurity-mosaic-modal.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-navbar.mjs +196 -187
- package/fesm2022/ptsecurity-mosaic-navbar.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-popover.mjs +37 -37
- package/{fesm2015 → fesm2022}/ptsecurity-mosaic-popover.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-bar.mjs +9 -9
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-spinner.mjs +18 -18
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-radio.mjs +80 -79
- package/{fesm2015 → fesm2022}/ptsecurity-mosaic-radio.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-select.mjs +188 -174
- package/fesm2022/ptsecurity-mosaic-select.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidebar.mjs +29 -29
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidebar.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidepanel.mjs +63 -63
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
- package/{fesm2015 → fesm2022}/ptsecurity-mosaic-splitter.mjs +55 -55
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-splitter.mjs.map +1 -1
- package/fesm2022/ptsecurity-mosaic-table.mjs +45 -0
- package/fesm2022/ptsecurity-mosaic-table.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tabs.mjs +188 -179
- package/fesm2022/ptsecurity-mosaic-tabs.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tags.mjs +150 -144
- package/fesm2022/ptsecurity-mosaic-tags.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-textarea.mjs +41 -41
- package/{fesm2015 → fesm2022}/ptsecurity-mosaic-textarea.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timepicker.mjs +95 -95
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timepicker.mjs.map +1 -1
- package/fesm2022/ptsecurity-mosaic-timezone.mjs +314 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timezone.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-title.mjs +18 -18
- package/fesm2022/ptsecurity-mosaic-title.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toast.mjs +47 -41
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toast.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toggle.mjs +35 -35
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toggle.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tooltip.mjs +47 -47
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tooltip.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tree-select.mjs +123 -123
- package/fesm2022/ptsecurity-mosaic-tree-select.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tree.mjs +203 -198
- package/fesm2022/ptsecurity-mosaic-tree.mjs.map +1 -0
- package/file-upload/_file-upload-theme.scss +2 -4
- package/file-upload/file-upload.d.ts +1 -1
- package/file-upload/multiple-file-upload.component.d.ts +5 -4
- package/file-upload/single-file-upload.component.d.ts +5 -4
- package/form-field/_form-field-theme.scss +7 -5
- package/form-field/form-field.d.ts +1 -2
- package/form-field/form-field.scss +1 -3
- package/form-field/hint.d.ts +1 -1
- package/form-field/password-hint.d.ts +6 -3
- package/icon/icon.component.d.ts +1 -1
- package/input/_input-theme.scss +7 -6
- package/input/input-number-validators.d.ts +2 -2
- package/input/input-number.d.ts +1 -1
- package/input/input-password.d.ts +2 -2
- package/input/input.d.ts +1 -1
- package/link/_link-theme.scss +7 -8
- package/link/link.component.d.ts +1 -1
- package/list/_list-theme.scss +2 -5
- package/list/list-selection.component.d.ts +2 -2
- package/loader-overlay/_loader-overlay-theme.scss +2 -5
- package/loader-overlay/loader-overlay.component.d.ts +1 -1
- package/loader-overlay/loader-overlay.scss +3 -0
- package/markdown/_markdown-theme.scss +3 -6
- package/markdown/markdown.component.d.ts +1 -1
- package/modal/_modal-theme.scss +3 -5
- package/modal/modal.component.d.ts +5 -2
- package/modal/modal.module.d.ts +2 -1
- package/modal/modal.scss +14 -2
- package/modal/modal.type.d.ts +3 -3
- package/navbar/_navbar-theme.scss +2 -6
- package/navbar/navbar-item.component.d.ts +5 -4
- package/navbar/navbar.component.d.ts +7 -4
- package/navbar/vertical-navbar.component.d.ts +5 -3
- package/package.json +156 -246
- package/popover/_popover-theme.scss +2 -6
- package/popover/popover-confirm.component.d.ts +1 -1
- package/popover/popover.component.d.ts +1 -1
- package/prebuilt-themes/dark-theme.css +1 -1
- package/prebuilt-themes/default-theme.css +1 -1
- package/progress-bar/progress-bar.component.d.ts +2 -2
- package/progress-spinner/progress-spinner.component.d.ts +3 -3
- package/radio/_radio-theme.scss +6 -6
- package/radio/radio.component.d.ts +2 -2
- package/select/_select-theme.scss +2 -5
- package/select/select.component.d.ts +12 -9
- package/select/select.scss +3 -1
- package/sidebar/sidebar.component.d.ts +3 -3
- package/sidepanel/_sidepanel-theme.scss +2 -5
- package/sidepanel/sidepanel-directives.d.ts +2 -2
- package/splitter/splitter.component.d.ts +3 -3
- package/table/_table-theme.scss +2 -5
- package/tabs/_tabs-theme.scss +2 -5
- package/tabs/paginated-tab-header.d.ts +3 -3
- package/tabs/tab-body.component.d.ts +3 -3
- package/tabs/tab-group.component.d.ts +2 -2
- package/tabs/tab-header.component.d.ts +2 -2
- package/tabs/tab-label-wrapper.directive.d.ts +1 -1
- package/tabs/tab-nav-bar/tab-nav-bar.d.ts +1 -1
- package/tabs/tab.component.d.ts +1 -1
- package/tags/_tag-theme.scss +2 -5
- package/tags/tag-default-options.d.ts +4 -0
- package/tags/tag-input.d.ts +1 -1
- package/tags/tag-list.component.d.ts +2 -1
- package/tags/tag-list.scss +6 -2
- package/tags/tag.component.d.ts +2 -2
- package/textarea/_textarea-theme.scss +2 -5
- package/textarea/textarea.component.d.ts +1 -1
- package/timepicker/timepicker.directive.d.ts +1 -1
- package/timezone/_timezone-option-theme.scss +2 -5
- package/timezone/timezone-option.component.d.ts +1 -1
- package/toast/_toast-theme.scss +2 -5
- package/toast/toast.type.d.ts +1 -1
- package/toggle/_toggle-theme.scss +2 -5
- package/toggle/toggle.component.d.ts +2 -2
- package/tooltip/_tooltip-theme.scss +2 -5
- package/tooltip/tooltip.component.d.ts +3 -3
- package/tree/_tree-theme.scss +2 -4
- package/tree/node.d.ts +1 -1
- package/tree/padding.directive.d.ts +1 -1
- package/tree/toggle.d.ts +2 -2
- package/tree/tree-base.d.ts +1 -1
- package/tree/tree-option.component.d.ts +1 -1
- package/tree/tree-option.scss +4 -2
- package/tree/tree-selection.component.d.ts +1 -1
- package/tree-select/_tree-select-theme.scss +2 -5
- package/tree-select/tree-select.component.d.ts +1 -1
- package/esm2020/autocomplete/autocomplete-trigger.directive.mjs +0 -552
- package/esm2020/button/button.component.mjs +0 -148
- package/esm2020/button-toggle/button-toggle.component.mjs +0 -381
- package/esm2020/card/card.component.mjs +0 -80
- package/esm2020/checkbox/checkbox.mjs +0 -300
- package/esm2020/code-block/code-block.component.mjs +0 -157
- package/esm2020/code-block/code-block.module.mjs +0 -60
- package/esm2020/core/common-behaviors/color.mjs +0 -33
- package/esm2020/core/formatters/index.mjs +0 -78
- package/esm2020/core/formatters/number/formatter.mjs +0 -129
- package/esm2020/core/locales/en-US.mjs +0 -10
- package/esm2020/core/locales/es-LA.mjs +0 -6
- package/esm2020/core/locales/fa-IR.mjs +0 -6
- package/esm2020/core/locales/pt-BR.mjs +0 -6
- package/esm2020/core/locales/ru-RU.mjs +0 -10
- package/esm2020/core/locales/zh-CN.mjs +0 -6
- package/esm2020/core/option/option.mjs +0 -262
- package/esm2020/core/overlay/overlay-position-map.mjs +0 -245
- package/esm2020/core/services/measure-scrollbar.service.mjs +0 -48
- package/esm2020/datepicker/calendar-header.component.mjs +0 -134
- package/esm2020/datepicker/calendar.component.mjs +0 -175
- package/esm2020/datepicker/datepicker-input.directive.mjs +0 -954
- package/esm2020/datepicker/datepicker-toggle.component.mjs +0 -86
- package/esm2020/datepicker/datepicker.component.mjs +0 -393
- package/esm2020/datepicker/month-view.component.mjs +0 -158
- package/esm2020/dropdown/dropdown-trigger.directive.mjs +0 -489
- package/esm2020/dropdown/dropdown.component.mjs +0 -292
- package/esm2020/ellipsis-center/ellipsis-center.directive.mjs +0 -106
- package/esm2020/file-upload/multiple-file-upload.component.mjs +0 -161
- package/esm2020/file-upload/single-file-upload.component.mjs +0 -130
- package/esm2020/form-field/form-field.mjs +0 -270
- package/esm2020/form-field/password-hint.mjs +0 -138
- package/esm2020/form-field/validate.directive.mjs +0 -158
- package/esm2020/input/input-number.mjs +0 -168
- package/esm2020/input/input-password.mjs +0 -343
- package/esm2020/input/input.mjs +0 -297
- package/esm2020/link/link.component.mjs +0 -122
- package/esm2020/list/list-selection.component.mjs +0 -705
- package/esm2020/loader-overlay/loader-overlay.component.mjs +0 -103
- package/esm2020/modal/modal-control.service.mjs +0 -85
- package/esm2020/modal/modal.component.mjs +0 -510
- package/esm2020/modal/modal.module.mjs +0 -71
- package/esm2020/navbar/navbar-item.component.mjs +0 -605
- package/esm2020/navbar/navbar.component.mjs +0 -239
- package/esm2020/popover/popover-confirm.component.mjs +0 -108
- package/esm2020/popover/popover.component.mjs +0 -266
- package/esm2020/radio/radio.component.mjs +0 -456
- package/esm2020/select/select-option.directive.mjs +0 -65
- package/esm2020/select/select.component.mjs +0 -1146
- package/esm2020/sidebar/sidebar.component.mjs +0 -146
- package/esm2020/sidepanel/sidepanel-container.component.mjs +0 -110
- package/esm2020/splitter/splitter.component.mjs +0 -482
- package/esm2020/tabs/paginated-tab-header.mjs +0 -488
- package/esm2020/tabs/tab-body.component.mjs +0 -179
- package/esm2020/tabs/tab-group.component.mjs +0 -349
- package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +0 -111
- package/esm2020/tags/tag-default-options.mjs +0 -4
- package/esm2020/tags/tag-input.mjs +0 -248
- package/esm2020/tags/tag-list.component.mjs +0 -714
- package/esm2020/tags/tag.component.mjs +0 -381
- package/esm2020/tags/tag.module.mjs +0 -56
- package/esm2020/textarea/textarea.component.mjs +0 -254
- package/esm2020/timepicker/timepicker.directive.mjs +0 -647
- package/esm2020/timezone/timezone-option.component.mjs +0 -48
- package/esm2020/title/title.directive.mjs +0 -107
- package/esm2020/toast/toast.component.mjs +0 -92
- package/esm2020/toast/toast.module.mjs +0 -42
- package/esm2020/toast/toast.service.mjs +0 -188
- package/esm2020/toggle/toggle.component.mjs +0 -156
- package/esm2020/tooltip/tooltip.component.mjs +0 -299
- package/esm2020/tree/data-source/flat-data-source.mjs +0 -162
- package/esm2020/tree/padding.directive.mjs +0 -113
- package/esm2020/tree/toggle.mjs +0 -81
- package/esm2020/tree/tree-base.mjs +0 -243
- package/esm2020/tree/tree-option.component.mjs +0 -299
- package/esm2020/tree/tree-selection.component.mjs +0 -557
- package/esm2020/tree-select/tree-select.component.mjs +0 -936
- package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +0 -753
- package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-button-toggle.mjs +0 -405
- package/fesm2015/ptsecurity-mosaic-button-toggle.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-button.mjs +0 -193
- package/fesm2015/ptsecurity-mosaic-button.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-card.mjs +0 -111
- package/fesm2015/ptsecurity-mosaic-card.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-checkbox.mjs +0 -351
- package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-code-block.mjs +0 -280
- package/fesm2015/ptsecurity-mosaic-code-block.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-core.mjs +0 -2314
- package/fesm2015/ptsecurity-mosaic-core.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-datepicker.mjs +0 -2112
- package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-divider.mjs +0 -61
- package/fesm2015/ptsecurity-mosaic-divider.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-dl.mjs +0 -126
- package/fesm2015/ptsecurity-mosaic-dl.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-dropdown.mjs +0 -1115
- package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-ellipsis-center.mjs +0 -113
- package/fesm2015/ptsecurity-mosaic-ellipsis-center.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-file-upload.mjs +0 -392
- package/fesm2015/ptsecurity-mosaic-file-upload.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-form-field.mjs +0 -768
- package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-icon.mjs +0 -86
- package/fesm2015/ptsecurity-mosaic-icon.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-input.mjs +0 -951
- package/fesm2015/ptsecurity-mosaic-input.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-link.mjs +0 -150
- package/fesm2015/ptsecurity-mosaic-link.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-list.mjs +0 -807
- package/fesm2015/ptsecurity-mosaic-list.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs +0 -157
- package/fesm2015/ptsecurity-mosaic-markdown.mjs +0 -128
- package/fesm2015/ptsecurity-mosaic-markdown.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-modal.mjs +0 -875
- package/fesm2015/ptsecurity-mosaic-modal.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-navbar.mjs +0 -1054
- package/fesm2015/ptsecurity-mosaic-navbar.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-popover.mjs +0 -411
- package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +0 -74
- package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +0 -93
- package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-radio.mjs +0 -480
- package/fesm2015/ptsecurity-mosaic-select.mjs +0 -1286
- package/fesm2015/ptsecurity-mosaic-select.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-sidebar.mjs +0 -202
- package/fesm2015/ptsecurity-mosaic-sidebar.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-sidepanel.mjs +0 -622
- package/fesm2015/ptsecurity-mosaic-sidepanel.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-splitter.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-table.mjs +0 -45
- package/fesm2015/ptsecurity-mosaic-table.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-tabs.mjs +0 -1523
- package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-tags.mjs +0 -1391
- package/fesm2015/ptsecurity-mosaic-tags.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-textarea.mjs +0 -280
- package/fesm2015/ptsecurity-mosaic-timepicker.mjs +0 -708
- package/fesm2015/ptsecurity-mosaic-timepicker.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-timezone.mjs +0 -316
- package/fesm2015/ptsecurity-mosaic-timezone.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-title.mjs +0 -128
- package/fesm2015/ptsecurity-mosaic-title.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-toast.mjs +0 -379
- package/fesm2015/ptsecurity-mosaic-toast.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-toggle.mjs +0 -178
- package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-tooltip.mjs +0 -369
- package/fesm2015/ptsecurity-mosaic-tooltip.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-tree-select.mjs +0 -983
- package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +0 -1
- package/fesm2015/ptsecurity-mosaic-tree.mjs +0 -1815
- package/fesm2015/ptsecurity-mosaic-tree.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-core.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-file-upload.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-icon.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs +0 -155
- package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-modal.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-navbar.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-popover.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-radio.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-select.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-splitter.mjs +0 -524
- package/fesm2020/ptsecurity-mosaic-table.mjs +0 -45
- package/fesm2020/ptsecurity-mosaic-table.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-tags.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-timezone.mjs +0 -314
- package/fesm2020/ptsecurity-mosaic-title.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic-tree.mjs.map +0 -1
- package/fesm2020/ptsecurity-mosaic.mjs +0 -4
- package/fesm2020/ptsecurity-mosaic.mjs.map +0 -1
- /package/{esm2020 → esm2022}/autocomplete/index.mjs +0 -0
- /package/{esm2020 → esm2022}/autocomplete/ptsecurity-mosaic-autocomplete.mjs +0 -0
- /package/{esm2020 → esm2022}/autocomplete/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/button/index.mjs +0 -0
- /package/{esm2020 → esm2022}/button/ptsecurity-mosaic-button.mjs +0 -0
- /package/{esm2020 → esm2022}/button/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/button-toggle/index.mjs +0 -0
- /package/{esm2020 → esm2022}/button-toggle/ptsecurity-mosaic-button-toggle.mjs +0 -0
- /package/{esm2020 → esm2022}/button-toggle/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/card/index.mjs +0 -0
- /package/{esm2020 → esm2022}/card/ptsecurity-mosaic-card.mjs +0 -0
- /package/{esm2020 → esm2022}/card/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/checkbox/checkbox-config.mjs +0 -0
- /package/{esm2020 → esm2022}/checkbox/index.mjs +0 -0
- /package/{esm2020 → esm2022}/checkbox/ptsecurity-mosaic-checkbox.mjs +0 -0
- /package/{esm2020 → esm2022}/checkbox/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/code-block/code-block.types.mjs +0 -0
- /package/{esm2020 → esm2022}/code-block/index.mjs +0 -0
- /package/{esm2020 → esm2022}/code-block/ptsecurity-mosaic-code-block.mjs +0 -0
- /package/{esm2020 → esm2022}/code-block/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/core/animation/animation.mjs +0 -0
- /package/{esm2020 → esm2022}/core/animation/fade-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/core/animation/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/animation/select-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/core/common-behaviors/constructor.mjs +0 -0
- /package/{esm2020 → esm2022}/core/common-behaviors/error-state.mjs +0 -0
- /package/{esm2020 → esm2022}/core/common-behaviors/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/datetime/date-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/core/datetime/date-formats.mjs +0 -0
- /package/{esm2020 → esm2022}/core/datetime/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/forms/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/label/label-options.mjs +0 -0
- /package/{esm2020 → esm2022}/core/locales/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/option/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/pop-up/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/core/pop-up/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/ptsecurity-mosaic-core.mjs +0 -0
- /package/{esm2020 → esm2022}/core/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/core/select/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/core/select/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/core/select/events.mjs +0 -0
- /package/{esm2020 → esm2022}/core/select/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/selection/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/core/selection/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/title/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/title/title-text-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/data-size/config.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/data-size/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/data-size/size.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/utils.mjs +0 -0
- /package/{esm2020 → esm2022}/core/validation/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/validation/validation.mjs +0 -0
- /package/{esm2020 → esm2022}/datepicker/datepicker-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/datepicker/datepicker-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/datepicker/index.mjs +0 -0
- /package/{esm2020 → esm2022}/datepicker/ptsecurity-mosaic-datepicker.mjs +0 -0
- /package/{esm2020 → esm2022}/datepicker/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/divider/index.mjs +0 -0
- /package/{esm2020 → esm2022}/divider/ptsecurity-mosaic-divider.mjs +0 -0
- /package/{esm2020 → esm2022}/divider/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/dl/index.mjs +0 -0
- /package/{esm2020 → esm2022}/dl/ptsecurity-mosaic-dl.mjs +0 -0
- /package/{esm2020 → esm2022}/dl/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/dropdown-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/dropdown-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/dropdown.types.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/index.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/ptsecurity-mosaic-dropdown.mjs +0 -0
- /package/{esm2020 → esm2022}/dropdown/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/ellipsis-center/index.mjs +0 -0
- /package/{esm2020 → esm2022}/ellipsis-center/ptsecurity-mosaic-ellipsis-center.mjs +0 -0
- /package/{esm2020 → esm2022}/ellipsis-center/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/file-upload/file-upload.mjs +0 -0
- /package/{esm2020 → esm2022}/file-upload/index.mjs +0 -0
- /package/{esm2020 → esm2022}/file-upload/ptsecurity-mosaic-file-upload.mjs +0 -0
- /package/{esm2020 → esm2022}/file-upload/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/form-field/form-field-control.mjs +0 -0
- /package/{esm2020 → esm2022}/form-field/form-field-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/form-field/index.mjs +0 -0
- /package/{esm2020 → esm2022}/form-field/ptsecurity-mosaic-form-field.mjs +0 -0
- /package/{esm2020 → esm2022}/form-field/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/icon/index.mjs +0 -0
- /package/{esm2020 → esm2022}/icon/ptsecurity-mosaic-icon.mjs +0 -0
- /package/{esm2020 → esm2022}/icon/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/input/index.mjs +0 -0
- /package/{esm2020 → esm2022}/input/input-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/input/input-value-accessor.mjs +0 -0
- /package/{esm2020 → esm2022}/input/ptsecurity-mosaic-input.mjs +0 -0
- /package/{esm2020 → esm2022}/input/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/link/index.mjs +0 -0
- /package/{esm2020 → esm2022}/link/ptsecurity-mosaic-link.mjs +0 -0
- /package/{esm2020 → esm2022}/link/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/list/index.mjs +0 -0
- /package/{esm2020 → esm2022}/list/ptsecurity-mosaic-list.mjs +0 -0
- /package/{esm2020 → esm2022}/list/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/loader-overlay/index.mjs +0 -0
- /package/{esm2020 → esm2022}/loader-overlay/ptsecurity-mosaic-loader-overlay.mjs +0 -0
- /package/{esm2020 → esm2022}/loader-overlay/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/markdown/index.mjs +0 -0
- /package/{esm2020 → esm2022}/markdown/markdown.values.mjs +0 -0
- /package/{esm2020 → esm2022}/markdown/ptsecurity-mosaic-markdown.mjs +0 -0
- /package/{esm2020 → esm2022}/markdown/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/index.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/modal-ref.class.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/modal-util.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/modal.type.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/ptsecurity-mosaic-modal.mjs +0 -0
- /package/{esm2020 → esm2022}/modal/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/navbar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/navbar/ptsecurity-mosaic-navbar.mjs +0 -0
- /package/{esm2020 → esm2022}/navbar/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/navbar/vertical-navbar.animation.mjs +0 -0
- /package/{esm2020 → esm2022}/popover/index.mjs +0 -0
- /package/{esm2020 → esm2022}/popover/popover-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/popover/ptsecurity-mosaic-popover.mjs +0 -0
- /package/{esm2020 → esm2022}/popover/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-bar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-bar/ptsecurity-mosaic-progress-bar.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-bar/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-spinner/index.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-spinner/ptsecurity-mosaic-progress-spinner.mjs +0 -0
- /package/{esm2020 → esm2022}/progress-spinner/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/ptsecurity-mosaic.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/radio/index.mjs +0 -0
- /package/{esm2020 → esm2022}/radio/ptsecurity-mosaic-radio.mjs +0 -0
- /package/{esm2020 → esm2022}/radio/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/select/index.mjs +0 -0
- /package/{esm2020 → esm2022}/select/ptsecurity-mosaic-select.mjs +0 -0
- /package/{esm2020 → esm2022}/select/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/sidebar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/sidebar/ptsecurity-mosaic-sidebar.mjs +0 -0
- /package/{esm2020 → esm2022}/sidebar/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/sidebar/sidebar-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/index.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/ptsecurity-mosaic-sidepanel.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/sidepanel-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/sidepanel-config.mjs +0 -0
- /package/{esm2020 → esm2022}/sidepanel/sidepanel-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/splitter/index.mjs +0 -0
- /package/{esm2020 → esm2022}/splitter/ptsecurity-mosaic-splitter.mjs +0 -0
- /package/{esm2020 → esm2022}/splitter/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/table/index.mjs +0 -0
- /package/{esm2020 → esm2022}/table/ptsecurity-mosaic-table.mjs +0 -0
- /package/{esm2020 → esm2022}/table/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tabs/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tabs/ptsecurity-mosaic-tabs.mjs +0 -0
- /package/{esm2020 → esm2022}/tabs/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tabs/tab-nav-bar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tabs/tabs-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/tags/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tags/ptsecurity-mosaic-tags.mjs +0 -0
- /package/{esm2020 → esm2022}/tags/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tags/tag-text-control.mjs +0 -0
- /package/{esm2020 → esm2022}/textarea/index.mjs +0 -0
- /package/{esm2020 → esm2022}/textarea/ptsecurity-mosaic-textarea.mjs +0 -0
- /package/{esm2020 → esm2022}/textarea/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/timepicker/index.mjs +0 -0
- /package/{esm2020 → esm2022}/timepicker/ptsecurity-mosaic-timepicker.mjs +0 -0
- /package/{esm2020 → esm2022}/timepicker/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/timepicker/timepicker.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/timezone/index.mjs +0 -0
- /package/{esm2020 → esm2022}/timezone/ptsecurity-mosaic-timezone.mjs +0 -0
- /package/{esm2020 → esm2022}/timezone/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/timezone/timezone.models.mjs +0 -0
- /package/{esm2020 → esm2022}/timezone/timezone.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/title/index.mjs +0 -0
- /package/{esm2020 → esm2022}/title/ptsecurity-mosaic-title.mjs +0 -0
- /package/{esm2020 → esm2022}/title/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/toast/index.mjs +0 -0
- /package/{esm2020 → esm2022}/toast/ptsecurity-mosaic-toast.mjs +0 -0
- /package/{esm2020 → esm2022}/toast/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/toast/toast-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/toast/toast.type.mjs +0 -0
- /package/{esm2020 → esm2022}/toggle/index.mjs +0 -0
- /package/{esm2020 → esm2022}/toggle/ptsecurity-mosaic-toggle.mjs +0 -0
- /package/{esm2020 → esm2022}/toggle/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/ptsecurity-mosaic-tooltip.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/tooltip.animations.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/base-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/flat-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/nested-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/data-source/nested-data-source.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/ptsecurity-mosaic-tree.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/tree-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/tree-select/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tree-select/ptsecurity-mosaic-tree-select.mjs +0 -0
- /package/{esm2020 → esm2022}/tree-select/public-api.mjs +0 -0
- /package/{fesm2015 → fesm2022}/ptsecurity-mosaic.mjs +0 -0
- /package/{fesm2015 → fesm2022}/ptsecurity-mosaic.mjs.map +0 -0
@@ -1,488 +0,0 @@
|
|
1
|
-
/* tslint:disable:naming-convention */
|
2
|
-
import { FocusKeyManager } from '@angular/cdk/a11y';
|
3
|
-
import { Directionality } from '@angular/cdk/bidi';
|
4
|
-
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
5
|
-
import { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';
|
6
|
-
import { Platform, normalizePassiveListenerOptions } from '@angular/cdk/platform';
|
7
|
-
import { ViewportRuler } from '@angular/cdk/scrolling';
|
8
|
-
import { ChangeDetectorRef, ElementRef, NgZone, Optional, EventEmitter, Directive, Inject, Input } from '@angular/core';
|
9
|
-
import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
|
10
|
-
import { DOWN_ARROW, END, HOME, LEFT_ARROW, RIGHT_ARROW, UP_ARROW } from '@ptsecurity/cdk/keycodes';
|
11
|
-
import { merge, of as observableOf, Subject, timer, fromEvent } from 'rxjs';
|
12
|
-
import { takeUntil } from 'rxjs/operators';
|
13
|
-
import * as i0 from "@angular/core";
|
14
|
-
import * as i1 from "@angular/cdk/scrolling";
|
15
|
-
import * as i2 from "@angular/cdk/platform";
|
16
|
-
import * as i3 from "@angular/cdk/bidi";
|
17
|
-
/** Config used to bind passive event listeners */
|
18
|
-
const passiveEventListenerOptions = normalizePassiveListenerOptions({ passive: true });
|
19
|
-
/**
|
20
|
-
* The distance in pixels that will be overshot when scrolling a tab label into view. This helps
|
21
|
-
* provide a small affordance to the label next to it.
|
22
|
-
*/
|
23
|
-
const EXAGGERATED_OVERSCROLL = 60;
|
24
|
-
/**
|
25
|
-
* Amount of milliseconds to wait before starting to scroll the header automatically.
|
26
|
-
* Set a little conservatively in order to handle fake events dispatched on touch devices.
|
27
|
-
*/
|
28
|
-
const HEADER_SCROLL_DELAY = 650;
|
29
|
-
/**
|
30
|
-
* Interval in milliseconds at which to scroll the header
|
31
|
-
* while the user is holding their pointer.
|
32
|
-
*/
|
33
|
-
const HEADER_SCROLL_INTERVAL = 100;
|
34
|
-
const VIEWPORT_THROTTLE_TIME = 150;
|
35
|
-
const SCROLL_DISTANCE = 0.8;
|
36
|
-
/**
|
37
|
-
* Base class for a tab header that supported pagination.
|
38
|
-
* @docs-private
|
39
|
-
*/
|
40
|
-
export class McPaginatedTabHeader {
|
41
|
-
constructor(elementRef, changeDetectorRef, viewportRuler, ngZone, platform, dir, animationMode) {
|
42
|
-
this.elementRef = elementRef;
|
43
|
-
this.changeDetectorRef = changeDetectorRef;
|
44
|
-
this.viewportRuler = viewportRuler;
|
45
|
-
this.ngZone = ngZone;
|
46
|
-
this.platform = platform;
|
47
|
-
this.dir = dir;
|
48
|
-
this.animationMode = animationMode;
|
49
|
-
this._selectedIndex = 0;
|
50
|
-
/** The distance in pixels that the tab labels should be translated to the left. */
|
51
|
-
this._scrollDistance = 0;
|
52
|
-
/** Event emitted when the option is selected. */
|
53
|
-
this.selectFocusedIndex = new EventEmitter();
|
54
|
-
/** Event emitted when a label is focused. */
|
55
|
-
this.indexFocused = new EventEmitter();
|
56
|
-
/** Whether the controls for pagination should be displayed */
|
57
|
-
this.showPaginationControls = false;
|
58
|
-
/** Whether the tab list can be scrolled more towards the end of the tab label list. */
|
59
|
-
this.disableScrollAfter = true;
|
60
|
-
/** Whether the tab list can be scrolled more towards the beginning of the tab label list. */
|
61
|
-
this.disableScrollBefore = true;
|
62
|
-
/**
|
63
|
-
* Whether pagination should be disabled. This can be used to avoid unnecessary
|
64
|
-
* layout recalculations if it's known that pagination won't be required.
|
65
|
-
*/
|
66
|
-
this.disablePagination = false;
|
67
|
-
/** Emits when the component is destroyed. */
|
68
|
-
this.destroyed = new Subject();
|
69
|
-
this.vertical = false;
|
70
|
-
/** Stream that will stop the automated scrolling. */
|
71
|
-
this.stopScrolling = new Subject();
|
72
|
-
/** Whether the header should scroll to the selected index after the view has been checked. */
|
73
|
-
this.selectedIndexChanged = false;
|
74
|
-
// Bind the `mouseleave` event on the outside since it doesn't change anything in the view.
|
75
|
-
ngZone.runOutsideAngular(() => {
|
76
|
-
fromEvent(elementRef.nativeElement, 'mouseleave')
|
77
|
-
.pipe(takeUntil(this.destroyed))
|
78
|
-
.subscribe(() => this.stopInterval());
|
79
|
-
});
|
80
|
-
}
|
81
|
-
/** The index of the active tab. */
|
82
|
-
get selectedIndex() {
|
83
|
-
return this._selectedIndex;
|
84
|
-
}
|
85
|
-
set selectedIndex(value) {
|
86
|
-
const coercedValue = coerceNumberProperty(value);
|
87
|
-
this.selectedIndexChanged = this._selectedIndex !== coercedValue;
|
88
|
-
this._selectedIndex = coercedValue;
|
89
|
-
this.keyManager?.updateActiveItem(coercedValue);
|
90
|
-
}
|
91
|
-
/** Tracks which element has focus; used for keyboard navigation */
|
92
|
-
get focusIndex() {
|
93
|
-
return this.keyManager ? this.keyManager.activeItemIndex : 0;
|
94
|
-
}
|
95
|
-
/** When the focus index is set, we must manually send focus to the correct label */
|
96
|
-
set focusIndex(value) {
|
97
|
-
if (!this.isValidIndex(value) || this.focusIndex === value || !this.keyManager) {
|
98
|
-
return;
|
99
|
-
}
|
100
|
-
this.keyManager.setActiveItem(value);
|
101
|
-
}
|
102
|
-
/** Sets the distance in pixels that the tab header should be transformed in the X-axis. */
|
103
|
-
get scrollDistance() {
|
104
|
-
return this._scrollDistance;
|
105
|
-
}
|
106
|
-
set scrollDistance(v) {
|
107
|
-
this._scrollDistance = Math.max(0, Math.min(this.getMaxScrollDistance(), v));
|
108
|
-
// Mark that the scroll distance has changed so that after the view is checked, the CSS
|
109
|
-
// transformation can move the header.
|
110
|
-
this.scrollDistanceChanged = true;
|
111
|
-
this.checkScrollingControls();
|
112
|
-
}
|
113
|
-
/** Called when the user has selected an item via the keyboard. */
|
114
|
-
ngAfterViewInit() {
|
115
|
-
// We need to handle these events manually, because we want to bind passive event listeners.
|
116
|
-
fromEvent(this.previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)
|
117
|
-
.pipe(takeUntil(this.destroyed))
|
118
|
-
.subscribe(() => this.handlePaginatorPress('before'));
|
119
|
-
fromEvent(this.nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)
|
120
|
-
.pipe(takeUntil(this.destroyed))
|
121
|
-
.subscribe(() => this.handlePaginatorPress('after'));
|
122
|
-
}
|
123
|
-
ngAfterContentInit() {
|
124
|
-
const dirChange = this.dir ? this.dir.change : observableOf('ltr');
|
125
|
-
const resize = this.viewportRuler.change(VIEWPORT_THROTTLE_TIME);
|
126
|
-
const realign = () => {
|
127
|
-
this.updatePagination();
|
128
|
-
};
|
129
|
-
this.keyManager = new FocusKeyManager(this.items)
|
130
|
-
.withHorizontalOrientation(this.getLayoutDirection());
|
131
|
-
this.keyManager.updateActiveItem(this._selectedIndex);
|
132
|
-
// Defer the first call in order to allow for slower browsers to lay out the elements.
|
133
|
-
// This helps in cases where the user lands directly on a page with paginated tabs.
|
134
|
-
typeof requestAnimationFrame !== undefined ? requestAnimationFrame(realign) : realign();
|
135
|
-
// On dir change or window resize, realign the ink bar and update the orientation of
|
136
|
-
// the key manager if the direction has changed.
|
137
|
-
merge(dirChange, resize, this.items.changes)
|
138
|
-
.pipe(takeUntil(this.destroyed))
|
139
|
-
.subscribe(() => {
|
140
|
-
// We need to defer this to give the browser some time to recalculate
|
141
|
-
// the element dimensions. The call has to be wrapped in `NgZone.run`,
|
142
|
-
// because the viewport change handler runs outside of Angular.
|
143
|
-
this.ngZone.run(() => Promise.resolve().then(() => {
|
144
|
-
this.updateScrollPosition();
|
145
|
-
realign();
|
146
|
-
}));
|
147
|
-
this.keyManager.withHorizontalOrientation(this.getLayoutDirection());
|
148
|
-
});
|
149
|
-
// If there is a change in the focus key manager we need to emit the `indexFocused`
|
150
|
-
// event in order to provide a public event that notifies about focus changes. Also we realign
|
151
|
-
// the tabs container by scrolling the new focused tab into the visible section.
|
152
|
-
this.keyManager.change
|
153
|
-
.pipe(takeUntil(this.destroyed))
|
154
|
-
.subscribe((newFocusIndex) => {
|
155
|
-
this.indexFocused.emit(newFocusIndex);
|
156
|
-
this.setTabFocus(newFocusIndex);
|
157
|
-
});
|
158
|
-
}
|
159
|
-
ngAfterContentChecked() {
|
160
|
-
// If the number of tab labels have changed, check if scrolling should be enabled
|
161
|
-
if (this.tabLabelCount !== this.items.length) {
|
162
|
-
this.updatePagination();
|
163
|
-
this.tabLabelCount = this.items.length;
|
164
|
-
this.changeDetectorRef.markForCheck();
|
165
|
-
}
|
166
|
-
// If the selected index has changed, scroll to the label and check if the scrolling controls
|
167
|
-
// should be disabled.
|
168
|
-
if (this.selectedIndexChanged) {
|
169
|
-
this.scrollToLabel(this._selectedIndex);
|
170
|
-
this.checkScrollingControls();
|
171
|
-
this.selectedIndexChanged = false;
|
172
|
-
this.changeDetectorRef.markForCheck();
|
173
|
-
}
|
174
|
-
// If the scroll distance has been changed (tab selected, focused, scroll controls activated),
|
175
|
-
// then translate the header to reflect this.
|
176
|
-
if (this.scrollDistanceChanged) {
|
177
|
-
this.updateTabScrollPosition();
|
178
|
-
this.scrollDistanceChanged = false;
|
179
|
-
this.changeDetectorRef.markForCheck();
|
180
|
-
}
|
181
|
-
}
|
182
|
-
ngOnDestroy() {
|
183
|
-
this.destroyed.next();
|
184
|
-
this.destroyed.complete();
|
185
|
-
this.stopScrolling.complete();
|
186
|
-
}
|
187
|
-
handleKeydown(event) {
|
188
|
-
// We don't handle any key bindings with a modifier key.
|
189
|
-
if (hasModifierKey(event)) {
|
190
|
-
return;
|
191
|
-
}
|
192
|
-
// tslint:disable-next-line: deprecation
|
193
|
-
const key = event.keyCode;
|
194
|
-
if (key === HOME) {
|
195
|
-
this.keyManager.setFirstItemActive();
|
196
|
-
}
|
197
|
-
else if (key === END) {
|
198
|
-
this.keyManager.setLastItemActive();
|
199
|
-
}
|
200
|
-
else if (key === UP_ARROW && this.vertical) {
|
201
|
-
this.keyManager.setPreviousItemActive();
|
202
|
-
}
|
203
|
-
else if (key === DOWN_ARROW && this.vertical) {
|
204
|
-
this.keyManager.setNextItemActive();
|
205
|
-
}
|
206
|
-
else if (key === RIGHT_ARROW && !this.vertical) {
|
207
|
-
this.keyManager.setNextItemActive();
|
208
|
-
}
|
209
|
-
else if (key === LEFT_ARROW && !this.vertical) {
|
210
|
-
this.keyManager.setPreviousItemActive();
|
211
|
-
}
|
212
|
-
else if ([ENTER, SPACE].includes(key)) {
|
213
|
-
this.selectFocusedIndex.emit(this.focusIndex);
|
214
|
-
}
|
215
|
-
if ([HOME, END, UP_ARROW, DOWN_ARROW, RIGHT_ARROW, LEFT_ARROW, SPACE, ENTER].includes(key)) {
|
216
|
-
event.preventDefault();
|
217
|
-
}
|
218
|
-
}
|
219
|
-
/**
|
220
|
-
* Callback for when the MutationObserver detects that the content has changed.
|
221
|
-
*/
|
222
|
-
onContentChanges() {
|
223
|
-
const textContent = this.elementRef.nativeElement.textContent;
|
224
|
-
// We need to diff the text content of the header, because the MutationObserver callback
|
225
|
-
// will fire even if the text content didn't change which is inefficient and is prone
|
226
|
-
// to infinite loops if a poorly constructed expression is passed in (see #14249).
|
227
|
-
if (textContent !== this.currentTextContent) {
|
228
|
-
this.currentTextContent = textContent || '';
|
229
|
-
// The content observer runs outside the `NgZone` by default, which
|
230
|
-
// means that we need to bring the callback back in ourselves.
|
231
|
-
this.ngZone.run(() => {
|
232
|
-
this.updatePagination();
|
233
|
-
this.changeDetectorRef.markForCheck();
|
234
|
-
});
|
235
|
-
}
|
236
|
-
}
|
237
|
-
/**
|
238
|
-
* Updates the view whether pagination should be enabled or not.
|
239
|
-
*
|
240
|
-
* WARNING: Calling this method can be very costly in terms of performance. It should be called
|
241
|
-
* as infrequently as possible from outside of the Tabs component as it causes a reflow of the
|
242
|
-
* page.
|
243
|
-
*/
|
244
|
-
updatePagination() {
|
245
|
-
this.checkPaginationEnabled();
|
246
|
-
this.checkScrollingControls();
|
247
|
-
this.updateTabScrollPosition();
|
248
|
-
}
|
249
|
-
/**
|
250
|
-
* Determines if an index is valid. If the tabs are not ready yet, we assume that the user is
|
251
|
-
* providing a valid index and return true.
|
252
|
-
*/
|
253
|
-
isValidIndex(index) {
|
254
|
-
if (!this.items) {
|
255
|
-
return true;
|
256
|
-
}
|
257
|
-
const tab = this.items ? this.items.toArray()[index] : null;
|
258
|
-
return !!tab && !tab.disabled;
|
259
|
-
}
|
260
|
-
/**
|
261
|
-
* Sets focus on the HTML element for the label wrapper and scrolls it into the view if
|
262
|
-
* scrolling is enabled.
|
263
|
-
*/
|
264
|
-
setTabFocus(tabIndex) {
|
265
|
-
if (this.showPaginationControls) {
|
266
|
-
this.scrollToLabel(tabIndex);
|
267
|
-
}
|
268
|
-
if (this.items?.length) {
|
269
|
-
this.items.toArray()[tabIndex].focus();
|
270
|
-
// Do not let the browser manage scrolling to focus the element, this will be handled
|
271
|
-
// by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width
|
272
|
-
// should be the full width minus the offset width.
|
273
|
-
const containerEl = this.tabListContainer.nativeElement;
|
274
|
-
const dir = this.getLayoutDirection();
|
275
|
-
if (dir === 'ltr') {
|
276
|
-
containerEl.scrollLeft = 0;
|
277
|
-
}
|
278
|
-
else {
|
279
|
-
containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;
|
280
|
-
}
|
281
|
-
}
|
282
|
-
}
|
283
|
-
/** The layout direction of the containing app. */
|
284
|
-
getLayoutDirection() {
|
285
|
-
return this.dir?.value === 'rtl' ? 'rtl' : 'ltr';
|
286
|
-
}
|
287
|
-
/** Performs the CSS transformation on the tab list that will cause the list to scroll. */
|
288
|
-
updateTabScrollPosition() {
|
289
|
-
if (this.disablePagination) {
|
290
|
-
return;
|
291
|
-
}
|
292
|
-
const scrollDistance = this.scrollDistance;
|
293
|
-
const translateX = this.getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;
|
294
|
-
// Don't use `translate3d` here because we don't want to create a new layer. A new layer
|
295
|
-
// seems to cause flickering and overflow in Internet Explorer. For example, the ink bar
|
296
|
-
// and ripples will exceed the boundaries of the visible tab bar.
|
297
|
-
// See: https://github.com/angular/components/issues/10276
|
298
|
-
// We round the `transform` here, because transforms with sub-pixel precision cause some
|
299
|
-
// browsers to blur the content of the element.
|
300
|
-
this.tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;
|
301
|
-
// Setting the `transform` on IE will change the scroll offset of the parent, causing the
|
302
|
-
// position to be thrown off in some cases. We have to reset it ourselves to ensure that
|
303
|
-
// it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing
|
304
|
-
// with the scroll position throws off Chrome 71+ in RTL mode (see #14689).
|
305
|
-
if (this.platform.TRIDENT || this.platform.EDGE) {
|
306
|
-
this.tabListContainer.nativeElement.scrollLeft = 0;
|
307
|
-
}
|
308
|
-
}
|
309
|
-
/**
|
310
|
-
* Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or
|
311
|
-
* the end of the list, respectively). The distance to scroll is computed to be a third of the
|
312
|
-
* length of the tab list view window.
|
313
|
-
*
|
314
|
-
* This is an expensive call that forces a layout reflow to compute box and scroll metrics and
|
315
|
-
* should be called sparingly.
|
316
|
-
*/
|
317
|
-
scrollHeader(direction) {
|
318
|
-
const viewLength = this.tabListContainer.nativeElement.offsetWidth;
|
319
|
-
// Move the scroll distance one-third the length of the tab list's viewport.
|
320
|
-
const scrollAmount = (direction === 'before' ? -1 : 1) * viewLength * SCROLL_DISTANCE;
|
321
|
-
return this.scrollTo(this.scrollDistance + scrollAmount);
|
322
|
-
}
|
323
|
-
/** Handles click events on the pagination arrows. */
|
324
|
-
handlePaginatorClick(direction) {
|
325
|
-
this.stopInterval();
|
326
|
-
this.scrollHeader(direction);
|
327
|
-
}
|
328
|
-
/**
|
329
|
-
* Moves the tab list such that the desired tab label (marked by index) is moved into view.
|
330
|
-
*
|
331
|
-
* This is an expensive call that forces a layout reflow to compute box and scroll metrics and
|
332
|
-
* should be called sparingly.
|
333
|
-
*/
|
334
|
-
scrollToLabel(labelIndex) {
|
335
|
-
if (this.disablePagination) {
|
336
|
-
return;
|
337
|
-
}
|
338
|
-
const selectedLabel = this.items ? this.items.toArray()[labelIndex] : null;
|
339
|
-
if (!selectedLabel) {
|
340
|
-
return;
|
341
|
-
}
|
342
|
-
// The view length is the visible width of the tab labels.
|
343
|
-
const viewLength = this.tabListContainer.nativeElement.offsetWidth;
|
344
|
-
const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;
|
345
|
-
let labelBeforePos;
|
346
|
-
let labelAfterPos;
|
347
|
-
if (this.getLayoutDirection() === 'ltr') {
|
348
|
-
labelBeforePos = offsetLeft;
|
349
|
-
labelAfterPos = labelBeforePos + offsetWidth;
|
350
|
-
}
|
351
|
-
else {
|
352
|
-
labelAfterPos = this.tabList.nativeElement.offsetWidth - offsetLeft;
|
353
|
-
labelBeforePos = labelAfterPos - offsetWidth;
|
354
|
-
}
|
355
|
-
const beforeVisiblePos = this.scrollDistance;
|
356
|
-
const afterVisiblePos = this.scrollDistance + viewLength;
|
357
|
-
if (labelBeforePos < beforeVisiblePos) {
|
358
|
-
// Scroll header to move label to the before direction
|
359
|
-
this.scrollDistance -= beforeVisiblePos - labelBeforePos + EXAGGERATED_OVERSCROLL;
|
360
|
-
}
|
361
|
-
else if (labelAfterPos > afterVisiblePos) {
|
362
|
-
// Scroll header to move label to the after direction
|
363
|
-
this.scrollDistance += labelAfterPos - afterVisiblePos + EXAGGERATED_OVERSCROLL;
|
364
|
-
}
|
365
|
-
}
|
366
|
-
/**
|
367
|
-
* Evaluate whether the pagination controls should be displayed. If the scroll width of the
|
368
|
-
* tab list is wider than the size of the header container, then the pagination controls should
|
369
|
-
* be shown.
|
370
|
-
*
|
371
|
-
* This is an expensive call that forces a layout reflow to compute box and scroll metrics and
|
372
|
-
* should be called sparingly.
|
373
|
-
*/
|
374
|
-
checkPaginationEnabled() {
|
375
|
-
if (this.disablePagination || this.vertical) {
|
376
|
-
this.showPaginationControls = false;
|
377
|
-
}
|
378
|
-
else {
|
379
|
-
const isEnabled = this.tabList.nativeElement.scrollWidth > this.elementRef.nativeElement.offsetWidth;
|
380
|
-
if (!isEnabled) {
|
381
|
-
this.scrollDistance = 0;
|
382
|
-
}
|
383
|
-
if (isEnabled !== this.showPaginationControls) {
|
384
|
-
this.changeDetectorRef.markForCheck();
|
385
|
-
}
|
386
|
-
this.showPaginationControls = isEnabled;
|
387
|
-
}
|
388
|
-
}
|
389
|
-
/**
|
390
|
-
* Evaluate whether the before and after controls should be enabled or disabled.
|
391
|
-
* If the header is at the beginning of the list (scroll distance is equal to 0) then disable the
|
392
|
-
* before button. If the header is at the end of the list (scroll distance is equal to the
|
393
|
-
* maximum distance we can scroll), then disable the after button.
|
394
|
-
*
|
395
|
-
* This is an expensive call that forces a layout reflow to compute box and scroll metrics and
|
396
|
-
* should be called sparingly.
|
397
|
-
*/
|
398
|
-
checkScrollingControls() {
|
399
|
-
if (this.disablePagination) {
|
400
|
-
this.disableScrollAfter = this.disableScrollBefore = true;
|
401
|
-
}
|
402
|
-
else {
|
403
|
-
// Check if the pagination arrows should be activated.
|
404
|
-
this.disableScrollBefore = this.scrollDistance === 0;
|
405
|
-
this.disableScrollAfter = this.scrollDistance === this.getMaxScrollDistance();
|
406
|
-
this.changeDetectorRef.markForCheck();
|
407
|
-
}
|
408
|
-
}
|
409
|
-
/**
|
410
|
-
* Determines what is the maximum length in pixels that can be set for the scroll distance. This
|
411
|
-
* is equal to the difference in width between the tab list container and tab header container.
|
412
|
-
*
|
413
|
-
* This is an expensive call that forces a layout reflow to compute box and scroll metrics and
|
414
|
-
* should be called sparingly.
|
415
|
-
*/
|
416
|
-
getMaxScrollDistance() {
|
417
|
-
const lengthOfTabList = this.tabList.nativeElement.scrollWidth;
|
418
|
-
const viewLength = this.tabListContainer.nativeElement.offsetWidth;
|
419
|
-
return (lengthOfTabList - viewLength) || 0;
|
420
|
-
}
|
421
|
-
/** Stops the currently-running paginator interval. */
|
422
|
-
stopInterval() {
|
423
|
-
this.stopScrolling.next();
|
424
|
-
}
|
425
|
-
/**
|
426
|
-
* Handles the user pressing down on one of the paginators.
|
427
|
-
* Starts scrolling the header after a certain amount of time.
|
428
|
-
* @param direction In which direction the paginator should be scrolled.
|
429
|
-
*/
|
430
|
-
handlePaginatorPress(direction, mouseEvent) {
|
431
|
-
// Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to
|
432
|
-
// null check the `button`, but we do it so we don't break tests that use fake events.
|
433
|
-
if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {
|
434
|
-
return;
|
435
|
-
}
|
436
|
-
// Avoid overlapping timers.
|
437
|
-
this.stopInterval();
|
438
|
-
// Start a timer after the delay and keep firing based on the interval.
|
439
|
-
timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)
|
440
|
-
// Keep the timer going until something tells it to stop or the component is destroyed.
|
441
|
-
.pipe(takeUntil(merge(this.stopScrolling, this.destroyed)))
|
442
|
-
.subscribe(() => {
|
443
|
-
const { maxScrollDistance, distance } = this.scrollHeader(direction);
|
444
|
-
// Stop the timer if we've reached the start or the end.
|
445
|
-
if (distance === 0 || distance >= maxScrollDistance) {
|
446
|
-
this.stopInterval();
|
447
|
-
}
|
448
|
-
});
|
449
|
-
}
|
450
|
-
/**
|
451
|
-
* Scrolls the header to a given position.
|
452
|
-
* @param position Position to which to scroll.
|
453
|
-
* @returns Information on the current scroll distance and the maximum.
|
454
|
-
*/
|
455
|
-
scrollTo(position) {
|
456
|
-
if (this.disablePagination) {
|
457
|
-
return { maxScrollDistance: 0, distance: 0 };
|
458
|
-
}
|
459
|
-
const maxScrollDistance = this.getMaxScrollDistance();
|
460
|
-
this.scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));
|
461
|
-
// Mark that the scroll distance has changed so that after the view is checked, the CSS
|
462
|
-
// transformation can move the header.
|
463
|
-
this.scrollDistanceChanged = true;
|
464
|
-
this.checkScrollingControls();
|
465
|
-
return { maxScrollDistance, distance: this.scrollDistance };
|
466
|
-
}
|
467
|
-
updateScrollPosition() {
|
468
|
-
const maxScrollDistance = this.getMaxScrollDistance();
|
469
|
-
if (this.scrollDistance > maxScrollDistance) {
|
470
|
-
this.scrollTo(maxScrollDistance);
|
471
|
-
}
|
472
|
-
}
|
473
|
-
}
|
474
|
-
/** @nocollapse */ McPaginatedTabHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: McPaginatedTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ViewportRuler }, { token: i0.NgZone }, { token: i2.Platform }, { token: i3.Directionality, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
475
|
-
/** @nocollapse */ McPaginatedTabHeader.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: McPaginatedTabHeader, inputs: { disablePagination: "disablePagination" }, ngImport: i0 });
|
476
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: McPaginatedTabHeader, decorators: [{
|
477
|
-
type: Directive
|
478
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ViewportRuler }, { type: i0.NgZone }, { type: i2.Platform }, { type: i3.Directionality, decorators: [{
|
479
|
-
type: Optional
|
480
|
-
}] }, { type: undefined, decorators: [{
|
481
|
-
type: Optional
|
482
|
-
}, {
|
483
|
-
type: Inject,
|
484
|
-
args: [ANIMATION_MODULE_TYPE]
|
485
|
-
}] }]; }, propDecorators: { disablePagination: [{
|
486
|
-
type: Input
|
487
|
-
}] } });
|
488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGVkLXRhYi1oZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9tb3NhaWMvdGFicy9wYWdpbmF0ZWQtdGFiLWhlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBbUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQWEsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUVSLFlBQVksRUFLWixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUczQyxrREFBa0Q7QUFDbEQsTUFBTSwyQkFBMkIsR0FBRywrQkFBK0IsQ0FBQyxF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QkFBQyxxQkFBcUI7NENBbkNwQyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpuYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHsgRm9jdXNLZXlNYW5hZ2VyLCBGb2N1c2FibGVPcHRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRU5URVIsIFNQQUNFLCBoYXNNb2RpZmllcktleSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSwgbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgTmdab25lLFxuICAgIE9wdGlvbmFsLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25EZXN0cm95LFxuICAgIERpcmVjdGl2ZSxcbiAgICBJbmplY3QsXG4gICAgSW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBTklNQVRJT05fTU9EVUxFX1RZUEUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgRU5ELCBIT01FLCBMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAcHRzZWN1cml0eS9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgbWVyZ2UsIG9mIGFzIG9ic2VydmFibGVPZiwgU3ViamVjdCwgdGltZXIsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbi8qKiBDb25maWcgdXNlZCB0byBiaW5kIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzICovXG5jb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgZGlyZWN0aW9ucyB0aGF0IHNjcm9sbGluZyBjYW4gZ28gaW4gd2hlbiB0aGUgaGVhZGVyJ3MgdGFicyBleGNlZWQgdGhlIGhlYWRlciB3aWR0aC4gJ0FmdGVyJ1xuICogd2lsbCBzY3JvbGwgdGhlIGhlYWRlciB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIHRhYnMgbGlzdCBhbmQgJ2JlZm9yZScgd2lsbCBzY3JvbGwgdG93YXJkcyB0aGVcbiAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2Nyb2xsRGlyZWN0aW9uID0gJ2FmdGVyJyB8ICdiZWZvcmUnO1xuXG4vKipcbiAqIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhhdCB3aWxsIGJlIG92ZXJzaG90IHdoZW4gc2Nyb2xsaW5nIGEgdGFiIGxhYmVsIGludG8gdmlldy4gVGhpcyBoZWxwc1xuICogcHJvdmlkZSBhIHNtYWxsIGFmZm9yZGFuY2UgdG8gdGhlIGxhYmVsIG5leHQgdG8gaXQuXG4gKi9cbmNvbnN0IEVYQUdHRVJBVEVEX09WRVJTQ1JPTEwgPSA2MDtcblxuLyoqXG4gKiBBbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHRvIHNjcm9sbCB0aGUgaGVhZGVyIGF1dG9tYXRpY2FsbHkuXG4gKiBTZXQgYSBsaXR0bGUgY29uc2VydmF0aXZlbHkgaW4gb3JkZXIgdG8gaGFuZGxlIGZha2UgZXZlbnRzIGRpc3BhdGNoZWQgb24gdG91Y2ggZGV2aWNlcy5cbiAqL1xuY29uc3QgSEVBREVSX1NDUk9MTF9ERUxBWSA9IDY1MDtcblxuLyoqXG4gKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYXQgd2hpY2ggdG8gc2Nyb2xsIHRoZSBoZWFkZXJcbiAqIHdoaWxlIHRoZSB1c2VyIGlzIGhvbGRpbmcgdGhlaXIgcG9pbnRlci5cbiAqL1xuY29uc3QgSEVBREVSX1NDUk9MTF9JTlRFUlZBTCA9IDEwMDtcblxuY29uc3QgVklFV1BPUlRfVEhST1RUTEVfVElNRSA9IDE1MDtcbmNvbnN0IFNDUk9MTF9ESVNUQU5DRSA9IDAuODtcblxuLyoqIEl0ZW0gaW5zaWRlIGEgcGFnaW5hdGVkIHRhYiBoZWFkZXIuICovXG5leHBvcnQgdHlwZSBNY1BhZ2luYXRlZFRhYkhlYWRlckl0ZW0gPSBGb2N1c2FibGVPcHRpb24gJiB7IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgfTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhIHRhYiBoZWFkZXIgdGhhdCBzdXBwb3J0ZWQgcGFnaW5hdGlvbi5cbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWNQYWdpbmF0ZWRUYWJIZWFkZXIgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGFjdGl2ZSB0YWIuICovXG4gICAgZ2V0IHNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSW5kZXg7XG4gICAgfVxuXG4gICAgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZWQgPSB0aGlzLl9zZWxlY3RlZEluZGV4ICE9PSBjb2VyY2VkVmFsdWU7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBjb2VyY2VkVmFsdWU7XG5cbiAgICAgICAgdGhpcy5rZXlNYW5hZ2VyPy51cGRhdGVBY3RpdmVJdGVtKGNvZXJjZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRJbmRleCA9IDA7XG5cblxuICAgIC8qKiBUcmFja3Mgd2hpY2ggZWxlbWVudCBoYXMgZm9jdXM7IHVzZWQgZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gKi9cbiAgICBnZXQgZm9jdXNJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlNYW5hZ2VyID8gdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCEgOiAwO1xuICAgIH1cblxuICAgIC8qKiBXaGVuIHRoZSBmb2N1cyBpbmRleCBpcyBzZXQsIHdlIG11c3QgbWFudWFsbHkgc2VuZCBmb2N1cyB0byB0aGUgY29ycmVjdCBsYWJlbCAqL1xuICAgIHNldCBmb2N1c0luZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbmRleCh2YWx1ZSkgfHwgdGhpcy5mb2N1c0luZGV4ID09PSB2YWx1ZSB8fCAhdGhpcy5rZXlNYW5hZ2VyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogU2V0cyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgdGhlIHRhYiBoZWFkZXIgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBYLWF4aXMuICovXG4gICAgZ2V0IHNjcm9sbERpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZTtcbiAgICB9XG5cbiAgICBzZXQgc2Nyb2xsRGlzdGFuY2UodjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3Njcm9sbERpc3RhbmNlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5nZXRNYXhTY3JvbGxEaXN0YW5jZSgpLCB2KSk7XG5cbiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBzY3JvbGwgZGlzdGFuY2UgaGFzIGNoYW5nZWQgc28gdGhhdCBhZnRlciB0aGUgdmlldyBpcyBjaGVja2VkLCB0aGUgQ1NTXG4gICAgICAgIC8vIHRyYW5zZm9ybWF0aW9uIGNhbiBtb3ZlIHRoZSBoZWFkZXIuXG4gICAgICAgIHRoaXMuc2Nyb2xsRGlzdGFuY2VDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhhdCB0aGUgdGFiIGxhYmVscyBzaG91bGQgYmUgdHJhbnNsYXRlZCB0byB0aGUgbGVmdC4gKi9cbiAgICBwcml2YXRlIF9zY3JvbGxEaXN0YW5jZSA9IDA7XG5cbiAgICBhYnN0cmFjdCBpdGVtczogUXVlcnlMaXN0PE1jUGFnaW5hdGVkVGFiSGVhZGVySXRlbT47XG4gICAgYWJzdHJhY3QgdGFiTGlzdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgYWJzdHJhY3QgdGFiTGlzdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgYWJzdHJhY3QgbmV4dFBhZ2luYXRvcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgYWJzdHJhY3QgcHJldmlvdXNQYWdpbmF0b3I6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgb3B0aW9uIGlzIHNlbGVjdGVkLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdEZvY3VzZWRJbmRleDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBsYWJlbCBpcyBmb2N1c2VkLiAqL1xuICAgIHJlYWRvbmx5IGluZGV4Rm9jdXNlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjb250cm9scyBmb3IgcGFnaW5hdGlvbiBzaG91bGQgYmUgZGlzcGxheWVkICovXG4gICAgc2hvd1BhZ2luYXRpb25Db250cm9scyA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRhYiBsaXN0IGNhbiBiZSBzY3JvbGxlZCBtb3JlIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgdGFiIGxhYmVsIGxpc3QuICovXG4gICAgZGlzYWJsZVNjcm9sbEFmdGVyID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB0YWIgbGlzdCBjYW4gYmUgc2Nyb2xsZWQgbW9yZSB0b3dhcmRzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYiBsYWJlbCBsaXN0LiAqL1xuICAgIGRpc2FibGVTY3JvbGxCZWZvcmUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBwYWdpbmF0aW9uIHNob3VsZCBiZSBkaXNhYmxlZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeVxuICAgICAqIGxheW91dCByZWNhbGN1bGF0aW9ucyBpZiBpdCdzIGtub3duIHRoYXQgcGFnaW5hdGlvbiB3b24ndCBiZSByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlUGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgdmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGFiIGxhYmVscyB0aGF0IGFyZSBkaXNwbGF5ZWQgb24gdGhlIGhlYWRlci4gV2hlbiB0aGlzIGNoYW5nZXMsIHRoZSBoZWFkZXJcbiAgICAgKiBzaG91bGQgcmUtZXZhbHVhdGUgdGhlIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRhYkxhYmVsQ291bnQ6IG51bWJlcjtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBzY3JvbGwgZGlzdGFuY2UgaGFzIGNoYW5nZWQgYW5kIHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHRoZSB2aWV3IGlzIGNoZWNrZWQuICovXG4gICAgcHJpdmF0ZSBzY3JvbGxEaXN0YW5jZUNoYW5nZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogVXNlZCB0byBtYW5hZ2UgZm9jdXMgYmV0d2VlbiB0aGUgdGFicy4gKi9cbiAgICBwcml2YXRlIGtleU1hbmFnZXI6IEZvY3VzS2V5TWFuYWdlcjxNY1BhZ2luYXRlZFRhYkhlYWRlckl0ZW0+O1xuXG4gICAgLyoqIENhY2hlZCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGhlYWRlci4gKi9cbiAgICBwcml2YXRlIGN1cnJlbnRUZXh0Q29udGVudDogc3RyaW5nO1xuXG4gICAgLyoqIFN0cmVhbSB0aGF0IHdpbGwgc3RvcCB0aGUgYXV0b21hdGVkIHNjcm9sbGluZy4gKi9cbiAgICBwcml2YXRlIHN0b3BTY3JvbGxpbmcgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGhlYWRlciBzaG91bGQgc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCBpbmRleCBhZnRlciB0aGUgdmlldyBoYXMgYmVlbiBjaGVja2VkLiAqL1xuICAgIHByaXZhdGUgc2VsZWN0ZWRJbmRleENoYW5nZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGlyOiBEaXJlY3Rpb25hbGl0eSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIHB1YmxpYyBhbmltYXRpb25Nb2RlPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIC8vIEJpbmQgdGhlIGBtb3VzZWxlYXZlYCBldmVudCBvbiB0aGUgb3V0c2lkZSBzaW5jZSBpdCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgdmlldy5cbiAgICAgICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudChlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdG9wSW50ZXJ2YWwoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgYW4gaXRlbSB2aWEgdGhlIGtleWJvYXJkLiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgdGhlc2UgZXZlbnRzIG1hbnVhbGx5LCBiZWNhdXNlIHdlIHdhbnQgdG8gYmluZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMucHJldmlvdXNQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZVBhZ2luYXRvclByZXNzKCdiZWZvcmUnKSk7XG5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMubmV4dFBhZ2luYXRvci5uYXRpdmVFbGVtZW50LCAndG91Y2hzdGFydCcsIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGFuZGxlUGFnaW5hdG9yUHJlc3MoJ2FmdGVyJykpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgY29uc3QgZGlyQ2hhbmdlID0gdGhpcy5kaXIgPyB0aGlzLmRpci5jaGFuZ2UgOiBvYnNlcnZhYmxlT2YoJ2x0cicpO1xuICAgICAgICBjb25zdCByZXNpemUgPSB0aGlzLnZpZXdwb3J0UnVsZXIuY2hhbmdlKFZJRVdQT1JUX1RIUk9UVExFX1RJTUUpO1xuXG4gICAgICAgIGNvbnN0IHJlYWxpZ24gPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmtleU1hbmFnZXIgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyPE1jUGFnaW5hdGVkVGFiSGVhZGVySXRlbT4odGhpcy5pdGVtcylcbiAgICAgICAgICAgIC53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuZ2V0TGF5b3V0RGlyZWN0aW9uKCkpO1xuXG4gICAgICAgIHRoaXMua2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKHRoaXMuX3NlbGVjdGVkSW5kZXgpO1xuXG4gICAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCBjYWxsIGluIG9yZGVyIHRvIGFsbG93IGZvciBzbG93ZXIgYnJvd3NlcnMgdG8gbGF5IG91dCB0aGUgZWxlbWVudHMuXG4gICAgICAgIC8vIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgbGFuZHMgZGlyZWN0bHkgb24gYSBwYWdlIHdpdGggcGFnaW5hdGVkIHRhYnMuXG4gICAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09IHVuZGVmaW5lZCA/IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWFsaWduKSA6IHJlYWxpZ24oKTtcblxuICAgICAgICAvLyBPbiBkaXIgY2hhbmdlIG9yIHdpbmRvdyByZXNpemUsIHJlYWxpZ24gdGhlIGluayBiYXIgYW5kIHVwZGF0ZSB0aGUgb3JpZW50YXRpb24gb2ZcbiAgICAgICAgLy8gdGhlIGtleSBtYW5hZ2VyIGlmIHRoZSBkaXJlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICAgIG1lcmdlKGRpckNoYW5nZSwgcmVzaXplLCB0aGlzLml0ZW1zLmNoYW5nZXMpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB0aGlzIHRvIGdpdmUgdGhlIGJyb3dzZXIgc29tZSB0aW1lIHRvIHJlY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgZGltZW5zaW9ucy4gVGhlIGNhbGwgaGFzIHRvIGJlIHdyYXBwZWQgaW4gYE5nWm9uZS5ydW5gLFxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHZpZXdwb3J0IGNoYW5nZSBoYW5kbGVyIHJ1bnMgb3V0c2lkZSBvZiBBbmd1bGFyLlxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICByZWFsaWduKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5nZXRMYXlvdXREaXJlY3Rpb24oKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZm9jdXMga2V5IG1hbmFnZXIgd2UgbmVlZCB0byBlbWl0IHRoZSBgaW5kZXhGb2N1c2VkYFxuICAgICAgICAvLyBldmVudCBpbiBvcmRlciB0byBwcm92aWRlIGEgcHVibGljIGV2ZW50IHRoYXQgbm90aWZpZXMgYWJvdXQgZm9jdXMgY2hhbmdlcy4gQWxzbyB3ZSByZWFsaWduXG4gICAgICAgIC8vIHRoZSB0YWJzIGNvbnRhaW5lciBieSBzY3JvbGxpbmcgdGhlIG5ldyBmb2N1c2VkIHRhYiBpbnRvIHRoZSB2aXNpYmxlIHNlY3Rpb24uXG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5jaGFuZ2VcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChuZXdGb2N1c0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEZvY3VzZWQuZW1pdChuZXdGb2N1c0luZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhYkZvY3VzKG5ld0ZvY3VzSW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIHRhYiBsYWJlbHMgaGF2ZSBjaGFuZ2VkLCBjaGVjayBpZiBzY3JvbGxpbmcgc2hvdWxkIGJlIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMudGFiTGFiZWxDb3VudCAhPT0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgdGhpcy50YWJMYWJlbENvdW50ID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGluZGV4IGhhcyBjaGFuZ2VkLCBzY3JvbGwgdG8gdGhlIGxhYmVsIGFuZCBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGNvbnRyb2xzXG4gICAgICAgIC8vIHNob3VsZCBiZSBkaXNhYmxlZC5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9MYWJlbCh0aGlzLl9zZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTY3JvbGxpbmdDb250cm9scygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzY3JvbGwgZGlzdGFuY2UgaGFzIGJlZW4gY2hhbmdlZCAodGFiIHNlbGVjdGVkLCBmb2N1c2VkLCBzY3JvbGwgY29udHJvbHMgYWN0aXZhdGVkKSxcbiAgICAgICAgLy8gdGhlbiB0cmFuc2xhdGUgdGhlIGhlYWRlciB0byByZWZsZWN0IHRoaXMuXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbERpc3RhbmNlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGhhbmRsZSBhbnkga2V5IGJpbmRpbmdzIHdpdGggYSBtb2RpZmllciBrZXkuXG4gICAgICAgIGlmIChoYXNNb2RpZmllcktleShldmVudCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgICAgIGlmIChrZXkgPT09IEhPTUUpIHtcbiAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IEVORCkge1xuICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBVUF9BUlJPVyAmJiB0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB0aGlzLmtleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBET1dOX0FSUk9XICYmIHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gUklHSFRfQVJST1cgJiYgIXRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gTEVGVF9BUlJPVyAmJiAhdGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFtFTlRFUiwgU1BBQ0VdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Rm9jdXNlZEluZGV4LmVtaXQodGhpcy5mb2N1c0luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbSE9NRSwgRU5ELCBVUF9BUlJPVywgRE9XTl9BUlJPVywgUklHSFRfQVJST1csIExFRlRfQVJST1csIFNQQUNFLCBFTlRFUl0uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBNdXRhdGlvbk9ic2VydmVyIGRldGVjdHMgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvbkNvbnRlbnRDaGFuZ2VzKCkge1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50O1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGlmZiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBoZWFkZXIsIGJlY2F1c2UgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgY2FsbGJhY2tcbiAgICAgICAgLy8gd2lsbCBmaXJlIGV2ZW4gaWYgdGhlIHRleHQgY29udGVudCBkaWRuJ3QgY2hhbmdlIHdoaWNoIGlzIGluZWZmaWNpZW50IGFuZCBpcyBwcm9uZVxuICAgICAgICAvLyB0byBpbmZpbml0ZSBsb29wcyBpZiBhIHBvb3JseSBjb25zdHJ1Y3RlZCBleHByZXNzaW9uIGlzIHBhc3NlZCBpbiAoc2VlICMxNDI0OSkuXG4gICAgICAgIGlmICh0ZXh0Q29udGVudCAhPT0gdGhpcy5jdXJyZW50VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRleHRDb250ZW50ID0gdGV4dENvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IG9ic2VydmVyIHJ1bnMgb3V0c2lkZSB0aGUgYE5nWm9uZWAgYnkgZGVmYXVsdCwgd2hpY2hcbiAgICAgICAgICAgIC8vIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBicmluZyB0aGUgY2FsbGJhY2sgYmFjayBpbiBvdXJzZWx2ZXMuXG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZpZXcgd2hldGhlciBwYWdpbmF0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IENhbGxpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHZlcnkgY29zdGx5IGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlLiBJdCBzaG91bGQgYmUgY2FsbGVkXG4gICAgICogYXMgaW5mcmVxdWVudGx5IGFzIHBvc3NpYmxlIGZyb20gb3V0c2lkZSBvZiB0aGUgVGFicyBjb21wb25lbnQgYXMgaXQgY2F1c2VzIGEgcmVmbG93IG9mIHRoZVxuICAgICAqIHBhZ2UuXG4gICAgICovXG4gICAgdXBkYXRlUGFnaW5hdGlvbigpIHtcbiAgICAgICAgdGhpcy5jaGVja1BhZ2luYXRpb25FbmFibGVkKCk7XG4gICAgICAgIHRoaXMuY2hlY2tTY3JvbGxpbmdDb250cm9scygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhbiBpbmRleCBpcyB2YWxpZC4gIElmIHRoZSB0YWJzIGFyZSBub3QgcmVhZHkgeWV0LCB3ZSBhc3N1bWUgdGhhdCB0aGUgdXNlciBpc1xuICAgICAqIHByb3ZpZGluZyBhIHZhbGlkIGluZGV4IGFuZCByZXR1cm4gdHJ1ZS5cbiAgICAgKi9cbiAgICBpc1ZhbGlkSW5kZXgoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaXRlbXMpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICBjb25zdCB0YWIgPSB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy50b0FycmF5KClbaW5kZXhdIDogbnVsbDtcblxuICAgICAgICByZXR1cm4gISF0YWIgJiYgIXRhYi5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGZvY3VzIG9uIHRoZSBIVE1MIGVsZW1lbnQgZm9yIHRoZSBsYWJlbCB3cmFwcGVyIGFuZCBzY3JvbGxzIGl0IGludG8gdGhlIHZpZXcgaWZcbiAgICAgKiBzY3JvbGxpbmcgaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBzZXRUYWJGb2N1cyh0YWJJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dQYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9MYWJlbCh0YWJJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnRvQXJyYXkoKVt0YWJJbmRleF0uZm9jdXMoKTtcblxuICAgICAgICAgICAgLy8gRG8gbm90IGxldCB0aGUgYnJvd3NlciBtYW5hZ2Ugc2Nyb2xsaW5nIHRvIGZvY3VzIHRoZSBlbGVtZW50LCB0aGlzIHdpbGwgYmUgaGFuZGxlZFxuICAgICAgICAgICAgLy8gYnkgdXNpbmcgdHJhbnNsYXRpb24uIEluIExUUiwgdGhlIHNjcm9sbCBsZWZ0IHNob3VsZCBiZSAwLiBJbiBSVEwsIHRoZSBzY3JvbGwgd2lkdGhcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0aGUgZnVsbCB3aWR0aCBtaW51cyB0aGUgb2Zmc2V0IHdpZHRoLlxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLnRhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHRoaXMuZ2V0TGF5b3V0RGlyZWN0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmIChkaXIgPT09ICdsdHInKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWwuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLnNjcm9sbExlZnQgPSBjb250YWluZXJFbC5zY3JvbGxXaWR0aCAtIGNvbnRhaW5lckVsLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBsYXlvdXQgZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGFwcC4gKi9cbiAgICBnZXRMYXlvdXREaXJlY3Rpb24oKTogRGlyZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyPy52YWx1ZSA9PT0gJ3J0bCcgPyAncnRsJyA6ICdsdHInO1xuICAgIH1cblxuICAgIC8qKiBQZXJmb3JtcyB0aGUgQ1NTIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSB0YWIgbGlzdCB0aGF0IHdpbGwgY2F1c2UgdGhlIGxpc3QgdG8gc2Nyb2xsLiAqL1xuICAgIHVwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlUGFnaW5hdGlvbikgeyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBzY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2Nyb2xsRGlzdGFuY2U7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSB0aGlzLmdldExheW91dERpcmVjdGlvbigpID09PSAnbHRyJyA/IC1zY3JvbGxEaXN0YW5jZSA6IHNjcm9sbERpc3RhbmNlO1xuXG4gICAgICAgIC8vIERvbid0IHVzZSBgdHJhbnNsYXRlM2RgIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsYXllci4gQSBuZXcgbGF5ZXJcbiAgICAgICAgLy8gc2VlbXMgdG8gY2F1c2UgZmxpY2tlcmluZyBhbmQgb3ZlcmZsb3cgaW4gSW50ZXJuZXQgRXhwbG9yZXIuIEZvciBleGFtcGxlLCB0aGUgaW5rIGJhclxuICAgICAgICAvLyBhbmQgcmlwcGxlcyB3aWxsIGV4Y2VlZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgdmlzaWJsZSB0YWIgYmFyLlxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjc2XG4gICAgICAgIC8vIFdlIHJvdW5kIHRoZSBgdHJhbnNmb3JtYCBoZXJlLCBiZWNhdXNlIHRyYW5zZm9ybXMgd2l0aCBzdWItcGl4ZWwgcHJlY2lzaW9uIGNhdXNlIHNvbWVcbiAgICAgICAgLy8gYnJvd3NlcnMgdG8gYmx1ciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgdGhpcy50YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtNYXRoLnJvdW5kKHRyYW5zbGF0ZVgpfXB4KWA7XG5cbiAgICAgICAgLy8gU2V0dGluZyB0aGUgYHRyYW5zZm9ybWAgb24gSUUgd2lsbCBjaGFuZ2UgdGhlIHNjcm9sbCBvZmZzZXQgb2YgdGhlIHBhcmVudCwgY2F1c2luZyB0aGVcbiAgICAgICAgLy8gcG9zaXRpb24gdG8gYmUgdGhyb3duIG9mZiBpbiBzb21lIGNhc2VzLiBXZSBoYXZlIHRvIHJlc2V0IGl0IG91cnNlbHZlcyB0byBlbnN1cmUgdGhhdFxuICAgICAgICAvLyBpdCBkb2Vzbid0IGdldCB0aHJvd24gb2ZmLiBOb3RlIHRoYXQgd2Ugc2NvcGUgaXQgb25seSB0byBJRSBhbmQgRWRnZSwgYmVjYXVzZSBtZXNzaW5nXG4gICAgICAgIC8vIHdpdGggdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvd3Mgb2ZmIENocm9tZSA3MSsgaW4gUlRMIG1vZGUgKHNlZSAjMTQ2ODkpLlxuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5UUklERU5UIHx8IHRoaXMucGxhdGZvcm0uRURHRSkge1xuICAgICAgICAgICAgdGhpcy50YWJMaXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgdGFiIGxpc3QgaW4gdGhlICdiZWZvcmUnIG9yICdhZnRlcicgZGlyZWN0aW9uICh0b3dhcmRzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Qgb3JcbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBsaXN0LCByZXNwZWN0aXZlbHkpLiBUaGUgZGlzdGFuY2UgdG8gc2Nyb2xsIGlzIGNvbXB1dGVkIHRvIGJlIGEgdGhpcmQgb2YgdGhlXG4gICAgICogbGVuZ3RoIG9mIHRoZSB0YWIgbGlzdCB2aWV3IHdpbmRvdy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNhbGwgdGhhdCBmb3JjZXMgYSBsYXlvdXQgcmVmbG93IHRvIGNvbXB1dGUgYm94IGFuZCBzY3JvbGwgbWV0cmljcyBhbmRcbiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS5cbiAgICAgKi9cbiAgICBzY3JvbGxIZWFkZXIoZGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgdmlld0xlbmd0aCA9IHRoaXMudGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuXG4gICAgICAgIC8vIE1vdmUgdGhlIHNjcm9sbCBkaXN0YW5jZSBvbmUtdGhpcmQgdGhlIGxlbmd0aCBvZiB0aGUgdGFiIGxpc3QncyB2aWV3cG9ydC5cbiAgICAgICAgY29uc3Qgc2Nyb2xsQW1vdW50ID0gKGRpcmVjdGlvbiA9PT0gJ2JlZm9yZScgPyAtMSA6IDEpICogdmlld0xlbmd0aCAqIFNDUk9MTF9ESVNUQU5DRTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUbyh0aGlzLnNjcm9sbERpc3RhbmNlICsgc2Nyb2xsQW1vdW50KTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIHBhZ2luYXRpb24gYXJyb3dzLiAqL1xuICAgIGhhbmRsZVBhZ2luYXRvckNsaWNrKGRpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RvcEludGVydmFsKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsSGVhZGVyKGRpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIHRhYiBsaXN0IHN1Y2ggdGhhdCB0aGUgZGVzaXJlZCB0YWIgbGFiZWwgKG1hcmtlZCBieSBpbmRleCkgaXMgbW92ZWQgaW50byB2aWV3LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgY2FsbCB0aGF0IGZvcmNlcyBhIGxheW91dCByZWZsb3cgdG8gY29tcHV0ZSBib3ggYW5kIHNjcm9sbCBtZXRyaWNzIGFuZFxuICAgICAqIHNob3VsZCBiZSBjYWxsZWQgc3BhcmluZ2x5LlxuICAgICAqL1xuICAgIHNjcm9sbFRvTGFiZWwobGFiZWxJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdpbmF0aW9uKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGFiZWwgPSB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy50b0FycmF5KClbbGFiZWxJbmRleF0gOiBudWxsO1xuXG4gICAgICAgIGlmICghc2VsZWN0ZWRMYWJlbCkgeyByZXR1cm47IH1cblxuICAgICAgICAvLyBUaGUgdmlldyBsZW5ndGggaXMgdGhlIHZpc2libGUgd2lkdGggb2YgdGhlIHRhYiBsYWJlbHMuXG4gICAgICAgIGNvbnN0IHZpZXdMZW5ndGggPSB0aGlzLnRhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgeyBvZmZzZXRMZWZ0LCBvZmZzZXRXaWR0aCB9ID0gc2VsZWN0ZWRMYWJlbC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IGxhYmVsQmVmb3JlUG9zOiBudW1iZXI7XG4gICAgICAgIGxldCBsYWJlbEFmdGVyUG9zOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TGF5b3V0RGlyZWN0aW9uKCkgPT09ICdsdHInKSB7XG4gICAgICAgICAgICBsYWJlbEJlZm9yZVBvcyA9IG9mZnNldExlZnQ7XG4gICAgICAgICAgICBsYWJlbEFmdGVyUG9zID0gbGFiZWxCZWZvcmVQb3MgKyAob2Zmc2V0V2lkdGggYXMgbnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsQWZ0ZXJQb3MgPSB0aGlzLnRhYkxpc3QubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAtIG9mZnNldExlZnQ7XG4gICAgICAgICAgICBsYWJlbEJlZm9yZVBvcyA9IGxhYmVsQWZ0ZXJQb3MgLSBvZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJlZm9yZVZpc2libGVQb3MgPSB0aGlzLnNjcm9sbERpc3RhbmNlO1xuICAgICAgICBjb25zdCBhZnRlclZpc2libGVQb3MgPSB0aGlzLnNjcm9sbERpc3RhbmNlICsgdmlld0xlbmd0aDtcblxuICAgICAgICBpZiAobGFiZWxCZWZvcmVQb3MgPCBiZWZvcmVWaXNpYmxlUG9zKSB7XG4gICAgICAgICAgICAvLyBTY3JvbGwgaGVhZGVyIHRvIG1vdmUgbGFiZWwgdG8gdGhlIGJlZm9yZSBkaXJlY3Rpb25cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlzdGFuY2UgLT0gYmVmb3JlVmlzaWJsZVBvcyAtIGxhYmVsQmVmb3JlUG9zICsgRVhBR0dFUkFURURfT1ZFUlNDUk9MTDtcbiAgICAgICAgfSBlbHNlIGlmIChsYWJlbEFmdGVyUG9zID4gYWZ0ZXJWaXNpYmxlUG9zKSB7XG4gICAgICAgICAgICAvLyBTY3JvbGwgaGVhZGVyIHRvIG1vdmUgbGFiZWwgdG8gdGhlIGFmdGVyIGRpcmVjdGlvblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZSArPSBsYWJlbEFmdGVyUG9zIC0gYWZ0ZXJWaXNpYmxlUG9zICsgRVhBR0dFUkFURURfT1ZFUlNDUk9MTDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgdGhlIHBhZ2luYXRpb24gY29udHJvbHMgc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgdGhlIHNjcm9sbCB3aWR0aCBvZiB0aGVcbiAgICAgKiB0YWIgbGlzdCBpcyB3aWRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgY29udGFpbmVyLCB0aGVuIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHNob3VsZFxuICAgICAqIGJlIHNob3duLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgY2FsbCB0aGF0IGZvcmNlcyBhIGxheW91dCByZWZsb3cgdG8gY29tcHV0ZSBib3ggYW5kIHNjcm9sbCBtZXRyaWNzIGFuZFxuICAgICAqIHNob3VsZCBiZSBjYWxsZWQgc3BhcmluZ2x5LlxuICAgICAqL1xuICAgIGNoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdpbmF0aW9uIHx8IHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb25Db250cm9scyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gdGhpcy50YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGggPiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpc3RhbmNlID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCAhPT0gdGhpcy5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbkNvbnRyb2xzID0gaXNFbmFibGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZhbHVhdGUgd2hldGhlciB0aGUgYmVmb3JlIGFuZCBhZnRlciBjb250cm9scyBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKiBJZiB0aGUgaGVhZGVyIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKHNjcm9sbCBkaXN0YW5jZSBpcyBlcXVhbCB0byAwKSB0aGVuIGRpc2FibGUgdGhlXG4gICAgICogYmVmb3JlIGJ1dHRvbi4gSWYgdGhlIGhlYWRlciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChzY3JvbGwgZGlzdGFuY2UgaXMgZXF1YWwgdG8gdGhlXG4gICAgICogbWF4aW11bSBkaXN0YW5jZSB3ZSBjYW4gc2Nyb2xsKSwgdGhlbiBkaXNhYmxlIHRoZSBhZnRlciBidXR0b24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kXG4gICAgICogc2hvdWxkIGJlIGNhbGxlZCBzcGFyaW5nbHkuXG4gICAgICovXG4gICAgY2hlY2tTY3JvbGxpbmdDb250cm9scygpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbEFmdGVyID0gdGhpcy5kaXNhYmxlU2Nyb2xsQmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWdpbmF0aW9uIGFycm93cyBzaG91bGQgYmUgYWN0aXZhdGVkLlxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlU2Nyb2xsQmVmb3JlID0gdGhpcy5zY3JvbGxEaXN0YW5jZSA9PT0gMDtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbEFmdGVyID0gdGhpcy5zY3JvbGxEaXN0YW5jZSA9PT0gdGhpcy5nZXRNYXhTY3JvbGxEaXN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggaW4gcGl4ZWxzIHRoYXQgY2FuIGJlIHNldCBmb3IgdGhlIHNjcm9sbCBkaXN0YW5jZS4gVGhpc1xuICAgICAqIGlzIGVxdWFsIHRvIHRoZSBkaWZmZXJlbmNlIGluIHdpZHRoIGJldHdlZW4gdGhlIHRhYiBsaXN0IGNvbnRhaW5lciBhbmQgdGFiIGhlYWRlciBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kXG4gICAgICogc2hvdWxkIGJlIGNhbGxlZCBzcGFyaW5nbHkuXG4gICAgICovXG4gICAgZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoT2ZUYWJMaXN0ID0gdGhpcy50YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHZpZXdMZW5ndGggPSB0aGlzLnRhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICByZXR1cm4gKGxlbmd0aE9mVGFiTGlzdCAtIHZpZXdMZW5ndGgpIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqIFN0b3BzIHRoZSBjdXJyZW50bHktcnVubmluZyBwYWdpbmF0b3IgaW50ZXJ2YWwuICAqL1xuICAgIHN0b3BJbnRlcnZhbCgpIHtcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSB1c2VyIHByZXNzaW5nIGRvd24gb24gb25lIG9mIHRoZSBwYWdpbmF0b3JzLlxuICAgICAqIFN0YXJ0cyBzY3JvbGxpbmcgdGhlIGhlYWRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuXG4gICAgICogQHBhcmFtIGRpcmVjdGlvbiBJbiB3aGljaCBkaXJlY3Rpb24gdGhlIHBhZ2luYXRvciBzaG91bGQgYmUgc2Nyb2xsZWQuXG4gICAgICovXG4gICAgaGFuZGxlUGFnaW5hdG9yUHJlc3MoZGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24sIG1vdXNlRXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIERvbid0IHN0YXJ0IGF1dG8gc2Nyb2xsaW5nIGZvciByaWdodCBtb3VzZSBidXR0b24gY2xpY2tzLiBOb3RlIHRoYXQgd2Ugc2hvdWxkbid0IGhhdmUgdG9cbiAgICAgICAgLy8gbnVsbCBjaGVjayB0aGUgYGJ1dHRvbmAsIGJ1dCB3ZSBkbyBpdCBzbyB3ZSBkb24ndCBicmVhayB0ZXN0cyB0aGF0IHVzZSBmYWtlIGV2ZW50cy5cbiAgICAgICAgaWYgKG1vdXNlRXZlbnQgJiYgbW91c2VFdmVudC5idXR0b24gIT0gbnVsbCAmJiBtb3VzZUV2ZW50LmJ1dHRvbiAhPT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgICAvLyBBdm9pZCBvdmVybGFwcGluZyB0aW1lcnMuXG4gICAgICAgIHRoaXMuc3RvcEludGVydmFsKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYSB0aW1lciBhZnRlciB0aGUgZGVsYXkgYW5kIGtlZXAgZmlyaW5nIGJhc2VkIG9uIHRoZSBpbnRlcnZhbC5cbiAgICAgICAgdGltZXIoSEVBREVSX1NDUk9MTF9ERUxBWSwgSEVBREVSX1NDUk9MTF9JTlRFUlZBTClcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIHRpbWVyIGdvaW5nIHVudGlsIHNvbWV0aGluZyB0ZWxscyBpdCB0byBzdG9wIG9yIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKG1lcmdlKHRoaXMuc3RvcFNjcm9sbGluZywgdGhpcy5kZXN0cm95ZWQpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWF4U2Nyb2xsRGlzdGFuY2UsIGRpc3RhbmNlIH0gPSB0aGlzLnNjcm9sbEhlYWRlcihkaXJlY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgdGltZXIgaWYgd2UndmUgcmVhY2hlZCB0aGUgc3RhcnQgb3IgdGhlIGVuZC5cbiAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPT09IDAgfHwgZGlzdGFuY2UgPj0gbWF4U2Nyb2xsRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wSW50ZXJ2YWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXRlbVNlbGVjdGVkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFNjcm9sbHMgdGhlIGhlYWRlciB0byBhIGdpdmVuIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiB0byB3aGljaCB0byBzY3JvbGwuXG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgc2Nyb2xsIGRpc3RhbmNlIGFuZCB0aGUgbWF4aW11bS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNjcm9sbFRvKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1heFNjcm9sbERpc3RhbmNlOiAwLCBkaXN0YW5jZTogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsRGlzdGFuY2UgPSB0aGlzLmdldE1heFNjcm9sbERpc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGlzdGFuY2UgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXhTY3JvbGxEaXN0YW5jZSwgcG9zaXRpb24pKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIHNjcm9sbCBkaXN0YW5jZSBoYXMgY2hhbmdlZCBzbyB0aGF0IGFmdGVyIHRoZSB2aWV3IGlzIGNoZWNrZWQsIHRoZSBDU1NcbiAgICAgICAgLy8gdHJhbnNmb3JtYXRpb24gY2FuIG1vdmUgdGhlIGhlYWRlci5cbiAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKTtcblxuICAgICAgICByZXR1cm4geyBtYXhTY3JvbGxEaXN0YW5jZSwgZGlzdGFuY2U6IHRoaXMuc2Nyb2xsRGlzdGFuY2UgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNjcm9sbFBvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGxEaXN0YW5jZSA9IHRoaXMuZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKTtcblxuICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXN0YW5jZSA+IG1heFNjcm9sbERpc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvKG1heFNjcm9sbERpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|