desy-angular 14.1.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/desy-angular.mjs +1842 -1402
- package/fesm2022/desy-angular.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/lib/desy-forms/components/character-count/character-count.component.d.ts +1 -8
- package/lib/desy-forms/components/checkboxes/checkboxes-parent.component.d.ts +8 -0
- package/lib/desy-forms/components/checkboxes/checkboxes.component.d.ts +26 -0
- package/lib/desy-forms/components/date-input/date-input.component.d.ts +13 -7
- package/lib/desy-forms/components/datepicker/datepicker.component.d.ts +1 -5
- package/lib/desy-forms/components/fieldset/fieldset.component.d.ts +7 -0
- package/lib/desy-forms/components/file-upload/file-upload.component.d.ts +5 -0
- package/lib/desy-forms/components/input/input.component.d.ts +1 -4
- package/lib/desy-forms/components/input-group/input-group.component.d.ts +7 -0
- package/lib/desy-forms/components/label/label.component.d.ts +1 -2
- package/lib/desy-forms/components/radios/radios-parent.component.d.ts +8 -0
- package/lib/desy-forms/components/radios/radios.component.d.ts +26 -0
- package/lib/desy-forms/components/search-bar/search-bar.component.d.ts +1 -2
- package/lib/desy-forms/components/select/option/option.component.d.ts +1 -2
- package/lib/desy-forms/components/textarea/textarea.component.d.ts +1 -3
- package/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.d.ts +1 -1
- package/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.d.ts +3 -3
- package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +11 -7
- package/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.d.ts +1 -1
- package/lib/desy-forms/components/tree/tree-sub/tree-sub.component.d.ts +2 -2
- package/lib/desy-forms/components/tree/tree.component.d.ts +67 -7
- package/lib/desy-forms/directives/condition.directive.d.ts +5 -0
- package/lib/desy-forms/interfaces/select-item-data.d.ts +1 -1
- package/lib/desy-modals/components/dialog/dialog.component.d.ts +1 -1
- package/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.d.ts +2 -2
- package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.d.ts +7 -0
- package/lib/desy-nav/components/header/header-subnav/header-subnav.component.d.ts +1 -1
- package/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.d.ts +2 -2
- package/lib/desy-nav/components/menubar/menubar.component.d.ts +7 -0
- package/lib/desy-nav/interfaces/header-dropdown-data.d.ts +1 -1
- package/lib/desy-nav/interfaces/header-mobile-text-data.d.ts +1 -1
- package/lib/desy-nav/interfaces/header-subnav-data.d.ts +1 -1
- package/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.d.ts +2 -2
- package/lib/desy-nav/interfaces/nav-item-event.data.d.ts +1 -1
- package/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.d.ts +1 -1
- package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +56 -1
- package/lib/desy-tables/directives/cell.directive.d.ts +3 -0
- package/lib/desy-tables/directives/row.directive.d.ts +7 -0
- package/lib/desy-tables/interfaces/head-cell-data.d.ts +1 -1
- package/lib/desy-views/components/alert/alert.component.d.ts +1 -1
- package/lib/shared/components/accessibility/accessibility.component.d.ts +3 -0
- package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +8 -0
- package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +6 -0
- package/lib/shared/components/content-base/content-base.component.d.ts +3 -0
- package/lib/shared/components/text-or-html-required/text-or-html-required.component.d.ts +4 -0
- package/lib/shared/decorators/desy-content-child.decorator.d.ts +11 -0
- package/lib/shared/decorators/desy-on-input-change.decorator.d.ts +4 -0
- package/lib/shared/directives/content-change.directive.d.ts +4 -0
- package/lib/shared/directives/custom-inner-content.directive.d.ts +6 -0
- package/lib/shared/pipes/external-href.pipe.d.ts +4 -0
- package/lib/shared/utils/search-utils.d.ts +10 -0
- package/lib/shared/utils/string-utils.d.ts +7 -0
- package/package.json +9 -11
- package/esm2022/desy-angular.mjs +0 -2
- package/esm2022/lib/desy-angular.module.mjs +0 -76
- package/esm2022/lib/desy-buttons/components/button/button.component.mjs +0 -118
- package/esm2022/lib/desy-buttons/components/button-loader/button-loader.component.mjs +0 -66
- package/esm2022/lib/desy-buttons/components/dropdown/dropdown.component.mjs +0 -158
- package/esm2022/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +0 -39
- package/esm2022/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.mjs +0 -14
- package/esm2022/lib/desy-buttons/components/listbox/listbox.component.mjs +0 -335
- package/esm2022/lib/desy-buttons/components/pill/pill.component.mjs +0 -83
- package/esm2022/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.mjs +0 -17
- package/esm2022/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.mjs +0 -17
- package/esm2022/lib/desy-buttons/components/toggle/toggle.component.mjs +0 -62
- package/esm2022/lib/desy-buttons/desy-buttons.module.mjs +0 -81
- package/esm2022/lib/desy-buttons/interfaces/listbox-item-data.mjs +0 -2
- package/esm2022/lib/desy-buttons/interfaces/listbox-label-data.mjs +0 -2
- package/esm2022/lib/desy-commons/components/content/content.component.mjs +0 -14
- package/esm2022/lib/desy-commons/components/description/description.component.mjs +0 -19
- package/esm2022/lib/desy-commons/components/divider/divider.component.mjs +0 -16
- package/esm2022/lib/desy-commons/components/icon/icon.component.mjs +0 -16
- package/esm2022/lib/desy-commons/components/title/title.component.mjs +0 -17
- package/esm2022/lib/desy-commons/desy-commons.module.mjs +0 -52
- package/esm2022/lib/desy-commons/interfaces/content-data.mjs +0 -2
- package/esm2022/lib/desy-commons/interfaces/description-data.mjs +0 -2
- package/esm2022/lib/desy-commons/interfaces/divider-data.mjs +0 -2
- package/esm2022/lib/desy-commons/interfaces/icon-data.mjs +0 -2
- package/esm2022/lib/desy-commons/interfaces/index.mjs +0 -6
- package/esm2022/lib/desy-commons/interfaces/title-data.mjs +0 -2
- package/esm2022/lib/desy-forms/components/character-count/character-count.component.mjs +0 -156
- package/esm2022/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +0 -189
- package/esm2022/lib/desy-forms/components/checkboxes/checkboxes-parent.component.mjs +0 -15
- package/esm2022/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +0 -269
- package/esm2022/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.mjs +0 -55
- package/esm2022/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.mjs +0 -19
- package/esm2022/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.mjs +0 -42
- package/esm2022/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.mjs +0 -55
- package/esm2022/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.mjs +0 -51
- package/esm2022/lib/desy-forms/components/date-input/date-input.component.mjs +0 -294
- package/esm2022/lib/desy-forms/components/datepicker/datepicker.component.mjs +0 -190
- package/esm2022/lib/desy-forms/components/datepicker/datepicker.pipe.mjs +0 -34
- package/esm2022/lib/desy-forms/components/error-message/error-message.component.mjs +0 -32
- package/esm2022/lib/desy-forms/components/fieldset/fieldset.component.mjs +0 -59
- package/esm2022/lib/desy-forms/components/fieldset/legend/legend.component.mjs +0 -34
- package/esm2022/lib/desy-forms/components/file-upload/file-upload.component.mjs +0 -78
- package/esm2022/lib/desy-forms/components/form-field/form-field.component.mjs +0 -120
- package/esm2022/lib/desy-forms/components/hint/hint.component.mjs +0 -30
- package/esm2022/lib/desy-forms/components/input/input.component.mjs +0 -110
- package/esm2022/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.mjs +0 -20
- package/esm2022/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.mjs +0 -59
- package/esm2022/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.mjs +0 -42
- package/esm2022/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.mjs +0 -51
- package/esm2022/lib/desy-forms/components/input-group/input-group.component.mjs +0 -229
- package/esm2022/lib/desy-forms/components/label/label.component.mjs +0 -39
- package/esm2022/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +0 -136
- package/esm2022/lib/desy-forms/components/radios/radios-parent.component.mjs +0 -15
- package/esm2022/lib/desy-forms/components/radios/radios.component.mjs +0 -282
- package/esm2022/lib/desy-forms/components/search-bar/search-bar.component.mjs +0 -65
- package/esm2022/lib/desy-forms/components/select/option/option.component.mjs +0 -22
- package/esm2022/lib/desy-forms/components/select/option-group/option-group.component.mjs +0 -18
- package/esm2022/lib/desy-forms/components/select/select-item/select-item.component.mjs +0 -14
- package/esm2022/lib/desy-forms/components/select/select.component.mjs +0 -94
- package/esm2022/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.mjs +0 -12
- package/esm2022/lib/desy-forms/components/textarea/textarea.component.mjs +0 -86
- package/esm2022/lib/desy-forms/components/tree/interfaces/itree-item.mjs +0 -3
- package/esm2022/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.mjs +0 -2
- package/esm2022/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +0 -174
- package/esm2022/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +0 -378
- package/esm2022/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.mjs +0 -25
- package/esm2022/lib/desy-forms/components/tree/tree-sub/tree-sub.component.mjs +0 -16
- package/esm2022/lib/desy-forms/components/tree/tree.component.mjs +0 -359
- package/esm2022/lib/desy-forms/desy-forms.module.mjs +0 -223
- package/esm2022/lib/desy-forms/directives/condition.directive.mjs +0 -34
- package/esm2022/lib/desy-forms/interfaces/error-message-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/fieldset-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/hint-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/index.mjs +0 -13
- package/esm2022/lib/desy-forms/interfaces/item-checkbox-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-date-input-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-divider-date-input-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-divider-input-group-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-input-group-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-radio-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/item-radio-with-template-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/label-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/legend-data.mjs +0 -2
- package/esm2022/lib/desy-forms/interfaces/select-item-data.mjs +0 -2
- package/esm2022/lib/desy-modals/components/dialog/dialog.component.mjs +0 -151
- package/esm2022/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.mjs +0 -25
- package/esm2022/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.mjs +0 -23
- package/esm2022/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.mjs +0 -23
- package/esm2022/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.mjs +0 -23
- package/esm2022/lib/desy-modals/components/modal/modal.component.mjs +0 -183
- package/esm2022/lib/desy-modals/desy-modals.module.mjs +0 -61
- package/esm2022/lib/desy-modals/interfaces/dialog-options.mjs +0 -2
- package/esm2022/lib/desy-modals/interfaces/index.mjs +0 -7
- package/esm2022/lib/desy-modals/interfaces/modal-button-data.mjs +0 -2
- package/esm2022/lib/desy-modals/interfaces/modal-data.mjs +0 -2
- package/esm2022/lib/desy-modals/interfaces/modal-icon-data.mjs +0 -2
- package/esm2022/lib/desy-modals/interfaces/modal-options.mjs +0 -2
- package/esm2022/lib/desy-modals/interfaces/open-dialog-result.mjs +0 -2
- package/esm2022/lib/desy-modals/services/dialog.service.mjs +0 -114
- package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.mjs +0 -16
- package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +0 -53
- package/esm2022/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.mjs +0 -19
- package/esm2022/lib/desy-nav/components/error-summary/error-summary.component.mjs +0 -67
- package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.mjs +0 -25
- package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta.component.mjs +0 -31
- package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.mjs +0 -25
- package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +0 -21
- package/esm2022/lib/desy-nav/components/footer/footer.component.mjs +0 -89
- package/esm2022/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.mjs +0 -15
- package/esm2022/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.mjs +0 -46
- package/esm2022/lib/desy-nav/components/header/header-mobileText/header-mobile-text.component.mjs +0 -336
- package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.mjs +0 -31
- package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +0 -36
- package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.mjs +0 -20
- package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.mjs +0 -15
- package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.mjs +0 -93
- package/esm2022/lib/desy-nav/components/header/header-subnav/header-subnav.component.mjs +0 -41
- package/esm2022/lib/desy-nav/components/header/header.component.mjs +0 -119
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-custom-navigation/header-custom-navigation.component.mjs +0 -14
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.mjs +0 -38
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-logo/header-advanced-logo.component.mjs +0 -37
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-sub/header-advanced-sub.component.mjs +0 -42
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-subtitle/header-advanced-subtitle.component.mjs +0 -14
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-super/header-advanced-super.component.mjs +0 -42
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title/header-advanced-title.component.mjs +0 -19
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title-container/header-advanced-title-container.component.mjs +0 -38
- package/esm2022/lib/desy-nav/components/header-advanced/header-advanced.component.mjs +0 -54
- package/esm2022/lib/desy-nav/components/header-mini/header-mini.component.mjs +0 -32
- package/esm2022/lib/desy-nav/components/links-list/links-list-icon-right/links-list-icon-right.component.mjs +0 -16
- package/esm2022/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.mjs +0 -46
- package/esm2022/lib/desy-nav/components/links-list/links-list-item-sub/links-list-item-sub.component.mjs +0 -14
- package/esm2022/lib/desy-nav/components/links-list/links-list.component.mjs +0 -44
- package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.mjs +0 -42
- package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +0 -76
- package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +0 -55
- package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.mjs +0 -49
- package/esm2022/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +0 -854
- package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +0 -44
- package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.mjs +0 -18
- package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.mjs +0 -34
- package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +0 -102
- package/esm2022/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +0 -51
- package/esm2022/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.mjs +0 -14
- package/esm2022/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.mjs +0 -36
- package/esm2022/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.mjs +0 -27
- package/esm2022/lib/desy-nav/components/menubar/directives/menubaritem.directive.mjs +0 -45
- package/esm2022/lib/desy-nav/components/menubar/menubar.component.mjs +0 -962
- package/esm2022/lib/desy-nav/components/nav/nav-item/nav-item.component.mjs +0 -43
- package/esm2022/lib/desy-nav/components/nav/nav.component.mjs +0 -115
- package/esm2022/lib/desy-nav/components/notification/notification-item/notification-item.component.mjs +0 -25
- package/esm2022/lib/desy-nav/components/notification/notification.component.mjs +0 -135
- package/esm2022/lib/desy-nav/components/skip-link/skip-link.component.mjs +0 -62
- package/esm2022/lib/desy-nav/desy-nav.module.mjs +0 -301
- package/esm2022/lib/desy-nav/directives/dynamic-heading.directive.mjs +0 -40
- package/esm2022/lib/desy-nav/interfaces/breadcrumbs.data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/error-summary-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/footer-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/footer-logo.mjs +0 -10
- package/esm2022/lib/desy-nav/interfaces/header-advanced-logo.mjs +0 -7
- package/esm2022/lib/desy-nav/interfaces/header-dropdown-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-mobile-text-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-navigation-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-navigation-item-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-offcanvas-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-skiplink-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/header-subnav-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/index.mjs +0 -21
- package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-event-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-navigation.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-vertical-items-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-items-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menubar-item-sub.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/menubar-item.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/nav-item-event.data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/nav-item.data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/notification-items-data.mjs +0 -2
- package/esm2022/lib/desy-nav/interfaces/notification-options.mjs +0 -2
- package/esm2022/lib/desy-pagination/components/pagination/pagination.component.mjs +0 -237
- package/esm2022/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.mjs +0 -19
- package/esm2022/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.mjs +0 -17
- package/esm2022/lib/desy-pagination/desy-pagination.module.mjs +0 -54
- package/esm2022/lib/desy-pagination/interfaces/pagination-item.data.mjs +0 -2
- package/esm2022/lib/desy-tables/components/table/components/table-caption.component.mjs +0 -17
- package/esm2022/lib/desy-tables/components/table/components/table-cell.component.mjs +0 -23
- package/esm2022/lib/desy-tables/components/table/components/table-footer.component.mjs +0 -18
- package/esm2022/lib/desy-tables/components/table/components/table-header.component.mjs +0 -18
- package/esm2022/lib/desy-tables/components/table/components/table-row.component.mjs +0 -18
- package/esm2022/lib/desy-tables/components/table/table.component.mjs +0 -120
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer-cell.component.mjs +0 -23
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer.component.mjs +0 -27
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.mjs +0 -56
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.mjs +0 -18
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.mjs +0 -23
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.mjs +0 -27
- package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.mjs +0 -28
- package/esm2022/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +0 -494
- package/esm2022/lib/desy-tables/desy-tables.module.mjs +0 -117
- package/esm2022/lib/desy-tables/directives/cell.directive.mjs +0 -25
- package/esm2022/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +0 -86
- package/esm2022/lib/desy-tables/directives/row.directive.mjs +0 -22
- package/esm2022/lib/desy-tables/interfaces/cell-data.mjs +0 -2
- package/esm2022/lib/desy-tables/interfaces/head-cell-data.mjs +0 -7
- package/esm2022/lib/desy-tables/interfaces/index.mjs +0 -5
- package/esm2022/lib/desy-tables/interfaces/recalculate-table-params.mjs +0 -2
- package/esm2022/lib/desy-tables/interfaces/row-data.mjs +0 -2
- package/esm2022/lib/desy-tables/interfaces/wrapper-data.mjs +0 -2
- package/esm2022/lib/desy-views/components/accordion/accordion-header/accordion-header.component.mjs +0 -17
- package/esm2022/lib/desy-views/components/accordion/accordion-item/accordion-item.component.mjs +0 -61
- package/esm2022/lib/desy-views/components/accordion/accordion.component.mjs +0 -447
- package/esm2022/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.mjs +0 -41
- package/esm2022/lib/desy-views/components/accordion-history/accordion-history.component.mjs +0 -20
- package/esm2022/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.mjs +0 -17
- package/esm2022/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.mjs +0 -17
- package/esm2022/lib/desy-views/components/alert/alert.component.mjs +0 -82
- package/esm2022/lib/desy-views/components/card/card-sectors/card-left.component.mjs +0 -21
- package/esm2022/lib/desy-views/components/card/card-sectors/card-right.component.mjs +0 -21
- package/esm2022/lib/desy-views/components/card/card-sectors/card-sub.component.mjs +0 -21
- package/esm2022/lib/desy-views/components/card/card-sectors/card-super.component.mjs +0 -21
- package/esm2022/lib/desy-views/components/card/card.component.mjs +0 -48
- package/esm2022/lib/desy-views/components/collapsible/collapsible.component.mjs +0 -66
- package/esm2022/lib/desy-views/components/description-list/definition/definition.component.mjs +0 -19
- package/esm2022/lib/desy-views/components/description-list/description-item/description-item.component.mjs +0 -36
- package/esm2022/lib/desy-views/components/description-list/description-list.component.mjs +0 -29
- package/esm2022/lib/desy-views/components/description-list/term/term.component.mjs +0 -19
- package/esm2022/lib/desy-views/components/details/details.component.mjs +0 -43
- package/esm2022/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.mjs +0 -17
- package/esm2022/lib/desy-views/components/item/item-content-right/item-content-right.component.mjs +0 -15
- package/esm2022/lib/desy-views/components/item/item-item/item-item.component.mjs +0 -15
- package/esm2022/lib/desy-views/components/item/item.component.mjs +0 -122
- package/esm2022/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.mjs +0 -12
- package/esm2022/lib/desy-views/components/media-object/media-object.component.mjs +0 -369
- package/esm2022/lib/desy-views/components/status/status.component.mjs +0 -366
- package/esm2022/lib/desy-views/components/status-item/status-item.component.mjs +0 -401
- package/esm2022/lib/desy-views/components/tabs/panel/panel.component.mjs +0 -19
- package/esm2022/lib/desy-views/components/tabs/tab-item/tab-item.component.mjs +0 -41
- package/esm2022/lib/desy-views/components/tabs/tabs.component.mjs +0 -445
- package/esm2022/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.mjs +0 -12
- package/esm2022/lib/desy-views/components/tooltip/tooltip.component.mjs +0 -444
- package/esm2022/lib/desy-views/desy-views.module.mjs +0 -195
- package/esm2022/lib/desy-views/interfaces/accordion-header.data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/accordion-item.data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/alert-options.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/description-item.data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/index.mjs +0 -11
- package/esm2022/lib/desy-views/interfaces/open-alert-result.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/status-data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/status-icon-data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/status-item-title-data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/tabs-items-data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/tabs-panel-data.mjs +0 -2
- package/esm2022/lib/desy-views/interfaces/term-definition.data.mjs +0 -2
- package/esm2022/lib/desy-views/services/alert.service.mjs +0 -88
- package/esm2022/lib/shared/components/accessibility/accessibility-attributes.mjs +0 -78
- package/esm2022/lib/shared/components/accessibility/accessibility.component.mjs +0 -164
- package/esm2022/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.mjs +0 -168
- package/esm2022/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.mjs +0 -165
- package/esm2022/lib/shared/components/content-base/content-base.component.mjs +0 -21
- package/esm2022/lib/shared/components/index.mjs +0 -7
- package/esm2022/lib/shared/components/spinner/spinner.component.mjs +0 -329
- package/esm2022/lib/shared/components/text-or-html-required/text-or-html-required.component.mjs +0 -18
- package/esm2022/lib/shared/decorators/desy-content-child.decorator.mjs +0 -30
- package/esm2022/lib/shared/decorators/desy-on-input-change.decorator.mjs +0 -15
- package/esm2022/lib/shared/directives/accessibility-directive.mjs +0 -52
- package/esm2022/lib/shared/directives/attribute-change.directive.mjs +0 -50
- package/esm2022/lib/shared/directives/click-outside.directive.mjs +0 -40
- package/esm2022/lib/shared/directives/content-change.directive.mjs +0 -41
- package/esm2022/lib/shared/directives/custom-inner-content.directive.mjs +0 -61
- package/esm2022/lib/shared/directives/inner-content.directive.mjs +0 -37
- package/esm2022/lib/shared/interfaces/accessibility-data.mjs +0 -2
- package/esm2022/lib/shared/pipes/external-href.pipe.mjs +0 -28
- package/esm2022/lib/shared/pipes/inner-html.pipe.mjs +0 -21
- package/esm2022/lib/shared/pipes/make-html-list.pipe.mjs +0 -20
- package/esm2022/lib/shared/shared.module.mjs +0 -88
- package/esm2022/lib/shared/sharedExternal.module.mjs +0 -24
- package/esm2022/lib/shared/utils/focus-utils.mjs +0 -51
- package/esm2022/lib/shared/utils/search-utils.mjs +0 -70
- package/esm2022/lib/shared/utils/string-utils.mjs +0 -11
- package/esm2022/public-api.mjs +0 -225
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren } from '@angular/core';
|
|
3
|
-
import { CheckboxItemComponent } from '../../../desy-forms/components/checkboxes/checkbox-item/checkbox-item.component';
|
|
4
|
-
import { AccessibilityComponent } from '../../../shared/components';
|
|
5
|
-
import { DesyContentChild } from '../../../shared/decorators/desy-content-child.decorator';
|
|
6
|
-
import { SearchUtils } from '../../../shared/utils/search-utils';
|
|
7
|
-
import { RowDirective } from '../../directives/row.directive';
|
|
8
|
-
import { OrderBy } from '../../interfaces';
|
|
9
|
-
import { TableCaptionComponent } from '../table/components/table-caption.component';
|
|
10
|
-
import { TableAdvancedFooterComponent } from './components/table-advanced-footer.component';
|
|
11
|
-
import { TableAdvancedHeaderComponent } from './components/table-advanced-header.component';
|
|
12
|
-
import { TableAdvancedRowComponent } from './components/table-advanced-row.component';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/common";
|
|
15
|
-
import * as i2 from "@angular/forms";
|
|
16
|
-
import * as i3 from "../../../shared/directives/custom-inner-content.directive";
|
|
17
|
-
import * as i4 from "../../../shared/directives/accessibility-directive";
|
|
18
|
-
import * as i5 from "../../../desy-forms/components/select/select.component";
|
|
19
|
-
import * as i6 from "../../../desy-forms/components/checkboxes/checkboxes.component";
|
|
20
|
-
import * as i7 from "../../../desy-forms/components/checkboxes/checkbox-item/checkbox-item.component";
|
|
21
|
-
import * as i8 from "../../../desy-forms/components/search-bar/search-bar.component";
|
|
22
|
-
import * as i9 from "../../directives/focus-clicked-cell.directive";
|
|
23
|
-
import * as i10 from "../../directives/cell.directive";
|
|
24
|
-
import * as i11 from "../../directives/row.directive";
|
|
25
|
-
import * as i12 from "../../../shared/pipes/make-html-list.pipe";
|
|
26
|
-
export class TableAdvancedComponent extends AccessibilityComponent {
|
|
27
|
-
set rows(rows) {
|
|
28
|
-
this._rows = rows;
|
|
29
|
-
this.recalculateVisibleElements();
|
|
30
|
-
}
|
|
31
|
-
get rows() {
|
|
32
|
-
return this._rows;
|
|
33
|
-
}
|
|
34
|
-
constructor(el, changeDetector) {
|
|
35
|
-
super();
|
|
36
|
-
this.el = el;
|
|
37
|
-
this.changeDetector = changeDetector;
|
|
38
|
-
this.selectAllPages = true;
|
|
39
|
-
this.totalItems = 0;
|
|
40
|
-
this.usePagination = false;
|
|
41
|
-
this.rowsCheckedInside = {};
|
|
42
|
-
this.numberOfSelectedRows = 0;
|
|
43
|
-
this.rowsChange = new EventEmitter();
|
|
44
|
-
this.rowsChecked = new EventEmitter();
|
|
45
|
-
this.allRowsChecked = new EventEmitter();
|
|
46
|
-
this.recalculateTable = new EventEmitter();
|
|
47
|
-
this.filterBy = new EventEmitter();
|
|
48
|
-
this.selectedBy = new EventEmitter();
|
|
49
|
-
this.sortBy = new EventEmitter();
|
|
50
|
-
this.rowsUnChecked = new EventEmitter();
|
|
51
|
-
this.orderByType = OrderBy;
|
|
52
|
-
this.unselectedRows = new Set();
|
|
53
|
-
this.selectedAllRowsChecked = false;
|
|
54
|
-
}
|
|
55
|
-
ngAfterContentInit() {
|
|
56
|
-
this.rowsSubscription = this.rowComponentList.changes.subscribe(() => this.recalculateVisibleElements());
|
|
57
|
-
}
|
|
58
|
-
ngOnDestroy() {
|
|
59
|
-
if (this.rowsSubscription) {
|
|
60
|
-
this.rowsSubscription.unsubscribe();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
ngAfterViewInit() {
|
|
64
|
-
const elemntsFocus = this.el.nativeElement.querySelector('[tabindex]');
|
|
65
|
-
if (elemntsFocus) {
|
|
66
|
-
elemntsFocus.setAttribute('tabindex', '0');
|
|
67
|
-
}
|
|
68
|
-
this.recalculateVisibleElements();
|
|
69
|
-
}
|
|
70
|
-
recalculateVisibleElements() {
|
|
71
|
-
const recalculateParams = this.buildRecalculateParams();
|
|
72
|
-
if (this.recalculateTable.observers.length > 0) {
|
|
73
|
-
this.recalculateTable.emit(recalculateParams);
|
|
74
|
-
this.changeDetector.markForCheck();
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
this.visibleRows = this.getRows();
|
|
78
|
-
this.changeDetector.detectChanges();
|
|
79
|
-
if (!this.usePagination) {
|
|
80
|
-
let rowData = this.filterRows(recalculateParams, this.rowData.toArray());
|
|
81
|
-
rowData = this.sortRows(recalculateParams, rowData);
|
|
82
|
-
this.visibleRows = rowData.map(r => r.desyRow);
|
|
83
|
-
this.changeDetector.detectChanges();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (this.checkboxComponent && !this.selectAllPages && this.usePagination) {
|
|
87
|
-
const allChecked = this.getRows().every(row => this.rowsCheckedInside && this.rowsCheckedInside[row.id]);
|
|
88
|
-
const anyChecked = this.getRows().some(row => this.rowsCheckedInside && this.rowsCheckedInside[row.id]);
|
|
89
|
-
this.checkboxComponent.indeterminateChecked = !allChecked && anyChecked;
|
|
90
|
-
this.checkboxComponent.checked = allChecked;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
buildRecalculateParams() {
|
|
94
|
-
const params = {
|
|
95
|
-
filters: [],
|
|
96
|
-
sort: null
|
|
97
|
-
};
|
|
98
|
-
const head = this.getHeaderCells();
|
|
99
|
-
if (head) {
|
|
100
|
-
head.forEach((headerCell, headerCellIndex) => {
|
|
101
|
-
if (headerCell.hasFilter && headerCell.activeFilter) {
|
|
102
|
-
params.filters.push({ columnIndex: headerCellIndex, filterText: headerCell.valueFilter, identifier: headerCell.identifier });
|
|
103
|
-
}
|
|
104
|
-
if (headerCell.hasSelect && headerCell.activeSelect) {
|
|
105
|
-
params.filters.push({ columnIndex: headerCellIndex, filterText: headerCell.valueSelect, identifier: headerCell.identifier });
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
const orderByColumnIndex = head.findIndex(cell => cell.orderBy && cell.orderBy !== OrderBy.none);
|
|
109
|
-
params.sort = (orderByColumnIndex >= 0) ? { columnIndex: orderByColumnIndex, order: head[orderByColumnIndex].orderBy } : null;
|
|
110
|
-
}
|
|
111
|
-
return params;
|
|
112
|
-
}
|
|
113
|
-
hasFilters() {
|
|
114
|
-
const head = this.getHeaderCells();
|
|
115
|
-
return head ? head.findIndex(cell => (cell.hasFilter) || (cell.hasSelect)) >= 0 : false;
|
|
116
|
-
}
|
|
117
|
-
getHeaderCells() {
|
|
118
|
-
return this.headerComponent && this.headerComponent.cells.length > 0 ? this.headerComponent.cells.toArray() : this.head;
|
|
119
|
-
}
|
|
120
|
-
getFooterCells() {
|
|
121
|
-
return this.footerComponent && this.footerComponent.length > 0 ? this.footerComponent.toArray() : this.foot;
|
|
122
|
-
}
|
|
123
|
-
getRows() {
|
|
124
|
-
let rows = [];
|
|
125
|
-
if (this.rowComponentList?.length > 0) {
|
|
126
|
-
rows = this.rowComponentList.toArray();
|
|
127
|
-
}
|
|
128
|
-
else if (this.rows) {
|
|
129
|
-
rows = this.rows;
|
|
130
|
-
}
|
|
131
|
-
return rows;
|
|
132
|
-
}
|
|
133
|
-
getVisibleRows() {
|
|
134
|
-
let rows = this.recalculateTable.observers.length > 0 ? this.getRows() : this.visibleRows;
|
|
135
|
-
if (this.selectAllPages && this.checkboxComponent && this.selectedAllRowsChecked && (this.checkboxComponent.checked || this.unselectedRows.size > 0)) {
|
|
136
|
-
rows.forEach(row => { row.checked = true; });
|
|
137
|
-
}
|
|
138
|
-
for (const id in this.rowsCheckedInside) {
|
|
139
|
-
const row = rows.find(r => r.id == String(id));
|
|
140
|
-
if (row) {
|
|
141
|
-
row.checked = this.rowsCheckedInside[id];
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return rows;
|
|
145
|
-
}
|
|
146
|
-
getIdPrefix() {
|
|
147
|
-
return this.idPrefix ? this.idPrefix : 'id-table-row';
|
|
148
|
-
}
|
|
149
|
-
getIdHeader(index) {
|
|
150
|
-
return this.getIdPrefix() + '-header-' + index;
|
|
151
|
-
}
|
|
152
|
-
getIdRowCheckbox(index) {
|
|
153
|
-
return this.getIdPrefix() + '-checkbox-' + index;
|
|
154
|
-
}
|
|
155
|
-
getIdHeaderFilter(index) {
|
|
156
|
-
return this.getIdPrefix() + '-header-filter-' + index;
|
|
157
|
-
}
|
|
158
|
-
getIdHeaderSelect(index) {
|
|
159
|
-
return this.getIdPrefix() + '-header-select-' + index;
|
|
160
|
-
}
|
|
161
|
-
getCaptionClass() {
|
|
162
|
-
return this.captionComponent ? this.captionComponent.classes : this.captionClasses;
|
|
163
|
-
}
|
|
164
|
-
getStringOrderBy(orderBy) {
|
|
165
|
-
if (orderBy === OrderBy.asc) {
|
|
166
|
-
return 'ascending';
|
|
167
|
-
}
|
|
168
|
-
else if (orderBy === OrderBy.desc) {
|
|
169
|
-
return 'descending';
|
|
170
|
-
}
|
|
171
|
-
else if (orderBy === OrderBy.none) {
|
|
172
|
-
return 'none';
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
getSelectForItem(item) {
|
|
176
|
-
return item.selectComponent ? item.selectComponent : null;
|
|
177
|
-
}
|
|
178
|
-
getItemSelectOptions(item) {
|
|
179
|
-
return item.selectItemComponentList && item.selectItemComponentList.length > 0 ?
|
|
180
|
-
item.selectItemComponentList.toArray() : item.items;
|
|
181
|
-
}
|
|
182
|
-
getContentComponent(item) {
|
|
183
|
-
return item.contentComponent ? item.contentComponent : null;
|
|
184
|
-
}
|
|
185
|
-
handleCheckboxChange(row) {
|
|
186
|
-
if (row instanceof TableAdvancedRowComponent) {
|
|
187
|
-
row.checkedChange.emit(row.checked);
|
|
188
|
-
}
|
|
189
|
-
this.notifyCheckedChange();
|
|
190
|
-
}
|
|
191
|
-
uncheckAll() {
|
|
192
|
-
this.rowsCheckedInside = {};
|
|
193
|
-
this.unselectedRows.clear();
|
|
194
|
-
this.selectedAllRowsChecked = false;
|
|
195
|
-
this.numberOfSelectedRows = 0;
|
|
196
|
-
this.getRows().forEach(r => {
|
|
197
|
-
const mustEmit = r.checked && r instanceof TableAdvancedRowComponent;
|
|
198
|
-
r.checked = false;
|
|
199
|
-
if (mustEmit) {
|
|
200
|
-
r.checkedChange.emit(r.checked);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
this.notifyCheckedChange();
|
|
204
|
-
}
|
|
205
|
-
notifyCheckedChange() {
|
|
206
|
-
if (this.rowComponentList.length === 0) {
|
|
207
|
-
this.rowsChange.emit(this.rows);
|
|
208
|
-
}
|
|
209
|
-
const rowChecks = {};
|
|
210
|
-
this.getRows().forEach(r => {
|
|
211
|
-
rowChecks[r.id] = !!r.checked;
|
|
212
|
-
if (this.selectAllPages && this.selectedAllRowsChecked) {
|
|
213
|
-
if (r.checked) {
|
|
214
|
-
this.unselectedRows.delete(r.id);
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
this.unselectedRows.add(r.id);
|
|
218
|
-
}
|
|
219
|
-
this.numberOfSelectedRows = this.totalItems - this.unselectedRows.size;
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
this.rowsCheckedInside = { ...this.rowsCheckedInside, ...rowChecks };
|
|
223
|
-
this.rowsChecked.emit(this.rowsCheckedInside);
|
|
224
|
-
Promise.resolve().then(() => {
|
|
225
|
-
if (this.checkboxComponent) {
|
|
226
|
-
const visibleRows = this.getVisibleRows();
|
|
227
|
-
const anyChecked = this.selectAllPages && this.totalItems && this.usePagination ? this.areAnyRowsChecked() : visibleRows.some((r) => r.checked);
|
|
228
|
-
const allChecked = this.selectAllPages && this.totalItems && this.usePagination ? this.areAllRowsChecked() : visibleRows.every((r) => r.checked);
|
|
229
|
-
this.checkboxComponent.indeterminateChecked = ((!this.selectedAllRowsChecked && this.selectAllPages && this.usePagination && anyChecked && !allChecked) || (anyChecked && !allChecked) || this.unselectedRows.size > 0 && this.unselectedRows.size < this.totalItems);
|
|
230
|
-
this.checkboxComponent.checked = (allChecked && this.unselectedRows.size == 0 && visibleRows.length > 0);
|
|
231
|
-
const { checked, indeterminateChecked } = this.checkboxComponent;
|
|
232
|
-
if (!this.selectedAllRowsChecked && checked)
|
|
233
|
-
this.selectedAllRowsChecked = true;
|
|
234
|
-
else if (this.selectedAllRowsChecked && !checked && !indeterminateChecked) {
|
|
235
|
-
this.selectedAllRowsChecked = false;
|
|
236
|
-
this.unselectedRows.clear();
|
|
237
|
-
}
|
|
238
|
-
if (checked) {
|
|
239
|
-
this.allRowsChecked.emit(true);
|
|
240
|
-
}
|
|
241
|
-
else if (indeterminateChecked || !checked) {
|
|
242
|
-
this.allRowsChecked.emit(false);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
if (this.selectAllPages) {
|
|
246
|
-
this.rowsUnChecked.emit(Array.from(this.unselectedRows));
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
areAllRowsChecked() {
|
|
251
|
-
const items = Object.keys(this.rowsCheckedInside);
|
|
252
|
-
if (items.length !== this.totalItems && this.numberOfSelectedRows !== this.totalItems) {
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
255
|
-
const allTrue = items.every(key => this.rowsCheckedInside[key]);
|
|
256
|
-
return allTrue;
|
|
257
|
-
}
|
|
258
|
-
areAnyRowsChecked() {
|
|
259
|
-
const items = Object.keys(this.rowsCheckedInside);
|
|
260
|
-
if (items.length === 0) {
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
const anyTrue = items.some(key => this.rowsCheckedInside[key]);
|
|
264
|
-
return anyTrue;
|
|
265
|
-
}
|
|
266
|
-
handleInputSearch(item) {
|
|
267
|
-
if (item.hasFilter) {
|
|
268
|
-
item.activeFilter = !!item.valueFilter;
|
|
269
|
-
this.uncheckAll();
|
|
270
|
-
}
|
|
271
|
-
if (item.hasSelect) {
|
|
272
|
-
item.activeSelect = !!item.valueSelect;
|
|
273
|
-
this.uncheckAll();
|
|
274
|
-
}
|
|
275
|
-
this.recalculateVisibleElements();
|
|
276
|
-
}
|
|
277
|
-
handleButtonSearch(item) {
|
|
278
|
-
if (item.hasFilter) {
|
|
279
|
-
item.activeFilter = !!item.valueFilter;
|
|
280
|
-
this.filterBy.emit({ id: item.identifier, value: item.valueFilter });
|
|
281
|
-
this.uncheckAll();
|
|
282
|
-
}
|
|
283
|
-
if (item.hasSelect) {
|
|
284
|
-
item.activeSelect = !!item.valueSelect;
|
|
285
|
-
this.selectedBy.emit(item.valueSelect);
|
|
286
|
-
this.uncheckAll();
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
filterRows(recalculateParams, rows) {
|
|
290
|
-
let filteredRows = rows;
|
|
291
|
-
recalculateParams.filters.forEach(filter => {
|
|
292
|
-
filteredRows = filteredRows.filter(row => SearchUtils.containsAnyWordFrom(row.getCell(filter.columnIndex).getContent(), filter.filterText));
|
|
293
|
-
});
|
|
294
|
-
return filteredRows;
|
|
295
|
-
}
|
|
296
|
-
handleSortByColumn(index, event) {
|
|
297
|
-
const head = this.getHeaderCells();
|
|
298
|
-
let order = OrderBy.asc;
|
|
299
|
-
if (head) {
|
|
300
|
-
head.forEach((cell, cellIndex) => {
|
|
301
|
-
if (cell.orderBy) {
|
|
302
|
-
if (cellIndex === index) {
|
|
303
|
-
order = this.getNextDirection(cell);
|
|
304
|
-
}
|
|
305
|
-
cell.orderBy = cellIndex === index ? this.getNextDirection(cell) : OrderBy.none;
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
if (this.usePagination) {
|
|
310
|
-
this.sortBy.emit({ id: index, order: order });
|
|
311
|
-
this.uncheckAll();
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
this.recalculateVisibleElements();
|
|
315
|
-
}
|
|
316
|
-
event?.preventDefault();
|
|
317
|
-
}
|
|
318
|
-
sortRows(recalculateParams, rows) {
|
|
319
|
-
let sortedRows = rows;
|
|
320
|
-
if (recalculateParams.sort) {
|
|
321
|
-
const columnIndex = recalculateParams.sort.columnIndex;
|
|
322
|
-
const isAsc = recalculateParams.sort.order === OrderBy.asc;
|
|
323
|
-
sortedRows = rows.sort((a, b) => this.compareCellContent(a.getCell(columnIndex), b.getCell(columnIndex), isAsc));
|
|
324
|
-
}
|
|
325
|
-
return sortedRows;
|
|
326
|
-
}
|
|
327
|
-
compareCellContent(a, b, isAsc) {
|
|
328
|
-
let result;
|
|
329
|
-
const aComparable = this.cleanCurrency(a.getContent()).trim();
|
|
330
|
-
const bComparable = this.cleanCurrency(b.getContent()).trim();
|
|
331
|
-
const numberRegex = /^-?\d+(\.|,)?\d*$/;
|
|
332
|
-
const dateRegex = /^(\d{2})(\/|-)(\d{2})(\/|-)(\d{4})( (\d{2}):(\d{2})(:(\d{2}))?)?$/;
|
|
333
|
-
if (aComparable && bComparable) {
|
|
334
|
-
if (numberRegex.test(aComparable) && numberRegex.test(bComparable)) {
|
|
335
|
-
result = (parseFloat(aComparable) - parseFloat(bComparable));
|
|
336
|
-
}
|
|
337
|
-
else if (dateRegex.test(aComparable) && dateRegex.test(bComparable)) {
|
|
338
|
-
result = this.parseDateTime(aComparable) - this.parseDateTime(bComparable);
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
result = aComparable.localeCompare(bComparable, 'es', { sensitivity: 'base', ignorePunctuation: true });
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
return result * (isAsc ? 1 : -1);
|
|
345
|
-
}
|
|
346
|
-
parseDateTime(input) {
|
|
347
|
-
let [datePart, timePart] = input.split(' ');
|
|
348
|
-
let [day, month, year] = datePart.split(/\/|-/).map(Number);
|
|
349
|
-
let [hours = 0, minutes = 0, seconds = 0] = (timePart ? timePart.split(':') : []).map(Number);
|
|
350
|
-
let date = new Date(year, month - 1, day, hours, minutes, seconds);
|
|
351
|
-
return date.getTime();
|
|
352
|
-
}
|
|
353
|
-
getNextDirection(item) {
|
|
354
|
-
if (item.orderBy === OrderBy.none || item.orderBy === OrderBy.desc) {
|
|
355
|
-
return OrderBy.asc;
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
return OrderBy.desc;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
cleanCurrency(txt) {
|
|
362
|
-
txt = txt.replace(/€/g, '');
|
|
363
|
-
return txt;
|
|
364
|
-
}
|
|
365
|
-
selectFilter(item, itemValue) {
|
|
366
|
-
item.valueChange.emit(itemValue);
|
|
367
|
-
const head = this.getHeaderCells();
|
|
368
|
-
const rows = this.getRows();
|
|
369
|
-
if (head && rows) {
|
|
370
|
-
head.forEach((cell, cellIndex) => {
|
|
371
|
-
});
|
|
372
|
-
rows.forEach(row => {
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
checkUncheckAll() {
|
|
377
|
-
if (!this.checkboxComponent)
|
|
378
|
-
return;
|
|
379
|
-
let { indeterminateChecked, checked } = this.checkboxComponent;
|
|
380
|
-
if (!checked) {
|
|
381
|
-
this.checkboxComponent.checked = false;
|
|
382
|
-
this.checkboxComponent.indeterminateChecked = false;
|
|
383
|
-
checked = false;
|
|
384
|
-
indeterminateChecked = false;
|
|
385
|
-
this.selectedAllRowsChecked = false;
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
this.selectedAllRowsChecked = true;
|
|
389
|
-
this.numberOfSelectedRows = this.totalItems;
|
|
390
|
-
}
|
|
391
|
-
if (this.selectAllPages)
|
|
392
|
-
this.rowsCheckedInside = {};
|
|
393
|
-
const selectedRows = {};
|
|
394
|
-
const rows = this.getVisibleRows();
|
|
395
|
-
if (rows && rows.length > 0) {
|
|
396
|
-
rows.forEach((row) => {
|
|
397
|
-
row.checked = indeterminateChecked ? false : checked;
|
|
398
|
-
if (!indeterminateChecked)
|
|
399
|
-
selectedRows[row.id] = checked;
|
|
400
|
-
});
|
|
401
|
-
if (checked) {
|
|
402
|
-
this.allRowsChecked.emit(true);
|
|
403
|
-
}
|
|
404
|
-
else if (indeterminateChecked || !checked) {
|
|
405
|
-
this.allRowsChecked.emit(false);
|
|
406
|
-
}
|
|
407
|
-
if (this.selectAllPages) {
|
|
408
|
-
this.unselectedRows.clear();
|
|
409
|
-
this.rowsUnChecked.emit(Array.from(this.unselectedRows));
|
|
410
|
-
}
|
|
411
|
-
this.rowsCheckedInside = { ...this.rowsCheckedInside, ...selectedRows };
|
|
412
|
-
this.rowsChecked.emit(this.rowsCheckedInside);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableAdvancedComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
416
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableAdvancedComponent, selector: "desy-table-advanced", inputs: { rows: "rows", head: "head", foot: "foot", caption: "caption", captionClasses: "captionClasses", firstCellIsHeader: "firstCellIsHeader", hasCheckboxes: "hasCheckboxes", idPrefix: "idPrefix", classes: "classes", checkboxClasses: "checkboxClasses", id: "id", wrapper: "wrapper", selectAllPages: "selectAllPages", totalItems: "totalItems", usePagination: "usePagination" }, outputs: { rowsChange: "rowsChange", rowsChecked: "rowsChecked", allRowsChecked: "allRowsChecked", recalculateTable: "recalculateTable", filterBy: "filterBy", selectedBy: "selectedBy", sortBy: "sortBy", rowsUnChecked: "rowsUnChecked" }, queries: [{ propertyName: "captionComponent", predicate: TableCaptionComponent }, { propertyName: "headerComponent", predicate: TableAdvancedHeaderComponent }, { propertyName: "footerComponent", predicate: TableAdvancedFooterComponent }, { propertyName: "rowComponentList", predicate: TableAdvancedRowComponent }], viewQueries: [{ propertyName: "checkboxComponent", first: true, predicate: ["checkbox"], descendants: true }, { propertyName: "rowData", predicate: RowDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #tableContent>\n \n <div *ngIf=\"hasCheckboxes\" class=\"lg:flex lg:flex-wrap lg:w-full\" aria-labelledby=\"acciones-entradas\">\n <h3 id=\"acciones-entradas\" class=\"sr-only\">Selecci\u00F3n m\u00FAltiple y Acciones sobre el listado de entradas</h3>\n <div id=\"selection-home\" class=\"pt-2 pb-0 pl-4 mt-0 lg:flex sm:flex-1 py-base\">\n <div class=\"h-10\">\n <desy-checkboxes name=\"todos-entradas-chbx\">\n <desy-checkbox-item\n #checkbox\n value=\"item-checkbox\"\n name=\"todos-entradas\"\n (checkedChange)=\"checkUncheckAll()\"\n [isIndeterminate]=\"true\"\n classes=\"c-checkboxes--sm\">\n <div class=\"pt-0.5 leading-5\">\n <label class=\"block -mt-1 text-sm ng-star-inserted\">{{selectAllPages?'Seleccionar todo':'Seleccionar todos los items de esta p\u00E1gina'}}</label>\n </div>\n </desy-checkbox-item>\n </desy-checkboxes>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader,$event)\" (keydown.enter)=\"handleSortByColumn(iHeader,$event)\" (keydown.space)=\"handleSortByColumn(iHeader,$event)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-dark\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"usePagination ? handleButtonSearch(item) : handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"usePagination ? handleButtonSearch(item) : null\"\n (ngModelChange)=\"!usePagination ? handleInputSearch(item): null\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "directive", type: i4.AccessibilityDirective, selector: "[desyAppAccessibility]", inputs: ["desyAppAccessibility"] }, { kind: "component", type: i5.SelectComponent, selector: "desy-select", inputs: ["name", "items", "describedBy", "formGroupClasses", "classes"] }, { kind: "component", type: i6.CheckboxesComponent, selector: "desy-checkboxes", inputs: ["fieldsetData", "legendRef", "legendData", "legendText", "idPrefix", "name", "items", "formGroupClasses", "hasDividers", "hasError", "classes", "describedBy"], outputs: ["itemsChange"] }, { kind: "component", type: i7.CheckboxItemComponent, selector: "desy-checkbox-item", inputs: ["id", "value", "name", "conditional", "disabled", "isIndeterminate", "indeterminateChecked", "classes", "checked"], outputs: ["checkedChange", "indeterminateChange"] }, { kind: "component", type: i8.SearchBarComponent, selector: "desy-search-bar", inputs: ["describedBy", "classes", "buttonClasses", "placeholder"], outputs: ["clickEvent"] }, { kind: "directive", type: i9.FocusClickedCellDirective, selector: "[desyFocusClickedCell]" }, { kind: "directive", type: i10.CellDirective, selector: "[desyCell]", inputs: ["row", "rowIndex", "columnIndex"] }, { kind: "directive", type: i11.RowDirective, selector: "[desyRow]", inputs: ["desyRow"] }, { kind: "pipe", type: i12.MakeHtmlListPipe, name: "makeHtmlList" }] }); }
|
|
417
|
-
}
|
|
418
|
-
__decorate([
|
|
419
|
-
DesyContentChild(),
|
|
420
|
-
__metadata("design:type", TableCaptionComponent)
|
|
421
|
-
], TableAdvancedComponent.prototype, "captionComponent", void 0);
|
|
422
|
-
__decorate([
|
|
423
|
-
DesyContentChild(),
|
|
424
|
-
__metadata("design:type", TableAdvancedHeaderComponent)
|
|
425
|
-
], TableAdvancedComponent.prototype, "headerComponent", void 0);
|
|
426
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableAdvancedComponent, decorators: [{
|
|
427
|
-
type: Component,
|
|
428
|
-
args: [{ selector: 'desy-table-advanced', template: "<ng-template #tableContent>\n \n <div *ngIf=\"hasCheckboxes\" class=\"lg:flex lg:flex-wrap lg:w-full\" aria-labelledby=\"acciones-entradas\">\n <h3 id=\"acciones-entradas\" class=\"sr-only\">Selecci\u00F3n m\u00FAltiple y Acciones sobre el listado de entradas</h3>\n <div id=\"selection-home\" class=\"pt-2 pb-0 pl-4 mt-0 lg:flex sm:flex-1 py-base\">\n <div class=\"h-10\">\n <desy-checkboxes name=\"todos-entradas-chbx\">\n <desy-checkbox-item\n #checkbox\n value=\"item-checkbox\"\n name=\"todos-entradas\"\n (checkedChange)=\"checkUncheckAll()\"\n [isIndeterminate]=\"true\"\n classes=\"c-checkboxes--sm\">\n <div class=\"pt-0.5 leading-5\">\n <label class=\"block -mt-1 text-sm ng-star-inserted\">{{selectAllPages?'Seleccionar todo':'Seleccionar todos los items de esta p\u00E1gina'}}</label>\n </div>\n </desy-checkbox-item>\n </desy-checkboxes>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader,$event)\" (keydown.enter)=\"handleSortByColumn(iHeader,$event)\" (keydown.space)=\"handleSortByColumn(iHeader,$event)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-dark\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"usePagination ? handleButtonSearch(item) : handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"usePagination ? handleButtonSearch(item) : null\"\n (ngModelChange)=\"!usePagination ? handleInputSearch(item): null\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n" }]
|
|
429
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { rows: [{
|
|
430
|
-
type: Input
|
|
431
|
-
}], head: [{
|
|
432
|
-
type: Input
|
|
433
|
-
}], foot: [{
|
|
434
|
-
type: Input
|
|
435
|
-
}], caption: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], captionClasses: [{
|
|
438
|
-
type: Input
|
|
439
|
-
}], firstCellIsHeader: [{
|
|
440
|
-
type: Input
|
|
441
|
-
}], hasCheckboxes: [{
|
|
442
|
-
type: Input
|
|
443
|
-
}], idPrefix: [{
|
|
444
|
-
type: Input
|
|
445
|
-
}], classes: [{
|
|
446
|
-
type: Input
|
|
447
|
-
}], checkboxClasses: [{
|
|
448
|
-
type: Input
|
|
449
|
-
}], id: [{
|
|
450
|
-
type: Input
|
|
451
|
-
}], wrapper: [{
|
|
452
|
-
type: Input
|
|
453
|
-
}], selectAllPages: [{
|
|
454
|
-
type: Input
|
|
455
|
-
}], totalItems: [{
|
|
456
|
-
type: Input
|
|
457
|
-
}], usePagination: [{
|
|
458
|
-
type: Input
|
|
459
|
-
}], captionComponent: [{
|
|
460
|
-
type: ContentChildren,
|
|
461
|
-
args: [TableCaptionComponent]
|
|
462
|
-
}], headerComponent: [{
|
|
463
|
-
type: ContentChildren,
|
|
464
|
-
args: [TableAdvancedHeaderComponent]
|
|
465
|
-
}], footerComponent: [{
|
|
466
|
-
type: ContentChildren,
|
|
467
|
-
args: [TableAdvancedFooterComponent]
|
|
468
|
-
}], rowComponentList: [{
|
|
469
|
-
type: ContentChildren,
|
|
470
|
-
args: [TableAdvancedRowComponent]
|
|
471
|
-
}], rowData: [{
|
|
472
|
-
type: ViewChildren,
|
|
473
|
-
args: [RowDirective]
|
|
474
|
-
}], rowsChange: [{
|
|
475
|
-
type: Output
|
|
476
|
-
}], rowsChecked: [{
|
|
477
|
-
type: Output
|
|
478
|
-
}], allRowsChecked: [{
|
|
479
|
-
type: Output
|
|
480
|
-
}], recalculateTable: [{
|
|
481
|
-
type: Output
|
|
482
|
-
}], filterBy: [{
|
|
483
|
-
type: Output
|
|
484
|
-
}], selectedBy: [{
|
|
485
|
-
type: Output
|
|
486
|
-
}], sortBy: [{
|
|
487
|
-
type: Output
|
|
488
|
-
}], rowsUnChecked: [{
|
|
489
|
-
type: Output
|
|
490
|
-
}], checkboxComponent: [{
|
|
491
|
-
type: ViewChild,
|
|
492
|
-
args: ['checkbox']
|
|
493
|
-
}] } });
|
|
494
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWR2YW5jZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzeS1hbmd1bGFyL3NyYy9saWIvZGVzeS10YWJsZXMvY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC90YWJsZS1hZHZhbmNlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LXRhYmxlcy9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlGQUFpRixDQUFDO0FBRXhILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFxQixPQUFPLEVBQXdCLE1BQU0sa0JBQWtCLENBQUM7QUFFcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFNUYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDNUYsT0FBTyxFQUFFLHlCQUF5QixF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biAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvaW50ZXJuYWwvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IENoZWNrYm94SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Rlc3ktZm9ybXMvY29tcG9uZW50cy9jaGVja2JveGVzL2NoZWNrYm94LWl0ZW0vY2hlY2tib3gtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VsZWN0SXRlbURhdGEgfSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2ludGVyZmFjZXMvc2VsZWN0LWl0ZW0tZGF0YSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgRGVzeUNvbnRlbnRDaGlsZCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzL2Rlc3ktY29udGVudC1jaGlsZC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgU2VhcmNoVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvc2VhcmNoLXV0aWxzJztcbmltcG9ydCB7IENlbGxEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NlbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIZWFkQ2VsbE1vZGVsRGF0YSwgT3JkZXJCeSwgUm93RGF0YSwgV3JhcHBlckRhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJlY2FsY3VsYXRlVGFibGVQYXJhbXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlY2FsY3VsYXRlLXRhYmxlLXBhcmFtcyc7XG5pbXBvcnQgeyBUYWJsZUNhcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YWJsZS9jb21wb25lbnRzL3RhYmxlLWNhcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLy4uLy4uLy4uL2Rlc3ktY29tbW9ucy9jb21wb25lbnRzL2NvbnRlbnQvY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1mb290ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLWhlYWRlci1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtc2VsZWN0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rlc3ktdGFibGUtYWR2YW5jZWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtYWR2YW5jZWQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQWR2YW5jZWRDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBfcm93czogUm93RGF0YVtdOyAvLyBvcmlnaW5hbCBkYXRhXG4gIEBJbnB1dCgpXG4gIHNldCByb3dzKHJvd3M6IFJvd0RhdGFbXSkge1xuICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKVxuICB9XG4gIGdldCByb3dzKCk6IFJvd0RhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NcbiAgfVxuICBASW5wdXQoKSBoZWFkOiBIZWFkQ2VsbE1vZGVsRGF0YVtdO1xuICBASW5wdXQoKSBmb290OiBSb3dEYXRhW107XG5cbiAgQElucHV0KCkgY2FwdGlvbjogc3RyaW5nO1xuICBASW5wdXQoKSBjYXB0aW9uQ2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBmaXJzdENlbGxJc0hlYWRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgaGFzQ2hlY2tib3hlczogYm9vbGVhbjtcbiAgQElucHV0KCkgaWRQcmVmaXg6IHN0cmluZztcbiAgQElucHV0KCkgY2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBjaGVja2JveENsYXNzZXM6IHN0cmluZztcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgd3JhcHBlcjogV3JhcHBlckRhdGE7XG5cbiAgQElucHV0KCkgc2VsZWN0QWxsUGFnZXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuXG4gIEBJbnB1dCgpIHVzZVBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICByb3dzQ2hlY2tlZEluc2lkZSA9IHt9O1xuICBudW1iZXJPZlNlbGVjdGVkUm93cyA9IDA7XG5cblxuICBARGVzeUNvbnRlbnRDaGlsZCgpXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDYXB0aW9uQ29tcG9uZW50KSBjYXB0aW9uQ29tcG9uZW50OiBUYWJsZUNhcHRpb25Db21wb25lbnQ7XG5cbiAgQERlc3lDb250ZW50Q2hpbGQoKVxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRIZWFkZXJDb21wb25lbnQpIGhlYWRlckNvbXBvbmVudDogVGFibGVBZHZhbmNlZEhlYWRlckNvbXBvbmVudDtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQpIGZvb3RlckNvbXBvbmVudDogUXVlcnlMaXN0PFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCkgcm93Q29tcG9uZW50TGlzdDogUXVlcnlMaXN0PFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQ+O1xuICBAVmlld0NoaWxkcmVuKFJvd0RpcmVjdGl2ZSkgcm93RGF0YTogUXVlcnlMaXN0PFJvd0RpcmVjdGl2ZT47XG5cbiAgQE91dHB1dCgpIHJvd3NDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByb3dzQ2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFsbFJvd3NDaGVja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVjYWxjdWxhdGVUYWJsZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjYWxjdWxhdGVUYWJsZVBhcmFtcz4oKTtcblxuICBAT3V0cHV0KCkgZmlsdGVyQnk6IEV2ZW50RW1pdHRlcjxPYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxPYmplY3Q+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZEJ5OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPdXRwdXQoKSBzb3J0Qnk6IEV2ZW50RW1pdHRlcjxPYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxPYmplY3Q+KCk7XG5cbiAgQE91dHB1dCgpIHJvd3NVbkNoZWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICB2aXNpYmxlUm93czogUm93RGF0YVtdIHwgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudFtdO1xuICBvcmRlckJ5VHlwZSA9IE9yZGVyQnk7XG4gIGlzUmVzZXQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByaXZhdGUgcm93c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3NTdWJzY3JpcHRpb24gPSB0aGlzLnJvd0NvbXBvbmVudExpc3QuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm93c1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3dzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1udHNGb2N1cyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXhdJyk7XG4gICAgaWYgKGVsZW1udHNGb2N1cykge1xuICAgICAgZWxlbW50c0ZvY3VzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIH1cbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgbGFzIGZpbGFzIHZpc2libGVzIHRyYXMgcmVhbGl6YXJzZSB1bmEgYsO6c3F1ZWRhIG8gdW5hIG9yZGVuYWNpw7NuXG4gICAqL1xuICByZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCByZWNhbGN1bGF0ZVBhcmFtcyA9IHRoaXMuYnVpbGRSZWNhbGN1bGF0ZVBhcmFtcygpO1xuXG4gICAgLy8gU2kgc2UgY2FwdHVyYSBlbCBldmVudG8gcmVjYWxjdWxhdGVUYWJsZSBzZSBkZWphIGFsIHVzdWFyaW8gbGEgcmVzcG9uc2FiaWxpZGFkIGRlIGZpbHRyYXIgeSBvcmRlbmFyIGxvcyBlbGVtZW50b3MuXG4gICAgaWYgKHRoaXMucmVjYWxjdWxhdGVUYWJsZS5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZWNhbGN1bGF0ZVRhYmxlLmVtaXQocmVjYWxjdWxhdGVQYXJhbXMpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAvLyBTZSBkZWJlbiBtb3N0cmFyIHRvZGFzIGxhcyBmaWxhcyB0ZW1wb3JhbG1lbnRlIHBhcmEgcG9kZXIgYXBsaWNhciBlbCBmaWx0cm8geSBsYSBvcmRlbmFjacOzbiBzb2JyZSBlbCBjb250ZW5pZG8gaW5zZXJ0YWRvXG4gICAgICB0aGlzLnZpc2libGVSb3dzID0gdGhpcy5nZXRSb3dzKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gU2UgYXBsaWNhIGVsIGZpbHRybyB5IGxhIG9yZGVuYWNpw7NuXG4gICAgICBpZiAoIXRoaXMudXNlUGFnaW5hdGlvbikge1xuICAgICAgICBsZXQgcm93RGF0YSA9IHRoaXMuZmlsdGVyUm93cyhyZWNhbGN1bGF0ZVBhcmFtcywgdGhpcy5yb3dEYXRhLnRvQXJyYXkoKSk7XG4gICAgICAgIHJvd0RhdGEgPSB0aGlzLnNvcnRSb3dzKHJlY2FsY3VsYXRlUGFyYW1zLCByb3dEYXRhKTtcbiAgICAgICAgdGhpcy52aXNpYmxlUm93cyA9IHJvd0RhdGEubWFwKHIgPT4gci5kZXN5Um93KSBhcyBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50W107XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja2JveENvbXBvbmVudCAmJiAhdGhpcy5zZWxlY3RBbGxQYWdlcyAmJiB0aGlzLnVzZVBhZ2luYXRpb24pIHsgLy8gU2VsZWN0IG9ubHkgb25lIHBhZ2UgbG9naWMsIHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlUGFnaW5hdGlvbiB0cnVlLlxuICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHRoaXMuZ2V0Um93cygpLmV2ZXJ5KHJvdyA9PiB0aGlzLnJvd3NDaGVja2VkSW5zaWRlICYmIHRoaXMucm93c0NoZWNrZWRJbnNpZGVbcm93LmlkXSk7XG4gICAgICBjb25zdCBhbnlDaGVja2VkID0gdGhpcy5nZXRSb3dzKCkuc29tZShyb3cgPT4gdGhpcy5yb3dzQ2hlY2tlZEluc2lkZSAmJiB0aGlzLnJvd3NDaGVja2VkSW5zaWRlW3Jvdy5pZF0pO1xuXG4gICAgICB0aGlzLmNoZWNrYm94Q29tcG9uZW50LmluZGV0ZXJtaW5hdGVDaGVja2VkID0gIWFsbENoZWNrZWQgJiYgYW55Q2hlY2tlZDtcbiAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuY2hlY2tlZCA9IGFsbENoZWNrZWQ7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydXllIGxvcyBwYXLDoW1ldHJvcyBuZWNlc2FyaW9zIHBhcmEgcmVjYWxjdWxhciBsYSB0YWJsYSwgaW5kaWNhbmRvIGxvcyBmaWx0cm9zIHkgbGEgb3JkZW5hY2nDs25cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSZWNhbGN1bGF0ZVBhcmFtcygpOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgIHNvcnQ6IG51bGxcbiAgICB9O1xuXG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZ2V0SGVhZGVyQ2VsbHMoKSBhcyAoSGVhZENlbGxNb2RlbERhdGEgfCBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudClbXTtcbiAgICBpZiAoaGVhZCkge1xuICAgICAgaGVhZC5mb3JFYWNoKChoZWFkZXJDZWxsLCBoZWFkZXJDZWxsSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGhlYWRlckNlbGwuaGFzRmlsdGVyICYmIGhlYWRlckNlbGwuYWN0aXZlRmlsdGVyKSB7XG4gICAgICAgICAgcGFyYW1zLmZpbHRlcnMucHVzaCh7IGNvbHVtbkluZGV4OiBoZWFkZXJDZWxsSW5kZXgsIGZpbHRlclRleHQ6IGhlYWRlckNlbGwudmFsdWVGaWx0ZXIsIGlkZW50aWZpZXI6IGhlYWRlckNlbGwuaWRlbnRpZmllciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFkZXJDZWxsLmhhc1NlbGVjdCAmJiBoZWFkZXJDZWxsLmFjdGl2ZVNlbGVjdCkge1xuICAgICAgICAgIHBhcmFtcy5maWx0ZXJzLnB1c2goeyBjb2x1bW5JbmRleDogaGVhZGVyQ2VsbEluZGV4LCBmaWx0ZXJUZXh0OiBoZWFkZXJDZWxsLnZhbHVlU2VsZWN0LCBpZGVudGlmaWVyOiBoZWFkZXJDZWxsLmlkZW50aWZpZXIgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcmRlckJ5Q29sdW1uSW5kZXggPSBoZWFkLmZpbmRJbmRleChjZWxsID0+IGNlbGwub3JkZXJCeSAmJiBjZWxsLm9yZGVyQnkgIT09IE9yZGVyQnkubm9uZSk7XG4gICAgICBwYXJhbXMuc29ydCA9IChvcmRlckJ5Q29sdW1uSW5kZXggPj0gMCkgPyB7IGNvbHVtbkluZGV4OiBvcmRlckJ5Q29sdW1uSW5kZXgsIG9yZGVyOiBoZWFkW29yZGVyQnlDb2x1bW5JbmRleF0ub3JkZXJCeSB9IDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jaW9uZXMgZGUgcmVjb2dlciBpZHMsIHkgY2FyYWN0ZXJpc3RpY2FzXG4gICAqL1xuXG4gIGhhc0ZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZ2V0SGVhZGVyQ2VsbHMoKTtcbiAgICByZXR1cm4gaGVhZCA/IGhlYWQuZmluZEluZGV4KGNlbGwgPT4gKGNlbGwuaGFzRmlsdGVyKSB8fCAoY2VsbC5oYXNTZWxlY3QpKSA+PSAwIDogZmFsc2U7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxscygpOiBIZWFkQ2VsbE1vZGVsRGF0YVtdIHwgVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29tcG9uZW50ICYmIHRoaXMuaGVhZGVyQ29tcG9uZW50LmNlbGxzLmxlbmd0aCA+IDAgPyB0aGlzLmhlYWRlckNvbXBvbmVudC5jZWxscy50b0FycmF5KCkgOiB0aGlzLmhlYWQ7XG4gIH1cblxuICBnZXRGb290ZXJDZWxscygpOiBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLmZvb3RlckNvbXBvbmVudCAmJiB0aGlzLmZvb3RlckNvbXBvbmVudC5sZW5ndGggPiAwID8gdGhpcy5mb290ZXJDb21wb25lbnQudG9BcnJheSgpIDogdGhpcy5mb290O1xuICB9XG5cbiAgZ2V0Um93cygpIHtcbiAgICBsZXQgcm93cyA9IFtdO1xuICAgIGlmICh0aGlzLnJvd0NvbXBvbmVudExpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJvd3MgPSB0aGlzLnJvd0NvbXBvbmVudExpc3QudG9BcnJheSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb3dzKSB7XG4gICAgICByb3dzID0gdGhpcy5yb3dzO1xuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaSBzZSBzb2JyZWVzY3JpYmUgIGVsIGNvbXBvcnRhbWllbnRvIHBvciBkZWZlY3RvIGRlIGZpbHRyYWRvIHkgb3JkZW5hY2nDs24sIHNlIHV0aWxpemFyw6FuIGxhcyBpbmRpY2FkYXMgZGVzZGUgZnVlcmEgZGVsXG4gICAqIGNvbXBvbmVudGUgKHlhIHNlYSBwb3IgcGFyw6FtZXRybyBvIHBvciBjb250ZW5pZG8pLlxuICAgKiBTaSBubyBzZSBzb2JyZWVzY3JpYmUsIGRldnVlbHZlIGxhcyBmaWxhcyBjYWxjdWxhZGFzLlxuICAgKi9cbiAgZ2V0VmlzaWJsZVJvd3MoKSB7XG4gICAgbGV0IHJvd3MgPSB0aGlzLnJlY2FsY3VsYXRlVGFibGUub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgPyB0aGlzLmdldFJvd3MoKSA6IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsUGFnZXMgJiYgdGhpcy5jaGVja2JveENvbXBvbmVudCAmJiB0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgJiYgKHRoaXMuY2hlY2tib3hDb21wb25lbnQuY2hlY2tlZCB8fCB0aGlzLnVuc2VsZWN0ZWRSb3dzLnNpemUgPiAwKSkge1xuICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiB7IHJvdy5jaGVja2VkID0gdHJ1ZSB9KVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm93c0NoZWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3MuZmluZChyID0+IHIuaWQgPT0gU3RyaW5nKGlkKSk7XG4gICAgICBpZiAocm93KSB7XG4gICAgICAgIHJvdy5jaGVja2VkID0gdGhpcy5yb3dzQ2hlY2tlZEluc2lkZVtpZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICBnZXRJZFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkUHJlZml4ID8gdGhpcy5pZFByZWZpeCA6ICdpZC10YWJsZS1yb3cnO1xuICB9XG5cbiAgZ2V0SWRIZWFkZXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SWRQcmVmaXgoKSArICctaGVhZGVyLScgKyBpbmRleDtcbiAgfVxuXG4gIGdldElkUm93Q2hlY2tib3goaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SWRQcmVmaXgoKSArICctY2hlY2tib3gtJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0SWRIZWFkZXJGaWx0ZXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SWRQcmVmaXgoKSArICctaGVhZGVyLWZpbHRlci0nICsgaW5kZXg7XG4gIH1cblxuICBnZXRJZEhlYWRlclNlbGVjdChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1oZWFkZXItc2VsZWN0LScgKyBpbmRleDtcbiAgfVxuXG4gIGdldENhcHRpb25DbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNhcHRpb25Db21wb25lbnQgPyB0aGlzLmNhcHRpb25Db21wb25lbnQuY2xhc3NlcyA6IHRoaXMuY2FwdGlvbkNsYXNzZXM7XG4gIH1cblxuICBnZXRTdHJpbmdPcmRlckJ5KG9yZGVyQnk6IE9yZGVyQnkpOiBzdHJpbmcge1xuICAgIGlmIChvcmRlckJ5ID09PSBPcmRlckJ5LmFzYykge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH0gZWxzZSBpZiAob3JkZXJCeSA9PT0gT3JkZXJCeS5kZXNjKSB7XG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuICAgIH0gZWxzZSBpZiAob3JkZXJCeSA9PT0gT3JkZXJCeS5ub25lKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdEZvckl0ZW0oaXRlbTogYW55KTogVGFibGVBZHZhbmNlZFNlbGVjdENvbXBvbmVudCB7XG4gICAgcmV0dXJuIGl0ZW0uc2VsZWN0Q29tcG9uZW50ID8gaXRlbS5zZWxlY3RDb21wb25lbnQgOiBudWxsO1xuICB9XG5cbiAgZ2V0SXRlbVNlbGVjdE9wdGlvbnMoaXRlbTogVGFibGVBZHZhbmNlZFNlbGVjdENvbXBvbmVudCk6IFNlbGVjdEl0ZW1EYXRhW10ge1xuICAgIHJldHVybiBpdGVtLnNlbGVjdEl0ZW1Db21wb25lbnRMaXN0ICYmIGl0ZW0uc2VsZWN0SXRlbUNvbXBvbmVudExpc3QubGVuZ3RoID4gMCA/XG4gICAgICBpdGVtLnNlbGVjdEl0ZW1Db21wb25lbnRMaXN0LnRvQXJyYXkoKSA6IGl0ZW0uaXRlbXM7XG4gIH1cblxuICBnZXRDb250ZW50Q29tcG9uZW50KGl0ZW06IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50KTogQ29udGVudENvbXBvbmVudCB7XG4gICAgcmV0dXJuIGl0ZW0uY29udGVudENvbXBvbmVudCA/IGl0ZW0uY29udGVudENvbXBvbmVudCA6IG51bGw7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBjaGVja3NcbiAgICovXG4gIGhhbmRsZUNoZWNrYm94Q2hhbmdlKHJvdzogUm93RGF0YSB8IFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpOiB2b2lkIHtcbiAgICBpZiAocm93IGluc3RhbmNlb2YgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCkge1xuICAgICAgcm93LmNoZWNrZWRDaGFuZ2UuZW1pdChyb3cuY2hlY2tlZCk7XG4gICAgfVxuICAgIHRoaXMubm90aWZ5Q2hlY2tlZENoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdGUgZGVzbWFyY2FyIHRvZGFzIGxhcyBmaWxhc1xuICAgKi9cbiAgcHJpdmF0ZSB1bmNoZWNrQWxsKCk6IHZvaWQge1xuXG4gICAgdGhpcy5yb3dzQ2hlY2tlZEluc2lkZSA9IHt9O1xuICAgIHRoaXMudW5zZWxlY3RlZFJvd3MuY2xlYXIoKTtcbiAgICB0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLm51bWJlck9mU2VsZWN0ZWRSb3dzID0gMDtcblxuICAgIHRoaXMuZ2V0Um93cygpLmZvckVhY2gociA9PiB7XG4gICAgICBjb25zdCBtdXN0RW1pdCA9IHIuY2hlY2tlZCAmJiByIGluc3RhbmNlb2YgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudDtcbiAgICAgIHIuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKG11c3RFbWl0KSB7XG4gICAgICAgIChyIGFzIFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpLmNoZWNrZWRDaGFuZ2UuZW1pdChyLmNoZWNrZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5Q2hlY2tlZENoYW5nZSgpO1xuICB9XG5cbiAgdW5zZWxlY3RlZFJvd3M6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBWYXJpYWJsZSBnbG9iYWwgcGFyYSBhbG1hY2VuYXIgbG9zIGl0ZW1zIGRlc2VsZWNjaW9uYWRvcyBjdWFuZG8gcHJldmlhbWVudGUgc2UgaGEgc2VsZWNjaW9uYWRvIHRvZG9zXG4gIHNlbGVjdGVkQWxsUm93c0NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIE5vdGlmaWNhIGNhbWJpb3MgZW4gbGFzIGZpbGFzXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeUNoZWNrZWRDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93Q29tcG9uZW50TGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucm93c0NoYW5nZS5lbWl0KHRoaXMucm93cyk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93Q2hlY2tzOiBhbnkgPSB7fTtcbiAgICB0aGlzLmdldFJvd3MoKS5mb3JFYWNoKHIgPT4ge1xuICAgICAgcm93Q2hlY2tzW3IuaWRdID0gISFyLmNoZWNrZWQ7IC8vIFNlIGFwbGljYW4gdGFtYmnDqW4gYSBsYXMgbm8gdmlzaWJsZXNcbiAgICAgIGlmICh0aGlzLnNlbGVjdEFsbFBhZ2VzICYmIHRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCkge1xuICAgICAgICBpZiAoci5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5kZWxldGUoci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5hZGQoci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5udW1iZXJPZlNlbGVjdGVkUm93cyA9IHRoaXMudG90YWxJdGVtcyAtIHRoaXMudW5zZWxlY3RlZFJvd3Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucm93c0NoZWNrZWRJbnNpZGUgPSB7IC4uLnRoaXMucm93c0NoZWNrZWRJbnNpZGUsIC4uLnJvd0NoZWNrcyB9XG4gICAgdGhpcy5yb3dzQ2hlY2tlZC5lbWl0KHRoaXMucm93c0NoZWNrZWRJbnNpZGUpO1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hlY2tib3hDb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJvd3MgPSB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gICAgICAgIGNvbnN0IGFueUNoZWNrZWQgPSB0aGlzLnNlbGVjdEFsbFBhZ2VzICYmIHRoaXMudG90YWxJdGVtcyAmJiB0aGlzLnVzZVBhZ2luYXRpb24gPyB0aGlzLmFyZUFueVJvd3NDaGVja2VkKCkgOiB2aXNpYmxlUm93cy5zb21lKChyKSA9PiByLmNoZWNrZWQpO1xuICAgICAgICBjb25zdCBhbGxDaGVja2VkID0gdGhpcy5zZWxlY3RBbGxQYWdlcyAmJiB0aGlzLnRvdGFsSXRlbXMgJiYgdGhpcy51c2VQYWdpbmF0aW9uID8gdGhpcy5hcmVBbGxSb3dzQ2hlY2tlZCgpIDogdmlzaWJsZVJvd3MuZXZlcnkoKHIpID0+IHIuY2hlY2tlZCk7XG4gICAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPSAoKCF0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgJiYgdGhpcy5zZWxlY3RBbGxQYWdlcyAmJiB0aGlzLnVzZVBhZ2luYXRpb24gJiYgYW55Q2hlY2tlZCAmJiAhYWxsQ2hlY2tlZCkgfHwgKGFueUNoZWNrZWQgJiYgIWFsbENoZWNrZWQpIHx8IHRoaXMudW5zZWxlY3RlZFJvd3Muc2l6ZSA+IDAgJiYgdGhpcy51bnNlbGVjdGVkUm93cy5zaXplIDwgdGhpcy50b3RhbEl0ZW1zKTtcbiAgICAgICAgdGhpcy5jaGVja2JveENvbXBvbmVudC5jaGVja2VkID0gKGFsbENoZWNrZWQgJiYgdGhpcy51bnNlbGVjdGVkUm93cy5zaXplID09IDAgJiYgdmlzaWJsZVJvd3MubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IHsgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZUNoZWNrZWQgfSA9IHRoaXMuY2hlY2tib3hDb21wb25lbnQ7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkICYmIGNoZWNrZWQpXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkID0gdHJ1ZVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgJiYgIWNoZWNrZWQgJiYgIWluZGV0ZXJtaW5hdGVDaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLnVuc2VsZWN0ZWRSb3dzLmNsZWFyKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIHRoaXMuYWxsUm93c0NoZWNrZWQuZW1pdCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRldGVybWluYXRlQ2hlY2tlZCB8fCAhY2hlY2tlZCkge1xuICAgICAgICAgIHRoaXMuYWxsUm93c0NoZWNrZWQuZW1pdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdEFsbFBhZ2VzKSB7XG4gICAgICAgIHRoaXMucm93c1VuQ2hlY2tlZC5lbWl0KEFycmF5LmZyb20odGhpcy51bnNlbGVjdGVkUm93cykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIGFyZUFsbFJvd3NDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXModGhpcy5yb3dzQ2hlY2tlZEluc2lkZSk7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gdGhpcy50b3RhbEl0ZW1zICYmIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJvd3MgIT09IHRoaXMudG90YWxJdGVtcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhbGxUcnVlID0gaXRlbXMuZXZlcnkoa2V5ID0+IHRoaXMucm93c0NoZWNrZWRJbnNpZGVba2V5XSk7XG4gICAgcmV0dXJuIGFsbFRydWU7XG4gIH1cblxuICBwcml2YXRlIGFyZUFueVJvd3NDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXModGhpcy5yb3dzQ2hlY2tlZEluc2lkZSk7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhbnlUcnVlID0gaXRlbXMuc29tZShrZXkgPT4gdGhpcy5yb3dzQ2hlY2tlZEluc2lkZVtrZXldKTtcbiAgICByZXR1cm4gYW55VHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBidXNxdWVkYVxuICAgKi9cbiAgaGFuZGxlSW5wdXRTZWFyY2goaXRlbTogSGVhZENlbGxNb2RlbERhdGEpOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5oYXNGaWx0ZXIpIHsgLy8gc2kgdGllbmUgYnVzY2Fkb3JcbiAgICAgIGl0ZW0uYWN0aXZlRmlsdGVyID0gISFpdGVtLnZhbHVlRmlsdGVyO1xuICAgICAgdGhpcy51bmNoZWNrQWxsKCk7XG4gICAgfVxuICAgIGlmIChpdGVtLmhhc1NlbGVjdCkgeyAvL1NpIHRpZW5lIHNlbGVjY2lvbmFibGVcbiAgICAgIGl0ZW0uYWN0aXZlU2VsZWN0ID0gISFpdGVtLnZhbHVlU2VsZWN0O1xuICAgICAgdGhpcy51bmNoZWNrQWxsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpO1xuICB9XG5cbiAgaGFuZGxlQnV0dG9uU2VhcmNoKGl0ZW06IEhlYWRDZWxsTW9kZWxEYXRhKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaGFzRmlsdGVyKSB7IC8vIHNpIHRpZW5lIGJ1c2NhZG9yXG4gICAgICBpdGVtLmFjdGl2ZUZpbHRlciA9ICEhaXRlbS52YWx1ZUZpbHRlcjtcbiAgICAgIHRoaXMuZmlsdGVyQnkuZW1pdCh7IGlkOiBpdGVtLmlkZW50aWZpZXIsIHZhbHVlOiBpdGVtLnZhbHVlRmlsdGVyIH0pO1xuICAgICAgdGhpcy51bmNoZWNrQWxsKCk7XG4gICAgfVxuICAgIGlmIChpdGVtLmhhc1NlbGVjdCkgeyAvL1NpIHRpZW5lIHNlbGVjY2lvbmFibGVcbiAgICAgIGl0ZW0uYWN0aXZlU2VsZWN0ID0gISFpdGVtLnZhbHVlU2VsZWN0O1xuICAgICAgdGhpcy5zZWxlY3RlZEJ5LmVtaXQoaXRlbS52YWx1ZVNlbGVjdCk7XG4gICAgICB0aGlzLnVuY2hlY2tBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2UgZmlsdHJhbiBsYXMgZmlsYXMgc2Vnw7puIGxvIGVzcGVjaWZpY2FkbyBlbiBsYSBiYXJyYSBkZSBiw7pzcXVlZGEgZGUgY2FkYSBjb2x1bW5hLlxuICAgKiBTaSBubyBoYXkgYsO6c3F1ZWRhIHNzZSBkZXZ1ZWx2ZW4gdG9kYXMgbGFzIGZpbGFzLlxuICAgKiBAcGFyYW0gcmVjYWxjdWxhdGVQYXJhbXMgcGFyYW1ldHJvcyBwYXJhIHJlY2FsY3VsYXIgbG9zIGVsZW1lbnRvcyB2aXNpYmxlc1xuICAgKiBAcGFyYW0gcm93cyBsaXN0YSBjb24gdG9kYXMgbGFzIGZpbGFzXG4gICAqIEByZXR1cm4gbGlzdGEgZGUgZmlsYXMgZmlsdHJhZGFcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyUm93cyhyZWNhbGN1bGF0ZVBhcmFtczogUmVjYWxjdWxhdGVUYWJsZVBhcmFtcywgcm93czogUm93RGlyZWN0aXZlW10pOiBSb3dEaXJlY3RpdmVbXSB7XG4gICAgbGV0IGZpbHRlcmVkUm93cyA9IHJvd3M7XG4gICAgcmVjYWxjdWxhdGVQYXJhbXMuZmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJlZFJvd3MuZmlsdGVyKHJvdyA9PlxuICAgICAgICBTZWFyY2hVdGlscy5jb250YWluc0FueVdvcmRGcm9tKHJvdy5nZXRDZWxsKGZpbHRlci5jb2x1bW5JbmRleCkuZ2V0Q29udGVudCgpLCBmaWx0ZXIuZmlsdGVyVGV4dCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gIH1cblxuICAvKipcbiAgICogb3JkZW5hY2lvblxuICAgKi9cblxuICAvKipcbiAgICogUGVybWl0ZSBpbmRpY2FyIHF1ZSBzZSBkZWJlIG9yZGVuYXIgbGEgdGFibGFcbiAgICogQHBhcmFtIGluZGV4IGluZGljZSBkZSBsYSBjb2x1bW5hXG4gICAqL1xuICBoYW5kbGVTb3J0QnlDb2x1bW4oaW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkZXJDZWxscygpO1xuICAgIGxldCBvcmRlciA9IE9yZGVyQnkuYXNjXG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbCwgY2VsbEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjZWxsLm9yZGVyQnkpIHtcbiAgICAgICAgICBpZiAoY2VsbEluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgb3JkZXIgPSB0aGlzLmdldE5leHREaXJlY3Rpb24oY2VsbClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2VsbC5vcmRlckJ5ID0gY2VsbEluZGV4ID09PSBpbmRleCA/IHRoaXMuZ2V0TmV4dERpcmVjdGlvbihjZWxsKSA6IE9yZGVyQnkubm9uZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVzZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc29ydEJ5LmVtaXQoeyBpZDogaW5kZXgsIG9yZGVyOiBvcmRlciB9KTtcbiAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cblxuICAvKipcbiAgICogT3JkZW5hIGxhcyBmaWxhcyBpbmRpY2FkYXMgc2Vnw7puIGxhIGNvbHVtbmEgZXNwZWNpZmljYWRhIGVuIGxhIGNhYmVjZXJhXG4gICAqIEBwYXJhbSByZWNhbGN1bGF0ZVBhcmFtcyBwYXJhbWV0cm9zIHBhcmEgcmVjYWxjdWxhciBsb3MgZWxlbWVudG9zIHZpc2libGVzXG4gICAqIEBwYXJhbSByb3dzIGZpbGFzIGRlIGxhIHRhYmxhIGEgb3JkZW5hclxuICAgKiBAcmV0dXJuIG1pc21hcyBmaWxhcyBwZXJvIG9yZGVuYWRhcyBwb3IgbGEgY29sdW1uYSBpbmRpY2FkYVxuICAgKi9cbiAgcHJpdmF0ZSBzb3J0Um93cyhyZWNhbGN1bGF0ZVBhcmFtczogUmVjYWxjdWxhdGVUYWJsZVBhcmFtcywgcm93czogUm93RGlyZWN0aXZlW10pOiBSb3dEaXJlY3RpdmVbXSB7XG4gICAgbGV0IHNvcnRlZFJvd3MgPSByb3dzO1xuICAgIGlmIChyZWNhbGN1bGF0ZVBhcmFtcy5zb3J0KSB7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHJlY2FsY3VsYXRlUGFyYW1zLnNvcnQuY29sdW1uSW5kZXg7XG4gICAgICBjb25zdCBpc0FzYyA9IHJlY2FsY3VsYXRlUGFyYW1zLnNvcnQub3JkZXIgPT09IE9yZGVyQnkuYXNjO1xuICAgICAgc29ydGVkUm93cyA9IHJvd3Muc29ydCgoYSwgYikgPT5cbiAgICAgICAgdGhpcy5jb21wYXJlQ2VsbENvbnRlbnQoYS5nZXRDZWxsKGNvbHVtbkluZGV4KSwgYi5nZXRDZWxsKGNvbHVtbkluZGV4KSwgaXNBc2MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydGVkUm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJhIGVsIGNvbnRlbmlkbyBkZSBkb3MgY2VsZGFzLiBFc3RlIHNlIGludmllcnRlIHNpIGVsIG9yZGVuIGVzcGVjaWZpY2FkbyBlcyBkZXNjZW5kZW50ZS5cbiAgICovXG4gIGNvbXBhcmVDZWxsQ29udGVudChhOiBDZWxsRGlyZWN0aXZlLCBiOiBDZWxsRGlyZWN0aXZlLCBpc0FzYzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBhQ29tcGFyYWJsZSA9IHRoaXMuY2xlYW5DdXJyZW5jeShhLmdldENvbnRlbnQoKSkudHJpbSgpO1xuICAgIGNvbnN0IGJDb21wYXJhYmxlID0gdGhpcy5jbGVhbkN1cnJlbmN5KGIuZ2V0Q29udGVudCgpKS50cmltKCk7XG4gICAgY29uc3QgbnVtYmVyUmVnZXggPSAvXi0/XFxkKyhcXC58LCk/XFxkKiQvO1xuICAgIGNvbnN0IGRhdGVSZWdleCA9IC9eKFxcZHsyfSkoXFwvfC0pKFxcZHsyfSkoXFwvfC0pKFxcZHs0fSkoIChcXGR7Mn0pOihcXGR7Mn0pKDooXFxkezJ9KSk/KT8kLztcbiAgICBpZiAoYUNvbXBhcmFibGUgJiYgYkNvbXBhcmFibGUpIHtcbiAgICAgIGlmIChudW1iZXJSZWdleC50ZXN0KGFDb21wYXJhYmxlKSAmJiBudW1iZXJSZWdleC50ZXN0KGJDb21wYXJhYmxlKSkgeyAvLyBOdW1lcm9zXG4gICAgICAgIHJlc3VsdCA9IChwYXJzZUZsb2F0KGFDb21wYXJhYmxlKSAtIHBhcnNlRmxvYXQoYkNvbXBhcmFibGUpKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0ZVJlZ2V4LnRlc3QoYUNvbXBhcmFibGUpICYmIGRhdGVSZWdleC50ZXN0KGJDb21wYXJhYmxlKSkgeyAvLyBGZWNoYXNcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZURhdGVUaW1lKGFDb21wYXJhYmxlKSAtIHRoaXMucGFyc2VEYXRlVGltZShiQ29tcGFyYWJsZSk7XG4gICAgICB9IGVsc2UgeyAvLyBUZXh0b1xuICAgICAgICByZXN1bHQgPSBhQ29tcGFyYWJsZS5sb2NhbGVDb21wYXJlKGJDb21wYXJhYmxlLCAnZXMnLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScsIGlnbm9yZVB1bmN0dWF0aW9uOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICogKGlzQXNjID8gMSA6IC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlVGltZShpbnB1dDogc3RyaW5nKSB7IC8vIDMxLzEyLzIwMjMgMTI6MTI6MTIgb3IgMzEtMTItMjAyMyAxMjoxMjoxMiBmZWNoYXMgcXVlIGFjZXB0YSwgaGg6bW06c3MgZXMgb3BjaW9uYWxcbiAgICBsZXQgW2RhdGVQYXJ0LCB0aW1lUGFydF0gPSBpbnB1dC5zcGxpdCgnICcpO1xuICAgIGxldCBbZGF5LCBtb250aCwgeWVhcl0gPSBkYXRlUGFydC5zcGxpdCgvXFwvfC0vKS5tYXAoTnVtYmVyKTtcbiAgICBsZXQgW2hvdXJzID0gMCwgbWludXRlcyA9IDAsIHNlY29uZHMgPSAwXSA9ICh0aW1lUGFydCA/IHRpbWVQYXJ0LnNwbGl0KCc6JykgOiBbXSkubWFwKE51bWJlcik7XG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xuICAgIHJldHVybiBkYXRlLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZSBjYWxjdWxhIGxhIG9yZGVuYWNpw7NuIG51ZXZhXG4gICAqL1xuICBwcml2YXRlIGdldE5leHREaXJlY3Rpb24oaXRlbTogSGVhZENlbGxNb2RlbERhdGEpOiBPcmRlckJ5IHtcbiAgICBpZiAoaXRlbS5vcmRlckJ5ID09PSBPcmRlckJ5Lm5vbmUgfHwgaXRlbS5vcmRlckJ5ID09PSBPcmRlckJ5LmRlc2MpIHtcbiAgICAgIHJldHVybiBPcmRlckJ5LmFzYztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9yZGVyQnkuZGVzYztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2kgZXMgdW5hIGNhbnRpZGFkIGRlIGRpbmVybyBzZSBxdWl0YSDigqwgcGFyYSBwb2RlciBjb21wYXJhciBsb3MgbnVtZXJvc1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhbkN1cnJlbmN5KHR4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0eHQgPSB0eHQucmVwbGFjZSgv4oKsL2csICcnKTtcbiAgICByZXR1cm4gdHh0O1xuICB9XG5cbiAgc2VsZWN0RmlsdGVyKGl0ZW06IFRhYmxlQWR2YW5jZWRTZWxlY3RDb21wb25lbnQsIGl0ZW1WYWx1ZTogYW55KTogdm9pZCB7XG4gICAgaXRlbS52YWx1ZUNoYW5nZS5lbWl0KGl0ZW1WYWx1ZSk7XG5cbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkZXJDZWxscygpO1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdldFJvd3MoKTtcbiAgICBpZiAoaGVhZCAmJiByb3dzKSB7XG4gICAgICBoZWFkLmZvckVhY2goKGNlbGw6IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50LCBjZWxsSW5kZXgpID0+IHtcbiAgICAgIH0pO1xuICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBAVmlld0NoaWxkKCdjaGVja2JveCcpIGNoZWNrYm94Q29tcG9uZW50OiBDaGVja2JveEl0ZW1Db21wb25lbnQ7XG5cblxuICBjaGVja1VuY2hlY2tBbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrYm94Q29tcG9uZW50KSByZXR1cm47XG5cbiAgICBsZXQgeyBpbmRldGVybWluYXRlQ2hlY2tlZCwgY2hlY2tlZCB9ID0gdGhpcy5jaGVja2JveENvbXBvbmVudDtcbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGVja2JveENvbXBvbmVudC5pbmRldGVybWluYXRlQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5udW1iZXJPZlNlbGVjdGVkUm93cyA9IHRoaXMudG90YWxJdGVtcztcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsUGFnZXMpXG4gICAgICB0aGlzLnJvd3NDaGVja2VkSW5zaWRlID0ge307XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0ge307XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIHJvdy5jaGVja2VkID0gaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPyBmYWxzZSA6IGNoZWNrZWQ7XG4gICAgICAgIGlmICghaW5kZXRlcm1pbmF0ZUNoZWNrZWQpXG4gICAgICAgICAgc2VsZWN0ZWRSb3dzW3Jvdy5pZF0gPSBjaGVja2VkO1xuICAgICAgfSk7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLmFsbFJvd3NDaGVja2VkLmVtaXQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGluZGV0ZXJtaW5hdGVDaGVja2VkIHx8ICFjaGVja2VkKSB7XG4gICAgICAgIHRoaXMuYWxsUm93c0NoZWNrZWQuZW1pdChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RBbGxQYWdlcykge1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWRSb3dzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucm93c1VuQ2hlY2tlZC5lbWl0KEFycmF5LmZyb20odGhpcy51bnNlbGVjdGVkUm93cykpO1xuICAgICAgfVxuICAgICAgdGhpcy5yb3dzQ2hlY2tlZEluc2lkZSA9IHsgLi4udGhpcy5yb3dzQ2hlY2tlZEluc2lkZSwgLi4uc2VsZWN0ZWRSb3dzIH1cbiAgICAgIHRoaXMucm93c0NoZWNrZWQuZW1pdCh0aGlzLnJvd3NDaGVja2VkSW5zaWRlKTtcblxuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0YWJsZUNvbnRlbnQ+XG4gIFxuICA8ZGl2ICpuZ0lmPVwiaGFzQ2hlY2tib3hlc1wiIGNsYXNzPVwibGc6ZmxleCBsZzpmbGV4LXdyYXAgbGc6dy1mdWxsXCIgYXJpYS1sYWJlbGxlZGJ5PVwiYWNjaW9uZXMtZW50cmFkYXNcIj5cbiAgICA8aDMgaWQ9XCJhY2Npb25lcy1lbnRyYWRhc1wiIGNsYXNzPVwic3Itb25seVwiPlNlbGVjY2nDs24gbcO6bHRpcGxlIHkgQWNjaW9uZXMgc29icmUgZWwgbGlzdGFkbyBkZSBlbnRyYWRhczwvaDM+XG4gICAgPGRpdiBpZD1cInNlbGVjdGlvbi1ob21lXCIgY2xhc3M9XCJwdC0yIHBiLTAgcGwtNCBtdC0wIGxnOmZsZXggc206ZmxleC0xIHB5LWJhc2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoLTEwXCI+XG4gICAgICAgIDxkZXN5LWNoZWNrYm94ZXMgbmFtZT1cInRvZG9zLWVudHJhZGFzLWNoYnhcIj5cbiAgICAgICAgICA8ZGVzeS1jaGVja2JveC1pdGVtXG4gICAgICAgICAgICAjY2hlY2tib3hcbiAgICAgICAgICAgIHZhbHVlPVwiaXRlbS1jaGVja2JveFwiXG4gICAgICAgICAgICBuYW1lPVwidG9kb3MtZW50cmFkYXNcIlxuICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiY2hlY2tVbmNoZWNrQWxsKClcIlxuICAgICAgICAgICAgW2lzSW5kZXRlcm1pbmF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzZXM9XCJjLWNoZWNrYm94ZXMtLXNtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMC41IGxlYWRpbmctNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayAtbXQtMSB0ZXh0LXNtIG5nLXN0YXItaW5zZXJ0ZWRcIj57e3NlbGVjdEFsbFBhZ2VzPydTZWxlY2Npb25hciB0b2RvJzonU2VsZWNjaW9uYXIgdG9kb3MgbG9zIGl0ZW1zIGRlIGVzdGEgcMOhZ2luYSd9fTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rlc3ktY2hlY2tib3gtaXRlbT5cbiAgICAgICAgPC9kZXN5LWNoZWNrYm94ZXM+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8dGFibGUgcm9sZT1cImdyaWRcIlxuICAgICAgICAgIFtjbGFzc109XCJbJ2MtdGFibGUtYWR2YW5jZWQgYm9yZGVyLXQtMiBib3JkZXItYi0yIGJvcmRlci1uZXV0cmFsLWJhc2UnLCBjbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgW2F0dHIuaWRdPVwiaWQgPyBpZCA6IG51bGxcIlxuICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJ0aGlzXCI+XG4gICAgICA8Y2FwdGlvbiAqbmdJZj1cImNhcHRpb24gfHwgY2FwdGlvbkNvbXBvbmVudFwiIFtjbGFzc109XCJnZXRDYXB0aW9uQ2xhc3MoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNhcHRpb25Db21wb25lbnQsIHRleHQ6IGNhcHRpb24gPyBjYXB0aW9uIDogbnVsbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2NhcHRpb24+XG4gICAgICA8dGhlYWQgKm5nSWY9XCJnZXRIZWFkZXJDZWxscygpXCI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLW5ldXRyYWwtYmFzZSBkaXZpZGUteCBkaXZpZGUtbmV1dHJhbC1iYXNlXCI+XG4gICAgICAgICAgICAgIDx0aCAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIiBzY29wZT1cImNvbFwiIFtjbGFzc109XCJbJ2FsaWduLXRvcCBweC1iYXNlIHB5LXhzJywgJ3ctMTYnLCBjaGVja2JveENsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5TZWxlY2Npb25hciBmaWxhPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRIZWFkZXJDZWxscygpOyBpbmRleCBhcyBpSGVhZGVyXCIgW2lkXT1cImdldElkSGVhZGVyKGlIZWFkZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiaXRlbS5vcmRlckJ5ID8gZ2V0U3RyaW5nT3JkZXJCeShpdGVtLm9yZGVyQnkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsnYWxpZ24tdG9wIHB4LWJhc2UgcHktc20gYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRleHQtbmV1dHJhbC1kYXJrJywgaXRlbS5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJpdGVtLmNvbHNwYW4gPyBpdGVtLmNvbHNwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJpdGVtLnJvd3NwYW4gPyBpdGVtLnJvd3NwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cIml0ZW1cIj5cblxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLm9yZGVyQnlcIiBjbGFzcz1cImlubGluZS1ibG9jayByZWxhdGl2ZVwiIChjbGljayk9XCJoYW5kbGVTb3J0QnlDb2x1bW4oaUhlYWRlciwkZXZlbnQpXCIgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlU29ydEJ5Q29sdW1uKGlIZWFkZXIsJGV2ZW50KVwiIChrZXlkb3duLnNwYWNlKT1cImhhbmRsZVNvcnRCeUNvbHVtbihpSGVhZGVyLCRldmVudClcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXRlbS5vcmRlckJ5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiaXRlbS5vcmRlckJ5ID8gJ2J1dHRvbicgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnRleHRcIj57e2l0ZW0udGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmNvbnRlbnRDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGl0ZW0uY29udGVudENvbXBvbmVudCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMtdGFibGUtYWR2YW5jZWRfX29yZGVyXCIgKm5nSWY9XCJpdGVtLm9yZGVyQnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlB1bHNhIHBhcmEgb3JkZW5hciBwb3IgZXN0YSBjb2x1bW5hPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19hc2NlbmRpbmdcIiAqbmdJZj1cIml0ZW0ub3JkZXJCeSA9PT0gb3JkZXJCeVR5cGUuYXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTQwIDE0MFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHdpZHRoPVwiMWVtXCIgaGVpZ2h0PVwiMWVtXCI+PHBhdGggZD1cIk0xMTIuMDcgMzcuOTNsLTM1LTM1YTEwIDEwIDAgMDAtMTQuMTQgMGwtMzUgMzVhMTAgMTAgMCAwMDE0LjE0IDE0LjE0bDEzLjY2LTEzLjY2QTIuNSAyLjUgMCAwMTYwIDQwLjE4VjEzMGExMCAxMCAwIDAwMjAgMFY0MC4xOGEyLjUgMi41IDAgMDE0LjI3LTEuNzdsMTMuNjYgMTMuNjZhMTAgMTAgMCAwMDE0LjE0LTE0LjE0elwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMtdGFibGUtYWR2YW5jZWRfX2Rlc2NlbmRpbmdcIiAqbmdJZj1cIml0ZW0ub3JkZXJCeSA9PT0gb3JkZXJCeVR5cGUuZGVzY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB3aWR0aD1cIjFlbVwiIGhlaWdodD1cIjFlbVwiPjxwYXRoIGQ9XCJNMjcuOTMgMTAyLjA3bDM1IDM1YTEwIDEwIDAgMDAxNC4xNCAwbDM1LTM1YTEwIDEwIDAgMDAtMTQuMTQtMTQuMTRsLTEzLjY2IDEzLjY2QTIuNSAyLjUgMCAwMTgwIDk5LjgyVjEwYTEwIDEwIDAgMDAtMjAgMHY4OS44MmEyLjUgMi41IDAgMDEtNC4yNyAxLjc3TDQyLjA3IDg3LjkzYTEwIDEwIDAgMDAtMTQuMTQgMTQuMTR6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYy10YWJsZS1hZHZhbmNlZF9fbm9uZVwiICAqbmdJZj1cIml0ZW0ub3JkZXJCeSA9PT0gb3JkZXJCeVR5cGUubm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiBjbGFzcz1cInRleHQtbmV1dHJhbC1kYXJrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgd2lkdGg9XCIxZW1cIiBoZWlnaHQ9XCIxZW1cIj48cGF0aCBkPVwiTTk0LjcgOTcuMmwtMTcuMiAxNy4xOVYyNS42MUw5NC43IDQyLjhhNy41IDcuNSAwIDAwMTAuNi0xMC42bC0zMC0zMGE3LjQ5IDcuNDkgMCAwMC0xMC42IDBsLTMwIDMwYTcuNSA3LjUgMCAwMDEwLjYgMTAuNmwxNy4yLTE3LjE5djg4Ljc4TDQ1LjMgOTcuMmE3LjUgNy41IDAgMTAtMTAuNiAxMC42bDMwIDMwYTcuNDggNy40OCAwIDAwMTAuNiAwbDMwLTMwYTcuNSA3LjUgMCAwMC0xMC42LTEwLjZ6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLm9yZGVyQnlcIiBjbGFzcz1cImlubGluZS1ibG9jayByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZXh0XCI+e3tpdGVtLnRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5jb250ZW50Q29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBpdGVtLmNvbnRlbnRDb21wb25lbnQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cblxuICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciBjbGFzcz1cImRpdmlkZS14IGRpdmlkZS1uZXV0cmFsLWJhc2VcIiAqbmdJZj1cImhhc0ZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNDaGVja2JveGVzXCIgW25nQ2xhc3NdPVwiY2hlY2tib3hDbGFzc2VzXCI+PC90ZD5cbiAgICAgICAgICAgICAgPHRkIHRhYmluZGV4PVwiLTFcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRIZWFkZXJDZWxscygpOyBpbmRleCBhcyBpSGVhZFwiIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydhbGlnbi10b3AgcHgtYmFzZSBwYi1zbSBib3JkZXItbmV1dHJhbC1iYXNlIGJvcmRlci1iLTAgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1ub3JtYWwgdGV4dC1uZXV0cmFsLWRhcmsnLCBpdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5oYXNTZWxlY3QgJiYgZ2V0U2VsZWN0Rm9ySXRlbShpdGVtKSAhPT0gbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVTZWxlY3Q7IGNvbnRleHQ6IHtzZWxlY3RhYmxlOiBnZXRTZWxlY3RGb3JJdGVtKGl0ZW0pfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlU2VsZWN0IGxldC1zZWxlY3RhYmxlPVwic2VsZWN0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkZXN5LXNlbGVjdCBbaWRdPVwiZ2V0SWRIZWFkZXJTZWxlY3QoaUhlYWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERhdGFdPVwieyB0ZXh0OiAnRmlsdHJhciBwb3IgZXN0YSBjb2x1bW5hJywgY2xhc3NlczogJ3NyLW9ubHknIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzZXNdPVwic2VsZWN0YWJsZS5jbGFzc2VzID8gc2VsZWN0YWJsZS5jbGFzc2VzIDogJ2Mtc2VsZWN0LS1zbSB3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBDbGFzc2VzXT1cInNlbGVjdGFibGUuZm9ybUdyb3VwQ2xhc3NlcyA/IHNlbGVjdGFibGUuZm9ybUdyb3VwQ2xhc3NlcyA6ICctbXQtc20gbWItMCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwic2VsZWN0YWJsZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJnZXRJdGVtU2VsZWN0T3B0aW9ucyhzZWxlY3RhYmxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0YWJsZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpYmVkQnldPVwiZ2V0SWRIZWFkZXJTZWxlY3QoaUhlYWQpXCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlU2VsZWN0XCIgKG5nTW9kZWxDaGFuZ2UpPVwidXNlUGFnaW5hdGlvbiA/IGhhbmRsZUJ1dHRvblNlYXJjaChpdGVtKSA6IGhhbmRsZUlucHV0U2VhcmNoKGl0ZW0pXCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVdPVwic2VsZWN0YWJsZS5yb2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwic2VsZWN0YWJsZS5hcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFEZXNjcmliZWRCeV09XCJzZWxlY3RhYmxlLmFyaWFEZXNjcmliZWRCeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsbGVkQnldPVwic2VsZWN0YWJsZS5hcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUhpZGRlbl09XCJzZWxlY3RhYmxlLmFyaWFIaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFEaXNhYmxlZF09XCJzZWxlY3RhYmxlLmFyaWFEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUNvbnRyb2xzXT1cInNlbGVjdGFibGUuYXJpYUNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhQ3VycmVudF09XCJzZWxlY3RhYmxlLmFyaWFDdXJyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGl2ZV09XCJzZWxlY3RhYmxlLmFyaWFMaXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhRXhwYW5kZWRdPVwic2VsZWN0YWJsZS5hcmlhRXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFFcnJvck1lc3NhZ2VdPVwic2VsZWN0YWJsZS5hcmlhRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhSGFzUG9wdXBdPVwic2VsZWN0YWJsZS5hcmlhSGFzUG9wdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInNlbGVjdGFibGUudGFiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rlc3ktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmhhc1NlbGVjdCAmJiBpdGVtLmhhc0ZpbHRlclwiIGNsYXNzPVwicGItc21cIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRlc3ktc2VhcmNoLWJhciAqbmdJZj1cIml0ZW0uaGFzRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlRmlsdGVyXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cInVzZVBhZ2luYXRpb24gPyBoYW5kbGVCdXR0b25TZWFyY2goaXRlbSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiIXVzZVBhZ2luYXRpb24gPyBoYW5kbGVJbnB1dFNlYXJjaChpdGVtKTogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVGV4dD1cIkJ1c2NhciBlbiBlc3RhIGNvbHVtbmFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0SWRIZWFkZXJGaWx0ZXIoaUhlYWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdXNjYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Nlc109XCJbJ2MtaW5wdXQtLXNtJywgaXRlbS5maWx0ZXJDbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsYXNzZXM9XCJtLXhzIHAtMC41IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpYmVkQnldPVwiZ2V0SWRIZWFkZXIoaUhlYWQpXCI+IDwvZGVzeS1zZWFyY2gtYmFyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG5cblxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGdldFZpc2libGVSb3dzKCk7IGluZGV4IGFzIGlSb3dcIiBjbGFzcz1cImJvcmRlci10IGJvcmRlci1iIGJvcmRlci1uZXV0cmFsLWJhc2UgaG92ZXI6YmctbmV1dHJhbC1saWdodGVyXCJcbiAgICAgICAgICAgICAgW2Rlc3lSb3ddPVwicm93XCI+XG4gICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbCBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXNtJywgY2hlY2tib3hDbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCIgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjLWNoZWNrYm94ZXMgYy1jaGVja2JveGVzLS1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbXgtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInctNiBoLTYgdHJhbnNpdGlvbiBkdXJhdGlvbi0xNTAgZWFzZS1pbi1vdXQgYm9yZGVyLWJsYWNrIGZvY3VzOmJvcmRlci1ibGFjayBmb2N1czpzaGFkb3ctb3V0bGluZS1mb2N1cy1pbnB1dCBmb2N1czpyaW5nLTQgZm9jdXM6cmluZy1vZmZzZXQtMCBmb2N1czpyaW5nLXdhcm5pbmctYmFzZSBkaXNhYmxlZDpiZy1uZXV0cmFsLWxpZ2h0IGRpc2FibGVkOmJvcmRlci1uZXV0cmFsLWJhc2UgdGV4dC1wcmltYXJ5LWJhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LmNoZWNrZWRcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVDaGVja2JveENoYW5nZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0SWRSb3dDaGVja2JveChpUm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0SWRSb3dDaGVja2JveChpUm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0wLjUgbGVhZGluZy01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzci1vbmx5IGJsb2NrIHRleHQtc20gLW10LTFcIiBbZm9yXT1cImdldElkUm93Q2hlY2tib3goaVJvdylcIj5TZWxlY2Npb25hIGZpbGEge3sgaVJvdyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93LmNlbGxzTGlzdDsgZmlyc3QgYXMgaXNGaXJzdENlbGw7IGluZGV4IGFzIGNvbHVtbkluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJmaXJzdENlbGxJc0hlYWRlciAmJiBpc0ZpcnN0Q2VsbDsgZWxzZSBlbHNlVGRcIiBzY29wZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsncHgtYmFzZSBweS14cyBib3JkZXItbmV1dHJhbC1iYXNlIGJvcmRlci1iLTAgYm9yZGVyLXIgdGV4dC1sZWZ0IGZvbnQtbm9ybWFsIHRleHQtc20gdGV4dC1uZXV0cmFsLWRhcmsnLCBjZWxsLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICBkZXN5Q2VsbCBbcm93XT1cInJvd1wiIFtyb3dJbmRleF09XCJpUm93XCIgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhbiA/IGNlbGwuY29sc3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJjZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0YWJpbmRleD1cIi0xXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsncHgtYmFzZSBweS1zbScsIGNlbGwuY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN5Q2VsbCBbcm93XT1cInJvd1wiIFtyb3dJbmRleF09XCJpUm93XCIgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4gPyBjZWxsLmNvbHNwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzeUFwcEFjY2Vzc2liaWxpdHldPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwudGFiaW5kZXggPyBjZWxsLnRhYmluZGV4IDogLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICAgIFxuICAgICAgPHRmb290ICpuZ0lmPVwiZ2V0Rm9vdGVyQ2VsbHMoKVwiPlxuICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBmb290IG9mIGdldEZvb3RlckNlbGxzKCk7IGluZGV4IGFzIGlGb290ZXJcIiBjbGFzcz1cImJvcmRlci10LTIgYm9yZGVyLWIgYm9yZGVyLW5ldXRyYWwtYmFzZSBob3ZlcjpiZy1uZXV0cmFsLWxpZ2h0ZXJcIj5cbiAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQ2hlY2tib3hlc1wiIGRlc3lGb2N1c0NsaWNrZWRDZWxsIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjaGVja2JveENsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYy1jaGVja2JveGVzIGMtY2hlY2tib3hlcy0tc21cIj5cbiAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG14LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJ3LTYgaC02IHRyYW5zaXRpb24gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0IGJvcmRlci1ibGFjayBmb2N1czpib3JkZXItYmxhY2sgZm9jdXM6c2hhZG93LW91dGxpbmUtZm9jdXMtaW5wdXQgZm9jdXM6cmluZy00IGZvY3VzOnJpbmctb2Zmc2V0LTAgZm9jdXM6cmluZy13YXJuaW5nLWJhc2UgZGlzYWJsZWQ6YmctbmV1dHJhbC1saWdodCBkaXNhYmxlZDpib3JkZXItbmV1dHJhbC1iYXNlIHRleHQtcHJpbWFyeS1iYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvb3QuY2hlY2tlZFwiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUNoZWNrYm94Q2hhbmdlKGZvb3QpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0SWRSb3dDaGVja2JveChpRm9vdGVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0SWRSb3dDaGVja2JveChpRm9vdGVyKVwiPlxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0wLjUgbGVhZGluZy01XCI+XG4gICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzci1vbmx5IGJsb2NrIHRleHQtc20gLW10LTFcIiBbZm9yXT1cImdldElkUm93Q2hlY2tib3goaUZvb3RlcilcIj5TZWxlY2Npb25hIGZpbGEge3sgaUZvb3RlciB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2YgZm9vdC5jZWxsc0xpc3Q7IGZpcnN0IGFzIGlzRmlyc3RDZWxsOyBpbmRleCBhcyBjb2x1bW5JbmRleFwiPlxuICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiZmlyc3RDZWxsSXNIZWFkZXIgJiYgaXNGaXJzdENlbGw7IGVsc2UgZWxzZVRkXCIgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHkteHMgYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIGJvcmRlci1yIHRleHQtbGVmdCBmb250LW5vcm1hbCB0ZXh0LXNtIHRleHQtbmV1dHJhbC1kYXJrJywgY2VsbC5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgZGVzeUNlbGwgW3Jvd109XCJyb3dcIiBbcm93SW5kZXhdPVwiaUZvb3RlclwiIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4gPyBjZWxsLmNvbHNwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJjZWxsLnJvd3NwYW4gPyBjZWxsLnJvd3NwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZCA/IGNlbGwuaWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbZGVzeUFwcEFjY2Vzc2liaWxpdHldPVwiY2VsbFwiPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VUZD5cbiAgICAgICAgICAgICAgICAgICA8dGQgdGFiaW5kZXg9XCItMVwiIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjZWxsLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGVzeUNlbGwgW3Jvd109XCJyb3dcIiBbcm93SW5kZXhdPVwiaUZvb3RlclwiIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZCA/IGNlbGwuaWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLnRhYmluZGV4ID8gY2VsbC50YWJpbmRleCA6IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPC90cj5cbiAgICA8L3Rmb290PlxuICA8L3RhYmxlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiAqbmdJZj1cIndyYXBwZXI7IGVsc2UgdGFibGVDb250ZW50XCIgW2NsYXNzXT1cIndyYXBwZXIuY2xhc3Nlc1wiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|