slick-components 4.4.13 → 4.4.16
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/css/slick-components.css +598 -365
- package/css/slick-components.min.css +1 -1
- package/esm2020/public-api.mjs +43 -0
- package/esm2020/slick-accordion/slick-accordion-item-header.component.mjs +14 -0
- package/esm2020/slick-accordion/slick-accordion-item.component.mjs +86 -0
- package/esm2020/slick-accordion/slick-accordion.component.mjs +75 -0
- package/esm2020/slick-accordion/slick-accordion.module.mjs +23 -0
- package/esm2020/slick-auto-complete/slick-auto-complete-list-item-template.directive.mjs +22 -0
- package/esm2020/slick-auto-complete/slick-auto-complete.component.mjs +375 -0
- package/esm2020/slick-auto-complete/slick-auto-complete.module.mjs +24 -0
- package/esm2020/slick-button-spinner/slick-button-spinner.component.mjs +175 -0
- package/esm2020/slick-button-spinner/slick-button-spinner.module.mjs +19 -0
- package/esm2020/slick-calendar/slick-calendar.component.mjs +246 -0
- package/esm2020/slick-calendar/slick-calendar.module.mjs +19 -0
- package/esm2020/slick-card/slick-card-header.component.mjs +14 -0
- package/esm2020/slick-card/slick-card.component.mjs +42 -0
- package/esm2020/slick-card/slick-card.module.mjs +20 -0
- package/esm2020/slick-components.mjs +5 -0
- package/esm2020/slick-confirm-dialog/slick-confirm-dialog.component.mjs +65 -0
- package/esm2020/slick-confirm-dialog/slick-confirm-dialog.module.mjs +20 -0
- package/esm2020/slick-container/slick-container-body.component.mjs +24 -0
- package/esm2020/slick-container/slick-container-footer.component.mjs +20 -0
- package/esm2020/slick-container/slick-container-header.component.mjs +20 -0
- package/esm2020/slick-container/slick-container.component.mjs +21 -0
- package/esm2020/slick-container/slick-container.module.mjs +25 -0
- package/esm2020/slick-context-menu/slick-context-menu-item.component.mjs +14 -0
- package/esm2020/slick-context-menu/slick-context-menu.component.mjs +48 -0
- package/esm2020/slick-context-menu/slick-context-menu.module.mjs +20 -0
- package/{esm2015/slick-currency-mask/slick-currency-mask-options.model.js → esm2020/slick-currency-mask/slick-currency-mask-options.model.mjs} +0 -0
- package/esm2020/slick-currency-mask/slick-currency-mask.directive.mjs +233 -0
- package/esm2020/slick-currency-mask/slick-currency-mask.module.mjs +19 -0
- package/esm2020/slick-date-picker/slick-date-picker.component.mjs +278 -0
- package/esm2020/slick-date-picker/slick-date-picker.module.mjs +21 -0
- package/esm2020/slick-dialog/slick-dialog-footer.component.mjs +24 -0
- package/esm2020/slick-dialog/slick-dialog.component.mjs +294 -0
- package/esm2020/slick-dialog/slick-dialog.module.mjs +23 -0
- package/esm2020/slick-dialog/slick-dialog.service.mjs +68 -0
- package/esm2020/slick-drag-drop/slick-drag-drop.directive.mjs +13 -0
- package/esm2020/slick-drag-drop/slick-drag-drop.module.mjs +21 -0
- package/esm2020/slick-drag-drop/slick-draggable.directive.mjs +13 -0
- package/{esm2015/slick-drop-down/slick-drop-down-button.model.js → esm2020/slick-drop-down/slick-drop-down-button.model.mjs} +0 -0
- package/esm2020/slick-drop-down/slick-drop-down.component.mjs +479 -0
- package/esm2020/slick-drop-down/slick-drop-down.module.mjs +24 -0
- package/esm2020/slick-drop-down/slick-drop-down.service.mjs +55 -0
- package/esm2020/slick-drop-list/slick-drop-list-grab.directive.mjs +18 -0
- package/esm2020/slick-drop-list/slick-drop-list-item.directive.mjs +18 -0
- package/esm2020/slick-drop-list/slick-drop-list.directive.mjs +215 -0
- package/esm2020/slick-drop-list/slick-drop-list.module.mjs +23 -0
- package/esm2020/slick-email-viewer/slick-email-viewer-dialog.component.mjs +81 -0
- package/esm2020/slick-email-viewer/slick-email-viewer.component.mjs +42 -0
- package/esm2020/slick-email-viewer/slick-email-viewer.module.mjs +26 -0
- package/{esm2015/slick-emailer/slick-emailer-address.model.js → esm2020/slick-emailer/slick-emailer-address.model.mjs} +0 -0
- package/esm2020/slick-emailer/slick-emailer-dialog.component.mjs +153 -0
- package/esm2020/slick-emailer/slick-emailer.component.mjs +235 -0
- package/{esm2015/slick-emailer/slick-emailer.model.js → esm2020/slick-emailer/slick-emailer.model.mjs} +0 -0
- package/esm2020/slick-emailer/slick-emailer.module.mjs +29 -0
- package/esm2020/slick-file-drop/slick-file-drop.component.mjs +156 -0
- package/esm2020/slick-file-drop/slick-file-drop.module.mjs +20 -0
- package/esm2020/slick-file-list/slick-file-list-item.component.mjs +173 -0
- package/esm2020/slick-file-list/slick-file-list.component.mjs +130 -0
- package/esm2020/slick-file-list/slick-file-list.module.mjs +23 -0
- package/{esm2015/slick-file-model/slick-file.model.js → esm2020/slick-file-model/slick-file.model.mjs} +0 -0
- package/esm2020/slick-google-address-search/slick-google-address-search.directive.mjs +75 -0
- package/esm2020/slick-google-address-search/slick-google-address-search.module.mjs +19 -0
- package/esm2020/slick-google-map/slick-google-map-dialog.component.mjs +50 -0
- package/esm2020/slick-google-map/slick-google-map.component.mjs +48 -0
- package/esm2020/slick-google-map/slick-google-map.module.mjs +22 -0
- package/esm2020/slick-grid/slick-grid-column-template.directive.mjs +19 -0
- package/{esm2015/slick-grid/slick-grid-column.model.js → esm2020/slick-grid/slick-grid-column.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-favorite.model.js → esm2020/slick-grid/slick-grid-favorite.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-request.model.js → esm2020/slick-grid/slick-grid-request.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-response.model.js → esm2020/slick-grid/slick-grid-response.model.mjs} +0 -0
- package/esm2020/slick-grid/slick-grid-sanitize.pipe.mjs +20 -0
- package/esm2020/slick-grid/slick-grid.component.mjs +793 -0
- package/esm2020/slick-grid/slick-grid.module.mjs +43 -0
- package/{esm2015/slick-grid/slick-grid.options.js → esm2020/slick-grid/slick-grid.options.mjs} +0 -0
- package/esm2020/slick-grid/slick-grid.service.mjs +66 -0
- package/esm2020/slick-multi-select/slick-multi-select.component.mjs +362 -0
- package/esm2020/slick-multi-select/slick-multi-select.module.mjs +20 -0
- package/esm2020/slick-multi-select/slick-multi-select.service.mjs +77 -0
- package/esm2020/slick-ordered-list/slick-ordered-list.component.mjs +200 -0
- package/esm2020/slick-ordered-list/slick-ordered-list.module.mjs +20 -0
- package/esm2020/slick-paging/slick-paging.component.mjs +185 -0
- package/esm2020/slick-paging/slick-paging.module.mjs +19 -0
- package/esm2020/slick-photo-gallery/slick-photo-gallery.component.mjs +98 -0
- package/{esm2015/slick-photo-gallery/slick-photo-gallery.model.js → esm2020/slick-photo-gallery/slick-photo-gallery.model.mjs} +0 -0
- package/esm2020/slick-photo-gallery/slick-photo-gallery.module.mjs +21 -0
- package/esm2020/slick-pick-list/slick-pick-list.component.mjs +84 -0
- package/esm2020/slick-pick-list/slick-pick-list.module.mjs +20 -0
- package/esm2020/slick-popover/slick-popover.component.mjs +204 -0
- package/esm2020/slick-popover/slick-popover.module.mjs +19 -0
- package/esm2020/slick-profile-picture/slick-profile-picture.component.mjs +267 -0
- package/esm2020/slick-profile-picture/slick-profile-picture.module.mjs +20 -0
- package/esm2020/slick-progress-bar/slick-progress-bar.module.mjs +18 -0
- package/esm2020/slick-progress-bar/slick-progress-bar.service.mjs +53 -0
- package/esm2020/slick-screen-blocker/slick-screen-blocker.module.mjs +18 -0
- package/esm2020/slick-screen-blocker/slick-screen-blocker.service.mjs +83 -0
- package/{esm2015/slick-slider/slick-slider-tick.model.js → esm2020/slick-slider/slick-slider-tick.model.mjs} +0 -0
- package/esm2020/slick-slider/slick-slider.component.mjs +90 -0
- package/esm2020/slick-slider/slick-slider.module.mjs +20 -0
- package/esm2020/slick-split-screen/slick-screen-split-left-content.component.mjs +15 -0
- package/esm2020/slick-split-screen/slick-screen-split-right-content.component.mjs +15 -0
- package/esm2020/slick-split-screen/slick-split-screen.component.mjs +159 -0
- package/esm2020/slick-split-screen/slick-split-screen.module.mjs +21 -0
- package/esm2020/slick-tabs/slick-tab-header.component.mjs +28 -0
- package/esm2020/slick-tabs/slick-tab.component.mjs +63 -0
- package/{esm2015/slick-tabs/slick-tab.model.js → esm2020/slick-tabs/slick-tab.model.mjs} +0 -0
- package/esm2020/slick-tabs/slick-tabs.component.mjs +107 -0
- package/esm2020/slick-tabs/slick-tabs.module.mjs +23 -0
- package/esm2020/slick-toast/slick-toast.module.mjs +18 -0
- package/esm2020/slick-toast/slick-toast.service.mjs +88 -0
- package/{esm2015/slick-tree-view/slick-tree-node.model.js → esm2020/slick-tree-view/slick-tree-node.model.mjs} +0 -0
- package/esm2020/slick-tree-view/slick-tree-view.component.mjs +293 -0
- package/esm2020/slick-tree-view/slick-tree-view.module.mjs +22 -0
- package/esm2020/slick-type-ahead/slick-type-ahead.directive.mjs +164 -0
- package/esm2020/slick-type-ahead/slick-type-ahead.module.mjs +18 -0
- package/esm2020/slick-validation-indicator/slick-validation-indicator.directive.mjs +63 -0
- package/esm2020/slick-validation-indicator/slick-validation-indicator.module.mjs +19 -0
- package/esm2020/utils/slick-function-lock.service.mjs +55 -0
- package/esm2020/utils/slick-init.service.mjs +49 -0
- package/esm2020/utils/slick-log.service.mjs +23 -0
- package/esm2020/utils/slick-sleep.service.mjs +14 -0
- package/esm2020/utils/slick-utils.service.mjs +247 -0
- package/fesm2015/{slick-components.js → slick-components.mjs} +2779 -2070
- package/fesm2015/slick-components.mjs.map +1 -0
- package/fesm2020/slick-components.mjs +8467 -0
- package/fesm2020/slick-components.mjs.map +1 -0
- package/package.json +20 -8
- package/public-api.d.ts +8 -8
- package/slick-accordion/slick-accordion-item-header.component.d.ts +3 -0
- package/slick-accordion/slick-accordion-item.component.d.ts +3 -0
- package/slick-accordion/slick-accordion.component.d.ts +3 -0
- package/slick-accordion/slick-accordion.module.d.ts +8 -0
- package/slick-auto-complete/slick-auto-complete-list-item-template.directive.d.ts +3 -0
- package/slick-auto-complete/slick-auto-complete.component.d.ts +3 -0
- package/slick-auto-complete/slick-auto-complete.module.d.ts +8 -0
- package/slick-button-spinner/slick-button-spinner.component.d.ts +3 -0
- package/slick-button-spinner/slick-button-spinner.module.d.ts +6 -0
- package/slick-calendar/slick-calendar.component.d.ts +3 -0
- package/slick-calendar/slick-calendar.module.d.ts +6 -0
- package/slick-card/slick-card-header.component.d.ts +3 -0
- package/slick-card/slick-card.component.d.ts +3 -0
- package/slick-card/slick-card.module.d.ts +10 -0
- package/slick-components.d.ts +1 -22
- package/slick-confirm-dialog/slick-confirm-dialog.component.d.ts +3 -0
- package/slick-confirm-dialog/slick-confirm-dialog.module.d.ts +7 -0
- package/slick-container/slick-container-body.component.d.ts +3 -0
- package/slick-container/slick-container-footer.component.d.ts +3 -0
- package/slick-container/slick-container-header.component.d.ts +3 -0
- package/slick-container/slick-container.component.d.ts +3 -0
- package/slick-container/slick-container.module.d.ts +9 -0
- package/slick-context-menu/slick-context-menu-item.component.d.ts +3 -0
- package/slick-context-menu/slick-context-menu.component.d.ts +3 -0
- package/slick-context-menu/slick-context-menu.module.d.ts +7 -0
- package/slick-currency-mask/slick-currency-mask.directive.d.ts +3 -0
- package/slick-currency-mask/slick-currency-mask.module.d.ts +5 -0
- package/slick-date-picker/slick-date-picker.component.d.ts +3 -0
- package/slick-date-picker/slick-date-picker.module.d.ts +8 -0
- package/slick-dialog/slick-dialog-footer.component.d.ts +3 -0
- package/slick-dialog/slick-dialog.component.d.ts +3 -0
- package/slick-dialog/slick-dialog.module.d.ts +10 -1
- package/slick-dialog/slick-dialog.service.d.ts +3 -0
- package/slick-drag-drop/slick-drag-drop.directive.d.ts +3 -0
- package/slick-drag-drop/slick-drag-drop.module.d.ts +11 -0
- package/slick-drag-drop/slick-draggable.directive.d.ts +3 -0
- package/slick-drop-down/slick-drop-down.component.d.ts +3 -0
- package/slick-drop-down/slick-drop-down.module.d.ts +9 -0
- package/slick-drop-down/slick-drop-down.service.d.ts +3 -0
- package/slick-drop-list/slick-drop-list-grab.directive.d.ts +3 -0
- package/slick-drop-list/slick-drop-list-item.directive.d.ts +3 -0
- package/slick-drop-list/slick-drop-list.directive.d.ts +13 -7
- package/slick-drop-list/slick-drop-list.module.d.ts +14 -0
- package/slick-email-viewer/slick-email-viewer-dialog.component.d.ts +3 -0
- package/slick-email-viewer/slick-email-viewer.component.d.ts +3 -0
- package/slick-email-viewer/slick-email-viewer.module.d.ts +10 -0
- package/slick-emailer/slick-emailer-dialog.component.d.ts +3 -0
- package/slick-emailer/slick-emailer.component.d.ts +3 -0
- package/slick-emailer/slick-emailer.module.d.ts +13 -0
- package/slick-file-drop/slick-file-drop.component.d.ts +3 -0
- package/slick-file-drop/slick-file-drop.module.d.ts +7 -0
- package/slick-file-list/slick-file-list-item.component.d.ts +3 -0
- package/slick-file-list/slick-file-list.component.d.ts +3 -0
- package/slick-file-list/slick-file-list.module.d.ts +10 -0
- package/slick-google-address-search/slick-google-address-search.directive.d.ts +3 -0
- package/slick-google-address-search/slick-google-address-search.module.d.ts +6 -0
- package/slick-google-map/slick-google-map-dialog.component.d.ts +3 -0
- package/slick-google-map/slick-google-map.component.d.ts +3 -0
- package/slick-google-map/slick-google-map.module.d.ts +8 -0
- package/slick-grid/slick-grid-column-template.directive.d.ts +3 -0
- package/slick-grid/slick-grid-sanitize.pipe.d.ts +3 -0
- package/slick-grid/slick-grid.component.d.ts +3 -0
- package/slick-grid/slick-grid.module.d.ts +16 -0
- package/slick-grid/slick-grid.service.d.ts +3 -0
- package/slick-multi-select/slick-multi-select.component.d.ts +3 -0
- package/slick-multi-select/slick-multi-select.module.d.ts +7 -0
- package/slick-multi-select/slick-multi-select.service.d.ts +3 -0
- package/slick-ordered-list/slick-ordered-list.component.d.ts +3 -0
- package/slick-ordered-list/slick-ordered-list.module.d.ts +7 -0
- package/slick-paging/slick-paging.component.d.ts +3 -0
- package/slick-paging/slick-paging.module.d.ts +6 -0
- package/slick-photo-gallery/slick-photo-gallery.component.d.ts +3 -0
- package/slick-photo-gallery/slick-photo-gallery.module.d.ts +6 -0
- package/slick-pick-list/slick-pick-list.component.d.ts +3 -0
- package/slick-pick-list/slick-pick-list.module.d.ts +7 -0
- package/slick-popover/slick-popover.component.d.ts +3 -0
- package/slick-popover/slick-popover.module.d.ts +6 -0
- package/slick-profile-picture/slick-profile-picture.component.d.ts +3 -0
- package/slick-profile-picture/slick-profile-picture.module.d.ts +7 -0
- package/slick-progress-bar/slick-progress-bar.module.d.ts +5 -0
- package/slick-progress-bar/slick-progress-bar.service.d.ts +3 -0
- package/slick-screen-blocker/slick-screen-blocker.module.d.ts +5 -0
- package/slick-screen-blocker/slick-screen-blocker.service.d.ts +3 -0
- package/slick-slider/slick-slider.component.d.ts +3 -0
- package/slick-slider/slick-slider.module.d.ts +6 -0
- package/slick-split-screen/slick-screen-split-left-content.component.d.ts +3 -0
- package/slick-split-screen/slick-screen-split-right-content.component.d.ts +3 -0
- package/slick-split-screen/slick-split-screen.component.d.ts +3 -0
- package/slick-split-screen/slick-split-screen.module.d.ts +8 -0
- package/slick-tabs/slick-tab-header.component.d.ts +3 -0
- package/slick-tabs/slick-tab.component.d.ts +3 -0
- package/slick-tabs/slick-tabs.component.d.ts +3 -0
- package/slick-tabs/slick-tabs.module.d.ts +10 -0
- package/slick-toast/slick-toast.module.d.ts +5 -0
- package/slick-toast/slick-toast.service.d.ts +3 -0
- package/slick-tree-view/slick-tree-view.component.d.ts +3 -0
- package/slick-tree-view/slick-tree-view.module.d.ts +8 -0
- package/slick-type-ahead/slick-type-ahead.directive.d.ts +3 -0
- package/slick-type-ahead/slick-type-ahead.module.d.ts +5 -0
- package/slick-validation-indicator/slick-validation-indicator.directive.d.ts +3 -0
- package/slick-validation-indicator/slick-validation-indicator.module.d.ts +6 -0
- package/utils/slick-function-lock.service.d.ts +3 -0
- package/utils/slick-init.service.d.ts +3 -0
- package/utils/slick-log.service.d.ts +3 -0
- package/utils/slick-sleep.service.d.ts +3 -0
- package/utils/slick-utils.service.d.ts +5 -0
- package/bundles/slick-components.umd.js +0 -9777
- package/bundles/slick-components.umd.js.map +0 -1
- package/esm2015/public-api.js +0 -43
- package/esm2015/slick-accordion/slick-accordion-item-header.component.js +0 -10
- package/esm2015/slick-accordion/slick-accordion-item.component.js +0 -80
- package/esm2015/slick-accordion/slick-accordion.component.js +0 -77
- package/esm2015/slick-accordion/slick-accordion.module.js +0 -18
- package/esm2015/slick-auto-complete/slick-auto-complete-list-item-template.directive.js +0 -21
- package/esm2015/slick-auto-complete/slick-auto-complete.component.js +0 -352
- package/esm2015/slick-auto-complete/slick-auto-complete.module.js +0 -19
- package/esm2015/slick-button-spinner/slick-button-spinner.component.js +0 -186
- package/esm2015/slick-button-spinner/slick-button-spinner.module.js +0 -14
- package/esm2015/slick-calendar/slick-calendar.component.js +0 -233
- package/esm2015/slick-calendar/slick-calendar.module.js +0 -14
- package/esm2015/slick-card/slick-card-header.component.js +0 -10
- package/esm2015/slick-card/slick-card.component.js +0 -37
- package/esm2015/slick-card/slick-card.module.js +0 -14
- package/esm2015/slick-components.js +0 -27
- package/esm2015/slick-confirm-dialog/slick-confirm-dialog.component.js +0 -62
- package/esm2015/slick-confirm-dialog/slick-confirm-dialog.module.js +0 -15
- package/esm2015/slick-container/slick-container-body.component.js +0 -18
- package/esm2015/slick-container/slick-container-footer.component.js +0 -16
- package/esm2015/slick-container/slick-container-header.component.js +0 -16
- package/esm2015/slick-container/slick-container.component.js +0 -19
- package/esm2015/slick-container/slick-container.module.js +0 -20
- package/esm2015/slick-context-menu/slick-context-menu-item.component.js +0 -10
- package/esm2015/slick-context-menu/slick-context-menu.component.js +0 -43
- package/esm2015/slick-context-menu/slick-context-menu.module.js +0 -15
- package/esm2015/slick-currency-mask/slick-currency-mask.directive.js +0 -234
- package/esm2015/slick-currency-mask/slick-currency-mask.module.js +0 -14
- package/esm2015/slick-date-picker/slick-date-picker.component.js +0 -267
- package/esm2015/slick-date-picker/slick-date-picker.module.js +0 -16
- package/esm2015/slick-dialog/slick-dialog-footer.component.js +0 -18
- package/esm2015/slick-dialog/slick-dialog.component.js +0 -282
- package/esm2015/slick-dialog/slick-dialog.module.js +0 -18
- package/esm2015/slick-dialog/slick-dialog.service.js +0 -67
- package/esm2015/slick-drag-drop/slick-drag-drop.directive.js +0 -9
- package/esm2015/slick-drag-drop/slick-drag-drop.module.js +0 -14
- package/esm2015/slick-drag-drop/slick-draggable.directive.js +0 -9
- package/esm2015/slick-drop-down/slick-drop-down.component.js +0 -465
- package/esm2015/slick-drop-down/slick-drop-down.module.js +0 -19
- package/esm2015/slick-drop-down/slick-drop-down.service.js +0 -59
- package/esm2015/slick-drop-list/slick-drop-list-grab.directive.js +0 -18
- package/esm2015/slick-drop-list/slick-drop-list-item.directive.js +0 -18
- package/esm2015/slick-drop-list/slick-drop-list.directive.js +0 -162
- package/esm2015/slick-drop-list/slick-drop-list.module.js +0 -15
- package/esm2015/slick-email-viewer/slick-email-viewer-dialog.component.js +0 -61
- package/esm2015/slick-email-viewer/slick-email-viewer.component.js +0 -39
- package/esm2015/slick-email-viewer/slick-email-viewer.module.js +0 -21
- package/esm2015/slick-emailer/slick-emailer-dialog.component.js +0 -122
- package/esm2015/slick-emailer/slick-emailer.component.js +0 -226
- package/esm2015/slick-emailer/slick-emailer.module.js +0 -24
- package/esm2015/slick-file-drop/slick-file-drop.component.js +0 -144
- package/esm2015/slick-file-drop/slick-file-drop.module.js +0 -15
- package/esm2015/slick-file-list/slick-file-list-item.component.js +0 -156
- package/esm2015/slick-file-list/slick-file-list.component.js +0 -114
- package/esm2015/slick-file-list/slick-file-list.module.js +0 -18
- package/esm2015/slick-google-address-search/slick-google-address-search.directive.js +0 -75
- package/esm2015/slick-google-address-search/slick-google-address-search.module.js +0 -14
- package/esm2015/slick-google-map/slick-google-map-dialog.component.js +0 -45
- package/esm2015/slick-google-map/slick-google-map.component.js +0 -45
- package/esm2015/slick-google-map/slick-google-map.module.js +0 -17
- package/esm2015/slick-grid/slick-grid-column-template.directive.js +0 -19
- package/esm2015/slick-grid/slick-grid-sanitize.pipe.js +0 -20
- package/esm2015/slick-grid/slick-grid.component.js +0 -792
- package/esm2015/slick-grid/slick-grid.module.js +0 -38
- package/esm2015/slick-grid/slick-grid.service.js +0 -72
- package/esm2015/slick-multi-select/slick-multi-select.component.js +0 -356
- package/esm2015/slick-multi-select/slick-multi-select.module.js +0 -15
- package/esm2015/slick-multi-select/slick-multi-select.service.js +0 -74
- package/esm2015/slick-ordered-list/slick-ordered-list.component.js +0 -198
- package/esm2015/slick-ordered-list/slick-ordered-list.module.js +0 -15
- package/esm2015/slick-paging/slick-paging.component.js +0 -180
- package/esm2015/slick-paging/slick-paging.module.js +0 -14
- package/esm2015/slick-photo-gallery/slick-photo-gallery.component.js +0 -101
- package/esm2015/slick-photo-gallery/slick-photo-gallery.module.js +0 -16
- package/esm2015/slick-pick-list/slick-pick-list.component.js +0 -78
- package/esm2015/slick-pick-list/slick-pick-list.module.js +0 -15
- package/esm2015/slick-popover/slick-popover.component.js +0 -199
- package/esm2015/slick-popover/slick-popover.module.js +0 -14
- package/esm2015/slick-profile-picture/slick-profile-picture.component.js +0 -242
- package/esm2015/slick-profile-picture/slick-profile-picture.module.js +0 -15
- package/esm2015/slick-progress-bar/slick-progress-bar.module.js +0 -13
- package/esm2015/slick-progress-bar/slick-progress-bar.service.js +0 -50
- package/esm2015/slick-screen-blocker/slick-screen-blocker.module.js +0 -13
- package/esm2015/slick-screen-blocker/slick-screen-blocker.service.js +0 -80
- package/esm2015/slick-slider/slick-slider.component.js +0 -88
- package/esm2015/slick-slider/slick-slider.module.js +0 -15
- package/esm2015/slick-split-screen/slick-screen-split-left-content.component.js +0 -13
- package/esm2015/slick-split-screen/slick-screen-split-right-content.component.js +0 -13
- package/esm2015/slick-split-screen/slick-split-screen.component.js +0 -148
- package/esm2015/slick-split-screen/slick-split-screen.module.js +0 -16
- package/esm2015/slick-tabs/slick-tab-header.component.js +0 -25
- package/esm2015/slick-tabs/slick-tab.component.js +0 -67
- package/esm2015/slick-tabs/slick-tabs.component.js +0 -104
- package/esm2015/slick-tabs/slick-tabs.module.js +0 -17
- package/esm2015/slick-toast/slick-toast.module.js +0 -13
- package/esm2015/slick-toast/slick-toast.service.js +0 -91
- package/esm2015/slick-tree-view/slick-tree-view.component.js +0 -287
- package/esm2015/slick-tree-view/slick-tree-view.module.js +0 -17
- package/esm2015/slick-type-ahead/slick-type-ahead.directive.js +0 -155
- package/esm2015/slick-type-ahead/slick-type-ahead.module.js +0 -13
- package/esm2015/slick-validation-indicator/slick-validation-indicator.directive.js +0 -61
- package/esm2015/slick-validation-indicator/slick-validation-indicator.module.js +0 -14
- package/esm2015/utils/slick-function-lock.service.js +0 -54
- package/esm2015/utils/slick-init.service.js +0 -48
- package/esm2015/utils/slick-log.service.js +0 -27
- package/esm2015/utils/slick-sleep.service.js +0 -14
- package/esm2015/utils/slick-utils.service.js +0 -229
- package/fesm2015/slick-components.js.map +0 -1
- package/slick-components.metadata.json +0 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, forwardRef } from "@angular/core";
|
|
2
|
+
import { SlickDropDownService } from "./slick-drop-down.service";
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
4
|
+
import { SlickSleepService } from "../utils/slick-sleep.service";
|
|
5
|
+
import { SlickUtilsService } from "../utils/slick-utils.service";
|
|
6
|
+
import { SlickInitService } from "../utils/slick-init.service";
|
|
7
|
+
import { SlickLogService } from "../utils/slick-log.service";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./slick-drop-down.service";
|
|
10
|
+
import * as i2 from "@angular/common";
|
|
11
|
+
import * as i3 from "@angular/forms";
|
|
12
|
+
import * as i4 from "../slick-validation-indicator/slick-validation-indicator.directive";
|
|
13
|
+
export var SlickDropDownSearchTypes;
|
|
14
|
+
(function (SlickDropDownSearchTypes) {
|
|
15
|
+
SlickDropDownSearchTypes[SlickDropDownSearchTypes["startsWith"] = 0] = "startsWith";
|
|
16
|
+
SlickDropDownSearchTypes[SlickDropDownSearchTypes["eachWord"] = 1] = "eachWord";
|
|
17
|
+
SlickDropDownSearchTypes[SlickDropDownSearchTypes["any"] = 2] = "any";
|
|
18
|
+
})(SlickDropDownSearchTypes || (SlickDropDownSearchTypes = {}));
|
|
19
|
+
export class SlickDropDownComponent {
|
|
20
|
+
constructor(slickDropDownService, changeDetector) {
|
|
21
|
+
this.slickDropDownService = slickDropDownService;
|
|
22
|
+
this.changeDetector = changeDetector;
|
|
23
|
+
this.placeholder = '';
|
|
24
|
+
this.idFieldName = "id";
|
|
25
|
+
this.textFieldName = "text";
|
|
26
|
+
this.compact = false;
|
|
27
|
+
this.disabled = false;
|
|
28
|
+
this.allowEmpty = true;
|
|
29
|
+
this.width = '100%';
|
|
30
|
+
this.listWidth = '100%';
|
|
31
|
+
this.height = '300px';
|
|
32
|
+
this.showLoadingMessage = false;
|
|
33
|
+
this.searchType = SlickDropDownSearchTypes.startsWith;
|
|
34
|
+
this.isMobile = false;
|
|
35
|
+
this.onExpand = new EventEmitter();
|
|
36
|
+
this.onSelect = new EventEmitter();
|
|
37
|
+
this.onChange = new EventEmitter();
|
|
38
|
+
// This is necessary so that the scroll and resize events can add and remove the event properly,
|
|
39
|
+
// as well as getting the correct ES6 function
|
|
40
|
+
this.fnReposition = () => this.reposition();
|
|
41
|
+
this.fnDocumentClick = (e) => this.documentClick(e);
|
|
42
|
+
this.expanded = false;
|
|
43
|
+
this.filterText = '';
|
|
44
|
+
this.isVisible = false;
|
|
45
|
+
this.isAndroid = ((SlickInitService.getPlatform() || '').toLowerCase() === 'android');
|
|
46
|
+
this.skipOnFocusEvent = false;
|
|
47
|
+
this.skipClickExpand = false;
|
|
48
|
+
this.propagateChange = (_) => { };
|
|
49
|
+
this.uuid = SlickUtilsService.newGuid();
|
|
50
|
+
}
|
|
51
|
+
async ngOnInit() {
|
|
52
|
+
this.attachTo = this.attachTo || SlickInitService.getParams().attachTo || 'body';
|
|
53
|
+
}
|
|
54
|
+
ngAfterViewInit() {
|
|
55
|
+
}
|
|
56
|
+
// this is the initial value set to the component
|
|
57
|
+
writeValue(obj) {
|
|
58
|
+
if (obj !== null && obj !== undefined)
|
|
59
|
+
this.selectedId = obj;
|
|
60
|
+
else
|
|
61
|
+
this.selectedId = null;
|
|
62
|
+
this.selectItem(this.selectedId, false);
|
|
63
|
+
this.collapse();
|
|
64
|
+
}
|
|
65
|
+
// registers 'fn' that will be fired when changes are made
|
|
66
|
+
// this is how we emit the changes back to the form
|
|
67
|
+
registerOnChange(fn) {
|
|
68
|
+
this.propagateChange = fn;
|
|
69
|
+
}
|
|
70
|
+
// not used, used for touch input
|
|
71
|
+
registerOnTouched() { }
|
|
72
|
+
async ngOnChanges(changes) {
|
|
73
|
+
await SlickSleepService.sleep();
|
|
74
|
+
if (changes.items) {
|
|
75
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
76
|
+
this.selectItem(this.selectedId, false);
|
|
77
|
+
if (this.selectedTextInputRef && document.activeElement === this.selectedTextInputRef.nativeElement)
|
|
78
|
+
this.expand();
|
|
79
|
+
}
|
|
80
|
+
if (changes.showLoadingMessage) {
|
|
81
|
+
await SlickSleepService.sleep();
|
|
82
|
+
if (this.showLoadingMessage === true)
|
|
83
|
+
this.selectedText = "Loading...";
|
|
84
|
+
}
|
|
85
|
+
if (changes.getUrl) {
|
|
86
|
+
if (this.showLoadingMessage === true) {
|
|
87
|
+
this.selectedText = "Loading...";
|
|
88
|
+
}
|
|
89
|
+
let items = await this.slickDropDownService.getItemsFromServer(this.getUrl);
|
|
90
|
+
this.selectedText = null;
|
|
91
|
+
this.items = items;
|
|
92
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
93
|
+
this.selectItem(this.selectedId, false);
|
|
94
|
+
if (document.activeElement === this.selectedTextInputRef.nativeElement)
|
|
95
|
+
this.expand();
|
|
96
|
+
}
|
|
97
|
+
if (changes.validationIndicator && changes.validationIndicator.firstChange) {
|
|
98
|
+
if (!this.validationIndicatorType)
|
|
99
|
+
this.validationIndicatorType = "error";
|
|
100
|
+
}
|
|
101
|
+
if (changes.allowEmpty)
|
|
102
|
+
this.allowEmpty = (this.allowEmpty.toString().toLowerCase() === 'false') ? false : true;
|
|
103
|
+
if (changes.isMobile)
|
|
104
|
+
this.isMobile = (this.isMobile.toString().toLowerCase() === 'true') ? true : false;
|
|
105
|
+
if (changes.disabled && changes.disabled.currentValue)
|
|
106
|
+
this.disabled = (changes.disabled.currentValue.toString().toLowerCase() !== 'false');
|
|
107
|
+
if (changes.compact && changes.compact.currentValue)
|
|
108
|
+
this.compact = (changes.compact.currentValue.toString().toLowerCase() !== 'false');
|
|
109
|
+
if (changes.searchType) {
|
|
110
|
+
if (changes.searchType.currentValue.toString().toLowerCase() === 'eachword')
|
|
111
|
+
this.searchType = SlickDropDownSearchTypes.eachWord;
|
|
112
|
+
else if (changes.searchType.currentValue.toString().toLowerCase() === 'any')
|
|
113
|
+
this.searchType = SlickDropDownSearchTypes.any;
|
|
114
|
+
else
|
|
115
|
+
this.searchType = SlickDropDownSearchTypes.startsWith;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
ngOnDestroy() {
|
|
119
|
+
this.collapse();
|
|
120
|
+
document.removeEventListener("click", this.fnDocumentClick, true);
|
|
121
|
+
// it's okay if this fails. It was already removed
|
|
122
|
+
try {
|
|
123
|
+
document.body.removeChild(this.dropdownList.nativeElement);
|
|
124
|
+
}
|
|
125
|
+
catch { }
|
|
126
|
+
}
|
|
127
|
+
async setFocus(showDropdownList = false) {
|
|
128
|
+
this.filterText = '';
|
|
129
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
130
|
+
this.skipOnFocusEvent = (showDropdownList === false);
|
|
131
|
+
await SlickUtilsService.waitForElement("#slick-drop-down_" + this.uuid);
|
|
132
|
+
this.selectedTextInputRef.nativeElement.focus();
|
|
133
|
+
}
|
|
134
|
+
async expand() {
|
|
135
|
+
if (this.disabled)
|
|
136
|
+
return;
|
|
137
|
+
this.isVisible = true;
|
|
138
|
+
this.changeDetector.detectChanges();
|
|
139
|
+
SlickUtilsService.attachElement(this.dropdownList.nativeElement, this.attachTo);
|
|
140
|
+
this.reposition();
|
|
141
|
+
await SlickSleepService.sleep();
|
|
142
|
+
this.dropdownList.nativeElement.style.display = "inline-block";
|
|
143
|
+
const selectedItems = this.dropdownList.nativeElement.getElementsByClassName("active");
|
|
144
|
+
if (selectedItems && selectedItems.length > 0)
|
|
145
|
+
selectedItems[0].scrollIntoView({ block: 'nearest' });
|
|
146
|
+
this.expanded = true;
|
|
147
|
+
// This is necessary, otherwise `this` in the reposition function will be window
|
|
148
|
+
// and not the component.
|
|
149
|
+
// Since angular has no way to use the third parameter, I'm doing this in raw js
|
|
150
|
+
document.addEventListener("click", this.fnDocumentClick, true);
|
|
151
|
+
if (this.onExpand)
|
|
152
|
+
this.onExpand.emit();
|
|
153
|
+
}
|
|
154
|
+
collapse() {
|
|
155
|
+
if (this.expanded === false)
|
|
156
|
+
return;
|
|
157
|
+
this.expanded = false;
|
|
158
|
+
this.dropdownList.nativeElement.style.display = "none";
|
|
159
|
+
// Since angular has no way to use the third parameter, I'm doing this in raw js
|
|
160
|
+
document.removeEventListener("click", this.fnDocumentClick, true);
|
|
161
|
+
SlickUtilsService.removeElement(this.dropdownList.nativeElement);
|
|
162
|
+
this.isVisible = false;
|
|
163
|
+
this.skipOnFocusEvent = false;
|
|
164
|
+
}
|
|
165
|
+
reposition() {
|
|
166
|
+
const dropDownRect = this.containerDiv.nativeElement.getBoundingClientRect();
|
|
167
|
+
const parentRect = (this.attachTo === 'body') ? null : document.body.querySelector(this.attachTo).getBoundingClientRect();
|
|
168
|
+
const containerLeft = (this.attachTo === 'body') ? dropDownRect.left : (dropDownRect.left - parentRect.left);
|
|
169
|
+
const containerTop = (this.attachTo === 'body') ? dropDownRect.top : (dropDownRect.top - parentRect.top);
|
|
170
|
+
const containerHeight = this.containerDiv.nativeElement.offsetHeight;
|
|
171
|
+
const containerWidth = dropDownRect.width;
|
|
172
|
+
this.width = containerWidth;
|
|
173
|
+
if (this.listWidth === '100%')
|
|
174
|
+
this.listGroupWidth = this.width;
|
|
175
|
+
else if (this.listWidth === 'auto')
|
|
176
|
+
this.listGroupWidth = "auto";
|
|
177
|
+
else
|
|
178
|
+
this.listGroupWidth = this.listWidth;
|
|
179
|
+
this.top = (containerTop + containerHeight);
|
|
180
|
+
this.left = containerLeft;
|
|
181
|
+
}
|
|
182
|
+
async documentClick(e) {
|
|
183
|
+
// Not entirely sure why, but iPhones call onFocus when clicking out of the dropdown
|
|
184
|
+
if (this.isMobile)
|
|
185
|
+
this.skipOnFocusEvent = true;
|
|
186
|
+
if (!this.expanded || !e.target)
|
|
187
|
+
return;
|
|
188
|
+
if (SlickUtilsService.checkParentIdExists(e.target, "slick-drop-down_" + this.uuid) === true)
|
|
189
|
+
return;
|
|
190
|
+
this.selectedTextInputRef.nativeElement.setSelectionRange(0, 0);
|
|
191
|
+
if (this.selectedIndex !== null && this.visibleItems.length > 0) {
|
|
192
|
+
let itemId = this.visibleItems[this.selectedIndex].id;
|
|
193
|
+
this.selectItem(itemId, true);
|
|
194
|
+
}
|
|
195
|
+
this.collapse();
|
|
196
|
+
}
|
|
197
|
+
selectItem(id, emitOnSelect) {
|
|
198
|
+
let item = this.slickDropDownService.getSelectedItem(this.visibleItems, id);
|
|
199
|
+
if (item) {
|
|
200
|
+
this.selectedItem = item;
|
|
201
|
+
this.selectedId = item.id;
|
|
202
|
+
this.selectedText = item.text;
|
|
203
|
+
this.selectedIndex = this.slickDropDownService.getItemIndex(this.visibleItems, this.selectedId);
|
|
204
|
+
if (this.onChange)
|
|
205
|
+
this.onChange.emit(this.selectedItem.item);
|
|
206
|
+
if (emitOnSelect === true && this.onSelect)
|
|
207
|
+
this.onSelect.emit(this.selectedItem.item);
|
|
208
|
+
this.propagateChange(this.selectedId);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this.selectedItem = null;
|
|
212
|
+
this.selectedText = null;
|
|
213
|
+
this.selectedIndex = null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async onFocus() {
|
|
217
|
+
if (this.skipOnFocusEvent === true) {
|
|
218
|
+
this.skipOnFocusEvent = false;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.filterText = '';
|
|
222
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
223
|
+
this.selectItem(this.selectedId, false);
|
|
224
|
+
if (this.selectedIndex && this.selectedIndex >= 0) {
|
|
225
|
+
this.selectedItem = this.visibleItems[this.selectedIndex];
|
|
226
|
+
this.selectedTextInputRef.nativeElement.setSelectionRange(0, this.selectedItem.text.length);
|
|
227
|
+
}
|
|
228
|
+
// This is kind of hacky, but if onFocus is called by clicking the dropdown, the onDropdownClick event is called as well
|
|
229
|
+
// That function will expand or collapse, depending on the state. Since this expands, it thinks it needs to collapse.
|
|
230
|
+
// So fake it out and tell it NOT to collapse. BUT, if we came in from tabbing into the field, then it would mess up
|
|
231
|
+
// the click event. So only wait for 1/2 second.
|
|
232
|
+
this.skipClickExpand = true;
|
|
233
|
+
this.expand();
|
|
234
|
+
await SlickSleepService.sleep(500);
|
|
235
|
+
this.skipClickExpand = false;
|
|
236
|
+
}
|
|
237
|
+
async onKeyDown(e) {
|
|
238
|
+
if (this.isAndroid)
|
|
239
|
+
return;
|
|
240
|
+
// Tab/enter
|
|
241
|
+
if (e.which === 9 || e.which === 13) {
|
|
242
|
+
this.collapse();
|
|
243
|
+
if (this.selectedIndex === null || this.selectedIndex === undefined)
|
|
244
|
+
return;
|
|
245
|
+
this.selectedTextInputRef.nativeElement.setSelectionRange(0, 0);
|
|
246
|
+
let itemId = this.visibleItems[this.selectedIndex].id;
|
|
247
|
+
this.selectItem(itemId, true);
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
if (e.key && e.key.length > 1)
|
|
251
|
+
return true;
|
|
252
|
+
if (e.which === 46 || e.which === 8) {
|
|
253
|
+
e.preventDefault();
|
|
254
|
+
e.stopPropagation();
|
|
255
|
+
}
|
|
256
|
+
if (e.which >= 32 && e.which <= 126) {
|
|
257
|
+
e.preventDefault();
|
|
258
|
+
e.stopPropagation();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async onKeyUp(e) {
|
|
262
|
+
e.preventDefault();
|
|
263
|
+
e.stopPropagation();
|
|
264
|
+
// If this is android, it won't pass us any key data so just read the entire input element
|
|
265
|
+
if (this.isAndroid === true) {
|
|
266
|
+
await SlickSleepService.sleep();
|
|
267
|
+
this.filterText = this.selectedTextInputRef.nativeElement.value;
|
|
268
|
+
this.filterSearch();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
// Esc
|
|
272
|
+
if (e.which === 27) {
|
|
273
|
+
this.collapse();
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
// del or backspace
|
|
277
|
+
if (e.which === 46 || e.which === 8 && !this.filterText) {
|
|
278
|
+
e.preventDefault();
|
|
279
|
+
e.stopPropagation();
|
|
280
|
+
if (this.allowEmpty === true) {
|
|
281
|
+
this.selectItem(null, true);
|
|
282
|
+
this.selectedId = null;
|
|
283
|
+
this.propagateChange(null);
|
|
284
|
+
if (this.onChange)
|
|
285
|
+
this.onChange.emit(null);
|
|
286
|
+
if (this.onSelect)
|
|
287
|
+
this.onSelect.emit(null);
|
|
288
|
+
}
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
if (e.which === 8 && this.filterText) {
|
|
292
|
+
this.filterText = this.filterText.substring(0, this.filterText.length - 1);
|
|
293
|
+
if (this.filterText.length === 0) {
|
|
294
|
+
this.selectedText = '';
|
|
295
|
+
this.selectedIndex = null;
|
|
296
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
297
|
+
}
|
|
298
|
+
else
|
|
299
|
+
this.filterSearch();
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
// Arrowup
|
|
303
|
+
if (e.which === 38) {
|
|
304
|
+
if (this.selectedIndex === null || this.selectedIndex === undefined)
|
|
305
|
+
this.selectedIndex = 0;
|
|
306
|
+
if (this.selectedIndex > 0)
|
|
307
|
+
this.selectedIndex--;
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
// Arrowdown
|
|
311
|
+
if (e.which === 40) {
|
|
312
|
+
if (this.selectedIndex === null || this.selectedIndex === undefined)
|
|
313
|
+
this.selectedIndex = -1;
|
|
314
|
+
if (!this.expanded || !this.visibleItems) {
|
|
315
|
+
this.expand();
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
if (this.selectedIndex < this.visibleItems.length - 1)
|
|
319
|
+
this.selectedIndex++;
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
// If F1 is pressed, key length will be 2
|
|
323
|
+
if (e.key.length > 1 || e.ctrlKey || e.altKey)
|
|
324
|
+
return false;
|
|
325
|
+
if (e.which >= 32 && e.which <= 126) {
|
|
326
|
+
this.filterText += e.key;
|
|
327
|
+
this.filterSearch();
|
|
328
|
+
}
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
//async onKeyPress(e: KeyboardEvent) {
|
|
332
|
+
// await SlickSleepService.sleep();
|
|
333
|
+
// if (((e.which >= 32 && e.which <= 126) || e.which === 8) && !e.ctrlKey && !e.altKey) {
|
|
334
|
+
// if (e.which === 8)
|
|
335
|
+
// this.filterText = this.filterText.substring(0, this.filterText.length - 1);
|
|
336
|
+
// else
|
|
337
|
+
// this.filterText += e.key;
|
|
338
|
+
// this.filterSearch();
|
|
339
|
+
// }
|
|
340
|
+
// return true;
|
|
341
|
+
//}
|
|
342
|
+
async filterSearch() {
|
|
343
|
+
if (!this.expanded)
|
|
344
|
+
this.expand();
|
|
345
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
346
|
+
if (this.searchType === SlickDropDownSearchTypes.startsWith) {
|
|
347
|
+
this.visibleItems = this.visibleItems.filter(x => x.text.toLowerCase().indexOf(this.filterText.toLowerCase()) === 0);
|
|
348
|
+
if (this.visibleItems.length > 0) {
|
|
349
|
+
this.selectedIndex = 0;
|
|
350
|
+
if (this.isAndroid === false) {
|
|
351
|
+
this.selectedText = this.visibleItems[0].text;
|
|
352
|
+
await SlickSleepService.sleep();
|
|
353
|
+
this.selectedTextInputRef.nativeElement.setSelectionRange(this.filterText.length, this.selectedText.length);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.selectedText = this.filterText;
|
|
358
|
+
this.selectedIndex = null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else if (this.searchType === SlickDropDownSearchTypes.eachWord) {
|
|
362
|
+
this.visibleItems = this.visibleItems.filter(x => (" " + x.text.toLowerCase()).indexOf(" " + this.filterText.toLowerCase()) >= 0);
|
|
363
|
+
if (this.visibleItems.length > 0) {
|
|
364
|
+
this.selectedIndex = 0;
|
|
365
|
+
if (this.isAndroid === false) {
|
|
366
|
+
this.selectedText = this.visibleItems[0].text;
|
|
367
|
+
const selectedTextStart = (" " + this.visibleItems[0].text).toLowerCase().indexOf(" " + this.filterText.toLowerCase());
|
|
368
|
+
await SlickSleepService.sleep();
|
|
369
|
+
this.selectedTextInputRef.nativeElement.setSelectionRange(selectedTextStart, selectedTextStart + this.filterText.length);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
this.selectedText = this.filterText;
|
|
374
|
+
this.selectedIndex = null;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
onDropdownClicked() {
|
|
379
|
+
this.filterText = '';
|
|
380
|
+
this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
|
|
381
|
+
this.selectItem(this.selectedId, false);
|
|
382
|
+
this.selectedTextInputRef.nativeElement.focus();
|
|
383
|
+
if (this.skipClickExpand === true) {
|
|
384
|
+
this.skipClickExpand = false;
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (this.expanded === false)
|
|
388
|
+
this.expand();
|
|
389
|
+
else
|
|
390
|
+
this.collapse();
|
|
391
|
+
}
|
|
392
|
+
onItemClick(item) {
|
|
393
|
+
this.selectItem(item.id, true);
|
|
394
|
+
this.collapse();
|
|
395
|
+
}
|
|
396
|
+
handleCustomButtonClick(callback, event) {
|
|
397
|
+
event.stopPropagation();
|
|
398
|
+
event.preventDefault();
|
|
399
|
+
if (callback) {
|
|
400
|
+
callback(event);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/** @nocollapse */ SlickDropDownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickDropDownComponent, deps: [{ token: i1.SlickDropDownService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
405
|
+
/** @nocollapse */ SlickDropDownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: SlickDropDownComponent, selector: "slick-drop-down", inputs: { placeholder: "placeholder", items: "items", idFieldName: "idFieldName", textFieldName: "textFieldName", compact: "compact", disabled: "disabled", allowEmpty: "allowEmpty", getUrl: "getUrl", width: "width", listWidth: "listWidth", height: "height", showLoadingMessage: "showLoadingMessage", showDebug: "showDebug", tabindex: "tabindex", validationIndicator: "validationIndicator", validationIndicatorType: "validationIndicatorType", attachTo: "attachTo", searchType: "searchType", appendButtons: "appendButtons", prependButtons: "prependButtons", isMobile: "isMobile", cssClass: "cssClass" }, outputs: { onExpand: "onExpand", onSelect: "onSelect", onChange: "onChange" }, providers: [SlickDropDownService, SlickLogService,
|
|
406
|
+
{
|
|
407
|
+
provide: NG_VALUE_ACCESSOR,
|
|
408
|
+
useExisting: forwardRef((() => SlickDropDownComponent)),
|
|
409
|
+
multi: true,
|
|
410
|
+
}], viewQueries: [{ propertyName: "containerDiv", first: true, predicate: ["containerDiv"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }, { propertyName: "selectedTextInputRef", first: true, predicate: ["selectedTextInputRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #containerDiv id=\"slick-drop-down_{{uuid}}\" attr.data-uuid=\"{{uuid}}\" [className]=\"'slick-drop-down ' + (cssClass || '')\" [class.open]=\"expanded\">\r\n\t<div *ngIf=\"compact === false\">\r\n <div *ngIf=\"!disabled\" class='input-group' style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n <ng-container *ngIf=\"prependButtons && prependButtons.length > 0\">\r\n <div class=\"input-group-prepend\">\r\n <ng-container *ngFor=\"let btn of prependButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-right: 2px; border-right: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <input *ngIf=\"validationIndicatorType\" [slick-validation-indicator]=\"validationIndicator\" [slickValidationType]=\"validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <input *ngIf=\"!validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <div tabindex=\"-1\" class=\"input-group-append\">\r\n <span class=\"input-group-text btn-primary badge-primary\"><i class='fas fa-chevron-down'></i></span>\r\n </div>\r\n <ng-container *ngIf=\"appendButtons && appendButtons.length > 0\">\r\n <div class=\"input-group-append\" style=\"margin-left: 0px;\">\r\n <ng-container *ngFor=\"let btn of appendButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-left: 1px; border-left: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" class='input-group'>\r\n\t\t\t<input #selectedTextInputRef style='cursor: default' [(ngModel)]=\"selectedText\" disabled=\"disabled\" readonly class='form-control' [placeholder]='placeholder' />\r\n\t\t\t<div tabindex=\"-1\" class=\"input-group-append disabled\">\r\n\t\t\t\t<span class=\"input-group-text text-muted\"><i class='fas fa-chevron-down'></i></span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div [className]=\"'slick-drop-down-compact ' + (cssClass || '')\" *ngIf=\"compact === true\">\r\n\t\t<div *ngIf=\"disabled === false\" style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n\t\t\t<input #selectedTextInputRef class=\"text-body\" [attr.tabindex]=\"tabindex\" [(ngModel)]=\"selectedText\" (keyup)=\"onKeyUp($event)\" (focus)=\"onFocus()\" ng-disabled='disabled' readonly [placeholder]='placeholder' />\r\n\t\t\t<div class=\"slick-drop-down-compact-arrow\" tabindex=\"-1\" style=\"position: relative; top: -1px;\"><i class='fas fa-chevron-down'></i></div>\r\n\t\t</div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" style=\"text-align: right;\">\r\n\t\t\t<div *ngIf='selectedText' style=\"text-align: right;\">{{selectedText}}</div>\r\n\t\t\t<div *ngIf=\"!selectedText\" style=\"text-align: right;\">{{placeholder}}</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<ul *ngIf=\"isVisible\" #dropdownList id=\"slick-drop-down_{{uuid}}\" class='slick-drop-down-list-group dropdown-menu' [style.width]=\"listGroupWidth\" [style.visibility]=\"(expanded === true) ? 'visible' : 'hidden'\" [style.opacity]=\"(expanded === true) ? '1' : '0'\" [style.max-height]=\"height\" [style.width.px]=\"listGroupWidth\" [style.left.px]=\"left\" [style.top.px]=\"top\">\r\n\t\t<li *ngFor=\"let item of visibleItems; let index = index;\" (click)=\"onItemClick(item)\" [class.active]=\"item.id === selectedItem?.id\" [class.card-header]=\"selectedIndex === index\" class=\"dropdown-item\">{{item.text}}</li>\r\n\t</ul>\r\n\r\n</div>", directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.SlickValidationIndicatorDirective, selector: "[slick-validation-indicator]", inputs: ["slick-validation-indicator", "slickValidationType"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
411
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickDropDownComponent, decorators: [{
|
|
412
|
+
type: Component,
|
|
413
|
+
args: [{ selector: 'slick-drop-down', providers: [SlickDropDownService, SlickLogService,
|
|
414
|
+
{
|
|
415
|
+
provide: NG_VALUE_ACCESSOR,
|
|
416
|
+
useExisting: forwardRef((() => SlickDropDownComponent)),
|
|
417
|
+
multi: true,
|
|
418
|
+
}], template: "<div #containerDiv id=\"slick-drop-down_{{uuid}}\" attr.data-uuid=\"{{uuid}}\" [className]=\"'slick-drop-down ' + (cssClass || '')\" [class.open]=\"expanded\">\r\n\t<div *ngIf=\"compact === false\">\r\n <div *ngIf=\"!disabled\" class='input-group' style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n <ng-container *ngIf=\"prependButtons && prependButtons.length > 0\">\r\n <div class=\"input-group-prepend\">\r\n <ng-container *ngFor=\"let btn of prependButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-right: 2px; border-right: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <input *ngIf=\"validationIndicatorType\" [slick-validation-indicator]=\"validationIndicator\" [slickValidationType]=\"validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <input *ngIf=\"!validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <div tabindex=\"-1\" class=\"input-group-append\">\r\n <span class=\"input-group-text btn-primary badge-primary\"><i class='fas fa-chevron-down'></i></span>\r\n </div>\r\n <ng-container *ngIf=\"appendButtons && appendButtons.length > 0\">\r\n <div class=\"input-group-append\" style=\"margin-left: 0px;\">\r\n <ng-container *ngFor=\"let btn of appendButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-left: 1px; border-left: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" class='input-group'>\r\n\t\t\t<input #selectedTextInputRef style='cursor: default' [(ngModel)]=\"selectedText\" disabled=\"disabled\" readonly class='form-control' [placeholder]='placeholder' />\r\n\t\t\t<div tabindex=\"-1\" class=\"input-group-append disabled\">\r\n\t\t\t\t<span class=\"input-group-text text-muted\"><i class='fas fa-chevron-down'></i></span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div [className]=\"'slick-drop-down-compact ' + (cssClass || '')\" *ngIf=\"compact === true\">\r\n\t\t<div *ngIf=\"disabled === false\" style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n\t\t\t<input #selectedTextInputRef class=\"text-body\" [attr.tabindex]=\"tabindex\" [(ngModel)]=\"selectedText\" (keyup)=\"onKeyUp($event)\" (focus)=\"onFocus()\" ng-disabled='disabled' readonly [placeholder]='placeholder' />\r\n\t\t\t<div class=\"slick-drop-down-compact-arrow\" tabindex=\"-1\" style=\"position: relative; top: -1px;\"><i class='fas fa-chevron-down'></i></div>\r\n\t\t</div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" style=\"text-align: right;\">\r\n\t\t\t<div *ngIf='selectedText' style=\"text-align: right;\">{{selectedText}}</div>\r\n\t\t\t<div *ngIf=\"!selectedText\" style=\"text-align: right;\">{{placeholder}}</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<ul *ngIf=\"isVisible\" #dropdownList id=\"slick-drop-down_{{uuid}}\" class='slick-drop-down-list-group dropdown-menu' [style.width]=\"listGroupWidth\" [style.visibility]=\"(expanded === true) ? 'visible' : 'hidden'\" [style.opacity]=\"(expanded === true) ? '1' : '0'\" [style.max-height]=\"height\" [style.width.px]=\"listGroupWidth\" [style.left.px]=\"left\" [style.top.px]=\"top\">\r\n\t\t<li *ngFor=\"let item of visibleItems; let index = index;\" (click)=\"onItemClick(item)\" [class.active]=\"item.id === selectedItem?.id\" [class.card-header]=\"selectedIndex === index\" class=\"dropdown-item\">{{item.text}}</li>\r\n\t</ul>\r\n\r\n</div>" }]
|
|
419
|
+
}], ctorParameters: function () { return [{ type: i1.SlickDropDownService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], items: [{
|
|
422
|
+
type: Input
|
|
423
|
+
}], idFieldName: [{
|
|
424
|
+
type: Input
|
|
425
|
+
}], textFieldName: [{
|
|
426
|
+
type: Input
|
|
427
|
+
}], compact: [{
|
|
428
|
+
type: Input
|
|
429
|
+
}], disabled: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], allowEmpty: [{
|
|
432
|
+
type: Input
|
|
433
|
+
}], getUrl: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], width: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], listWidth: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], height: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], showLoadingMessage: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], showDebug: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], tabindex: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], validationIndicator: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], validationIndicatorType: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], attachTo: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], searchType: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], appendButtons: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], prependButtons: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], isMobile: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], cssClass: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], onExpand: [{
|
|
464
|
+
type: Output
|
|
465
|
+
}], onSelect: [{
|
|
466
|
+
type: Output
|
|
467
|
+
}], onChange: [{
|
|
468
|
+
type: Output
|
|
469
|
+
}], containerDiv: [{
|
|
470
|
+
type: ViewChild,
|
|
471
|
+
args: ["containerDiv"]
|
|
472
|
+
}], dropdownList: [{
|
|
473
|
+
type: ViewChild,
|
|
474
|
+
args: ["dropdownList"]
|
|
475
|
+
}], selectedTextInputRef: [{
|
|
476
|
+
type: ViewChild,
|
|
477
|
+
args: ["selectedTextInputRef"]
|
|
478
|
+
}] } });
|
|
479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZHJvcC1kb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL3NsaWNrLWRyb3AtZG93bi9zbGljay1kcm9wLWRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvc2xpY2stZHJvcC1kb3duL3NsaWNrLWRyb3AtZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUEyRCxTQUFTLEVBQUUsVUFBVSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6TCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFHN0QsTUFBTSxDQUFOLElBQVksd0JBQXNEO0FBQWxFLFdBQVksd0JBQXdCO0lBQUcsbUZBQVUsQ0FBQTtJQUFFLCtFQUFRLENBQUE7SUFBRSxxRUFBRyxDQUFBO0FBQUMsQ0FBQyxFQUF0RCx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBQThCO0FBWWxFLE1BQU0sT0FBTyxzQkFBc0I7SUFxRGxDLFlBQW9CLG9CQUEwQyxFQUNyRCxjQUFpQztRQUR0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQ3JELG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXJEakMsZ0JBQVcs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QXVCO3NCQUEvQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0UsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNVLG9CQUFvQjtzQkFBdEQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWNrRHJvcERvd25TZXJ2aWNlIH0gZnJvbSBcIi4vc2xpY2stZHJvcC1kb3duLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFNsaWNrU2xlZXBTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLXNsZWVwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tVdGlsc1NlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stdXRpbHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0luaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLWluaXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0xvZ1NlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVNsaWNrRHJvcERvd25CdXR0b25Nb2RlbCB9IGZyb20gXCIuL3NsaWNrLWRyb3AtZG93bi1idXR0b24ubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBlbnVtIFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcyB7IHN0YXJ0c1dpdGgsIGVhY2hXb3JkLCBhbnkgfVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdzbGljay1kcm9wLWRvd24nLFxyXG5cdHRlbXBsYXRlVXJsOiAnc2xpY2stZHJvcC1kb3duLmNvbXBvbmVudC5odG1sJyxcclxuXHRwcm92aWRlcnM6IFtTbGlja0Ryb3BEb3duU2VydmljZSwgU2xpY2tMb2dTZXJ2aWNlLFxyXG5cdFx0e1xyXG5cdFx0XHRwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuXHRcdFx0dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpY2tEcm9wRG93bkNvbXBvbmVudCksXHJcblx0XHRcdG11bHRpOiB0cnVlLFxyXG5cdFx0fV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWNrRHJvcERvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblx0QElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cdEBJbnB1dCgpIGl0ZW1zOiBhbnlbXTtcclxuXHRASW5wdXQoKSBpZEZpZWxkTmFtZTogc3RyaW5nID0gXCJpZFwiO1xyXG5cdEBJbnB1dCgpIHRleHRGaWVsZE5hbWU6IHN0cmluZyA9IFwidGV4dFwiO1xyXG5cdEBJbnB1dCgpIGNvbXBhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdEBJbnB1dCgpIGdldFVybDogc3RyaW5nO1xyXG5cdEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcblx0QElucHV0KCkgbGlzdFdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcblx0QElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSAnMzAwcHgnO1xyXG5cdEBJbnB1dCgpIHNob3dMb2FkaW5nTWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpIHNob3dEZWJ1ZzogYm9vbGVhbjtcclxuXHRASW5wdXQoKSB0YWJpbmRleDogbnVtYmVyO1xyXG5cdEBJbnB1dCgpIHZhbGlkYXRpb25JbmRpY2F0b3I6IGJvb2xlYW47XHJcblx0QElucHV0KCkgdmFsaWRhdGlvbkluZGljYXRvclR5cGU6IHN0cmluZztcclxuXHRASW5wdXQoKSBhdHRhY2hUbzogc3RyaW5nO1xyXG5cdEBJbnB1dCgpIHNlYXJjaFR5cGU6IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcyA9IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoO1xyXG5cdEBJbnB1dCgpIGFwcGVuZEJ1dHRvbnM6IElTbGlja0Ryb3BEb3duQnV0dG9uTW9kZWxbXTtcclxuXHRASW5wdXQoKSBwcmVwZW5kQnV0dG9uczogSVNsaWNrRHJvcERvd25CdXR0b25Nb2RlbFtdO1xyXG5cdEBJbnB1dCgpIGlzTW9iaWxlOiBib29sZWFuID0gZmFsc2U7XHJcblx0QElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuXHJcblx0QE91dHB1dCgpIG9uRXhwYW5kOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cdEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdEBWaWV3Q2hpbGQoXCJjb250YWluZXJEaXZcIikgY29udGFpbmVyRGl2OiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJkcm9wZG93bkxpc3RcIikgZHJvcGRvd25MaXN0OiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJzZWxlY3RlZFRleHRJbnB1dFJlZlwiKSBzZWxlY3RlZFRleHRJbnB1dFJlZjogRWxlbWVudFJlZjtcclxuXHJcblx0Ly8gVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgc2Nyb2xsIGFuZCByZXNpemUgZXZlbnRzIGNhbiBhZGQgYW5kIHJlbW92ZSB0aGUgZXZlbnQgcHJvcGVybHksXHJcblx0Ly8gYXMgd2VsbCBhcyBnZXR0aW5nIHRoZSBjb3JyZWN0IEVTNiBmdW5jdGlvblxyXG5cdGZuUmVwb3NpdGlvbiA9ICgpID0+IHRoaXMucmVwb3NpdGlvbigpO1xyXG5cdGZuRG9jdW1lbnRDbGljayA9IChlKSA9PiB0aGlzLmRvY3VtZW50Q2xpY2soZSk7XHJcblx0dXVpZDogc3RyaW5nO1xyXG5cdHNlbGVjdGVkSWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZFRleHQ6IHN0cmluZztcclxuXHRleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHNlbGVjdGVkSXRlbTogYW55O1xyXG5cdHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcclxuXHRmaWx0ZXJUZXh0OiBzdHJpbmcgPSAnJztcclxuXHR2aXNpYmxlSXRlbXM6IGFueVtdO1xyXG5cdGxlZnQ6IG51bWJlcjtcclxuXHR0b3A6IG51bWJlcjtcclxuXHRsaXN0R3JvdXBXaWR0aDogc3RyaW5nO1xyXG5cdGlzVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzQW5kcm9pZDogYm9vbGVhbiA9ICgoU2xpY2tJbml0U2VydmljZS5nZXRQbGF0Zm9ybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpO1xyXG5cclxuXHRwcml2YXRlIHNraXBPbkZvY3VzRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIHNraXBDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHNsaWNrRHJvcERvd25TZXJ2aWNlOiBTbGlja0Ryb3BEb3duU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuYXR0YWNoVG8gPSB0aGlzLmF0dGFjaFRvIHx8IFNsaWNrSW5pdFNlcnZpY2UuZ2V0UGFyYW1zKCkuYXR0YWNoVG8gfHwgJ2JvZHknO1xyXG5cdH1cclxuXHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdH1cclxuXHJcblx0cHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuXHQvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XHJcblx0cHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcclxuXHRcdGlmIChvYmogIT09IG51bGwgJiYgb2JqICE9PSB1bmRlZmluZWQpXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJZCA9IG9iajtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5zZWxlY3RlZElkID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0fVxyXG5cclxuXHQvLyByZWdpc3RlcnMgJ2ZuJyB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlXHJcblx0Ly8gdGhpcyBpcyBob3cgd2UgZW1pdCB0aGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtXHJcblx0cHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xyXG5cdFx0dGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuXHR9XHJcblxyXG5cdC8vIG5vdCB1c2VkLCB1c2VkIGZvciB0b3VjaCBpbnB1dFxyXG5cdHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCgpIHsgfVxyXG5cclxuXHRhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdGlmIChjaGFuZ2VzLml0ZW1zKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRJZCwgZmFsc2UpO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZiAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcblx0XHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5zaG93TG9hZGluZ01lc3NhZ2UpIHtcclxuXHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdFx0aWYgKHRoaXMuc2hvd0xvYWRpbmdNZXNzYWdlID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJMb2FkaW5nLi4uXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZ2V0VXJsKSB7XHJcblx0XHRcdGlmICh0aGlzLnNob3dMb2FkaW5nTWVzc2FnZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJMb2FkaW5nLi4uXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBpdGVtczogYW55W10gPSBhd2FpdCB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldEl0ZW1zRnJvbVNlcnZlcih0aGlzLmdldFVybClcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLml0ZW1zID0gaXRlbXNcclxuXHRcdFx0dGhpcy52aXNpYmxlSXRlbXMgPSB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldFZpc2libGVJdGVtcyh0aGlzLml0ZW1zLCB0aGlzLmlkRmllbGROYW1lLCB0aGlzLnRleHRGaWVsZE5hbWUpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcblx0XHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy52YWxpZGF0aW9uSW5kaWNhdG9yICYmIGNoYW5nZXMudmFsaWRhdGlvbkluZGljYXRvci5maXJzdENoYW5nZSkge1xyXG5cdFx0XHRpZiAoIXRoaXMudmFsaWRhdGlvbkluZGljYXRvclR5cGUpXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0aW9uSW5kaWNhdG9yVHlwZSA9IFwiZXJyb3JcIjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5hbGxvd0VtcHR5KVxyXG5cdFx0XHR0aGlzLmFsbG93RW1wdHkgPSAodGhpcy5hbGxvd0VtcHR5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykgPyBmYWxzZSA6IHRydWU7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuaXNNb2JpbGUpXHJcblx0XHRcdHRoaXMuaXNNb2JpbGUgPSAodGhpcy5pc01vYmlsZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykgPyB0cnVlIDogZmFsc2U7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZGlzYWJsZWQgJiYgY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUpXHJcblx0XHRcdHRoaXMuZGlzYWJsZWQgPSAoY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKTtcclxuXHJcblx0XHRpZiAoY2hhbmdlcy5jb21wYWN0ICYmIGNoYW5nZXMuY29tcGFjdC5jdXJyZW50VmFsdWUpXHJcblx0XHRcdHRoaXMuY29tcGFjdCA9IChjaGFuZ2VzLmNvbXBhY3QuY3VycmVudFZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJyk7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc2VhcmNoVHlwZSkge1xyXG5cdFx0XHRpZiAoY2hhbmdlcy5zZWFyY2hUeXBlLmN1cnJlbnRWYWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdlYWNod29yZCcpXHJcblx0XHRcdFx0dGhpcy5zZWFyY2hUeXBlID0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmVhY2hXb3JkO1xyXG5cdFx0XHRlbHNlIGlmIChjaGFuZ2VzLnNlYXJjaFR5cGUuY3VycmVudFZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2FueScpXHJcblx0XHRcdFx0dGhpcy5zZWFyY2hUeXBlID0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmFueTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMuc2VhcmNoVHlwZSA9IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cclxuXHRcdC8vIGl0J3Mgb2theSBpZiB0aGlzIGZhaWxzLiAgSXQgd2FzIGFscmVhZHkgcmVtb3ZlZFxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50KTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIHsgfVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2V0Rm9jdXMoc2hvd0Ryb3Bkb3duTGlzdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLmZpbHRlclRleHQgPSAnJztcclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdHRoaXMuc2tpcE9uRm9jdXNFdmVudCA9IChzaG93RHJvcGRvd25MaXN0ID09PSBmYWxzZSk7XHJcblxyXG5cdFx0YXdhaXQgU2xpY2tVdGlsc1NlcnZpY2Uud2FpdEZvckVsZW1lbnQoXCIjc2xpY2stZHJvcC1kb3duX1wiICsgdGhpcy51dWlkKTtcclxuXHRcdCg8SFRNTElucHV0RWxlbWVudD50aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGV4cGFuZCgpIHtcclxuXHRcdGlmICh0aGlzLmRpc2FibGVkKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0dGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdFNsaWNrVXRpbHNTZXJ2aWNlLmF0dGFjaEVsZW1lbnQodGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudCwgdGhpcy5hdHRhY2hUbylcclxuXHJcblx0XHR0aGlzLnJlcG9zaXRpb24oKTtcclxuXHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cdFx0dGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcclxuXHJcblx0XHRjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYWN0aXZlXCIpO1xyXG5cdFx0aWYgKHNlbGVjdGVkSXRlbXMgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKVxyXG5cdFx0XHQoPEhUTUxFbGVtZW50PnNlbGVjdGVkSXRlbXNbMF0pLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcclxuXHJcblx0XHR0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcclxuXHJcblxyXG5cdFx0Ly8gVGhpcyBpcyBuZWNlc3NhcnksIG90aGVyd2lzZSBgdGhpc2AgaW4gdGhlIHJlcG9zaXRpb24gZnVuY3Rpb24gd2lsbCBiZSB3aW5kb3dcclxuXHRcdC8vIGFuZCBub3QgdGhlIGNvbXBvbmVudC5cclxuXHRcdC8vIFNpbmNlIGFuZ3VsYXIgaGFzIG5vIHdheSB0byB1c2UgdGhlIHRoaXJkIHBhcmFtZXRlciwgSSdtIGRvaW5nIHRoaXMgaW4gcmF3IGpzXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cclxuXHRcdGlmICh0aGlzLm9uRXhwYW5kKVxyXG5cdFx0XHR0aGlzLm9uRXhwYW5kLmVtaXQoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY29sbGFwc2UoKSB7XHJcblx0XHRpZiAodGhpcy5leHBhbmRlZCA9PT0gZmFsc2UpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR0aGlzLmV4cGFuZGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuXHRcdC8vIFNpbmNlIGFuZ3VsYXIgaGFzIG5vIHdheSB0byB1c2UgdGhlIHRoaXJkIHBhcmFtZXRlciwgSSdtIGRvaW5nIHRoaXMgaW4gcmF3IGpzXHJcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cdFx0U2xpY2tVdGlsc1NlcnZpY2UucmVtb3ZlRWxlbWVudCh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50KTtcclxuXHJcblx0XHR0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlcG9zaXRpb24oKSB7XHJcblx0XHRjb25zdCBkcm9wRG93blJlY3QgPSB0aGlzLmNvbnRhaW5lckRpdi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0Y29uc3QgcGFyZW50UmVjdCA9ICh0aGlzLmF0dGFjaFRvID09PSAnYm9keScpID8gbnVsbCA6IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3Rvcih0aGlzLmF0dGFjaFRvKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXJMZWZ0ID0gKHRoaXMuYXR0YWNoVG8gPT09ICdib2R5JykgPyBkcm9wRG93blJlY3QubGVmdCA6IChkcm9wRG93blJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCk7XHJcblx0XHRjb25zdCBjb250YWluZXJUb3AgPSAodGhpcy5hdHRhY2hUbyA9PT0gJ2JvZHknKSA/IGRyb3BEb3duUmVjdC50b3AgOiAoZHJvcERvd25SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLmNvbnRhaW5lckRpdi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHRcdGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZHJvcERvd25SZWN0LndpZHRoO1xyXG5cclxuXHRcdHRoaXMud2lkdGggPSBjb250YWluZXJXaWR0aDtcclxuXHRcdGlmICh0aGlzLmxpc3RXaWR0aCA9PT0gJzEwMCUnKVxyXG5cdFx0XHR0aGlzLmxpc3RHcm91cFdpZHRoID0gdGhpcy53aWR0aDtcclxuXHRcdGVsc2UgaWYgKHRoaXMubGlzdFdpZHRoID09PSAnYXV0bycpXHJcblx0XHRcdHRoaXMubGlzdEdyb3VwV2lkdGggPSBcImF1dG9cIjtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5saXN0R3JvdXBXaWR0aCA9IHRoaXMubGlzdFdpZHRoO1xyXG5cdFx0dGhpcy50b3AgPSAoY29udGFpbmVyVG9wICsgY29udGFpbmVySGVpZ2h0KTtcclxuXHRcdHRoaXMubGVmdCA9IGNvbnRhaW5lckxlZnQ7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGRvY3VtZW50Q2xpY2soZTogTW91c2VFdmVudCkge1xyXG5cdFx0Ly8gTm90IGVudGlyZWx5IHN1cmUgd2h5LCBidXQgaVBob25lcyBjYWxsIG9uRm9jdXMgd2hlbiBjbGlja2luZyBvdXQgb2YgdGhlIGRyb3Bkb3duXHJcblx0XHRpZiAodGhpcy5pc01vYmlsZSlcclxuXHRcdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIXRoaXMuZXhwYW5kZWQgfHwgIWUudGFyZ2V0KVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKFNsaWNrVXRpbHNTZXJ2aWNlLmNoZWNrUGFyZW50SWRFeGlzdHMoPEhUTUxFbGVtZW50PmUudGFyZ2V0LCBcInNsaWNrLWRyb3AtZG93bl9cIiArIHRoaXMudXVpZCkgPT09IHRydWUpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgdGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgaXRlbUlkID0gdGhpcy52aXNpYmxlSXRlbXNbdGhpcy5zZWxlY3RlZEluZGV4XS5pZDtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKGl0ZW1JZCwgdHJ1ZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZWxlY3RJdGVtKGlkOiBzdHJpbmcsIGVtaXRPblNlbGVjdDogYm9vbGVhbikge1xyXG5cdFx0bGV0IGl0ZW0gPSB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldFNlbGVjdGVkSXRlbSh0aGlzLnZpc2libGVJdGVtcywgaWQpO1xyXG5cclxuXHRcdGlmIChpdGVtKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZElkID0gaXRlbS5pZDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBpdGVtLnRleHQ7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0SXRlbUluZGV4KHRoaXMudmlzaWJsZUl0ZW1zLCB0aGlzLnNlbGVjdGVkSWQpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMub25DaGFuZ2UpXHJcblx0XHRcdFx0dGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtLml0ZW0pO1xyXG5cdFx0XHRpZiAoZW1pdE9uU2VsZWN0ID09PSB0cnVlICYmIHRoaXMub25TZWxlY3QpXHJcblx0XHRcdFx0dGhpcy5vblNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtLml0ZW0pO1xyXG5cdFx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkSWQpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25Gb2N1cygpIHtcclxuXHRcdGlmICh0aGlzLnNraXBPbkZvY3VzRXZlbnQgPT09IHRydWUpIHtcclxuXHRcdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZpbHRlclRleHQgPSAnJztcclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNlbGVjdGVkSWQsIGZhbHNlKTtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggJiYgdGhpcy5zZWxlY3RlZEluZGV4ID49IDApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnZpc2libGVJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0aGlzLnNlbGVjdGVkSXRlbS50ZXh0Lmxlbmd0aCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVGhpcyBpcyBraW5kIG9mIGhhY2t5LCBidXQgaWYgb25Gb2N1cyBpcyBjYWxsZWQgYnkgY2xpY2tpbmcgdGhlIGRyb3Bkb3duLCB0aGUgb25Ecm9wZG93bkNsaWNrIGV2ZW50IGlzIGNhbGxlZCBhcyB3ZWxsXHJcblx0XHQvLyBUaGF0IGZ1bmN0aW9uIHdpbGwgZXhwYW5kIG9yIGNvbGxhcHNlLCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlLiAgU2luY2UgdGhpcyBleHBhbmRzLCBpdCB0aGlua3MgaXQgbmVlZHMgdG8gY29sbGFwc2UuXHJcblx0XHQvLyBTbyBmYWtlIGl0IG91dCBhbmQgdGVsbCBpdCBOT1QgdG8gY29sbGFwc2UuICBCVVQsIGlmIHdlIGNhbWUgaW4gZnJvbSB0YWJiaW5nIGludG8gdGhlIGZpZWxkLCB0aGVuIGl0IHdvdWxkIG1lc3MgdXBcclxuXHRcdC8vIHRoZSBjbGljayBldmVudC4gIFNvIG9ubHkgd2FpdCBmb3IgMS8yIHNlY29uZC5cclxuXHRcdHRoaXMuc2tpcENsaWNrRXhwYW5kID0gdHJ1ZTtcclxuXHRcdHRoaXMuZXhwYW5kKCk7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCg1MDApO1xyXG5cdFx0dGhpcy5za2lwQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRpZiAodGhpcy5pc0FuZHJvaWQpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHQvLyBUYWIvZW50ZXJcclxuXHRcdGlmIChlLndoaWNoID09PSA5IHx8IGUud2hpY2ggPT09IDEzKSB7XHJcblx0XHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPT09IG51bGwgfHwgdGhpcy5zZWxlY3RlZEluZGV4ID09PSB1bmRlZmluZWQpXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0KDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuc2VsZWN0ZWRUZXh0SW5wdXRSZWYubmF0aXZlRWxlbWVudCkuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7XHJcblx0XHRcdGxldCBpdGVtSWQgPSB0aGlzLnZpc2libGVJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmlkO1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0oaXRlbUlkLCB0cnVlKTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChlLmtleSAmJiBlLmtleS5sZW5ndGggPiAxKVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDYgfHwgZS53aGljaCA9PT0gOCkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGUud2hpY2ggPj0gMzIgJiYgZS53aGljaCA8PSAxMjYpIHtcclxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25LZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuXHRcdC8vIElmIHRoaXMgaXMgYW5kcm9pZCwgaXQgd29uJ3QgcGFzcyB1cyBhbnkga2V5IGRhdGEgc28ganVzdCByZWFkIHRoZSBlbnRpcmUgaW5wdXQgZWxlbWVudFxyXG5cdFx0aWYgKHRoaXMuaXNBbmRyb2lkID09PSB0cnVlKSB7XHJcblx0XHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblxyXG5cdFx0XHR0aGlzLmZpbHRlclRleHQgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS52YWx1ZTtcclxuXHRcdFx0dGhpcy5maWx0ZXJTZWFyY2goKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVzY1xyXG5cdFx0aWYgKGUud2hpY2ggPT09IDI3KSB7XHJcblx0XHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBkZWwgb3IgYmFja3NwYWNlXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDYgfHwgZS53aGljaCA9PT0gOCAmJiAhdGhpcy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmFsbG93RW1wdHkgPT09IHRydWUpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZElkID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZShudWxsKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMub25DaGFuZ2UpXHJcblx0XHRcdFx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm9uU2VsZWN0KVxyXG5cdFx0XHRcdFx0dGhpcy5vblNlbGVjdC5lbWl0KG51bGwpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDggJiYgdGhpcy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuZmlsdGVyVGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCAtIDEpO1xyXG5cdFx0XHRpZiAodGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0VmlzaWJsZUl0ZW1zKHRoaXMuaXRlbXMsIHRoaXMuaWRGaWVsZE5hbWUsIHRoaXMudGV4dEZpZWxkTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMuZmlsdGVyU2VhcmNoKCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcnJvd3VwXHJcblx0XHRpZiAoZS53aGljaCA9PT0gMzgpIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4LS07XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQXJyb3dkb3duXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDApIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcclxuXHJcblx0XHRcdGlmICghdGhpcy5leHBhbmRlZCB8fCAhdGhpcy52aXNpYmxlSXRlbXMpIHtcclxuXHRcdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aCAtIDEpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4Kys7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSWYgRjEgaXMgcHJlc3NlZCwga2V5IGxlbmd0aCB3aWxsIGJlIDJcclxuXHRcdGlmIChlLmtleS5sZW5ndGggPiAxIHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSlcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmIChlLndoaWNoID49IDMyICYmIGUud2hpY2ggPD0gMTI2KSB7XHJcblx0XHRcdHRoaXMuZmlsdGVyVGV4dCArPSBlLmtleTtcclxuXHJcblx0XHRcdHRoaXMuZmlsdGVyU2VhcmNoKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvL2FzeW5jIG9uS2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xyXG5cdC8vXHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHQvL1x0aWYgKCgoZS53aGljaCA+PSAzMiAmJiBlLndoaWNoIDw9IDEyNikgfHwgZS53aGljaCA9PT0gOCkgJiYgIWUuY3RybEtleSAmJiAhZS5hbHRLZXkpIHtcclxuXHQvL1x0XHRpZiAoZS53aGljaCA9PT0gOClcclxuXHQvL1x0XHRcdHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuZmlsdGVyVGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCAtIDEpO1xyXG5cdC8vXHRcdGVsc2VcclxuXHQvL1x0XHRcdHRoaXMuZmlsdGVyVGV4dCArPSBlLmtleTtcclxuXHQvL1x0XHR0aGlzLmZpbHRlclNlYXJjaCgpO1xyXG5cdC8vXHR9XHJcblxyXG5cdC8vXHRyZXR1cm4gdHJ1ZTtcclxuXHQvL31cclxuXHJcblxyXG5cdHByaXZhdGUgYXN5bmMgZmlsdGVyU2VhcmNoKCkge1xyXG5cdFx0aWYgKCF0aGlzLmV4cGFuZGVkKVxyXG5cdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKHggPT4geC50ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSkgPT09IDApO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0aWYgKHRoaXMuaXNBbmRyb2lkID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSB0aGlzLnZpc2libGVJdGVtc1swXS50ZXh0O1xyXG5cdFx0XHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdFx0XHRcdCg8SFRNTElucHV0RWxlbWVudD50aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZmlsdGVyVGV4dC5sZW5ndGgsIHRoaXMuc2VsZWN0ZWRUZXh0Lmxlbmd0aCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gdGhpcy5maWx0ZXJUZXh0O1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmVhY2hXb3JkKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKHggPT4gKFwiIFwiICsgeC50ZXh0LnRvTG93ZXJDYXNlKCkpLmluZGV4T2YoXCIgXCIgKyB0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSkgPj0gMCk7XHJcblx0XHRcdGlmICh0aGlzLnZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRpZiAodGhpcy5pc0FuZHJvaWQgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkVGV4dCA9IHRoaXMudmlzaWJsZUl0ZW1zWzBdLnRleHQ7XHJcblx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZFRleHRTdGFydCA9IChcIiBcIiArIHRoaXMudmlzaWJsZUl0ZW1zWzBdLnRleHQpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIiBcIiArIHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKTtcclxuXHRcdFx0XHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblx0XHRcdFx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3RlZFRleHRTdGFydCwgc2VsZWN0ZWRUZXh0U3RhcnQgKyB0aGlzLmZpbHRlclRleHQubGVuZ3RoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSB0aGlzLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uRHJvcGRvd25DbGlja2VkKCkge1xyXG5cdFx0dGhpcy5maWx0ZXJUZXh0ID0gJyc7XHJcblx0XHR0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0VmlzaWJsZUl0ZW1zKHRoaXMuaXRlbXMsIHRoaXMuaWRGaWVsZE5hbWUsIHRoaXMudGV4dEZpZWxkTmFtZSk7XHJcblx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNraXBDbGlja0V4cGFuZCA9PT0gdHJ1ZSkge1xyXG5cdFx0XHR0aGlzLnNraXBDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuZXhwYW5kZWQgPT09IGZhbHNlKVxyXG5cdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0fVxyXG5cclxuXHRvbkl0ZW1DbGljayhpdGVtOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0SXRlbShpdGVtLmlkLCB0cnVlKTtcclxuXHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZUN1c3RvbUJ1dHRvbkNsaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgZXZlbnQ6IEV2ZW50KSB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdGNhbGxiYWNrKGV2ZW50KTtcclxuXHRcdH1cclxuXHR9XHJcbn0iLCI8ZGl2ICNjb250YWluZXJEaXYgaWQ9XCJzbGljay1kcm9wLWRvd25fe3t1dWlkfX1cIiBhdHRyLmRhdGEtdXVpZD1cInt7dXVpZH19XCIgW2NsYXNzTmFtZV09XCInc2xpY2stZHJvcC1kb3duICcgKyAoY3NzQ2xhc3MgfHwgJycpXCIgW2NsYXNzLm9wZW5dPVwiZXhwYW5kZWRcIj5cclxuXHQ8ZGl2ICpuZ0lmPVwiY29tcGFjdCA9PT0gZmFsc2VcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRpc2FibGVkXCIgY2xhc3M9J2lucHV0LWdyb3VwJyBzdHlsZT1cImN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50XCIgKGNsaWNrKT1cIm9uRHJvcGRvd25DbGlja2VkKClcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXBlbmRCdXR0b25zICYmIHByZXBlbmRCdXR0b25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIHByZXBlbmRCdXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBidG4gYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIiAoY2xpY2spPVwiaGFuZGxlQ3VzdG9tQnV0dG9uQ2xpY2soYnRuLm9uQ2xpY2ssICRldmVudClcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMnB4OyBib3JkZXItcmlnaHQ6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyB7eyBidG4uZmFDbGFzcyB9fVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInZhbGlkYXRpb25JbmRpY2F0b3JUeXBlXCIgW3NsaWNrLXZhbGlkYXRpb24taW5kaWNhdG9yXT1cInZhbGlkYXRpb25JbmRpY2F0b3JcIiBbc2xpY2tWYWxpZGF0aW9uVHlwZV09XCJ2YWxpZGF0aW9uSW5kaWNhdG9yVHlwZVwiICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz0nZm9ybS1jb250cm9sJyBzdHlsZT0nYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcicgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBbcmVhZG9ubHldPVwiIWlzTW9iaWxlXCIgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiF2YWxpZGF0aW9uSW5kaWNhdG9yVHlwZVwiICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz0nZm9ybS1jb250cm9sJyBzdHlsZT0nYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcicgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBbcmVhZG9ubHldPVwiIWlzTW9iaWxlXCIgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcbiAgICAgICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHQgYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiPjxpIGNsYXNzPSdmYXMgZmEtY2hldnJvbi1kb3duJz48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwcGVuZEJ1dHRvbnMgJiYgYXBwZW5kQnV0dG9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBhcHBlbmRCdXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBidG4gYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIiAoY2xpY2spPVwiaGFuZGxlQ3VzdG9tQnV0dG9uQ2xpY2soYnRuLm9uQ2xpY2ssICRldmVudClcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxcHg7IGJvcmRlci1sZWZ0OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMge3sgYnRuLmZhQ2xhc3MgfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHRcdDxkaXYgKm5nSWY9XCJkaXNhYmxlZCA9PT0gdHJ1ZVwiIGNsYXNzPSdpbnB1dC1ncm91cCc+XHJcblx0XHRcdDxpbnB1dCAjc2VsZWN0ZWRUZXh0SW5wdXRSZWYgc3R5bGU9J2N1cnNvcjogZGVmYXVsdCcgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBkaXNhYmxlZD1cImRpc2FibGVkXCIgcmVhZG9ubHkgY2xhc3M9J2Zvcm0tY29udHJvbCcgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcblx0XHRcdDxkaXYgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kIGRpc2FibGVkXCI+XHJcblx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0IHRleHQtbXV0ZWRcIj48aSBjbGFzcz0nZmFzIGZhLWNoZXZyb24tZG93bic+PC9pPjwvc3Bhbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiAgW2NsYXNzTmFtZV09XCInc2xpY2stZHJvcC1kb3duLWNvbXBhY3QgJyArIChjc3NDbGFzcyB8fCAnJylcIiAqbmdJZj1cImNvbXBhY3QgPT09IHRydWVcIj5cclxuXHRcdDxkaXYgKm5nSWY9XCJkaXNhYmxlZCA9PT0gZmFsc2VcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50XCIgKGNsaWNrKT1cIm9uRHJvcGRvd25DbGlja2VkKClcIj5cclxuXHRcdFx0PGlucHV0ICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz1cInRleHQtYm9keVwiIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIG5nLWRpc2FibGVkPSdkaXNhYmxlZCcgcmVhZG9ubHkgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzbGljay1kcm9wLWRvd24tY29tcGFjdC1hcnJvd1wiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAtMXB4O1wiPjxpIGNsYXNzPSdmYXMgZmEtY2hldnJvbi1kb3duJz48L2k+PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHJcblx0XHQ8ZGl2ICpuZ0lmPVwiZGlzYWJsZWQgPT09IHRydWVcIiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0lmPSdzZWxlY3RlZFRleHQnIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+e3tzZWxlY3RlZFRleHR9fTwvZGl2PlxyXG5cdFx0XHQ8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVGV4dFwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+e3twbGFjZWhvbGRlcn19PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PHVsICpuZ0lmPVwiaXNWaXNpYmxlXCIgI2Ryb3Bkb3duTGlzdCBpZD1cInNsaWNrLWRyb3AtZG93bl97e3V1aWR9fVwiIGNsYXNzPSdzbGljay1kcm9wLWRvd24tbGlzdC1ncm91cCBkcm9wZG93bi1tZW51JyBbc3R5bGUud2lkdGhdPVwibGlzdEdyb3VwV2lkdGhcIiBbc3R5bGUudmlzaWJpbGl0eV09XCIoZXhwYW5kZWQgPT09IHRydWUpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIiBbc3R5bGUub3BhY2l0eV09XCIoZXhwYW5kZWQgPT09IHRydWUpID8gJzEnIDogJzAnXCIgW3N0eWxlLm1heC1oZWlnaHRdPVwiaGVpZ2h0XCIgW3N0eWxlLndpZHRoLnB4XT1cImxpc3RHcm91cFdpZHRoXCIgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiIFtzdHlsZS50b3AucHhdPVwidG9wXCI+XHJcblx0XHQ8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmlzaWJsZUl0ZW1zOyBsZXQgaW5kZXggPSBpbmRleDtcIiAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIiBbY2xhc3MuYWN0aXZlXT1cIml0ZW0uaWQgPT09IHNlbGVjdGVkSXRlbT8uaWRcIiBbY2xhc3MuY2FyZC1oZWFkZXJdPVwic2VsZWN0ZWRJbmRleCA9PT0gaW5kZXhcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj57e2l0ZW0udGV4dH19PC9saT5cclxuXHQ8L3VsPlxyXG5cclxuPC9kaXY+Il19
|