@ethlete/cdk 4.2.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +6 -7
- package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +9 -18
- package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +7 -7
- package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +7 -7
- package/esm2022/lib/components/button/components/button/button.component.mjs +3 -3
- package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +7 -7
- package/esm2022/lib/components/button/directives/button/button.directive.mjs +3 -3
- package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +3 -3
- package/esm2022/lib/components/filter/filter-overlay/components/filter-overlay-page-outlet/filter-overlay-page-outlet.component.mjs +11 -11
- package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-back-or-close/filter-overlay-back-or-close.directive.mjs +3 -3
- package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-link/filter-overlay-link.directive.mjs +3 -3
- package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-reset/filter-overlay-reset.directive.mjs +3 -3
- package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-submit/filter-overlay-submit.directive.mjs +3 -3
- package/esm2022/lib/components/filter/filter-overlay/services/filter-overlay.service.mjs +3 -3
- package/esm2022/lib/components/filter/rich-filter/components/rich-filter-host/rich-filter-host.component.mjs +3 -3
- package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button/rich-filter-button.directive.mjs +3 -3
- package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button-slot/rich-filter-button-slot.directive.mjs +3 -3
- package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-content/rich-filter-content.directive.mjs +3 -3
- package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-top/rich-filter-top.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/input/components/date-input/date-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/date-input/date-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +5 -5
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +6 -8
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-empty-template/combobox-body-empty-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-error-template/combobox-body-error-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-loading-template/combobox-body-loading-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-more-items-hint-template/combobox-body-more-items-hint-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/combobox-option-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/combobox-selected-option-template.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +7 -9
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +8 -8
- package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/select/directives/select-field/select-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/selection-list/components/selection-list-field/selection-list-field.component.mjs +4 -5
- package/esm2022/lib/components/forms/components/selection-list/components/selection-list-option/selection-list-option.component.mjs +5 -5
- package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-field/selection-list-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/selection-list-option.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +6 -6
- package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +6 -6
- package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/expose-input-vars/expose-input-vars.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/input/input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/form-field-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/form-group-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/input-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +3 -3
- package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +3 -3
- package/esm2022/lib/components/forms/utils/input.base.mjs +3 -3
- package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +3 -3
- package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +3 -3
- package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/context-menu-trigger.mjs +6 -6
- package/esm2022/lib/components/overlay/components/menu/menu-aim.mjs +6 -6
- package/esm2022/lib/components/overlay/components/menu/menu-bar.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-base.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-group.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-item-checkbox.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-item-radio.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-item-selectable.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-item.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-module.mjs +4 -4
- package/esm2022/lib/components/overlay/components/menu/menu-stack.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-trigger-base.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu-trigger.mjs +3 -3
- package/esm2022/lib/components/overlay/components/menu/menu.mjs +3 -3
- package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/overlay/partials/overlay-close/overlay-close.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/overlay/partials/overlay-title/overlay-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/overlay/services/overlay.service.mjs +4 -4
- package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +8 -8
- package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +8 -8
- package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +4 -4
- package/esm2022/lib/components/overlay/directives/dynamic-overlay-title/dynamic-overlay-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +3 -3
- package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +7 -7
- package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +3 -3
- package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +4 -4
- package/esm2022/lib/components/pagination/utils/pagination.util.mjs +1 -1
- package/esm2022/lib/components/picture/picture-data.directive.mjs +3 -3
- package/esm2022/lib/components/picture/picture.component.mjs +8 -8
- package/esm2022/lib/components/picture/pipes/normalize-source/normalize-source.pipe.mjs +3 -3
- package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +6 -6
- package/esm2022/lib/components/query-error/components/query-error/query-error.component.mjs +5 -6
- package/esm2022/lib/components/query-error/directives/query-error/query-error.directive.mjs +3 -3
- package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +219 -146
- package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +3 -3
- package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +3 -3
- package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +5 -6
- package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +3 -3
- package/esm2022/lib/components/sort/services/sort-header-intl.mjs +3 -3
- package/esm2022/lib/components/table/components/table/table.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +7 -9
- package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +3 -3
- package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +3 -3
- package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +21 -13
- package/esm2022/lib/services/swipe-handler.service.mjs +3 -3
- package/fesm2022/ethlete-cdk.mjs +898 -834
- package/fesm2022/ethlete-cdk.mjs.map +1 -1
- package/lib/components/picture/picture.component.d.ts +1 -1
- package/lib/components/scrollable/components/scrollable/scrollable.component.d.ts +55 -35
- package/lib/components/tabs/utils/paginated-tab-header.directive.d.ts +1 -1
- package/package.json +7 -7
|
@@ -1,18 +1,63 @@
|
|
|
1
|
-
import { NgClass
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter,
|
|
3
|
-
import { CursorDragScrollDirective, IS_ACTIVE_ELEMENT, IS_ELEMENT, LetDirective, ObserveScrollStateDirective, TypedQueryList, createDestroy, getElementVisibleStates, scrollToElement, signalElementIntersection, signalElementScrollState, signalHostAttributes, } from '@ethlete/core';
|
|
1
|
+
import { NgClass } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, booleanAttribute, computed, effect, inject, isDevMode, numberAttribute, signal, } from '@angular/core';
|
|
3
|
+
import { CursorDragScrollDirective, IS_ACTIVE_ELEMENT, IS_ELEMENT, LetDirective, ObserveScrollStateDirective, TypedQueryList, createDestroy, getElementVisibleStates, isElementVisible, nextFrame, scrollToElement, signalElementIntersection, signalElementScrollState, signalHostAttributes, signalHostClasses, } from '@ethlete/core';
|
|
4
4
|
import { BehaviorSubject, debounceTime, fromEvent, merge, of, startWith, takeUntil, tap } from 'rxjs';
|
|
5
5
|
import { ChevronIconComponent } from '../../../icons';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export class ScrollableComponent {
|
|
8
|
-
set
|
|
9
|
-
this.
|
|
8
|
+
set _itemSize(v) {
|
|
9
|
+
this.itemSize.set(v);
|
|
10
10
|
}
|
|
11
|
-
set
|
|
12
|
-
this.
|
|
11
|
+
set _direction(v) {
|
|
12
|
+
this.direction.set(v);
|
|
13
13
|
}
|
|
14
|
-
set
|
|
15
|
-
this.
|
|
14
|
+
set _scrollableRole(v) {
|
|
15
|
+
this.scrollableRole.set(v);
|
|
16
|
+
}
|
|
17
|
+
set _scrollableClass(v) {
|
|
18
|
+
this.scrollableClass.set(v);
|
|
19
|
+
}
|
|
20
|
+
set _renderMasks(v) {
|
|
21
|
+
this.renderMasks.set(v);
|
|
22
|
+
}
|
|
23
|
+
set _renderButtons(v) {
|
|
24
|
+
this.renderButtons.set(v);
|
|
25
|
+
}
|
|
26
|
+
set _renderScrollbars(v) {
|
|
27
|
+
this.renderScrollbars.set(v);
|
|
28
|
+
}
|
|
29
|
+
set _stickyButtons(v) {
|
|
30
|
+
this.stickyButtons.set(v);
|
|
31
|
+
}
|
|
32
|
+
set _cursorDragScroll(v) {
|
|
33
|
+
this.cursorDragScroll.set(v);
|
|
34
|
+
}
|
|
35
|
+
set _disableActiveElementScrolling(v) {
|
|
36
|
+
this.disableActiveElementScrolling.set(v);
|
|
37
|
+
}
|
|
38
|
+
set _scrollMode(v) {
|
|
39
|
+
this.scrollMode.set(v);
|
|
40
|
+
}
|
|
41
|
+
set _snap(v) {
|
|
42
|
+
this.snap.set(v);
|
|
43
|
+
}
|
|
44
|
+
set _scrollMargin(v) {
|
|
45
|
+
this.scrollMargin.set(v);
|
|
46
|
+
}
|
|
47
|
+
set _scrollable(e) {
|
|
48
|
+
this.scrollable.set(e);
|
|
49
|
+
}
|
|
50
|
+
set _firstElement(e) {
|
|
51
|
+
this.firstElement.set(e);
|
|
52
|
+
}
|
|
53
|
+
set _lastElement(e) {
|
|
54
|
+
this.lastElement.set(e);
|
|
55
|
+
}
|
|
56
|
+
set _activeElementList(e) {
|
|
57
|
+
this.activeElementList.set(e);
|
|
58
|
+
}
|
|
59
|
+
set _elementList(e) {
|
|
60
|
+
this.elementList.set(e);
|
|
16
61
|
}
|
|
17
62
|
get highestVisibleIntersection() {
|
|
18
63
|
const elements = this._latestVisibilityStates$.value;
|
|
@@ -66,87 +111,121 @@ export class ScrollableComponent {
|
|
|
66
111
|
this._elementRef = inject(ElementRef);
|
|
67
112
|
this._isCursorDragging$ = new BehaviorSubject(false);
|
|
68
113
|
this._latestVisibilityStates$ = new BehaviorSubject([]);
|
|
69
|
-
this.itemSize = 'auto';
|
|
70
|
-
this.direction = 'horizontal';
|
|
71
|
-
this.
|
|
72
|
-
this.
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
114
|
+
this.itemSize = signal('auto');
|
|
115
|
+
this.direction = signal('horizontal');
|
|
116
|
+
this.scrollableRole = signal(null);
|
|
117
|
+
this.scrollableClass = signal(null);
|
|
118
|
+
this.renderMasks = signal(true);
|
|
119
|
+
this.renderButtons = signal(true);
|
|
120
|
+
this.renderScrollbars = signal(false);
|
|
121
|
+
this.stickyButtons = signal(false);
|
|
122
|
+
this.cursorDragScroll = signal(true);
|
|
123
|
+
this.disableActiveElementScrolling = signal(false);
|
|
124
|
+
this.scrollMode = signal('container');
|
|
125
|
+
this.snap = signal(false);
|
|
126
|
+
this.scrollMargin = signal(0);
|
|
80
127
|
this.scrollStateChange = new EventEmitter();
|
|
81
128
|
this.intersectionChange = new EventEmitter();
|
|
82
|
-
this.
|
|
83
|
-
this.
|
|
84
|
-
this.
|
|
85
|
-
this.
|
|
86
|
-
this.
|
|
87
|
-
this.containerScrollState = signalElementScrollState(this.
|
|
88
|
-
this.firstElementIntersection = signalElementIntersection(this.
|
|
89
|
-
this.
|
|
90
|
-
this.
|
|
129
|
+
this.scrollable = signal(null);
|
|
130
|
+
this.firstElement = signal(null);
|
|
131
|
+
this.lastElement = signal(null);
|
|
132
|
+
this.activeElementList = signal(null);
|
|
133
|
+
this.elementList = signal(null);
|
|
134
|
+
this.containerScrollState = signalElementScrollState(this.scrollable);
|
|
135
|
+
this.firstElementIntersection = signalElementIntersection(this.firstElement);
|
|
136
|
+
this.firstElementVisibility = signal(null);
|
|
137
|
+
this.lastElementIntersection = signalElementIntersection(this.lastElement);
|
|
138
|
+
this.lastElementVisibility = signal(null);
|
|
91
139
|
this.canScroll = computed(() => {
|
|
92
|
-
const dir = this.direction;
|
|
140
|
+
const dir = this.direction();
|
|
93
141
|
if (dir === 'horizontal') {
|
|
94
142
|
return this.containerScrollState().canScrollHorizontally;
|
|
95
143
|
}
|
|
96
144
|
return this.containerScrollState().canScrollVertically;
|
|
97
145
|
});
|
|
98
|
-
this.isAtStart = computed(() =>
|
|
99
|
-
|
|
146
|
+
this.isAtStart = computed(() => {
|
|
147
|
+
if (!this.canScroll()) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
const intersection = this.firstElementIntersection();
|
|
151
|
+
if (!intersection) {
|
|
152
|
+
return this.firstElementVisibility()?.inline ?? true;
|
|
153
|
+
}
|
|
154
|
+
return intersection.isIntersecting;
|
|
155
|
+
});
|
|
156
|
+
this.isAtEnd = computed(() => {
|
|
157
|
+
if (!this.canScroll()) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
const intersection = this.lastElementIntersection();
|
|
161
|
+
if (!intersection) {
|
|
162
|
+
return this.lastElementVisibility()?.inline ?? true;
|
|
163
|
+
}
|
|
164
|
+
return intersection.isIntersecting;
|
|
165
|
+
});
|
|
166
|
+
this.enableOverlayAnimations = signal(false);
|
|
100
167
|
this.hostAttributes = signalHostAttributes({
|
|
101
|
-
'
|
|
102
|
-
|
|
103
|
-
'
|
|
104
|
-
'
|
|
168
|
+
'item-size': this.itemSize,
|
|
169
|
+
direction: this.direction,
|
|
170
|
+
'render-scrollbars': this.renderScrollbars,
|
|
171
|
+
'sticky-buttons': this.stickyButtons,
|
|
105
172
|
});
|
|
173
|
+
this.hostClasses = signalHostClasses({
|
|
174
|
+
'et-scrollable--can-scroll': this.canScroll,
|
|
175
|
+
'et-scrollable--is-at-start': this.isAtStart,
|
|
176
|
+
'et-scrollable--is-at-end': this.isAtEnd,
|
|
177
|
+
'et-scrollable--enable-overlay-animations': this.enableOverlayAnimations,
|
|
178
|
+
});
|
|
179
|
+
effect(() => {
|
|
180
|
+
const scrollable = this.scrollable()?.nativeElement;
|
|
181
|
+
const firstElement = this.firstElement()?.nativeElement;
|
|
182
|
+
const lastElement = this.lastElement()?.nativeElement;
|
|
183
|
+
const activeElementList = this.activeElementList()?.toArray();
|
|
184
|
+
if (!scrollable || !firstElement || !lastElement || !activeElementList) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const firstActive = activeElementList.find((a) => a.isActiveElement);
|
|
188
|
+
if (firstActive && !this.disableActiveElementScrolling()) {
|
|
189
|
+
const offsetTop = firstActive.elementRef.nativeElement.offsetTop - scrollable.offsetTop;
|
|
190
|
+
const offsetLeft = firstActive.elementRef.nativeElement.offsetLeft - scrollable.offsetLeft;
|
|
191
|
+
scrollable.scrollLeft = offsetLeft;
|
|
192
|
+
scrollable.scrollTop = offsetTop;
|
|
193
|
+
}
|
|
194
|
+
this.firstElementVisibility.set(isElementVisible({
|
|
195
|
+
container: scrollable,
|
|
196
|
+
element: firstElement,
|
|
197
|
+
}));
|
|
198
|
+
this.lastElementVisibility.set(isElementVisible({
|
|
199
|
+
container: scrollable,
|
|
200
|
+
element: lastElement,
|
|
201
|
+
}));
|
|
202
|
+
// We need to wait one frame before enabling animations to prevent a animation from playing during initial render.
|
|
203
|
+
nextFrame(() => this.enableOverlayAnimations.set(true));
|
|
204
|
+
}, { allowSignalWrites: true });
|
|
106
205
|
effect(() => {
|
|
107
206
|
const isAtStart = this.isAtStart();
|
|
108
207
|
const isAtEnd = this.isAtEnd();
|
|
109
208
|
const canScroll = this.canScroll();
|
|
110
209
|
this.scrollStateChange.emit({
|
|
111
210
|
canScroll,
|
|
112
|
-
isAtEnd,
|
|
113
|
-
isAtStart,
|
|
211
|
+
isAtEnd: !!isAtEnd,
|
|
212
|
+
isAtStart: !!isAtStart,
|
|
114
213
|
});
|
|
115
214
|
});
|
|
116
215
|
}
|
|
117
216
|
ngAfterContentInit() {
|
|
118
|
-
if (!this.activeElements || !this.elements) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
this.activeElements.changes
|
|
122
|
-
.pipe(startWith(this.activeElements), tap((activeElements) => {
|
|
123
|
-
if (this.disableActiveElementScrolling) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const firstActive = activeElements
|
|
127
|
-
.filter((a) => !!a)
|
|
128
|
-
.find((a) => a.isActiveElement);
|
|
129
|
-
if (!firstActive) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
scrollToElement({
|
|
133
|
-
behavior: 'auto',
|
|
134
|
-
container: this.scrollable.nativeElement,
|
|
135
|
-
element: firstActive.elementRef.nativeElement,
|
|
136
|
-
scrollInlineMargin: this.direction === 'horizontal' ? this.scrollMargin : 0,
|
|
137
|
-
scrollBlockMargin: this.direction === 'horizontal' ? 0 : this.scrollMargin,
|
|
138
|
-
});
|
|
139
|
-
}), takeUntil(this._destroy$))
|
|
140
|
-
.subscribe();
|
|
141
217
|
this._setupScrollListening();
|
|
142
218
|
}
|
|
143
219
|
scrollOneContainerSize(direction) {
|
|
144
|
-
const scrollElement = this.scrollable
|
|
220
|
+
const scrollElement = this.scrollable()?.nativeElement;
|
|
221
|
+
if (!scrollElement) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
145
224
|
const parent = this._elementRef.nativeElement;
|
|
146
|
-
const scrollableSize = this.direction === 'horizontal' ? parent.clientWidth : parent.clientHeight;
|
|
147
|
-
const currentScroll = this.direction === 'horizontal' ? scrollElement.scrollLeft : scrollElement.scrollTop;
|
|
225
|
+
const scrollableSize = this.direction() === 'horizontal' ? parent.clientWidth : parent.clientHeight;
|
|
226
|
+
const currentScroll = this.direction() === 'horizontal' ? scrollElement.scrollLeft : scrollElement.scrollTop;
|
|
148
227
|
scrollElement.scrollTo({
|
|
149
|
-
[this.direction === 'horizontal' ? 'left' : 'top']: currentScroll + (direction === 'start' ? -scrollableSize : scrollableSize),
|
|
228
|
+
[this.direction() === 'horizontal' ? 'left' : 'top']: currentScroll + (direction === 'start' ? -scrollableSize : scrollableSize),
|
|
150
229
|
behavior: 'smooth',
|
|
151
230
|
});
|
|
152
231
|
}
|
|
@@ -164,39 +243,39 @@ export class ScrollableComponent {
|
|
|
164
243
|
}
|
|
165
244
|
this.scrollToElement({
|
|
166
245
|
element: el?.element,
|
|
167
|
-
direction: this.direction === 'horizontal' ? 'inline' : 'block',
|
|
246
|
+
direction: this.direction() === 'horizontal' ? 'inline' : 'block',
|
|
168
247
|
origin: direction,
|
|
169
|
-
...(this.direction === 'horizontal'
|
|
170
|
-
? { scrollInlineMargin: this.scrollMargin }
|
|
171
|
-
: { scrollBlockMargin: this.scrollMargin }),
|
|
248
|
+
...(this.direction() === 'horizontal'
|
|
249
|
+
? { scrollInlineMargin: this.scrollMargin() }
|
|
250
|
+
: { scrollBlockMargin: this.scrollMargin() }),
|
|
172
251
|
});
|
|
173
252
|
}
|
|
174
253
|
scrollToElement(options) {
|
|
175
|
-
const scrollElement = this.scrollable
|
|
254
|
+
const scrollElement = this.scrollable()?.nativeElement;
|
|
176
255
|
scrollToElement({
|
|
177
256
|
container: scrollElement,
|
|
178
|
-
...(this.direction === 'horizontal'
|
|
179
|
-
? { scrollInlineMargin: this.scrollMargin }
|
|
180
|
-
: { scrollBlockMargin: this.scrollMargin }),
|
|
257
|
+
...(this.direction() === 'horizontal'
|
|
258
|
+
? { scrollInlineMargin: this.scrollMargin() }
|
|
259
|
+
: { scrollBlockMargin: this.scrollMargin() }),
|
|
181
260
|
...options,
|
|
182
261
|
});
|
|
183
262
|
}
|
|
184
263
|
scrollToElementByIndex(options) {
|
|
185
|
-
const elements = this.
|
|
264
|
+
const elements = this.elementList()?.toArray() ?? [];
|
|
186
265
|
if (!elements.length) {
|
|
187
266
|
if (isDevMode()) {
|
|
188
267
|
console.warn('No elements found to scroll to. Make sure to apply the isElement directive to the elements you want to scroll to.');
|
|
189
268
|
}
|
|
190
269
|
return;
|
|
191
270
|
}
|
|
192
|
-
const scrollElement = this.scrollable
|
|
271
|
+
const scrollElement = this.scrollable()?.nativeElement;
|
|
193
272
|
const element = elements[options.index]?.elementRef.nativeElement;
|
|
194
273
|
scrollToElement({
|
|
195
274
|
container: scrollElement,
|
|
196
275
|
element,
|
|
197
|
-
...(this.direction === 'horizontal'
|
|
198
|
-
? { scrollInlineMargin: this.scrollMargin }
|
|
199
|
-
: { scrollBlockMargin: this.scrollMargin }),
|
|
276
|
+
...(this.direction() === 'horizontal'
|
|
277
|
+
? { scrollInlineMargin: this.scrollMargin() }
|
|
278
|
+
: { scrollBlockMargin: this.scrollMargin() }),
|
|
200
279
|
...options,
|
|
201
280
|
});
|
|
202
281
|
}
|
|
@@ -204,7 +283,7 @@ export class ScrollableComponent {
|
|
|
204
283
|
this._isCursorDragging$.next(isDragging);
|
|
205
284
|
}
|
|
206
285
|
scrollToStartDirection() {
|
|
207
|
-
if (this.scrollMode === 'container') {
|
|
286
|
+
if (this.scrollMode() === 'container') {
|
|
208
287
|
this.scrollOneContainerSize('start');
|
|
209
288
|
}
|
|
210
289
|
else {
|
|
@@ -212,7 +291,7 @@ export class ScrollableComponent {
|
|
|
212
291
|
}
|
|
213
292
|
}
|
|
214
293
|
scrollToStartEnd() {
|
|
215
|
-
if (this.scrollMode === 'container') {
|
|
294
|
+
if (this.scrollMode() === 'container') {
|
|
216
295
|
this.scrollOneContainerSize('end');
|
|
217
296
|
}
|
|
218
297
|
else {
|
|
@@ -220,7 +299,11 @@ export class ScrollableComponent {
|
|
|
220
299
|
}
|
|
221
300
|
}
|
|
222
301
|
_setupScrollListening() {
|
|
223
|
-
const scrollElement = this.scrollable
|
|
302
|
+
const scrollElement = this.scrollable()?.nativeElement;
|
|
303
|
+
const elements = this.elementList();
|
|
304
|
+
if (!scrollElement || !elements) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
224
307
|
let isSnapping = false;
|
|
225
308
|
let snapTimeout = 0;
|
|
226
309
|
merge(fromEvent(scrollElement, 'wheel'), fromEvent(scrollElement, 'touchstart'))
|
|
@@ -228,21 +311,21 @@ export class ScrollableComponent {
|
|
|
228
311
|
isSnapping = false;
|
|
229
312
|
}))
|
|
230
313
|
.subscribe();
|
|
231
|
-
merge(fromEvent(scrollElement, 'scroll'), this._isCursorDragging$,
|
|
314
|
+
merge(fromEvent(scrollElement, 'scroll'), this._isCursorDragging$, elements.changes.pipe(startWith(elements)) ?? of(null))
|
|
232
315
|
.pipe(debounceTime(300), takeUntil(this._destroy$), tap(() => {
|
|
233
|
-
const
|
|
316
|
+
const els = elements
|
|
234
317
|
?.toArray()
|
|
235
318
|
.map((e) => e?.elementRef.nativeElement)
|
|
236
319
|
.filter((e) => !!e) ?? [];
|
|
237
|
-
if (!
|
|
320
|
+
if (!els.length) {
|
|
238
321
|
this._latestVisibilityStates$.next([]);
|
|
239
322
|
return;
|
|
240
323
|
}
|
|
241
324
|
const states = getElementVisibleStates({
|
|
242
|
-
elements,
|
|
325
|
+
elements: els,
|
|
243
326
|
container: scrollElement,
|
|
244
327
|
});
|
|
245
|
-
const prop = this.direction === 'horizontal' ? 'inlineIntersection' : 'blockIntersection';
|
|
328
|
+
const prop = this.direction() === 'horizontal' ? 'inlineIntersection' : 'blockIntersection';
|
|
246
329
|
const stateClass = `et-element--is-intersecting`;
|
|
247
330
|
for (const state of states) {
|
|
248
331
|
if (state[prop] === 100) {
|
|
@@ -263,7 +346,7 @@ export class ScrollableComponent {
|
|
|
263
346
|
});
|
|
264
347
|
this.intersectionChange.emit(intersectionChanges);
|
|
265
348
|
this._latestVisibilityStates$.next(intersectionChanges);
|
|
266
|
-
if (isSnapping || this._isCursorDragging$.value || !this.snap)
|
|
349
|
+
if (isSnapping || this._isCursorDragging$.value || !this.snap())
|
|
267
350
|
return;
|
|
268
351
|
const prev = this.previousPartialIntersection;
|
|
269
352
|
const next = this.nextPartialIntersection;
|
|
@@ -283,10 +366,10 @@ export class ScrollableComponent {
|
|
|
283
366
|
scrollToElement({
|
|
284
367
|
container: scrollElement,
|
|
285
368
|
element: highestIntersecting.element,
|
|
286
|
-
direction: this.direction === 'horizontal' ? 'inline' : 'block',
|
|
369
|
+
direction: this.direction() === 'horizontal' ? 'inline' : 'block',
|
|
287
370
|
origin,
|
|
288
|
-
scrollBlockMargin: this.direction === 'horizontal' ? 0 : this.scrollMargin,
|
|
289
|
-
scrollInlineMargin: this.direction === 'horizontal' ? this.scrollMargin : 0,
|
|
371
|
+
scrollBlockMargin: this.direction() === 'horizontal' ? 0 : this.scrollMargin(),
|
|
372
|
+
scrollInlineMargin: this.direction() === 'horizontal' ? this.scrollMargin() : 0,
|
|
290
373
|
});
|
|
291
374
|
isSnapping = true;
|
|
292
375
|
window.clearTimeout(snapTimeout);
|
|
@@ -296,81 +379,71 @@ export class ScrollableComponent {
|
|
|
296
379
|
}))
|
|
297
380
|
.subscribe();
|
|
298
381
|
}
|
|
299
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
300
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
382
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
383
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.2", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { _itemSize: ["itemSize", "_itemSize"], _direction: ["direction", "_direction"], _scrollableRole: ["scrollableRole", "_scrollableRole"], _scrollableClass: ["scrollableClass", "_scrollableClass"], _renderMasks: ["renderMasks", "_renderMasks", booleanAttribute], _renderButtons: ["renderButtons", "_renderButtons", booleanAttribute], _renderScrollbars: ["renderScrollbars", "_renderScrollbars", booleanAttribute], _stickyButtons: ["stickyButtons", "_stickyButtons", booleanAttribute], _cursorDragScroll: ["cursorDragScroll", "_cursorDragScroll", booleanAttribute], _disableActiveElementScrolling: ["disableActiveElementScrolling", "_disableActiveElementScrolling", booleanAttribute], _scrollMode: ["scrollMode", "_scrollMode"], _snap: ["snap", "_snap", booleanAttribute], _scrollMargin: ["scrollMargin", "_scrollMargin", numberAttribute] }, outputs: { scrollStateChange: "scrollStateChange", intersectionChange: "intersectionChange" }, host: { classAttribute: "et-scrollable" }, queries: [{ propertyName: "_activeElementList", predicate: IS_ACTIVE_ELEMENT, descendants: true }, { propertyName: "_elementList", predicate: IS_ELEMENT, descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }, { propertyName: "_firstElement", first: true, predicate: ["firstElement"], descendants: true, static: true }, { propertyName: "_lastElement", first: true, predicate: ["lastElement"], descendants: true, static: true }], ngImport: i0, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll()\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n@if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n}\n\n@if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden;grid-template-columns:auto 1fr auto}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto;grid-template-rows:auto 1fr auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll", "allowedDirection"], outputs: ["cursorDragStart", "cursorDragMove", "cursorDragEnd"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
301
384
|
}
|
|
302
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
385
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ScrollableComponent, decorators: [{
|
|
303
386
|
type: Component,
|
|
304
|
-
args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CursorDragScrollDirective, ObserveScrollStateDirective, NgClass,
|
|
387
|
+
args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CursorDragScrollDirective, ObserveScrollStateDirective, NgClass, LetDirective, ChevronIconComponent], host: {
|
|
305
388
|
class: 'et-scrollable',
|
|
306
|
-
}, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n [allowedDirection]=\"direction\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n
|
|
307
|
-
}], ctorParameters: () => [], propDecorators: {
|
|
308
|
-
type: Input
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}, {
|
|
315
|
-
type: HostBinding,
|
|
316
|
-
args: ['attr.direction']
|
|
317
|
-
}], scrollableRole: [{
|
|
318
|
-
type: Input
|
|
319
|
-
}], scrollableClass: [{
|
|
320
|
-
type: Input
|
|
321
|
-
}], renderMasks: [{
|
|
389
|
+
}, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll()\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n@if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n}\n\n@if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden;grid-template-columns:auto 1fr auto}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto;grid-template-rows:auto 1fr auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"] }]
|
|
390
|
+
}], ctorParameters: () => [], propDecorators: { _itemSize: [{
|
|
391
|
+
type: Input,
|
|
392
|
+
args: [{ alias: 'itemSize' }]
|
|
393
|
+
}], _direction: [{
|
|
394
|
+
type: Input,
|
|
395
|
+
args: [{ alias: 'direction' }]
|
|
396
|
+
}], _scrollableRole: [{
|
|
322
397
|
type: Input,
|
|
323
|
-
args: [{
|
|
324
|
-
}],
|
|
398
|
+
args: [{ alias: 'scrollableRole' }]
|
|
399
|
+
}], _scrollableClass: [{
|
|
325
400
|
type: Input,
|
|
326
|
-
args: [{
|
|
327
|
-
}],
|
|
401
|
+
args: [{ alias: 'scrollableClass' }]
|
|
402
|
+
}], _renderMasks: [{
|
|
328
403
|
type: Input,
|
|
329
|
-
args: [{ transform: booleanAttribute }]
|
|
330
|
-
}, {
|
|
331
|
-
type: HostBinding,
|
|
332
|
-
args: ['attr.render-scrollbars']
|
|
333
|
-
}], stickyButtons: [{
|
|
404
|
+
args: [{ transform: booleanAttribute, alias: 'renderMasks' }]
|
|
405
|
+
}], _renderButtons: [{
|
|
334
406
|
type: Input,
|
|
335
|
-
args: [{ transform: booleanAttribute }]
|
|
336
|
-
}, {
|
|
337
|
-
type: HostBinding,
|
|
338
|
-
args: ['attr.sticky-buttons']
|
|
339
|
-
}], cursorDragScroll: [{
|
|
407
|
+
args: [{ transform: booleanAttribute, alias: 'renderButtons' }]
|
|
408
|
+
}], _renderScrollbars: [{
|
|
340
409
|
type: Input,
|
|
341
|
-
args: [{ transform: booleanAttribute }]
|
|
342
|
-
}],
|
|
410
|
+
args: [{ transform: booleanAttribute, alias: 'renderScrollbars' }]
|
|
411
|
+
}], _stickyButtons: [{
|
|
343
412
|
type: Input,
|
|
344
|
-
args: [{ transform: booleanAttribute }]
|
|
345
|
-
}],
|
|
346
|
-
type: Input
|
|
347
|
-
}], snap: [{
|
|
413
|
+
args: [{ transform: booleanAttribute, alias: 'stickyButtons' }]
|
|
414
|
+
}], _cursorDragScroll: [{
|
|
348
415
|
type: Input,
|
|
349
|
-
args: [{ transform: booleanAttribute }]
|
|
350
|
-
}],
|
|
416
|
+
args: [{ transform: booleanAttribute, alias: 'cursorDragScroll' }]
|
|
417
|
+
}], _disableActiveElementScrolling: [{
|
|
351
418
|
type: Input,
|
|
352
|
-
args: [{ transform:
|
|
419
|
+
args: [{ transform: booleanAttribute, alias: 'disableActiveElementScrolling' }]
|
|
420
|
+
}], _scrollMode: [{
|
|
421
|
+
type: Input,
|
|
422
|
+
args: [{ alias: 'scrollMode' }]
|
|
423
|
+
}], _snap: [{
|
|
424
|
+
type: Input,
|
|
425
|
+
args: [{ transform: booleanAttribute, alias: 'snap' }]
|
|
426
|
+
}], _scrollMargin: [{
|
|
427
|
+
type: Input,
|
|
428
|
+
args: [{ transform: numberAttribute, alias: 'scrollMargin' }]
|
|
353
429
|
}], scrollStateChange: [{
|
|
354
430
|
type: Output
|
|
355
431
|
}], intersectionChange: [{
|
|
356
432
|
type: Output
|
|
357
|
-
}],
|
|
433
|
+
}], _scrollable: [{
|
|
358
434
|
type: ViewChild,
|
|
359
435
|
args: ['scrollable', { static: true }]
|
|
360
|
-
}],
|
|
361
|
-
type:
|
|
362
|
-
args: ['
|
|
363
|
-
}],
|
|
364
|
-
type:
|
|
365
|
-
args: ['
|
|
366
|
-
}],
|
|
367
|
-
type: ViewChildren,
|
|
368
|
-
args: ['lastElement']
|
|
369
|
-
}], activeElements: [{
|
|
436
|
+
}], _firstElement: [{
|
|
437
|
+
type: ViewChild,
|
|
438
|
+
args: ['firstElement', { static: true }]
|
|
439
|
+
}], _lastElement: [{
|
|
440
|
+
type: ViewChild,
|
|
441
|
+
args: ['lastElement', { static: true }]
|
|
442
|
+
}], _activeElementList: [{
|
|
370
443
|
type: ContentChildren,
|
|
371
444
|
args: [IS_ACTIVE_ELEMENT, { descendants: true }]
|
|
372
|
-
}],
|
|
445
|
+
}], _elementList: [{
|
|
373
446
|
type: ContentChildren,
|
|
374
447
|
args: [IS_ELEMENT, { descendants: true }]
|
|
375
448
|
}] } });
|
|
376
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixVQUFVLEVBR1YsWUFBWSxFQUVaLDJCQUEyQixFQUczQixjQUFjLEVBQ2QsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixvQkFBb0IsR0FDckIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLG9C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O3NCQURiLGVBQWU7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUl6RCxRQUFRO3NCQURQLGVBQWU7dUJBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLFxuICBJU19BQ1RJVkVfRUxFTUVOVCxcbiAgSVNfRUxFTUVOVCxcbiAgSXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlLFxuICBJc0VsZW1lbnREaXJlY3RpdmUsXG4gIExldERpcmVjdGl2ZSxcbiAgTmdDbGFzc1R5cGUsXG4gIE9ic2VydmVTY3JvbGxTdGF0ZURpcmVjdGl2ZSxcbiAgU2Nyb2xsT2JzZXJ2ZXJTY3JvbGxTdGF0ZSxcbiAgU2Nyb2xsVG9FbGVtZW50T3B0aW9ucyxcbiAgVHlwZWRRdWVyeUxpc3QsXG4gIGNyZWF0ZURlc3Ryb3ksXG4gIGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzLFxuICBzY3JvbGxUb0VsZW1lbnQsXG4gIHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24sXG4gIHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZSxcbiAgc2lnbmFsSG9zdEF0dHJpYnV0ZXMsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCwgbWVyZ2UsIG9mLCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UsIFNjcm9sbGFibGVTY3JvbGxNb2RlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1zY3JvbGxhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSwgT2JzZXJ2ZVNjcm9sbFN0YXRlRGlyZWN0aXZlLCBOZ0NsYXNzLCBOZ0lmLCBMZXREaXJlY3RpdmUsIENoZXZyb25JY29uQ29tcG9uZW50XSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtc2Nyb2xsYWJsZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ3Vyc29yRHJhZ2dpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxhYmxlSW50ZXJzZWN0aW9uQ2hhbmdlW10+KFtdKTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaXRlbS1zaXplJylcbiAgaXRlbVNpemU6ICdhdXRvJyB8ICdzYW1lJyB8ICdmdWxsJyA9ICdhdXRvJztcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGlyZWN0aW9uJylcbiAgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID0gJ2hvcml6b250YWwnO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVSb2xlPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVDbGFzcz86IE5nQ2xhc3NUeXBlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICByZW5kZXJNYXNrcyA9IHRydWU7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHJlbmRlckJ1dHRvbnMgPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBASG9zdEJpbmRpbmcoJ2F0dHIucmVuZGVyLXNjcm9sbGJhcnMnKVxuICByZW5kZXJTY3JvbGxiYXJzID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIEBIb3N0QmluZGluZygnYXR0ci5zdGlja3ktYnV0dG9ucycpXG4gIHN0aWNreUJ1dHRvbnMgPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgY3Vyc29yRHJhZ1Njcm9sbCA9IHRydWU7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2Nyb2xsTW9kZTogU2Nyb2xsYWJsZVNjcm9sbE1vZGUgPSAnY29udGFpbmVyJztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc25hcCA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHNjcm9sbE1hcmdpbiA9IDA7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHNjcm9sbFN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlPigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBpbnRlcnNlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2VbXT4oKTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2Nyb2xsYWJsZSE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ3Njcm9sbGFibGUnKVxuICBwcm90ZWN0ZWQgc2V0IHNjcm9sbGFibGVMaXN0KGxpc3Q6IFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pikge1xuICAgIHRoaXMuX3Njcm9sbGFibGVMaXN0LnNldChsaXN0KTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxhYmxlTGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkcmVuKCdmaXJzdEVsZW1lbnQnKVxuICBwcm90ZWN0ZWQgc2V0IGZpcnN0RWxlbWVudExpc3QobGlzdDogVHlwZWRRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KSB7XG4gICAgdGhpcy5fZmlyc3RFbGVtZW50TGlzdC5zZXQobGlzdCk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfZmlyc3RFbGVtZW50TGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkcmVuKCdsYXN0RWxlbWVudCcpXG4gIHByb3RlY3RlZCBzZXQgbGFzdEVsZW1lbnRMaXN0KGxpc3Q6IFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pikge1xuICAgIHRoaXMuX2xhc3RFbGVtZW50TGlzdC5zZXQobGlzdCk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfbGFzdEVsZW1lbnRMaXN0ID0gc2lnbmFsPFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PiB8IG51bGw+KG51bGwpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSVNfQUNUSVZFX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgYWN0aXZlRWxlbWVudHM6IFR5cGVkUXVlcnlMaXN0PElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZT4gfCBudWxsID0gbnVsbDtcblxuICBAQ29udGVudENoaWxkcmVuKElTX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgZWxlbWVudHM6IFR5cGVkUXVlcnlMaXN0PElzRWxlbWVudERpcmVjdGl2ZT4gfCBudWxsID0gbnVsbDtcblxuICBnZXQgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24oKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC52YWx1ZTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyLmludGVyc2VjdGlvblJhdGlvID4gcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA/IGN1cnIgOiBwcmV2O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG5leHRQYXJ0aWFsSW50ZXJzZWN0aW9uKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24gPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uO1xuXG4gICAgaWYgKCFoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID0gZWxlbWVudHMuc2xpY2UoaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXgpLmZpbmRJbmRleCgoZSkgPT4gIWUuaXNJbnRlcnNlY3RpbmcpO1xuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudHNbaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXggKyBuZXh0SW5kZXhdO1xuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50IHx8IG51bGw7XG4gIH1cblxuICBnZXQgcHJldmlvdXNQYXJ0aWFsSW50ZXJzZWN0aW9uKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24gPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uO1xuXG4gICAgaWYgKCFoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGVsZW1lbnRzXG4gICAgICAuc2xpY2UoMCwgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZEluZGV4KChlKSA9PiAhZS5pc0ludGVyc2VjdGluZyk7XG5cbiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IGVsZW1lbnRzW2hpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uLmluZGV4IC0gcHJldmlvdXNJbmRleCAtIDFdO1xuXG4gICAgcmV0dXJuIHByZXZpb3VzRWxlbWVudCB8fCBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRhaW5lclNjcm9sbFN0YXRlID0gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKHRoaXMuX3Njcm9sbGFibGVMaXN0KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0RWxlbWVudEludGVyc2VjdGlvbiA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5fZmlyc3RFbGVtZW50TGlzdCwgdGhpcy5fc2Nyb2xsYWJsZUxpc3QpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFzdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKHRoaXMuX2xhc3RFbGVtZW50TGlzdCwgdGhpcy5fc2Nyb2xsYWJsZUxpc3QpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRBbmltYXRlT3ZlcmxheXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAhIXRoaXMuZmlyc3RFbGVtZW50SW50ZXJzZWN0aW9uKCkgJiYgISF0aGlzLmxhc3RFbGVtZW50SW50ZXJzZWN0aW9uKCksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhblNjcm9sbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0aGlzLmRpcmVjdGlvbjtcblxuICAgIGlmIChkaXIgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBdFN0YXJ0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNhblNjcm9sbCgpID8gdGhpcy5maXJzdEVsZW1lbnRJbnRlcnNlY3Rpb24oKS5pc0ludGVyc2VjdGluZyA6IHRydWUsXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0F0RW5kID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNhblNjcm9sbCgpID8gdGhpcy5sYXN0RWxlbWVudEludGVyc2VjdGlvbigpLmlzSW50ZXJzZWN0aW5nIDogdHJ1ZSxcbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdEF0dHJpYnV0ZXMgPSBzaWduYWxIb3N0QXR0cmlidXRlcyh7XG4gICAgJ2Nhbi1zY3JvbGwnOiB0aGlzLmNhblNjcm9sbCxcbiAgICAnYXQtc3RhcnQnOiB0aGlzLmlzQXRTdGFydCxcbiAgICAnYXQtZW5kJzogdGhpcy5pc0F0RW5kLFxuICAgICdhbmltYXRlLW92ZXJsYXlzJzogdGhpcy5zaG91bGRBbmltYXRlT3ZlcmxheXMsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpc0F0U3RhcnQgPSB0aGlzLmlzQXRTdGFydCgpO1xuICAgICAgY29uc3QgaXNBdEVuZCA9IHRoaXMuaXNBdEVuZCgpO1xuICAgICAgY29uc3QgY2FuU2Nyb2xsID0gdGhpcy5jYW5TY3JvbGwoKTtcblxuICAgICAgdGhpcy5zY3JvbGxTdGF0ZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgY2FuU2Nyb2xsLFxuICAgICAgICBpc0F0RW5kLFxuICAgICAgICBpc0F0U3RhcnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlRWxlbWVudHMgfHwgIXRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRzLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgodGhpcy5hY3RpdmVFbGVtZW50cyksXG4gICAgICAgIHRhcCgoYWN0aXZlRWxlbWVudHMpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWN0aXZlRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGEpOiBhIGlzIElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZSA9PiAhIWEpXG4gICAgICAgICAgICAuZmluZCgoYSkgPT4gYS5pc0FjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgaWYgKCFmaXJzdEFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2F1dG8nLFxuICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLnNjcm9sbGFibGUubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGZpcnN0QWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/IHRoaXMuc2Nyb2xsTWFyZ2luIDogMCxcbiAgICAgICAgICAgIHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gMCA6IHRoaXMuc2Nyb2xsTWFyZ2luLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuX3NldHVwU2Nyb2xsTGlzdGVuaW5nKCk7XG4gIH1cblxuICBzY3JvbGxPbmVDb250YWluZXJTaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHNjcm9sbGFibGVTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/IHBhcmVudC5jbGllbnRXaWR0aCA6IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbCA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBzY3JvbGxFbGVtZW50LnNjcm9sbExlZnQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgIHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG8oe1xuICAgICAgW3RoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnbGVmdCcgOiAndG9wJ106XG4gICAgICAgIGN1cnJlbnRTY3JvbGwgKyAoZGlyZWN0aW9uID09PSAnc3RhcnQnID8gLXNjcm9sbGFibGVTaXplIDogc2Nyb2xsYWJsZVNpemUpLFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsT25lSXRlbVNpemUoZGlyZWN0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLnZhbHVlO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ05vIGVsZW1lbnRzIGZvdW5kIHRvIHNjcm9sbCB0by4gTWFrZSBzdXJlIHRvIGFwcGx5IHRoZSBpc0VsZW1lbnQgZGlyZWN0aXZlIHRvIHRoZSBlbGVtZW50cyB5b3Ugd2FudCB0byBzY3JvbGwgdG8uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbCA9IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IHRoaXMucHJldmlvdXNQYXJ0aWFsSW50ZXJzZWN0aW9uIDogdGhpcy5uZXh0UGFydGlhbEludGVyc2VjdGlvbjtcblxuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICBlbGVtZW50OiBlbD8uZWxlbWVudCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmUnIDogJ2Jsb2NrJyxcbiAgICAgIG9yaWdpbjogZGlyZWN0aW9uLFxuICAgICAgLi4uKHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4gfVxuICAgICAgICA6IHsgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+KSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8geyBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luIH1cbiAgICAgICAgOiB7IHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbiB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxUb0VsZW1lbnRCeUluZGV4KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+ICYgeyBpbmRleDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM/LnRvQXJyYXkoKSA/PyBbXTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgaXNFbGVtZW50IGRpcmVjdGl2ZSB0byB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvcHRpb25zLmluZGV4XT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi4odGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbiB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4gfSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldElzQ3Vyc29yRHJhZ2dpbmcoaXNEcmFnZ2luZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQ3Vyc29yRHJhZ2dpbmckLm5leHQoaXNEcmFnZ2luZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TdGFydERpcmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlID09PSAnY29udGFpbmVyJykge1xuICAgICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdzdGFydCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdzdGFydCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1N0YXJ0RW5kKCkge1xuICAgIGlmICh0aGlzLnNjcm9sbE1vZGUgPT09ICdjb250YWluZXInKSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNjcm9sbExpc3RlbmluZygpIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgbGV0IGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICBsZXQgc25hcFRpbWVvdXQgPSAwO1xuXG4gICAgbWVyZ2UoZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHNjcm9sbEVsZW1lbnQsICd3aGVlbCcpLCBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oc2Nyb2xsRWxlbWVudCwgJ3RvdWNoc3RhcnQnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudChzY3JvbGxFbGVtZW50LCAnc2Nyb2xsJyksXG4gICAgICB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJCxcbiAgICAgIHRoaXMuZWxlbWVudHM/LmNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5lbGVtZW50cykpID8/IG9mKG51bGwpLFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50cyA9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzXG4gICAgICAgICAgICAgID8udG9BcnJheSgpXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGU/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSk6IGUgaXMgSFRNTEVsZW1lbnQgPT4gISFlKSA/PyBbXTtcblxuICAgICAgICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC5uZXh0KFtdKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YXRlcyA9IGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzKHtcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnaW5saW5lSW50ZXJzZWN0aW9uJyA6ICdibG9ja0ludGVyc2VjdGlvbic7XG4gICAgICAgICAgY29uc3Qgc3RhdGVDbGFzcyA9IGBldC1lbGVtZW50LS1pcy1pbnRlcnNlY3RpbmdgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZVtwcm9wXSA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25DaGFuZ2VzID0gc3RhdGVzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IHMuZWxlbWVudCxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW86IHNbcHJvcF0gLyAxMDAsXG4gICAgICAgICAgICAgIGlzSW50ZXJzZWN0aW5nOiBzW3Byb3BdID09PSAxMDAsXG4gICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25DaGFuZ2UuZW1pdChpbnRlcnNlY3Rpb25DaGFuZ2VzKTtcblxuICAgICAgICAgIHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLm5leHQoaW50ZXJzZWN0aW9uQ2hhbmdlcyk7XG5cbiAgICAgICAgICBpZiAoaXNTbmFwcGluZyB8fCB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJC52YWx1ZSB8fCAhdGhpcy5zbmFwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5wcmV2aW91c1BhcnRpYWxJbnRlcnNlY3Rpb247XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmV4dFBhcnRpYWxJbnRlcnNlY3Rpb247XG4gICAgICAgICAgY29uc3Qgc2tpcFNuYXAgPVxuICAgICAgICAgICAgIXByZXYgfHxcbiAgICAgICAgICAgICFuZXh0IHx8XG4gICAgICAgICAgICBwcmV2LmludGVyc2VjdGlvblJhdGlvID09PSAwIHx8XG4gICAgICAgICAgICBuZXh0LmludGVyc2VjdGlvblJhdGlvID09PSAwIHx8XG4gICAgICAgICAgICBwcmV2LmludGVyc2VjdGlvblJhdGlvID09PSBuZXh0LmludGVyc2VjdGlvblJhdGlvO1xuXG4gICAgICAgICAgaWYgKHNraXBTbmFwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBoaWdoZXN0SW50ZXJzZWN0aW5nID0gcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA+IG5leHQuaW50ZXJzZWN0aW9uUmF0aW8gPyBwcmV2IDogbmV4dDtcbiAgICAgICAgICBjb25zdCBmdWxsSW50ZXJzZWN0aW9uSW5kZXggPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uPy5pbmRleDtcblxuICAgICAgICAgIGlmIChmdWxsSW50ZXJzZWN0aW9uSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgaGlnaGVzdEludGVyc2VjdGluZ0luZGV4ID0gaGlnaGVzdEludGVyc2VjdGluZy5pbmRleDtcbiAgICAgICAgICBjb25zdCBvcmlnaW4gPSBoaWdoZXN0SW50ZXJzZWN0aW5nSW5kZXggPiBmdWxsSW50ZXJzZWN0aW9uSW5kZXggPyAnZW5kJyA6ICdzdGFydCc7XG5cbiAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgICAgZWxlbWVudDogaGlnaGVzdEludGVyc2VjdGluZy5lbGVtZW50LFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ2lubGluZScgOiAnYmxvY2snLFxuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAwIDogdGhpcy5zY3JvbGxNYXJnaW4sXG4gICAgICAgICAgICBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyB0aGlzLnNjcm9sbE1hcmdpbiA6IDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpc1NuYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoc25hcFRpbWVvdXQpO1xuXG4gICAgICAgICAgc25hcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpc1NuYXBwaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxhYmxlXG4gIFthdHRyLnJvbGVdPVwic2Nyb2xsYWJsZVJvbGUgPz8gdW5kZWZpbmVkXCJcbiAgW2V0Q3Vyc29yRHJhZ1Njcm9sbF09XCJjdXJzb3JEcmFnU2Nyb2xsXCJcbiAgW2FsbG93ZWREaXJlY3Rpb25dPVwiZGlyZWN0aW9uXCJcbiAgKGN1cnNvckRyYWdTdGFydCk9XCJzZXRJc0N1cnNvckRyYWdnaW5nKHRydWUpXCJcbiAgKGN1cnNvckRyYWdFbmQpPVwic2V0SXNDdXJzb3JEcmFnZ2luZyhmYWxzZSlcIlxuICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyLW91dGVyXCJcbj5cbiAgPGRpdiBbbmdDbGFzc109XCJzY3JvbGxhYmxlQ2xhc3NcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyXCI+XG4gICAgPGRpdiAjZmlyc3RFbGVtZW50IGNsYXNzPVwiZXQtc2Nyb2xsLW9ic2VydmVyLWZpcnN0LWVsZW1lbnRcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCAvPlxuICAgIDxkaXYgI2xhc3RFbGVtZW50IGNsYXNzPVwiZXQtc2Nyb2xsLW9ic2VydmVyLWxhc3QtZWxlbWVudFwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyTWFza3NcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFza3NcIj5cbiAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLXN0YXJ0XCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1lbmRcIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyQnV0dG9uc1wiIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b25zXCI+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydERpcmVjdGlvbigpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1zdGFydFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydEVuZCgpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1lbmRcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gID5cbiAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixVQUFVLEVBR1YsWUFBWSxFQUVaLDJCQUEyQixFQUczQixjQUFjLEVBQ2QsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGVBQWUsRUFDZix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxF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O3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTzdCLGFBQWE7c0JBRHhCLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPL0IsWUFBWTtzQkFEdkIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU85QixrQkFBa0I7c0JBRDdCLGVBQWU7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQU83QyxZQUFZO3NCQUR2QixlQUFlO3VCQUFDLFVBQVUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlzRGV2TW9kZSxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ3VycmVudEVsZW1lbnRWaXNpYmlsaXR5LFxuICBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLFxuICBJU19BQ1RJVkVfRUxFTUVOVCxcbiAgSVNfRUxFTUVOVCxcbiAgSXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlLFxuICBJc0VsZW1lbnREaXJlY3RpdmUsXG4gIExldERpcmVjdGl2ZSxcbiAgTmdDbGFzc1R5cGUsXG4gIE9ic2VydmVTY3JvbGxTdGF0ZURpcmVjdGl2ZSxcbiAgU2Nyb2xsT2JzZXJ2ZXJTY3JvbGxTdGF0ZSxcbiAgU2Nyb2xsVG9FbGVtZW50T3B0aW9ucyxcbiAgVHlwZWRRdWVyeUxpc3QsXG4gIGNyZWF0ZURlc3Ryb3ksXG4gIGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzLFxuICBpc0VsZW1lbnRWaXNpYmxlLFxuICBuZXh0RnJhbWUsXG4gIHNjcm9sbFRvRWxlbWVudCxcbiAgc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbixcbiAgc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlLFxuICBzaWduYWxIb3N0QXR0cmlidXRlcyxcbiAgc2lnbmFsSG9zdENsYXNzZXMsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCwgbWVyZ2UsIG9mLCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UsIFNjcm9sbGFibGVTY3JvbGxNb2RlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1zY3JvbGxhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSwgT2JzZXJ2ZVNjcm9sbFN0YXRlRGlyZWN0aXZlLCBOZ0NsYXNzLCBMZXREaXJlY3RpdmUsIENoZXZyb25JY29uQ29tcG9uZW50XSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtc2Nyb2xsYWJsZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ3Vyc29yRHJhZ2dpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxhYmxlSW50ZXJzZWN0aW9uQ2hhbmdlW10+KFtdKTtcblxuICBASW5wdXQoeyBhbGlhczogJ2l0ZW1TaXplJyB9KVxuICBzZXQgX2l0ZW1TaXplKHY6ICdhdXRvJyB8ICdzYW1lJyB8ICdmdWxsJykge1xuICAgIHRoaXMuaXRlbVNpemUuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IGl0ZW1TaXplID0gc2lnbmFsPCdhdXRvJyB8ICdzYW1lJyB8ICdmdWxsJz4oJ2F1dG8nKTtcblxuICBASW5wdXQoeyBhbGlhczogJ2RpcmVjdGlvbicgfSlcbiAgc2V0IF9kaXJlY3Rpb24odjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJykge1xuICAgIHRoaXMuZGlyZWN0aW9uLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBkaXJlY3Rpb24gPSBzaWduYWw8J2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJz4oJ2hvcml6b250YWwnKTtcblxuICBASW5wdXQoeyBhbGlhczogJ3Njcm9sbGFibGVSb2xlJyB9KVxuICBzZXQgX3Njcm9sbGFibGVSb2xlKHY6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLnNjcm9sbGFibGVSb2xlLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBzY3JvbGxhYmxlUm9sZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoeyBhbGlhczogJ3Njcm9sbGFibGVDbGFzcycgfSlcbiAgc2V0IF9zY3JvbGxhYmxlQ2xhc3ModjogTmdDbGFzc1R5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5zY3JvbGxhYmxlQ2xhc3Muc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbGFibGVDbGFzcyA9IHNpZ25hbDxOZ0NsYXNzVHlwZSB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdyZW5kZXJNYXNrcycgfSlcbiAgc2V0IF9yZW5kZXJNYXNrcyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZW5kZXJNYXNrcy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgcmVuZGVyTWFza3MgPSBzaWduYWwodHJ1ZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3JlbmRlckJ1dHRvbnMnIH0pXG4gIHNldCBfcmVuZGVyQnV0dG9ucyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZW5kZXJCdXR0b25zLnNldCh2KTtcbiAgfVxuICByZWFkb25seSByZW5kZXJCdXR0b25zID0gc2lnbmFsKHRydWUpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdyZW5kZXJTY3JvbGxiYXJzJyB9KVxuICBzZXQgX3JlbmRlclNjcm9sbGJhcnModjogYm9vbGVhbikge1xuICAgIHRoaXMucmVuZGVyU2Nyb2xsYmFycy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgcmVuZGVyU2Nyb2xsYmFycyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3N0aWNreUJ1dHRvbnMnIH0pXG4gIHNldCBfc3RpY2t5QnV0dG9ucyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGlja3lCdXR0b25zLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBzdGlja3lCdXR0b25zID0gc2lnbmFsKGZhbHNlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnY3Vyc29yRHJhZ1Njcm9sbCcgfSlcbiAgc2V0IF9jdXJzb3JEcmFnU2Nyb2xsKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmN1cnNvckRyYWdTY3JvbGwuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IGN1cnNvckRyYWdTY3JvbGwgPSBzaWduYWwodHJ1ZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ2Rpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nJyB9KVxuICBzZXQgX2Rpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBkaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdzY3JvbGxNb2RlJyB9KVxuICBzZXQgX3Njcm9sbE1vZGUodjogU2Nyb2xsYWJsZVNjcm9sbE1vZGUpIHtcbiAgICB0aGlzLnNjcm9sbE1vZGUuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbE1vZGUgPSBzaWduYWw8U2Nyb2xsYWJsZVNjcm9sbE1vZGU+KCdjb250YWluZXInKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnc25hcCcgfSlcbiAgc2V0IF9zbmFwKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNuYXAuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNuYXAgPSBzaWduYWwoZmFsc2UpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlLCBhbGlhczogJ3Njcm9sbE1hcmdpbicgfSlcbiAgc2V0IF9zY3JvbGxNYXJnaW4odjogbnVtYmVyKSB7XG4gICAgdGhpcy5zY3JvbGxNYXJnaW4uc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbE1hcmdpbiA9IHNpZ25hbCgwKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgc2Nyb2xsU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGU+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGludGVyc2VjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2Nyb2xsYWJsZUludGVyc2VjdGlvbkNoYW5nZVtdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIHNldCBfc2Nyb2xsYWJsZShlOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgIHRoaXMuc2Nyb2xsYWJsZS5zZXQoZSk7XG4gIH1cbiAgcmVhZG9ubHkgc2Nyb2xsYWJsZSA9IHNpZ25hbDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGw+KG51bGwpO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpcnN0RWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgc2V0IF9maXJzdEVsZW1lbnQoZTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLmZpcnN0RWxlbWVudC5zZXQoZSk7XG4gIH1cbiAgcmVhZG9ubHkgZmlyc3RFbGVtZW50ID0gc2lnbmFsPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgQFZpZXdDaGlsZCgnbGFzdEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIHNldCBfbGFzdEVsZW1lbnQoZTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLmxhc3RFbGVtZW50LnNldChlKTtcbiAgfVxuICByZWFkb25seSBsYXN0RWxlbWVudCA9IHNpZ25hbDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGw+KG51bGwpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSVNfQUNUSVZFX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX2FjdGl2ZUVsZW1lbnRMaXN0KGU6IFR5cGVkUXVlcnlMaXN0PElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZT4pIHtcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRMaXN0LnNldChlKTtcbiAgfVxuICByZWFkb25seSBhY3RpdmVFbGVtZW50TGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxJc0FjdGl2ZUVsZW1lbnREaXJlY3RpdmU+IHwgbnVsbD4obnVsbCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihJU19FTEVNRU5ULCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHByaXZhdGUgc2V0IF9lbGVtZW50TGlzdChlOiBUeXBlZFF1ZXJ5TGlzdDxJc0VsZW1lbnREaXJlY3RpdmU+KSB7XG4gICAgdGhpcy5lbGVtZW50TGlzdC5zZXQoZSk7XG4gIH1cbiAgcmVhZG9ubHkgZWxlbWVudExpc3QgPSBzaWduYWw8VHlwZWRRdWVyeUxpc3Q8SXNFbGVtZW50RGlyZWN0aXZlPiB8IG51bGw+KG51bGwpO1xuXG4gIGdldCBoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbigpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLnZhbHVlO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgIGlmICghcHJldikge1xuICAgICAgICByZXR1cm4gY3VycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnIuaW50ZXJzZWN0aW9uUmF0aW8gPiBwcmV2LmludGVyc2VjdGlvblJhdGlvID8gY3VyciA6IHByZXY7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbmV4dFBhcnRpYWxJbnRlcnNlY3Rpb24oKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC52YWx1ZTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbiA9IHRoaXMuaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb247XG5cbiAgICBpZiAoIWhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SW5kZXggPSBlbGVtZW50cy5zbGljZShoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbi5pbmRleCkuZmluZEluZGV4KChlKSA9PiAhZS5pc0ludGVyc2VjdGluZyk7XG5cbiAgICBpZiAobmV4dEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBlbGVtZW50c1toaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbi5pbmRleCArIG5leHRJbmRleF07XG5cbiAgICByZXR1cm4gbmV4dEVsZW1lbnQgfHwgbnVsbDtcbiAgfVxuXG4gIGdldCBwcmV2aW91c1BhcnRpYWxJbnRlcnNlY3Rpb24oKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC52YWx1ZTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbiA9IHRoaXMuaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb247XG5cbiAgICBpZiAoIWhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gZWxlbWVudHNcbiAgICAgIC5zbGljZSgwLCBoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbi5pbmRleClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maW5kSW5kZXgoKGUpID0+ICFlLmlzSW50ZXJzZWN0aW5nKTtcblxuICAgIGlmIChwcmV2aW91c0luZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gZWxlbWVudHNbaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXggLSBwcmV2aW91c0luZGV4IC0gMV07XG5cbiAgICByZXR1cm4gcHJldmlvdXNFbGVtZW50IHx8IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGFpbmVyU2Nyb2xsU3RhdGUgPSBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUodGhpcy5zY3JvbGxhYmxlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0RWxlbWVudEludGVyc2VjdGlvbiA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5maXJzdEVsZW1lbnQpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3RFbGVtZW50VmlzaWJpbGl0eSA9IHNpZ25hbDxDdXJyZW50RWxlbWVudFZpc2liaWxpdHkgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhc3RFbGVtZW50SW50ZXJzZWN0aW9uID0gc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbih0aGlzLmxhc3RFbGVtZW50KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhc3RFbGVtZW50VmlzaWJpbGl0eSA9IHNpZ25hbDxDdXJyZW50RWxlbWVudFZpc2liaWxpdHkgfCBudWxsPihudWxsKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FuU2Nyb2xsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRoaXMuZGlyZWN0aW9uKCk7XG5cbiAgICBpZiAoZGlyID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclNjcm9sbFN0YXRlKCkuY2FuU2Nyb2xsSG9yaXpvbnRhbGx5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclNjcm9sbFN0YXRlKCkuY2FuU2Nyb2xsVmVydGljYWxseTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQXRTdGFydCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuY2FuU2Nyb2xsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMuZmlyc3RFbGVtZW50SW50ZXJzZWN0aW9uKCk7XG5cbiAgICBpZiAoIWludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50VmlzaWJpbGl0eSgpPy5pbmxpbmUgPz8gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9uLmlzSW50ZXJzZWN0aW5nO1xuICB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQXRFbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNhblNjcm9sbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSB0aGlzLmxhc3RFbGVtZW50SW50ZXJzZWN0aW9uKCk7XG5cbiAgICBpZiAoIWludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdEVsZW1lbnRWaXNpYmlsaXR5KCk/LmlubGluZSA/PyB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb24uaXNJbnRlcnNlY3Rpbmc7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBlbmFibGVPdmVybGF5QW5pbWF0aW9ucyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvc3RBdHRyaWJ1dGVzID0gc2lnbmFsSG9zdEF0dHJpYnV0ZXMoe1xuICAgICdpdGVtLXNpemUnOiB0aGlzLml0ZW1TaXplLFxuICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24sXG4gICAgJ3JlbmRlci1zY3JvbGxiYXJzJzogdGhpcy5yZW5kZXJTY3JvbGxiYXJzLFxuICAgICdzdGlja3ktYnV0dG9ucyc6IHRoaXMuc3RpY2t5QnV0dG9ucyxcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvc3RDbGFzc2VzID0gc2lnbmFsSG9zdENsYXNzZXMoe1xuICAgICdldC1zY3JvbGxhYmxlLS1jYW4tc2Nyb2xsJzogdGhpcy5jYW5TY3JvbGwsXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LXN0YXJ0JzogdGhpcy5pc0F0U3RhcnQsXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LWVuZCc6IHRoaXMuaXNBdEVuZCxcbiAgICAnZXQtc2Nyb2xsYWJsZS0tZW5hYmxlLW92ZXJsYXktYW5pbWF0aW9ucyc6IHRoaXMuZW5hYmxlT3ZlcmxheUFuaW1hdGlvbnMsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0aGlzLmZpcnN0RWxlbWVudCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMubGFzdEVsZW1lbnQoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudExpc3QgPSB0aGlzLmFjdGl2ZUVsZW1lbnRMaXN0KCk/LnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAoIXNjcm9sbGFibGUgfHwgIWZpcnN0RWxlbWVudCB8fCAhbGFzdEVsZW1lbnQgfHwgIWFjdGl2ZUVsZW1lbnRMaXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RBY3RpdmUgPSBhY3RpdmVFbGVtZW50TGlzdC5maW5kKChhKSA9PiBhLmlzQWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGZpcnN0QWN0aXZlICYmICF0aGlzLmRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nKCkpIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSBmaXJzdEFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wIC0gc2Nyb2xsYWJsZS5vZmZzZXRUb3A7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IGZpcnN0QWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0IC0gc2Nyb2xsYWJsZS5vZmZzZXRMZWZ0O1xuICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsTGVmdCA9IG9mZnNldExlZnQ7XG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUb3AgPSBvZmZzZXRUb3A7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcnN0RWxlbWVudFZpc2liaWxpdHkuc2V0KFxuICAgICAgICAgIGlzRWxlbWVudFZpc2libGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxhYmxlLFxuICAgICAgICAgICAgZWxlbWVudDogZmlyc3RFbGVtZW50LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubGFzdEVsZW1lbnRWaXNpYmlsaXR5LnNldChcbiAgICAgICAgICBpc0VsZW1lbnRWaXNpYmxlKHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc2Nyb2xsYWJsZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGxhc3RFbGVtZW50LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBvbmUgZnJhbWUgYmVmb3JlIGVuYWJsaW5nIGFuaW1hdGlvbnMgdG8gcHJldmVudCBhIGFuaW1hdGlvbiBmcm9tIHBsYXlpbmcgZHVyaW5nIGluaXRpYWwgcmVuZGVyLlxuICAgICAgICBuZXh0RnJhbWUoKCkgPT4gdGhpcy5lbmFibGVPdmVybGF5QW5pbWF0aW9ucy5zZXQodHJ1ZSkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlzQXRTdGFydCA9IHRoaXMuaXNBdFN0YXJ0KCk7XG4gICAgICBjb25zdCBpc0F0RW5kID0gdGhpcy5pc0F0RW5kKCk7XG4gICAgICBjb25zdCBjYW5TY3JvbGwgPSB0aGlzLmNhblNjcm9sbCgpO1xuXG4gICAgICB0aGlzLnNjcm9sbFN0YXRlQ2hhbmdlLmVtaXQoe1xuICAgICAgICBjYW5TY3JvbGwsXG4gICAgICAgIGlzQXRFbmQ6ICEhaXNBdEVuZCxcbiAgICAgICAgaXNBdFN0YXJ0OiAhIWlzQXRTdGFydCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHVwU2Nyb2xsTGlzdGVuaW5nKCk7XG4gIH1cblxuICBzY3JvbGxPbmVDb250YWluZXJTaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3Qgc2Nyb2xsYWJsZVNpemUgPSB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyBwYXJlbnQuY2xpZW50V2lkdGggOiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGwgPSB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyBzY3JvbGxFbGVtZW50LnNjcm9sbExlZnQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgIHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG8oe1xuICAgICAgW3RoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdsZWZ0JyA6ICd0b3AnXTpcbiAgICAgICAgY3VycmVudFNjcm9sbCArIChkaXJlY3Rpb24gPT09ICdzdGFydCcgPyAtc2Nyb2xsYWJsZVNpemUgOiBzY3JvbGxhYmxlU2l6ZSksXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxPbmVJdGVtU2l6ZShkaXJlY3Rpb246ICdzdGFydCcgfCAnZW5kJykge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnTm8gZWxlbWVudHMgZm91bmQgdG8gc2Nyb2xsIHRvLiBNYWtlIHN1cmUgdG8gYXBwbHkgdGhlIGlzRWxlbWVudCBkaXJlY3RpdmUgdG8gdGhlIGVsZW1lbnRzIHlvdSB3YW50IHRvIHNjcm9sbCB0by4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gZGlyZWN0aW9uID09PSAnc3RhcnQnID8gdGhpcy5wcmV2aW91c1BhcnRpYWxJbnRlcnNlY3Rpb24gOiB0aGlzLm5leHRQYXJ0aWFsSW50ZXJzZWN0aW9uO1xuXG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGVsZW1lbnQ6IGVsPy5lbGVtZW50LFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyAnaW5saW5lJyA6ICdibG9jaycsXG4gICAgICBvcmlnaW46IGRpcmVjdGlvbixcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHNjcm9sbFRvRWxlbWVudChvcHRpb25zOiBPbWl0PFNjcm9sbFRvRWxlbWVudE9wdGlvbnMsICdjb250YWluZXInPikge1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICBjb250YWluZXI6IHNjcm9sbEVsZW1lbnQsXG4gICAgICAuLi4odGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8geyBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luKCkgfVxuICAgICAgICA6IHsgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luKCkgfSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50QnlJbmRleChvcHRpb25zOiBPbWl0PFNjcm9sbFRvRWxlbWVudE9wdGlvbnMsICdjb250YWluZXInPiAmIHsgaW5kZXg6IG51bWJlciB9KSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRMaXN0KCk/LnRvQXJyYXkoKSA/PyBbXTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgaXNFbGVtZW50IGRpcmVjdGl2ZSB0byB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvcHRpb25zLmluZGV4XT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi4odGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8geyBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luKCkgfVxuICAgICAgICA6IHsgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luKCkgfSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldElzQ3Vyc29yRHJhZ2dpbmcoaXNEcmFnZ2luZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQ3Vyc29yRHJhZ2dpbmckLm5leHQoaXNEcmFnZ2luZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TdGFydERpcmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlKCkgPT09ICdjb250YWluZXInKSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ3N0YXJ0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsT25lSXRlbVNpemUoJ3N0YXJ0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvU3RhcnRFbmQoKSB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsTW9kZSgpID09PSAnY29udGFpbmVyJykge1xuICAgICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdlbmQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxPbmVJdGVtU2l6ZSgnZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBTY3JvbGxMaXN0ZW5pbmcoKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5lbGVtZW50TGlzdCgpO1xuXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50IHx8ICFlbGVtZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpc1NuYXBwaW5nID0gZmFsc2U7XG4gICAgbGV0IHNuYXBUaW1lb3V0ID0gMDtcblxuICAgIG1lcmdlKGZyb21FdmVudDxXaGVlbEV2ZW50PihzY3JvbGxFbGVtZW50LCAnd2hlZWwnKSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHNjcm9sbEVsZW1lbnQsICd0b3VjaHN0YXJ0JykpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBpc1NuYXBwaW5nID0gZmFsc2U7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgbWVyZ2UoXG4gICAgICBmcm9tRXZlbnQoc2Nyb2xsRWxlbWVudCwgJ3Njcm9sbCcpLFxuICAgICAgdGhpcy5faXNDdXJzb3JEcmFnZ2luZyQsXG4gICAgICBlbGVtZW50cy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKGVsZW1lbnRzKSkgPz8gb2YobnVsbCksXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVscyA9XG4gICAgICAgICAgICBlbGVtZW50c1xuICAgICAgICAgICAgICA/LnRvQXJyYXkoKVxuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlPy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGUpOiBlIGlzIEhUTUxFbGVtZW50ID0+ICEhZSkgPz8gW107XG5cbiAgICAgICAgICBpZiAoIWVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLm5leHQoW10pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3RhdGVzID0gZ2V0RWxlbWVudFZpc2libGVTdGF0ZXMoe1xuICAgICAgICAgICAgZWxlbWVudHM6IGVscyxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyAnaW5saW5lSW50ZXJzZWN0aW9uJyA6ICdibG9ja0ludGVyc2VjdGlvbic7XG4gICAgICAgICAgY29uc3Qgc3RhdGVDbGFzcyA9IGBldC1lbGVtZW50LS1pcy1pbnRlcnNlY3RpbmdgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZVtwcm9wXSA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25DaGFuZ2VzID0gc3RhdGVzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IHMuZWxlbWVudCxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW86IHNbcHJvcF0gLyAxMDAsXG4gICAgICAgICAgICAgIGlzSW50ZXJzZWN0aW5nOiBzW3Byb3BdID09PSAxMDAsXG4gICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25DaGFuZ2UuZW1pdChpbnRlcnNlY3Rpb25DaGFuZ2VzKTtcblxuICAgICAgICAgIHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLm5leHQoaW50ZXJzZWN0aW9uQ2hhbmdlcyk7XG5cbiAgICAgICAgICBpZiAoaXNTbmFwcGluZyB8fCB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJC52YWx1ZSB8fCAhdGhpcy5zbmFwKCkpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLnByZXZpb3VzUGFydGlhbEludGVyc2VjdGlvbjtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0UGFydGlhbEludGVyc2VjdGlvbjtcbiAgICAgICAgICBjb25zdCBza2lwU25hcCA9XG4gICAgICAgICAgICAhcHJldiB8fFxuICAgICAgICAgICAgIW5leHQgfHxcbiAgICAgICAgICAgIHByZXYuaW50ZXJzZWN0aW9uUmF0aW8gPT09IDAgfHxcbiAgICAgICAgICAgIG5leHQuaW50ZXJzZWN0aW9uUmF0aW8gPT09IDAgfHxcbiAgICAgICAgICAgIHByZXYuaW50ZXJzZWN0aW9uUmF0aW8gPT09IG5leHQuaW50ZXJzZWN0aW9uUmF0aW87XG5cbiAgICAgICAgICBpZiAoc2tpcFNuYXApIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RJbnRlcnNlY3RpbmcgPSBwcmV2LmludGVyc2VjdGlvblJhdGlvID4gbmV4dC5pbnRlcnNlY3Rpb25SYXRpbyA/IHByZXYgOiBuZXh0O1xuICAgICAgICAgIGNvbnN0IGZ1bGxJbnRlcnNlY3Rpb25JbmRleCA9IHRoaXMuaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24/LmluZGV4O1xuXG4gICAgICAgICAgaWYgKGZ1bGxJbnRlcnNlY3Rpb25JbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBoaWdoZXN0SW50ZXJzZWN0aW5nSW5kZXggPSBoaWdoZXN0SW50ZXJzZWN0aW5nLmluZGV4O1xuICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGhpZ2hlc3RJbnRlcnNlY3RpbmdJbmRleCA+IGZ1bGxJbnRlcnNlY3Rpb25JbmRleCA/ICdlbmQnIDogJ3N0YXJ0JztcblxuICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICBjb250YWluZXI6IHNjcm9sbEVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50OiBoaWdoZXN0SW50ZXJzZWN0aW5nLmVsZW1lbnQsXG4gICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmUnIDogJ2Jsb2NrJyxcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyAwIDogdGhpcy5zY3JvbGxNYXJnaW4oKSxcbiAgICAgICAgICAgIHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnID8gdGhpcy5zY3JvbGxNYXJnaW4oKSA6IDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpc1NuYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoc25hcFRpbWVvdXQpO1xuXG4gICAgICAgICAgc25hcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpc1NuYXBwaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxhYmxlXG4gIFthdHRyLnJvbGVdPVwic2Nyb2xsYWJsZVJvbGUoKSA/PyB1bmRlZmluZWRcIlxuICBbZXRDdXJzb3JEcmFnU2Nyb2xsXT1cImN1cnNvckRyYWdTY3JvbGwoKVwiXG4gIFthbGxvd2VkRGlyZWN0aW9uXT1cImRpcmVjdGlvbigpXCJcbiAgKGN1cnNvckRyYWdTdGFydCk9XCJzZXRJc0N1cnNvckRyYWdnaW5nKHRydWUpXCJcbiAgKGN1cnNvckRyYWdFbmQpPVwic2V0SXNDdXJzb3JEcmFnZ2luZyhmYWxzZSlcIlxuICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyLW91dGVyXCJcbj5cbiAgPGRpdiBbbmdDbGFzc109XCJzY3JvbGxhYmxlQ2xhc3MoKVwiIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1jb250YWluZXJcIj5cbiAgICA8ZGl2ICNmaXJzdEVsZW1lbnQgY2xhc3M9XCJldC1zY3JvbGwtb2JzZXJ2ZXItZmlyc3QtZWxlbWVudFwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IC8+XG4gICAgPGRpdiAjbGFzdEVsZW1lbnQgY2xhc3M9XCJldC1zY3JvbGwtb2JzZXJ2ZXItbGFzdC1lbGVtZW50XCI+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbkBpZiAocmVuZGVyTWFza3MoKSkge1xuICA8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1tYXNrc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1zdGFydFwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1lbmRcIj48L2Rpdj5cbiAgPC9kaXY+XG59XG5cbkBpZiAocmVuZGVyQnV0dG9ucygpKSB7XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydERpcmVjdGlvbigpXCJcbiAgICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b24gZXQtc2Nyb2xsYWJsZS1idXR0b24tLXN0YXJ0XCJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgID5cbiAgICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydEVuZCgpXCJcbiAgICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b24gZXQtc2Nyb2xsYWJsZS1idXR0b24tLWVuZFwiXG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICA+XG4gICAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxufVxuIl19
|