@wavemaker/app-ng-runtime 11.14.1-rc.6310 → 11.14.2-rc.242
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/components/advanced/carousel/bundles/index.umd.js +15 -1
- package/components/advanced/carousel/carousel.directive.d.ts +1 -0
- package/components/advanced/carousel/esm2022/carousel.directive.mjs +16 -2
- package/components/advanced/carousel/fesm2022/index.mjs +15 -1
- package/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
- package/components/advanced/login/bundles/index.umd.js +24 -3
- package/components/advanced/login/esm2022/login.component.mjs +25 -4
- package/components/advanced/login/fesm2022/index.mjs +24 -3
- package/components/advanced/login/fesm2022/index.mjs.map +1 -1
- package/components/advanced/login/login.component.d.ts +5 -2
- package/components/base/bundles/index.umd.js +331 -36
- package/components/base/directives/show-in-device.directive.d.ts +2 -1
- package/components/base/esm2022/directives/show-in-device.directive.mjs +22 -4
- package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
- package/components/base/esm2022/utils/widget-utils.mjs +3 -3
- package/components/base/esm2022/widgets/common/base/base-container.component.mjs +27 -1
- package/components/base/esm2022/widgets/common/base/base-field-validations.mjs +18 -1
- package/components/base/esm2022/widgets/common/base/base.component.mjs +68 -7
- package/components/base/esm2022/widgets/common/base/custom-widget-container.directive.mjs +9 -1
- package/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +44 -11
- package/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +20 -1
- package/components/base/esm2022/widgets/common/item-template/item-template.directive.mjs +26 -1
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +44 -4
- package/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +16 -1
- package/components/base/esm2022/widgets/common/pull-to-refresh/pull-to-refresh.mjs +22 -1
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
- package/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +5 -3
- package/components/base/esm2022/widgets/framework/widget-registry.mjs +6 -3
- package/components/base/fesm2022/index.mjs +327 -34
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/base/pipes/custom-pipes.d.ts +5 -5
- package/components/base/widgets/common/base/base-container.component.d.ts +3 -2
- package/components/base/widgets/common/base/base-field-validations.d.ts +1 -0
- package/components/base/widgets/common/base/custom-widget-container.directive.d.ts +3 -2
- package/components/base/widgets/common/base/dataset-aware-nav.component.d.ts +6 -2
- package/components/base/widgets/common/base/partial-container.directive.d.ts +3 -2
- package/components/base/widgets/common/item-template/item-template.directive.d.ts +3 -2
- package/components/base/widgets/common/lazy-load/lazy-load.directive.d.ts +1 -1
- package/components/base/widgets/common/partial-param/partial-param.directive.d.ts +3 -2
- package/components/base/widgets/common/pull-to-refresh/pull-to-refresh.d.ts +3 -2
- package/components/basic/anchor/bundles/index.umd.js +13 -1
- package/components/basic/anchor/esm2022/anchor.component.mjs +14 -2
- package/components/basic/anchor/fesm2022/index.mjs +13 -1
- package/components/basic/anchor/fesm2022/index.mjs.map +1 -1
- package/components/basic/html/bundles/index.umd.js +13 -1
- package/components/basic/html/esm2022/html.directive.mjs +14 -2
- package/components/basic/html/fesm2022/index.mjs +13 -1
- package/components/basic/html/fesm2022/index.mjs.map +1 -1
- package/components/basic/label/bundles/index.umd.js +17 -1
- package/components/basic/label/esm2022/label.directive.mjs +18 -2
- package/components/basic/label/fesm2022/index.mjs +17 -1
- package/components/basic/label/fesm2022/index.mjs.map +1 -1
- package/components/basic/label/label.directive.d.ts +3 -2
- package/components/basic/progress/progress-circle/bundles/index.umd.js +10 -0
- package/components/basic/progress/progress-circle/esm2022/progress-circle.component.mjs +11 -1
- package/components/basic/progress/progress-circle/fesm2022/index.mjs +10 -0
- package/components/basic/progress/progress-circle/fesm2022/index.mjs.map +1 -1
- package/components/basic/progress/progress-circle/progress-circle.component.d.ts +3 -2
- package/components/basic/search/bundles/index.umd.js +31 -5
- package/components/basic/search/esm2022/scrollable.directive.mjs +13 -4
- package/components/basic/search/esm2022/search.component.mjs +20 -3
- package/components/basic/search/fesm2022/index.mjs +31 -5
- package/components/basic/search/fesm2022/index.mjs.map +1 -1
- package/components/basic/search/scrollable.directive.d.ts +5 -3
- package/components/basic/search/search.component.d.ts +3 -2
- package/components/basic/spinner/bundles/index.umd.js +9 -1
- package/components/basic/spinner/esm2022/spinner.component.mjs +10 -2
- package/components/basic/spinner/fesm2022/index.mjs +9 -1
- package/components/basic/spinner/fesm2022/index.mjs.map +1 -1
- package/components/basic/spinner/spinner.component.d.ts +4 -2
- package/components/chart/bundles/index.umd.js +21 -3
- package/components/chart/esm2022/chart.component.mjs +22 -4
- package/components/chart/fesm2022/index.mjs +21 -3
- package/components/chart/fesm2022/index.mjs.map +1 -1
- package/components/containers/accordion/accordion-pane/accordion-pane.component.d.ts +3 -2
- package/components/containers/accordion/accordion.directive.d.ts +5 -2
- package/components/containers/accordion/bundles/index.umd.js +49 -2
- package/components/containers/accordion/esm2022/accordion-pane/accordion-pane.component.mjs +10 -1
- package/components/containers/accordion/esm2022/accordion.directive.mjs +41 -3
- package/components/containers/accordion/fesm2022/index.mjs +49 -2
- package/components/containers/accordion/fesm2022/index.mjs.map +1 -1
- package/components/containers/panel/bundles/index.umd.js +13 -0
- package/components/containers/panel/esm2022/panel.component.mjs +14 -1
- package/components/containers/panel/fesm2022/index.mjs +13 -0
- package/components/containers/panel/fesm2022/index.mjs.map +1 -1
- package/components/containers/panel/panel.component.d.ts +3 -2
- package/components/containers/tabs/bundles/index.umd.js +54 -2
- package/components/containers/tabs/esm2022/tab-pane/tab-pane.component.mjs +10 -1
- package/components/containers/tabs/esm2022/tabs.component.mjs +46 -3
- package/components/containers/tabs/fesm2022/index.mjs +54 -2
- package/components/containers/tabs/fesm2022/index.mjs.map +1 -1
- package/components/containers/tabs/tab-pane/tab-pane.component.d.ts +3 -2
- package/components/containers/tabs/tabs.component.d.ts +5 -2
- package/components/containers/wizard/bundles/index.umd.js +47 -3
- package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +16 -3
- package/components/containers/wizard/esm2022/wizard.component.mjs +33 -2
- package/components/containers/wizard/fesm2022/index.mjs +47 -3
- package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
- package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +3 -2
- package/components/containers/wizard/wizard.component.d.ts +4 -2
- package/components/data/card/bundles/index.umd.js +17 -1
- package/components/data/card/card-content/card-content.component.d.ts +3 -2
- package/components/data/card/card.component.d.ts +4 -2
- package/components/data/card/esm2022/card-content/card-content.component.mjs +6 -1
- package/components/data/card/esm2022/card.component.mjs +13 -2
- package/components/data/card/fesm2022/index.mjs +17 -1
- package/components/data/card/fesm2022/index.mjs.map +1 -1
- package/components/data/form/bundles/index.umd.js +92 -0
- package/components/data/form/esm2022/form-action/form-action.directive.mjs +7 -1
- package/components/data/form/esm2022/form-field/form-field.directive.mjs +28 -1
- package/components/data/form/esm2022/form-widget.directive.mjs +8 -1
- package/components/data/form/esm2022/form.component.mjs +27 -1
- package/components/data/form/esm2022/live-actions/live-actions.directive.mjs +7 -1
- package/components/data/form/esm2022/live-filter/live-filter.directive.mjs +12 -1
- package/components/data/form/esm2022/live-form/live-form.directive.mjs +10 -1
- package/components/data/form/fesm2022/index.mjs +92 -0
- package/components/data/form/fesm2022/index.mjs.map +1 -1
- package/components/data/form/form-action/form-action.directive.d.ts +3 -2
- package/components/data/form/form-field/form-field.directive.d.ts +3 -2
- package/components/data/form/form-widget.directive.d.ts +3 -2
- package/components/data/form/live-actions/live-actions.directive.d.ts +3 -1
- package/components/data/form/live-filter/live-filter.directive.d.ts +3 -1
- package/components/data/form/live-form/live-form.directive.d.ts +3 -1
- package/components/data/list/bundles/index.umd.js +213 -19
- package/components/data/list/esm2022/list-item.directive.mjs +95 -11
- package/components/data/list/esm2022/list.component.mjs +120 -10
- package/components/data/list/fesm2022/index.mjs +213 -19
- package/components/data/list/fesm2022/index.mjs.map +1 -1
- package/components/data/list/list-item.directive.d.ts +7 -2
- package/components/data/list/list.component.d.ts +7 -0
- package/components/data/live-table/bundles/index.umd.js +13 -1
- package/components/data/live-table/esm2022/live-table.component.mjs +14 -2
- package/components/data/live-table/fesm2022/index.mjs +13 -1
- package/components/data/live-table/fesm2022/index.mjs.map +1 -1
- package/components/data/live-table/live-table.component.d.ts +4 -2
- package/components/data/pagination/bundles/index.umd.js +57 -4
- package/components/data/pagination/esm2022/pagination.component.mjs +58 -5
- package/components/data/pagination/fesm2022/index.mjs +57 -4
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/pagination/pagination.component.d.ts +4 -2
- package/components/data/table/bundles/index.umd.js +345 -15
- package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table-column/table-column.directive.mjs +107 -3
- package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
- package/components/data/table/esm2022/table-cud.directive.mjs +8 -2
- package/components/data/table/esm2022/table-filter.directive.mjs +12 -2
- package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
- package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table.component.mjs +193 -12
- package/components/data/table/fesm2022/index.mjs +345 -15
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table-action/table-action.directive.d.ts +3 -2
- package/components/data/table/table-column/table-column.directive.d.ts +3 -2
- package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
- package/components/data/table/table-cud.directive.d.ts +3 -1
- package/components/data/table/table-filter.directive.d.ts +3 -1
- package/components/data/table/table-row/table-row.directive.d.ts +3 -2
- package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
- package/components/data/table/table.component.d.ts +6 -2
- package/components/dialogs/alert-dialog/alert-dialog.component.d.ts +3 -2
- package/components/dialogs/alert-dialog/bundles/index.umd.js +5 -0
- package/components/dialogs/alert-dialog/esm2022/alert-dialog.component.mjs +6 -1
- package/components/dialogs/alert-dialog/fesm2022/index.mjs +5 -0
- package/components/dialogs/alert-dialog/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/confirm-dialog/bundles/index.umd.js +5 -0
- package/components/dialogs/confirm-dialog/confirm-dialog.component.d.ts +3 -2
- package/components/dialogs/confirm-dialog/esm2022/confirm-dialog.component.mjs +6 -1
- package/components/dialogs/confirm-dialog/fesm2022/index.mjs +5 -0
- package/components/dialogs/confirm-dialog/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/default/bundles/index.umd.js +15 -2
- package/components/dialogs/default/dialog-body/dialog-body.directive.d.ts +4 -2
- package/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +16 -3
- package/components/dialogs/default/fesm2022/index.mjs +15 -2
- package/components/dialogs/default/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/design-dialog/bundles/index.umd.js +7 -0
- package/components/dialogs/design-dialog/dialog.component.d.ts +3 -2
- package/components/dialogs/design-dialog/esm2022/dialog.component.mjs +8 -1
- package/components/dialogs/design-dialog/fesm2022/index.mjs +7 -0
- package/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/iframe-dialog/bundles/index.umd.js +5 -0
- package/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +6 -1
- package/components/dialogs/iframe-dialog/fesm2022/index.mjs +5 -0
- package/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/iframe-dialog/iframe-dialog.component.d.ts +3 -2
- package/components/dialogs/partial-dialog/bundles/index.umd.js +23 -3
- package/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +24 -4
- package/components/dialogs/partial-dialog/fesm2022/index.mjs +23 -3
- package/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
- package/components/dialogs/partial-dialog/partial-dialog.component.d.ts +4 -2
- package/components/input/base-form/base-form.component.d.ts +4 -2
- package/components/input/base-form/bundles/index.umd.js +16 -2
- package/components/input/base-form/esm2022/base-form.component.mjs +17 -3
- package/components/input/base-form/fesm2022/index.mjs +16 -2
- package/components/input/base-form/fesm2022/index.mjs.map +1 -1
- package/components/input/base-form-custom/base-form-custom.component.d.ts +3 -2
- package/components/input/base-form-custom/bundles/index.umd.js +13 -2
- package/components/input/base-form-custom/esm2022/base-form-custom.component.mjs +14 -3
- package/components/input/base-form-custom/fesm2022/index.mjs +13 -2
- package/components/input/base-form-custom/fesm2022/index.mjs.map +1 -1
- package/components/input/checkbox/bundles/index.umd.js +7 -0
- package/components/input/checkbox/checkbox.component.d.ts +3 -2
- package/components/input/checkbox/esm2022/checkbox.component.mjs +8 -1
- package/components/input/checkbox/fesm2022/index.mjs +7 -0
- package/components/input/checkbox/fesm2022/index.mjs.map +1 -1
- package/components/input/checkboxset/bundles/index.umd.js +18 -2
- package/components/input/checkboxset/checkboxset.component.d.ts +4 -2
- package/components/input/checkboxset/esm2022/checkboxset.component.mjs +19 -3
- package/components/input/checkboxset/fesm2022/index.mjs +18 -2
- package/components/input/checkboxset/fesm2022/index.mjs.map +1 -1
- package/components/input/chips/bundles/index.umd.js +45 -5
- package/components/input/chips/chips.component.d.ts +3 -2
- package/components/input/chips/esm2022/chips.component.mjs +46 -6
- package/components/input/chips/fesm2022/index.mjs +45 -5
- package/components/input/chips/fesm2022/index.mjs.map +1 -1
- package/components/input/color-picker/bundles/index.umd.js +8 -0
- package/components/input/color-picker/color-picker.component.d.ts +3 -2
- package/components/input/color-picker/esm2022/color-picker.component.mjs +9 -1
- package/components/input/color-picker/fesm2022/index.mjs +8 -0
- package/components/input/color-picker/fesm2022/index.mjs.map +1 -1
- package/components/input/composite/bundles/index.umd.js +10 -1
- package/components/input/composite/composite.directive.d.ts +3 -2
- package/components/input/composite/esm2022/composite.directive.mjs +11 -2
- package/components/input/composite/fesm2022/index.mjs +10 -1
- package/components/input/composite/fesm2022/index.mjs.map +1 -1
- package/components/input/currency/bundles/index.umd.js +7 -0
- package/components/input/currency/currency.component.d.ts +3 -2
- package/components/input/currency/esm2022/currency.component.mjs +8 -1
- package/components/input/currency/fesm2022/index.mjs +7 -0
- package/components/input/currency/fesm2022/index.mjs.map +1 -1
- package/components/input/dataset-aware-form/bundles/index.umd.js +26 -2
- package/components/input/dataset-aware-form/esm2022/dataset-aware-form.component.mjs +27 -3
- package/components/input/dataset-aware-form/fesm2022/index.mjs +26 -2
- package/components/input/dataset-aware-form/fesm2022/index.mjs.map +1 -1
- package/components/input/epoch/date/bundles/index.umd.js +22 -0
- package/components/input/epoch/date/date.component.d.ts +1 -0
- package/components/input/epoch/date/esm2022/date.component.mjs +23 -1
- package/components/input/epoch/date/fesm2022/index.mjs +22 -0
- package/components/input/epoch/date/fesm2022/index.mjs.map +1 -1
- package/components/input/file-upload/bundles/index.umd.js +25 -8
- package/components/input/file-upload/esm2022/file-upload.component.mjs +26 -9
- package/components/input/file-upload/fesm2022/index.mjs +25 -8
- package/components/input/file-upload/fesm2022/index.mjs.map +1 -1
- package/components/input/file-upload/file-upload.component.d.ts +3 -0
- package/components/input/number/bundles/index.umd.js +8 -0
- package/components/input/number/esm2022/number.component.mjs +9 -1
- package/components/input/number/fesm2022/index.mjs +8 -0
- package/components/input/number/fesm2022/index.mjs.map +1 -1
- package/components/input/number/number.component.d.ts +3 -2
- package/components/input/radioset/bundles/index.umd.js +18 -2
- package/components/input/radioset/esm2022/radioset.component.mjs +19 -3
- package/components/input/radioset/fesm2022/index.mjs +18 -2
- package/components/input/radioset/fesm2022/index.mjs.map +1 -1
- package/components/input/radioset/radioset.component.d.ts +4 -2
- package/components/input/rating/bundles/index.umd.js +10 -0
- package/components/input/rating/esm2022/rating.component.mjs +11 -1
- package/components/input/rating/fesm2022/index.mjs +10 -0
- package/components/input/rating/fesm2022/index.mjs.map +1 -1
- package/components/input/rating/rating.component.d.ts +3 -2
- package/components/input/select/bundles/index.umd.js +6 -0
- package/components/input/select/esm2022/select.component.mjs +7 -1
- package/components/input/select/fesm2022/index.mjs +6 -0
- package/components/input/select/fesm2022/index.mjs.map +1 -1
- package/components/input/select/select.component.d.ts +3 -2
- package/components/input/slider/bundles/index.umd.js +10 -0
- package/components/input/slider/esm2022/slider.component.mjs +11 -1
- package/components/input/slider/fesm2022/index.mjs +10 -0
- package/components/input/slider/fesm2022/index.mjs.map +1 -1
- package/components/input/slider/slider.component.d.ts +3 -2
- package/components/input/switch/bundles/index.umd.js +22 -2
- package/components/input/switch/esm2022/switch.component.mjs +23 -3
- package/components/input/switch/fesm2022/index.mjs +22 -2
- package/components/input/switch/fesm2022/index.mjs.map +1 -1
- package/components/input/switch/switch.component.d.ts +3 -2
- package/components/input/text/bundles/index.umd.js +36 -0
- package/components/input/text/esm2022/input-calendar/input-calendar.component.mjs +8 -1
- package/components/input/text/esm2022/input-color/input-color.component.mjs +8 -1
- package/components/input/text/esm2022/input-email/input-email.component.mjs +8 -1
- package/components/input/text/esm2022/input-number/input-number.component.mjs +8 -1
- package/components/input/text/esm2022/input-text/input-text.component.mjs +9 -1
- package/components/input/text/fesm2022/index.mjs +36 -0
- package/components/input/text/fesm2022/index.mjs.map +1 -1
- package/components/input/text/input-calendar/input-calendar.component.d.ts +3 -2
- package/components/input/text/input-color/input-color.component.d.ts +3 -2
- package/components/input/text/input-email/input-email.component.d.ts +3 -2
- package/components/input/text/input-number/input-number.component.d.ts +3 -2
- package/components/input/text/input-text/input-text.component.d.ts +3 -2
- package/components/input/textarea/bundles/index.umd.js +7 -0
- package/components/input/textarea/esm2022/textarea.component.mjs +8 -1
- package/components/input/textarea/fesm2022/index.mjs +7 -0
- package/components/input/textarea/fesm2022/index.mjs.map +1 -1
- package/components/input/textarea/textarea.component.d.ts +3 -2
- package/components/navigation/menu/bundles/index.umd.js +55 -6
- package/components/navigation/menu/esm2022/menu-adapator.component.mjs +17 -3
- package/components/navigation/menu/esm2022/menu.component.mjs +10 -3
- package/components/navigation/menu/esm2022/nav/nav-item/nav-item.directive.mjs +6 -1
- package/components/navigation/menu/esm2022/nav/nav.component.mjs +11 -1
- package/components/navigation/menu/esm2022/nav/navigation-control.directive.mjs +16 -3
- package/components/navigation/menu/fesm2022/index.mjs +55 -6
- package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- package/components/navigation/menu/menu-adapator.component.d.ts +4 -2
- package/components/navigation/menu/nav/nav-item/nav-item.directive.d.ts +3 -2
- package/components/navigation/menu/nav/nav.component.d.ts +3 -2
- package/components/navigation/menu/nav/navigation-control.directive.d.ts +4 -2
- package/components/navigation/navbar/bundles/index.umd.js +5 -0
- package/components/navigation/navbar/esm2022/navbar.component.mjs +6 -1
- package/components/navigation/navbar/fesm2022/index.mjs +5 -0
- package/components/navigation/navbar/fesm2022/index.mjs.map +1 -1
- package/components/navigation/navbar/navbar.component.d.ts +3 -2
- package/components/navigation/popover/bundles/index.umd.js +65 -13
- package/components/navigation/popover/esm2022/popover.component.mjs +63 -11
- package/components/navigation/popover/fesm2022/index.mjs +62 -10
- package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/popover.component.d.ts +11 -3
- package/components/page/default/bundles/index.umd.js +30 -6
- package/components/page/default/esm2022/layout.directive.mjs +9 -1
- package/components/page/default/esm2022/page-content/page-content.component.mjs +13 -3
- package/components/page/default/esm2022/router-outlet.directive.mjs +13 -6
- package/components/page/default/fesm2022/index.mjs +30 -6
- package/components/page/default/fesm2022/index.mjs.map +1 -1
- package/components/page/default/layout.directive.d.ts +3 -2
- package/components/page/default/page-content/page-content.component.d.ts +3 -2
- package/components/page/default/router-outlet.directive.d.ts +5 -2
- package/components/page/left-panel/bundles/index.umd.js +16 -0
- package/components/page/left-panel/esm2022/left-panel.directive.mjs +17 -1
- package/components/page/left-panel/fesm2022/index.mjs +16 -0
- package/components/page/left-panel/fesm2022/index.mjs.map +1 -1
- package/components/page/left-panel/left-panel.directive.d.ts +3 -2
- package/components/page/top-nav/bundles/index.umd.js +2 -1
- package/components/page/top-nav/esm2022/top-nav.props.mjs +3 -2
- package/components/page/top-nav/fesm2022/index.mjs +2 -1
- package/components/page/top-nav/fesm2022/index.mjs.map +1 -1
- package/components/prefab/bundles/index.umd.js +4 -0
- package/components/prefab/esm2022/prefab.directive.mjs +5 -1
- package/components/prefab/fesm2022/index.mjs +4 -0
- package/components/prefab/fesm2022/index.mjs.map +1 -1
- package/core/bundles/index.umd.js +391 -94
- package/core/esm2022/public_api.mjs +3 -3
- package/core/esm2022/services/viewport.service.mjs +24 -10
- package/core/esm2022/types/types.mjs +1 -1
- package/core/esm2022/utils/dom.mjs +18 -2
- package/core/esm2022/utils/event-notifier.mjs +5 -2
- package/core/esm2022/utils/lru-cache.mjs +16 -2
- package/core/esm2022/utils/utils.mjs +6 -2
- package/core/esm2022/utils/watcher.mjs +323 -81
- package/core/fesm2022/index.mjs +390 -96
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +2 -2
- package/core/services/viewport.service.d.ts +5 -2
- package/core/types/types.d.ts +1 -0
- package/core/utils/lru-cache.d.ts +6 -0
- package/core/utils/utils.d.ts +1 -0
- package/core/utils/watcher.d.ts +26 -5
- package/http/bundles/index.umd.js +31 -1
- package/http/esm2022/http.service.mjs +32 -2
- package/http/fesm2022/index.mjs +31 -1
- package/http/fesm2022/index.mjs.map +1 -1
- package/http/http.service.d.ts +6 -2
- package/npm-shrinkwrap.json +2 -2
- package/oAuth/bundles/index.umd.js +9 -0
- package/oAuth/esm2022/oAuth.service.mjs +10 -1
- package/oAuth/fesm2022/index.mjs +9 -0
- package/oAuth/fesm2022/index.mjs.map +1 -1
- package/oAuth/oAuth.service.d.ts +3 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +367 -32
- package/runtime/base/components/app-component/app.component.d.ts +4 -0
- package/runtime/base/components/prefab-preview.component.d.ts +5 -2
- package/runtime/base/directives/accessroles.directive.d.ts +4 -3
- package/runtime/base/directives/prefab.directive.d.ts +3 -2
- package/runtime/base/esm2022/components/app-component/app.component.mjs +40 -9
- package/runtime/base/esm2022/components/base-custom-widget.component.mjs +33 -2
- package/runtime/base/esm2022/components/base-layout.component.mjs +7 -1
- package/runtime/base/esm2022/components/base-page.component.mjs +36 -3
- package/runtime/base/esm2022/components/base-partial.component.mjs +37 -3
- package/runtime/base/esm2022/components/base-prefab.component.mjs +32 -3
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +37 -3
- package/runtime/base/esm2022/components/prefab-preview.component.mjs +23 -4
- package/runtime/base/esm2022/directives/accessroles.directive.mjs +11 -2
- package/runtime/base/esm2022/directives/prefab.directive.mjs +9 -1
- package/runtime/base/esm2022/services/app.manager.service.mjs +40 -12
- package/runtime/base/esm2022/services/app.service.mjs +34 -2
- package/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +4 -1
- package/runtime/base/esm2022/services/pipe-provider.service.mjs +7 -4
- package/runtime/base/esm2022/services/spinner.service.mjs +15 -1
- package/runtime/base/esm2022/util/fragment-monitor.mjs +23 -2
- package/runtime/base/fesm2022/index.mjs +368 -33
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/runtime/base/runtime-base.module.d.ts +2 -2
- package/runtime/base/services/app.manager.service.d.ts +6 -1
- package/runtime/base/services/app.service.d.ts +12 -2
- package/runtime/base/services/dynamic-component-ref-provider.service.d.ts +2 -1
- package/runtime/base/services/spinner.service.d.ts +3 -1
- package/runtime/base/util/fragment-monitor.d.ts +6 -0
- package/runtime/dynamic/bundles/index.umd.js +5 -0
- package/runtime/dynamic/esm2022/app/components/page-wrapper.component.mjs +6 -1
- package/runtime/dynamic/fesm2022/index.mjs +5 -0
- package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
- package/scripts/@wavemaker/nvd3/build/nv.d3.min.js +1 -1
- package/scripts/datatable/datatable.js +100 -14
- package/security/bundles/index.umd.js +41 -2
- package/security/esm2022/security.service.mjs +42 -3
- package/security/fesm2022/index.mjs +41 -2
- package/security/fesm2022/index.mjs.map +1 -1
- package/security/security.service.d.ts +5 -2
- package/variables/bundles/index.umd.js +50 -6
- package/variables/esm2022/manager/action/notification-action.manager.mjs +18 -3
- package/variables/esm2022/manager/variable/base-variable.manager.mjs +15 -2
- package/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +13 -3
- package/variables/esm2022/service/variables.service.mjs +8 -2
- package/variables/fesm2022/index.mjs +50 -6
- package/variables/fesm2022/index.mjs.map +1 -1
|
@@ -697,12 +697,29 @@ export class SearchComponent extends DatasetAwareFormComponent {
|
|
|
697
697
|
}
|
|
698
698
|
super.onPropertyChange(key, nv, ov);
|
|
699
699
|
}
|
|
700
|
+
ngOnDestroy() {
|
|
701
|
+
// MEMORY LEAK FIX: Clear QueryList reference
|
|
702
|
+
this.liElements = null;
|
|
703
|
+
// MEMORY LEAK FIX: Clear data provider
|
|
704
|
+
if (this.dataProvider) {
|
|
705
|
+
this.dataProvider = null;
|
|
706
|
+
}
|
|
707
|
+
// MEMORY LEAK FIX: Clear typeahead reference
|
|
708
|
+
if (this.typeahead) {
|
|
709
|
+
this.typeahead = null;
|
|
710
|
+
}
|
|
711
|
+
// MEMORY LEAK FIX: Clear query model
|
|
712
|
+
this.queryModel = null;
|
|
713
|
+
this.query = '';
|
|
714
|
+
// Call parent ngOnDestroy (DatasetAwareFormComponent has cleanup)
|
|
715
|
+
super.ngOnDestroy();
|
|
716
|
+
}
|
|
700
717
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchComponent, deps: [{ token: i0.Injector }, { token: i1.App }, { token: 'datavalue.bind', attribute: true }, { token: 'dataset.bind', attribute: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
701
718
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SearchComponent, isStandalone: true, selector: "[wmSearch]", providers: [
|
|
702
719
|
provideAs(SearchComponent, NG_VALUE_ACCESSOR, true),
|
|
703
720
|
provideAs(SearchComponent, NG_VALIDATORS, true),
|
|
704
721
|
provideAsWidgetRef(SearchComponent)
|
|
705
|
-
], viewQueries: [{ propertyName: "typeahead", first: true, predicate: TypeaheadDirective, descendants: true }, { propertyName: "ulElement", first: true, predicate: ["ulElement"], descendants: true }, { propertyName: "liElements", predicate: ["liElements"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\"
|
|
722
|
+
], viewQueries: [{ propertyName: "typeahead", first: true, predicate: TypeaheadDirective, descendants: true }, { propertyName: "ulElement", first: true, predicate: ["ulElement"], descendants: true }, { propertyName: "liElements", predicate: ["liElements"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\" scrollableHandler>\n @for (match of matches; track match; let i = $index) {\n <li #liElements [ngClass]=\"{active: typeaheadContainer && typeaheadContainer.isActive(match), 'list-group-header': match && match.isHeader()}\"\n (mouseenter)=\"typeaheadContainer.selectActive(match);\"\n (click)=\"match && !match.isHeader() && typeaheadContainer.selectMatch(match, $event); $typeaheadEvent = $event; notifySubscriber();\">\n <!-- itemTemplate comes from the <input> -->\n @if (match.isHeader()) {\n <h4 class=\"group-title\">{{match.value}}</h4>\n }\n @if (!match.isHeader()) {\n <ng-container [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-container>\n }\n </li>\n }\n <div class=\"status\" [hidden]=\"_loadingItems || !(datacompletemsg && dataProvider.isLastPage)\">\n <span [textContent]=\"datacompletemsg\"></span>\n </div>\n <div class=\"status\" [hidden]=\"!_loadingItems\">\n <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n <span [textContent]=\"loadingdatamsg\"></span>\n </div>\n </ul>\n</ng-template>\n\n<!--This template is for search inside mobile navbar.-->\n@if (navsearchbar) {\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n container=\"body\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event)\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event);\"\n (focusout)=\"onFocusOut()\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [dropup]=\"dropup\"\n [tabindex]=\"tabindex\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\"/>\n <i class=\"btn-close wi wi-cancel\" [hidden]=\"!showClosebtn\" (click)=\"clearSearch($event);\"></i>\n} @else {\n <button type=\"button\" class=\"btn btn-icon form-control-feedback back-btn\" aria-hidden=\"true\" (click)=\"closeSearch()\"><i class=\"app-icon {{backsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Back button</span>\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n [container]=\"containerTarget || '.wm-app'\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event); onFocusOut()\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event)\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [tabindex]=\"tabindex\"\n [dropup]=\"dropup\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\">\n <input class=\"model-holder\" ng-model=\"proxyModel\" ng-required=\"required\" tabindex=\"-1\" aria-hidden=\"true\">\n @if (_loadingItems) {\n <span aria-hidden=\"true\" class=\"fa fa-circle-o-notch fa-spin form-control-feedback\"></span>\n }\n <button type=\"button\" class=\"btn btn-icon form-control-feedback clear-btn\" [ngClass]=\"{'show-btn': isQueryEntered()}\" (click)=\"clearSearch($event, true)\"><i class=\"app-icon {{clearsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Clear button</span>\n @if (showsearchicon) {\n <span [ngClass]=\"{'disabled': disabled}\" class=\"input-group-addon\">\n <form>\n <button title=\"Search\" [disabled]=\"disabled\" class=\"app-search-button btn btn-icon\" type=\"submit\"\n (click)=\"onSearchSelect($event)\">\n <i class=\"app-icon {{searchiconclass}}\"></i></button>\n </form>\n </span>\n }\n }\n <!--This template is for both web and fullscreen mode in mobile.-->\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", 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]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: ScrollableDirective, selector: "[scrollableHandler]" }, { kind: "ngmodule", type: TypeaheadModule }, { kind: "directive", type: i4.TypeaheadDirective, selector: "[typeahead]", inputs: ["typeahead", "typeaheadMinLength", "adaptivePosition", "isAnimated", "typeaheadWaitMs", "typeaheadOptionsLimit", "typeaheadOptionField", "typeaheadGroupField", "typeaheadOrderBy", "typeaheadAsync", "typeaheadLatinize", "typeaheadSingleWords", "typeaheadWordDelimiters", "typeaheadMultipleSearch", "typeaheadMultipleSearchDelimiters", "typeaheadPhraseDelimiters", "typeaheadItemTemplate", "optionsListTemplate", "typeaheadScrollable", "typeaheadOptionsInScrollableView", "typeaheadHideResultsOnBlur", "typeaheadSelectFirstItem", "typeaheadIsFirstItemActive", "container", "dropup"], outputs: ["typeaheadLoading", "typeaheadNoResults", "typeaheadOnSelect", "typeaheadOnPreview", "typeaheadOnBlur"], exportAs: ["bs-typeahead"] }, { kind: "directive", type: TextContentDirective, selector: "[textContent]", inputs: ["textContent"] }, { kind: "directive", type: ItemTemplateDirective, selector: "[wmItemTemplate]", inputs: ["userComponentParams", "wmItemTemplate"], exportAs: ["itemTemplateRef"] }, { kind: "directive", type: PartialParamHandlerDirective, selector: "[partialContainer]" }, { kind: "directive", type: PartialContainerDirective, selector: "[partialContainer]" }] }); }
|
|
706
723
|
}
|
|
707
724
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchComponent, decorators: [{
|
|
708
725
|
type: Component,
|
|
@@ -710,7 +727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
710
727
|
provideAs(SearchComponent, NG_VALUE_ACCESSOR, true),
|
|
711
728
|
provideAs(SearchComponent, NG_VALIDATORS, true),
|
|
712
729
|
provideAsWidgetRef(SearchComponent)
|
|
713
|
-
], template: "<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\"
|
|
730
|
+
], template: "<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\" scrollableHandler>\n @for (match of matches; track match; let i = $index) {\n <li #liElements [ngClass]=\"{active: typeaheadContainer && typeaheadContainer.isActive(match), 'list-group-header': match && match.isHeader()}\"\n (mouseenter)=\"typeaheadContainer.selectActive(match);\"\n (click)=\"match && !match.isHeader() && typeaheadContainer.selectMatch(match, $event); $typeaheadEvent = $event; notifySubscriber();\">\n <!-- itemTemplate comes from the <input> -->\n @if (match.isHeader()) {\n <h4 class=\"group-title\">{{match.value}}</h4>\n }\n @if (!match.isHeader()) {\n <ng-container [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-container>\n }\n </li>\n }\n <div class=\"status\" [hidden]=\"_loadingItems || !(datacompletemsg && dataProvider.isLastPage)\">\n <span [textContent]=\"datacompletemsg\"></span>\n </div>\n <div class=\"status\" [hidden]=\"!_loadingItems\">\n <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n <span [textContent]=\"loadingdatamsg\"></span>\n </div>\n </ul>\n</ng-template>\n\n<!--This template is for search inside mobile navbar.-->\n@if (navsearchbar) {\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n container=\"body\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event)\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event);\"\n (focusout)=\"onFocusOut()\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [dropup]=\"dropup\"\n [tabindex]=\"tabindex\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\"/>\n <i class=\"btn-close wi wi-cancel\" [hidden]=\"!showClosebtn\" (click)=\"clearSearch($event);\"></i>\n} @else {\n <button type=\"button\" class=\"btn btn-icon form-control-feedback back-btn\" aria-hidden=\"true\" (click)=\"closeSearch()\"><i class=\"app-icon {{backsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Back button</span>\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n [container]=\"containerTarget || '.wm-app'\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event); onFocusOut()\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event)\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [tabindex]=\"tabindex\"\n [dropup]=\"dropup\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\">\n <input class=\"model-holder\" ng-model=\"proxyModel\" ng-required=\"required\" tabindex=\"-1\" aria-hidden=\"true\">\n @if (_loadingItems) {\n <span aria-hidden=\"true\" class=\"fa fa-circle-o-notch fa-spin form-control-feedback\"></span>\n }\n <button type=\"button\" class=\"btn btn-icon form-control-feedback clear-btn\" [ngClass]=\"{'show-btn': isQueryEntered()}\" (click)=\"clearSearch($event, true)\"><i class=\"app-icon {{clearsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Clear button</span>\n @if (showsearchicon) {\n <span [ngClass]=\"{'disabled': disabled}\" class=\"input-group-addon\">\n <form>\n <button title=\"Search\" [disabled]=\"disabled\" class=\"app-search-button btn btn-icon\" type=\"submit\"\n (click)=\"onSearchSelect($event)\">\n <i class=\"app-icon {{searchiconclass}}\"></i></button>\n </form>\n </span>\n }\n }\n <!--This template is for both web and fullscreen mode in mobile.-->\n" }]
|
|
714
731
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
|
|
715
732
|
type: Attribute,
|
|
716
733
|
args: ['datavalue.bind']
|
|
@@ -732,4 +749,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
732
749
|
type: ViewChildren,
|
|
733
750
|
args: ['liElements']
|
|
734
751
|
}] } });
|
|
735
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9iYXNpYy9zZWFyY2gvc3JjL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvc2VhcmNoL3NyYy9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFFSCxrQkFBa0IsRUFFbEIsZUFBZSxFQUNsQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM1RyxPQUFPLEVBQ0gsU0FBUyxFQUNULG1CQUFtQixFQUVuQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIseUJB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WSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtGb3Jtc01vZHVsZSwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U2Nyb2xsYWJsZURpcmVjdGl2ZX0gZnJvbSAnLi9zY3JvbGxhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtmcm9tLCBPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWVyZ2VNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBUeXBlYWhlYWRDb250YWluZXJDb21wb25lbnQsXG4gICAgVHlwZWFoZWFkRGlyZWN0aXZlLFxuICAgIFR5cGVhaGVhZE1hdGNoLFxuICAgIFR5cGVhaGVhZE1vZHVsZVxufSBmcm9tICduZ3gtYm9vdHN0cmFwL3R5cGVhaGVhZCc7XG5cbmltcG9ydCB7YWRkQ2xhc3MsIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLCBBcHAsIERhdGFTb3VyY2UsIGlzRGVmaW5lZCwgaXNNb2JpbGUsIHRvQm9vbGVhbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBTExGSUVMRFMsXG4gICAgY29udmVydERhdGFUb09iamVjdCxcbiAgICBEYXRhU2V0SXRlbSxcbiAgICBleHRyYWN0RGF0YUFzQXJyYXksXG4gICAgZ2V0Q29udGFpbmVyVGFyZ2V0Q2xhc3MsXG4gICAgZ2V0VW5pcU9ianNCeURhdGFGaWVsZCxcbiAgICBJdGVtVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgUGFydGlhbENvbnRhaW5lckRpcmVjdGl2ZSxcbiAgICBQYXJ0aWFsUGFyYW1IYW5kbGVyRGlyZWN0aXZlLFxuICAgIHByb3ZpZGVBcyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgc3R5bGVyLFxuICAgIFRleHRDb250ZW50RGlyZWN0aXZlLFxuICAgIHRyYW5zZm9ybUZvcm1EYXRhXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50fSBmcm9tICdAd20vY29tcG9uZW50cy9pbnB1dC9kYXRhc2V0LWF3YXJlLWZvcm0nO1xuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL3NlYXJjaC5wcm9wcyc7XG5pbXBvcnQge0RhdGFQcm92aWRlciwgSURhdGFQcm92aWRlciwgSURhdGFQcm92aWRlckNvbmZpZ30gZnJvbSAnLi9kYXRhLXByb3ZpZGVyL2RhdGEtcHJvdmlkZXInO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZSxcbiAgICBmaW5kLFxuICAgIGdldCxcbiAgICBpbmNsdWRlcyxcbiAgICBpc0FycmF5LFxuICAgIGlzRW1wdHksXG4gICAgaXNFcXVhbCxcbiAgICBpc09iamVjdCxcbiAgICBpc1VuZGVmaW5lZCxcbiAgICBtYXAsXG4gICAgc3BsaXQsXG4gICAgdG9TdHJpbmcsXG4gICAgdHJpbVxufSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7IHdpZGdldFR5cGU6ICd3bS1zZWFyY2gnLCBob3N0Q2xhc3M6ICdpbnB1dC1ncm91cCcgfTtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgU2Nyb2xsYWJsZURpcmVjdGl2ZSwgVHlwZWFoZWFkTW9kdWxlLCBUZXh0Q29udGVudERpcmVjdGl2ZSwgSXRlbVRlbXBsYXRlRGlyZWN0aXZlLCBQYXJ0aWFsUGFyYW1IYW5kbGVyRGlyZWN0aXZlLCBQYXJ0aWFsQ29udGFpbmVyRGlyZWN0aXZlXSxcbiAgICBzZWxlY3RvcjogJ1t3bVNlYXJjaF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXMoU2VhcmNoQ29tcG9uZW50LCBOR19WQUxVRV9BQ0NFU1NPUiwgdHJ1ZSksXG4gICAgICAgIHByb3ZpZGVBcyhTZWFyY2hDb21wb25lbnQsIE5HX1ZBTElEQVRPUlMsIHRydWUpLFxuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoU2VhcmNoQ29tcG9uZW50KVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29tcG9uZW50IGV4dGVuZHMgRGF0YXNldEF3YXJlRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcbiAgICBwdWJsaWMgY2FzZXNlbnNpdGl2ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgc2VhcmNoa2V5OiBzdHJpbmc7XG4gICAgcHVibGljIHF1ZXJ5TW9kZWw6IEFycmF5PERhdGFTZXRJdGVtPiB8IHN0cmluZztcbiAgICBwdWJsaWMgcXVlcnkgPSAnJztcbiAgICBwdWJsaWMgbGltaXQ6IGFueTtcbiAgICBwdWJsaWMgc2hvd3NlYXJjaGljb246IGJvb2xlYW47XG4gICAgcHVibGljIG1pbmNoYXJzOiBudW1iZXI7XG4gICAgcHVibGljIHR5cGU6IHN0cmluZztcbiAgICBwdWJsaWMgbmF2c2VhcmNoYmFyOiBhbnk7XG4gICAgcHVibGljIGRlYm91bmNldGltZTogbnVtYmVyO1xuICAgIHB1YmxpYyBoaW50OiBzdHJpbmc7XG4gICAgcHVibGljIGFyaWFsYWJlbDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBhcHA6IEFwcDtcbiAgICBwcml2YXRlIHR5cGVhaGVhZERhdGFTb3VyY2U6IE9ic2VydmFibGU8YW55PjtcbiAgICBwcml2YXRlIHBhZ2VzaXplOiBhbnk7XG4gICAgcHJpdmF0ZSBwYWdlID0gMTtcbiAgICBwdWJsaWMgX2xvYWRpbmdJdGVtczogYm9vbGVhbjtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlcjogSURhdGFQcm92aWRlcjtcbiAgICBwcml2YXRlIHJlc3VsdDogQXJyYXk8YW55PjsgLy8gY29udGFpbnMgdGhlIHNlYXJjaCByZXN1bHQgaS5lLiBtYXRjaGVzXG4gICAgcHJpdmF0ZSBmb3JtYXR0ZWREYXRhc2V0OiBhbnk7XG4gICAgcHJpdmF0ZSBpc2Zvcm1maWVsZDogYm9vbGVhbjtcbiAgICBwcml2YXRlICR0eXBlYWhlYWRFdmVudDogRXZlbnQ7XG5cbiAgICBwdWJsaWMgdGFiaW5kZXg6IG51bWJlcjtcbiAgICBwdWJsaWMgc3RhcnRJbmRleDogbnVtYmVyO1xuICAgIHB1YmxpYyBiaW5kZGlzcGxheWxhYmVsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGVhaGVhZENvbnRhaW5lcjogVHlwZWFoZWFkQ29udGFpbmVyQ29tcG9uZW50O1xuICAgIHB1YmxpYyBjb250YWluZXJUYXJnZXQ6IHN0cmluZztcbiAgICBwdWJsaWMgY2xlYXJzZWFyY2hpY29uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgYmFja3NlYXJjaGljb25jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWFyY2hpY29uY2xhc3M6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoVHlwZWFoZWFkRGlyZWN0aXZlKSB0eXBlYWhlYWQ6IFR5cGVhaGVhZERpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCd1bEVsZW1lbnQnKSB1bEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZHJlbignbGlFbGVtZW50cycpIGxpRWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICAgIHByaXZhdGUgYWxsb3dvbmx5c2VsZWN0OiBib29sZWFuO1xuICAgIHByaXZhdGUgY2xhc3M6IHN0cmluZztcblxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkSW5kZXg6IG51bWJlcjtcbiAgICBwcml2YXRlIGRhdGFvcHRpb25zOiBhbnk7XG4gICAgcHVibGljIGRyb3Bkb3duRWw6IGFueTtcbiAgICBwcml2YXRlIF9sYXN0UXVlcnk6IHN0cmluZztcbiAgICBwcml2YXRlIF9sYXN0UmVzdWx0OiBhbnk7XG4gICAgcHJpdmF0ZSBfaXNPcGVuOiBib29sZWFuOyAvLyBzZXQgdG8gdHJ1ZSB3aGVuIGRyb3Bkb3duIGlzIG9wZW5cbiAgICBwcml2YXRlIHNob3dDbG9zZWJ0bjogYm9vbGVhbjtcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUR2OiBib29sZWFuO1xuICAgIHByaXZhdGUgX2RhdGFzb3VyY2U6IGFueTtcbiAgICBwcml2YXRlIGlzU2Nyb2xsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBwYXJlbnRFbDogYW55O1xuICAgIHByaXZhdGUgcG9zaXRpb246IHN0cmluZztcbiAgICBwcml2YXRlIGVsSW5kZXg6IG51bWJlcjtcbiAgICBwcml2YXRlIGxpc3RlblF1ZXJ5OiBib29sZWFuO1xuICAgIHByaXZhdGUgX2RvbVVwZGF0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBzZWFyY2hvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgc2hvd2NsZWFyOiBib29sZWFuO1xuICAgIHB1YmxpYyBtYXRjaG1vZGU6IHN0cmluZztcbiAgICBwcml2YXRlIGNsZWFyRGF0YTogYm9vbGVhbjtcblxuXG4gICAgLy8gZ2V0dGVyIHNldHRlciBpcyBhZGRlZCB0byBwYXNzIHRoZSBkYXRhc291cmNlIHRvIHNlYXJjaGNvbXBvbmVudC5cbiAgICBnZXQgZGF0YXNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFzb3VyY2U7XG4gICAgfVxuXG4gICAgc2V0IGRhdGFzb3VyY2UobnYpIHtcbiAgICAgICAgdGhpcy5fZGF0YXNvdXJjZSA9IG52O1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhdmFsdWUgfHwgdGhpcy50b0JlUHJvY2Vzc2VkRGF0YXZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YXZhbHVlKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmo6IEluamVjdG9yLFxuICAgICAgICBhcHA6IEFwcCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YXZhbHVlLmJpbmQnKSBwdWJsaWMgYmluZGRhdGF2YWx1ZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YXNldC5iaW5kJykgcHVibGljIGJpbmRkYXRhc2V0LFxuICAgICAgICBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnlcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgICAgICAvLyB0aGlzIGZsYWcgd2lsbCBub3QgYWxsb3cgdGhlIGVtcHR5IGRhdGFmaWVsZCB2YWx1ZXMuXG4gICAgICAgIHRoaXMuYWxsb3dlbXB0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgICAgYWRkQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAnYXBwLXNlYXJjaCcsIHRydWUpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW5zIGZvciB0aGUgY2hhbmdlIGluIHRoZSBuZ01vZGVsIG9uIGV2ZXJ5IHNlYXJjaCBhbmQgcmV0cmlldmVzIHRoZSBkYXRhIGFzIG9ic2VydmFibGUuXG4gICAgICAgICAqIFRoaXMgb2JzZXJ2YWJsZSBkYXRhIGlzIHBhc3NlZCB0byB0aGUgdHlwZWFoZWFkLlxuICAgICAgICAgKiBAdHlwZSB7T2JzZXJ2YWJsZTxhbnk+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlYWhlYWREYXRhU291cmNlID0gT2JzZXJ2YWJsZVxuICAgICAgICAgICAgLmNyZWF0ZSgob2JzZXJ2ZXI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJ1bnMgb24gZXZlcnkgc2VhcmNoXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuUXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHRoaXMucXVlcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvbiBrZXlkb3duLCB3aGlsZSBzY3JvbGxpbmcgdGhlIGRyb3Bkb3duIGl0ZW1zLCB3aGVuIGxhc3QgaXRlbSBpcyByZWFjaGVkIG5leHQgY2FsbCBpcyB0cmlnZ2VyZWRcbiAgICAgICAgICAgICAgICAvLyB1bmxlc3MgdGhlIGNhbGwgaXMgcmVzb2x2ZWQsIHdlIGFyZSBhYmxlIHRvIHNjcm9sbCBuZXh0IHRvIGZpcnN0IGl0ZW0gYW5kIHNvb25cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3dzIGZsaWNrZXJpbmcgZnJvbSBmaXJzdCBpdGVtIHRvIG5leHQgbmV3IGl0ZW1zIGFwcGVuZGVkLlxuICAgICAgICAgICAgICAgIC8vIEJ5IHNldHRpbmcgY29udGFpbmVyIHRvIHVuZGVmaW5lZCwga2V5IGV2ZW50cyBjaGFuZ2VzIHdpbGwgYmUgc3RvcHBlZCB3aGlsZSBsb2FkaW5nIGl0ZW1zXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdGVkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuX2NvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMubWluY2hhcnMgPT09IDAgfHwgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5sZW5ndGggPj0gdGhpcy5taW5jaGFycykpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCh0b2tlbjogc3RyaW5nKSA9PiB0aGlzLmdldERhdGFTb3VyY2VBc09ic2VydmFibGUodG9rZW4pKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlciA9IG5ldyBEYXRhUHJvdmlkZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBkZWZhdWx0IGRhdGF2YWx1ZSBpcyBub3QgZm91bmQgd2l0aGluIHRoZSBkYXRhc2V0LCBhIGZpbHRlciBjYWxsIGlzIG1hZGUgdG8gZ2V0IHRoZSByZWNvcmQgdXNpbmcgZmV0Y2hEZWZhdWx0TW9kZWwuXG4gICAgICAgICAqIGFmdGVyIGdldHRpbmcgdGhlIHJlc3BvbnNlLCBzZXQgdGhlIHF1ZXJ5TW9kZWwgYW5kIHF1ZXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZGF0YXZhbHVlU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhdmFsdWUkLnN1YnNjcmliZSgodmFsOiBBcnJheTxzdHJpbmc+IHwgc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gKGlzQXJyYXkodmFsKSA/IHZhbFswXSA6IHZhbCkgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAocXVlcnkgPT09IG51bGwgfHwgcXVlcnkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5TW9kZWwgPSAnJztcbiAgICAgICAgICAgICAgICAvLyBvbiBjbGVhciBvciByZXNldCBmaWx0ZXIsIGVtcHR5IHRoZSBsYXN0UmVzdWx0cyB0byBmZXRjaCBuZXcgcmVjb3Jkcy5cbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLl91bnN1YnNjcmliZUR2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGlmIHByZXYgZGF0YXZhbHVlIGlzIG5vdCBlcXVhbCB0byBjdXJyZW50IGRhdGF2YWx1ZSB0aGVuIGNsZWFyIHRoZSBtb2RlbEJ5S2V5IGFuZCBxdWVyeU1vZGVsXG4gICAgICAgICAgICAgICAgaWYgKCFpc09iamVjdCh2YWwpICYmICh0aGlzIGFzIGFueSkucHJldkRhdGF2YWx1ZSAhPT0gdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5TW9kZWwgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGFmaWVsZCBpcyBBTExGSUxFRFMgZG8gbm90IGZldGNoIHRoZSByZWNvcmRzXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBxdWVyeSBtb2RlbCB3aXRoIHRoZSB2YWx1ZXMgd2UgaGF2ZVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnlEYXRhdmFsdWUodmFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHVybiBvbiBzaG93Q2xvc2VCdG4gd2hlbiBhIGRlZmF1bHQgdmFsdWUgaXMgZ2l2ZW5cbiAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4gZGF0YXZhbHVlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFzZXRTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFzZXQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIG5leHQgaXRlbSBpbmRleC5cbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHRoaXMuZGF0YXNldEl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGF2YWx1ZSB8fCB0aGlzLnRvQmVQcm9jZXNzZWREYXRhdmFsdWU7XG4gICAgICAgICAgICAvLyBpbnZva2luZyB1cGRhdGVCeURhdGFzZXQgb25seSB3aGVuIGRhdGF2YWx1ZSBpcyBwcmVzZW50LCBhcyBlbnRlcmVkIHZhbHVlIGkuZS4gcXVlcnkgaXMgc2V0dGluZyBiYWNrIHRvICcnXG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YXNldChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBkYXRhc2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIC8vIG9uIGNsZWFyLCB0cmlnZ2VyIHNlYXJjaCB3aXRoIHBhZ2Ugc2l6ZSAxXG4gICAgcHJpdmF0ZSBjbGVhclNlYXJjaCgkZXZlbnQsIGxvYWRPbkNsZWFyKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCRldmVudCk7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IGZhbHNlO1xuICAgICAgICBpZiAobG9hZE9uQ2xlYXIpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVEdiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NsZWFyc2VhcmNoJyk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAvLyB3aGVuIHNlYXJjaCBpbnB1dCBpcyBjbGVhcmVkLCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGRcbiAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuYXBwLXNlYXJjaC1pbnB1dCcpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmdW5jdGlvbiB0byAgY2xlYXIgdGhlIGlucHV0IHZhbHVlXG4gICAgcHVibGljIGNsZWFyVGV4dCgpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBmdWxsIHNjcmVlbiBtb2RlIGluIG1vYmlsZSB2aWV3IG9mIGF1dG8gY29tcGxldGVcbiAgICBwcml2YXRlIGNsb3NlU2VhcmNoKCkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgLy8gYWZ0ZXIgY2xvc2luZyB0aGUgc2VhcmNoLCBpbnNlcnQgdGhlIGVsZW1lbnQgYXQgaXRzIHByZXZpb3VzIHBvc2l0aW9uIChlbEluZGV4KVxuICAgICAgICB0aGlzLmluc2VydEF0SW5kZXgodGhpcy5lbEluZGV4KTtcbiAgICAgICAgdGhpcy5lbEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBhcmVudEVsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCdmdWxsLXNjcmVlbicpO1xuICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5fZG9tVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVEdiA9IHRydWU7XG4gICAgICAgIHRoaXMudHlwZWFoZWFkLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlck1vYmlsZUF1dG9Db21wbGV0ZSgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgc2VhcmNoIGVsZW1lbnQgd2hpY2ggY2FuIGJlIG5leHQgb3IgcHJldiBlbGVtZW50LCBpZiBib3RoIGFyZSBlbXB0eSB0aGVuIGdldCB0aGUgcGFyZW50IG9mIGVsZW1lbnQuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuZWxJbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWwgPSB0aGlzLiRlbGVtZW50LnBhcmVudCgpO1xuICAgICAgICAgICAgdGhpcy5lbEluZGV4ID0gdGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmluZGV4KHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgLy8gdGhpcyBmbGFnIGlzIHNldCB0byBub3RpZnkgdGhhdCB0aGUgdHlwZWFoZWFkLWNvbnRhaW5lciBkb20gaGFzIGNoYW5nZWQgaXRzIHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLl9kb21VcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEFkZCBmdWxsIHNjcmVlbiBjbGFzcyBvbiBmb2N1cyBvZiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2Z1bGwtc2NyZWVuJyk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBwb3NpdGlvbiB0byBzZXQgdGhlIGhlaWdodCB0byBhdXRvXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMucG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZvY3VzIGlzIGxvc3Qgd2hlbiBlbGVtZW50IGlzIGNoYW5nZWQgdG8gZnVsbC1zY3JlZW4sIGtleWRvd24gdG8gc2VsZWN0IG5leHQgaXRlbXMgd2lsbCBub3Qgd29ya1xuICAgICAgICAvLyBIZW5jZSBleHBsaWNpdGx5IGZvY3VzaW5nIHRoZSBpbnB1dFxuICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuYXBwLXNlYXJjaC1pbnB1dCcpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGFTb3VyY2VBc09ic2VydmFibGUocXVlcnk6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIC8vIHNob3cgZHJvcGRvd24gb25seSB3aGVuIHRoZXJlIGlzIGNoYW5nZSBpbiBxdWVyeS4gVGhpcyBzaG91bGQgbm90IGFwcGx5IHdoZW4gZGF0YW9wdGlvbnMgd2l0aCBmaWx0ZXJGaWVsZHMgYXJlIHVwZGF0ZWQuXG4gICAgICAgIC8vIHdoZW4gbGFzdFJlc3VsdCBpcyBub3QgYXZhaWxhYmxlIGkuZS4gc3RpbGwgdGhlIGZpcnN0IGNhbGwgaXMgcGVuZGluZyBhbmQgc2Vjb25kIHF1ZXJ5IGlzIGludm9rZWQgdGhlbiBkbyBub3QgcmV0dXJuLlxuICAgICAgICBpZiAodGhpcy5fbGFzdFF1ZXJ5ID09PSBxdWVyeSAmJiAhZ2V0KHRoaXMuZGF0YW9wdGlvbnMsICdmaWx0ZXJGaWVsZHMnKSAmJiBpc0RlZmluZWQodGhpcy5fbGFzdFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMuX2xhc3RSZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgICBXTVMtMTkxNzc6IE9uIGZvY3VzIG9mIGlucHV0IGZpZWxkIGZvciBhdXRvY29tcGxldGUgdHlwZSwgZG8gbm90IHRyaWdnZXIgYXBpIGNhbGwgd2hlblxuICAgICAgICAgICAgICAgICBhKSBzZWFyY2hrZXkgYW5kIGRpc3BsYXlleHByZXNzaW9uIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgYikgYmluZGRpc3BsYXlsYWJlbCBjb250YWlucyBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgYykgYmluZGRpc3BsYXlsYWJlbCBjb250YWlucyBzaW5nbGUgdmFsdWUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggd2l0aCBzZWFyY2hrZXlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYgdGhpcy5zZWFyY2hrZXkgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLmRhdGF2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGJpbmREaXNwbGF5TGFiZWxBcnJheSA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoS2V5QXJyYXkgPSBzcGxpdCh0aGlzLnNlYXJjaGtleSwgJywnKTtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5bGFiZWw7XG4gICAgICAgICAgICBpZiAodGhpcy5iaW5kZGlzcGxheWxhYmVsKSB7XG4gICAgICAgICAgICAgICAgYmluZERpc3BsYXlMYWJlbEFycmF5ID0gc3BsaXQodGhpcy5iaW5kZGlzcGxheWxhYmVsLCAnKycpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kRGlzcGxheUxhYmVsQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMoYmluZERpc3BsYXlMYWJlbEFycmF5WzBdLCAnfCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9cXFsoLio/KVxcXS87XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5bGFiZWwgPSByZWdleC5leGVjKGJpbmREaXNwbGF5TGFiZWxBcnJheVswXSlbMV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5bGFiZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChiaW5kRGlzcGxheUxhYmVsQXJyYXkubGVuZ3RoID4gMSB8fCAoZGlzcGxheWxhYmVsICYmICFpbmNsdWRlcyhzZWFyY2hLZXlBcnJheSwgZGlzcGxheWxhYmVsKSlcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiAmJiAhaW5jbHVkZXMoc2VhcmNoS2V5QXJyYXksIHRoaXMuZGlzcGxheWV4cHJlc3Npb24pKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgICAgIHJldHVybiBmcm9tKHRoaXMuZ2V0RGF0YVNvdXJjZShxdWVyeSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50Q2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVzKFsnYmx1cicsICdmb2N1cycsICdzZWxlY3QnLCAnc3VibWl0JywgJ2NoYW5nZSddLCBldmVudE5hbWUpKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudChub2RlLCBldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoaWdobGlnaHQgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGRyb3Bkb3duIG1hdGNoaW5nIHRoZSBxdWVyeS5cbiAgICBwcml2YXRlIGhpZ2hsaWdodChtYXRjaDogVHlwZWFoZWFkTWF0Y2gsIHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAvLyBoaWdobGlnaHQgb2YgY2hhcnMgd2lsbCB3b3JrIG9ubHkgd2hlbiBsYWJlbCBhcmUgc3RyaW5ncy5cbiAgICAgICAgICAgIChtYXRjaCBhcyBhbnkpLnZhbHVlID0gbWF0Y2guaXRlbS5sYWJlbC50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmhpZ2hsaWdodChtYXRjaCwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaW5zZXJ0cyB0aGUgZWxlbWVudCBhdCB0aGUgaW5kZXggcG9zaXRpb25cbiAgICBwcml2YXRlIGluc2VydEF0SW5kZXgoaSkge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbC5wcmVwZW5kKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJGVsQXRJbmRleCA9IHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5lcShpKTtcbiAgICAgICAgICAgIGlmICgkZWxBdEluZGV4Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5lcShpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIodGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmVxKGkgLSAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2lkZ2V0IGlzIG9mIHR5cGUgYXV0b2NvbXBsZXRlIGluIG1vYmlsZSB2aWV3LyBhcHBcbiAgICBwdWJsaWMgaXNNb2JpbGVBdXRvQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdhdXRvY29tcGxldGUnICYmIGlzTW9iaWxlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGVudGVyZWQgaW4gdGhlIGlucHV0IGFuZCB0aGUgdmlldyBpcyBub3QgbW9iaWxlXG4gICAgcHVibGljIGlzUXVlcnlFbnRlcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93Y2xlYXIgJiYgdGhpcy5zaG93Q2xvc2VidG47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkTW9yZURhdGEoaW5jcmVtZW50UGFnZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmNyZWFzZSB0aGUgcGFnZSBudW1iZXIgYW5kIHRyaWdnZXIgZm9yY2UgcXVlcnkgdXBkYXRlXG4gICAgICAgIHRoaXMucGFnZSA9IGluY3JlbWVudFBhZ2UgPyB0aGlzLnBhZ2UgKyAxIDogdGhpcy5wYWdlO1xuXG4gICAgICAgIHRoaXMuaXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IHRydWU7XG5cbiAgICAgICAgLy8gd2hlbiBpbnZva2luZyBuZXcgc2V0IG9mIHJlc3VsdHMsIHJlc2V0IHRoZSBsYXN0UXVlcnkuXG4gICAgICAgIGlmIChpbmNyZW1lbnRQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIHRoZSB0eXBlYWhlYWQgY2hhbmdlIG1hbnVhbGx5IHRvIGZldGNoIHRoZSBuZXh0IHNldCBvZiByZXN1bHRzLlxuICAgICAgICB0aGlzLnR5cGVhaGVhZC5vbklucHV0KHtcbiAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0cmltKHRoaXMucXVlcnkpIHx8ICcwJyAvLyBkdW1teSBkYXRhIHRvIG5vdGlmeSB0aGUgb2JzZXJ2YWJsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gb24gZm9jdXNvdXQsIHN1YnNjcmliZSB0byB0aGUgZGF0YXZhbHVlIGNoYW5nZXMgYWdhaW5cbiAgICBwcml2YXRlIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRHYgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgIC8vIHJlc2V0IHRoZSBwYWdlIHZhbHVlIG9uIGZvY3Vzb3V0LlxuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICAvLyBpZiBkb21VcGRhdGVkIGlzIHRydWUgdGhlbiBkbyBub3QgaGlkZSB0aGUgZHJvcGRvd24gaW4gdGhlIGZ1bGxzY3JlZW5cbiAgICAgICAgaWYgKCF0aGlzLl9kb21VcGRhdGVkICYmIHRoaXMuX2lzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgICAgICAvLyBvbiBvdXRzaWRlIGNsaWNrLCB0eXBlYWhlYWQgaXMgaGlkZGVuLiBUbyBhdm9pZCB0aGlzLCB3aGVuIGZ1bGxzY3JlZW4gaXMgc2V0LCBvdmVycmlkZGluZyBpc0ZvY3VzZWQgZmxhZyBvbiB0aGUgdHlwZWFoZWFkIGNvbnRhaW5lclxuICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRlZCAmJiB0aGlzLnR5cGVhaGVhZCAmJiAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fY29udGFpbmVyLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSW5wdXRDaGFuZ2UoJGV2ZW50KSB7XG4gICAgICAgIC8vIHJlc2V0IGFsbCB0aGUgcHJldmlvdXMgcGFnZSBkZXRhaWxzIGluIG9yZGVyIHRvIGZldGNoIG5ldyBzZXQgb2YgcmVzdWx0LlxuICAgICAgICB0aGlzLnJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKTtcbiAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIHdoZW4gaW5wdXQgaXMgY2xlYXJlZCwgcmVzZXQgdGhlIGRhdGF2YWx1ZVxuICAgICAgICBpZiAodGhpcy5xdWVyeSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZEYXRhdmFsdWUodGhpcy5fbGFzdFF1ZXJ5KTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5fbW9kZWxCeVZhbHVlLCB7fSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnY2xlYXInLCB7ICRldmVudCB9KTtcblxuICAgICAgICAgICAgLy8gdHJpZ2dlciBvblN1Ym1pdCBvbmx5IHdoZW4gdGhlIHNlYXJjaCBpbnB1dCBpcyBjbGVhcmVkIG9mZiBhbmQgZG8gbm90IHRyaWdnZXIgd2hlbiB0YWIgaXMgcHJlc3NlZC5cbiAgICAgICAgICAgIGlmICgkZXZlbnQgJiYgJGV2ZW50LndoaWNoICE9PSA5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCB7ICRldmVudCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGludm9raW5nIGNoYW5nZSBldmVudCBvbiBldmVyeSBpbnB1dCB2YWx1ZSBjaGFuZ2UuXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICRldmVudCxcbiAgICAgICAgICAgICAgICBuZXdWYWw6IHRoaXMuX21vZGVsQnlWYWx1ZSB8fCB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIG9sZFZhbDogKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlcmVkIGZvciBlbnRlciBldmVudFxuICAgIHByaXZhdGUgaGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpIHtcbiAgICAgICAgLy8gc3VibWl0IGV2ZW50IHRyaWdnZXJlZCB3aGVuIHRoZXJlIGlzIG5vIHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGlmICghZ2V0KHRoaXMudHlwZWFoZWFkLCAnbWF0Y2hlcy5sZW5ndGgnKSkge1xuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFNlbGVjdCgkZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyaWdnZXJyZWQgd2hlbiB0eXBlYWhlYWQgb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgIHByaXZhdGUgb25TZWFyY2hTZWxlY3QoJGV2ZW50OiBFdmVudCkge1xuICAgICAgICBsZXQgaXRlbTtcbiAgICAgICAgLy8gV01TLTIyNTMzOiBCZWZvcmUgYWRkaW5nIGFjdGl2ZSB0eXBlYWhlYWQgZWwsIGNoZWNrIGlmIHRoZSBlbnRlcmVkIHF1ZXJ5IG1hdGNoZXMgd2l0aCB0aGUgYWN0aXZlIGVsIG9yIG5vdFxuICAgICAgICBjb25zdCBpc1F1ZXJ5TWF0Y2ggPSB0aGlzLnR5cGVhaGVhZENvbnRhaW5lcj8uYWN0aXZlPy52YWx1ZSA9PT0gdGhpcy5xdWVyeTtcblxuICAgICAgICBpZiAodGhpcy50eXBlYWhlYWRDb250YWluZXIgJiYgdGhpcy50eXBlYWhlYWRDb250YWluZXIuYWN0aXZlICYmIGlzUXVlcnlNYXRjaCkge1xuICAgICAgICAgICAgaXRlbSA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmFjdGl2ZS5pdGVtO1xuICAgICAgICB9XG4gICAgICAgICRldmVudCA9IHRoaXMuZXZlbnREYXRhKCRldmVudCwgaXRlbSB8fCB7fSk7XG5cbiAgICAgICAgLy8gc2VhcmNoT24gaXMgc2V0IGFzIG9uQnRuQ2xpY2ssIHRoZW4gaW52b2tlIHRoZSBzZWFyY2ggYXBpIGNhbGwgbWFudWFsbHkuXG4gICAgICAgIGlmICghdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSB0eXBlYWhlYWQgY2hhbmdlIG1hbnVhbGx5IHRvIGZldGNoIHRoZSBuZXh0IHNldCBvZiByZXN1bHRzLlxuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQub25JbnB1dCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5IC8vIGR1bW15IGRhdGEgdG8gbm90aWZ5IHRoZSBvYnNlcnZhYmxlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gbWF0Y2hlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICBpZiAodGhpcy50eXBlYWhlYWRDb250YWluZXIgJiYgdGhpcy5saUVsZW1lbnRzLmxlbmd0aCAmJiBpc1F1ZXJ5TWF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdEFjdGl2ZU1hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB0aGlzLnF1ZXJ5O1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCB7ICRldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW52b2tlT25CZWZvcmVTZXJ2aWNlQ2FsbChpbnB1dERhdGEpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVzZXJ2aWNlY2FsbCcsIHsgaW5wdXREYXRhIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Ecm9wZG93bk9wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmNsZWFyRGF0YSkge1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldHRpbmcgdGhlIHVsRWxlbWVudHMsIGxpRWxlbWVudCBvbiB0eXBlYWhlYWRDb250YWluZXIuXG4gICAgICAgIC8vIGFzIHdlIGFyZSB1c2luZyBjdXN0b21PcHRpb24gdGVtcGxhdGUsIGxpRWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUgb24gdHlwZWFoZWFkQ29udGFpbmVyIHNvIGFwcGVuZCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgIGNvbnN0IGZuID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyID0gdGhpcy50eXBlYWhlYWQuX2NvbnRhaW5lciB8fCAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fdHlwZWFoZWFkLmluc3RhbmNlO1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyIGFzIGFueSkubGlFbGVtZW50cyA9IHRoaXMubGlFbGVtZW50cztcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciBhcyBhbnkpLnVsRWxlbWVudCA9IHRoaXMudWxFbGVtZW50O1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24oJCgndHlwZWFoZWFkLWNvbnRhaW5lcicpLCB0aGlzLm5hdGl2ZUVsZW1lbnQsICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLl90eXBlYWhlYWQsICQoJ3R5cGVhaGVhZC1jb250YWluZXIgLmRyb3Bkb3duLW1lbnUnKSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm4oKTtcblxuICAgICAgICAvLyBvcGVuIGZ1bGwtc2NyZWVuIHNlYXJjaCB2aWV3XG4gICAgICAgIGlmICh0aGlzLmlzTW9iaWxlQXV0b0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTW9iaWxlQXV0b0NvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkVsID0gdGhpcy5kcm9wZG93bkVsLmNsb3Nlc3QoJ3R5cGVhaGVhZC1jb250YWluZXInKTtcblxuICAgICAgICAgICAgZHJvcGRvd25FbC5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50LmZpbmQoJ2lucHV0JykuZmlyc3QoKSk7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJy5hcHAtY29udGVudCcpLmhlaWdodCgpO1xuICAgICAgICAgICAgZHJvcGRvd25FbC5jc3MoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdG9wOiAwLCBoZWlnaHQ6IHNjcmVlbkhlaWdodCArICdweCcgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9IHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeSAhPT0gJyc7XG5cbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkgJiYgIXRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0TmV4dCgpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLm1hdGNoZXM7XG5cbiAgICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGVzLmluZGV4T2YodGhpcy50eXBlYWhlYWRDb250YWluZXIuYWN0aXZlKTtcblxuICAgICAgICAvLyBvbiBrZXlkb3duLCBpZiBzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBhbmQgbmV4dCBwYWdlIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZmV0Y2ggbmV4dCBwYWdlIGl0ZW1zLlxuICAgICAgICBpZiAoIXRoaXMuX2xvYWRpbmdJdGVtcyAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSAmJiBpbmRleCArIDEgPiBtYXRjaGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIGluZGV4IGlzIHNhdmVkIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgbGFzdFNlbGVjdGVkIGl0ZW0gaW4gdGhlIGRyb3Bkb3duIGFmdGVyIGZldGNoaW5nIG5leHQgcGFnZSBpdGVtcy5cbiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMYXN0QWN0aXZlTWF0Y2hBc1NlbGVjdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyIGFzIGFueSkuX2FjdGl2ZSA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLm1hdGNoZXNbdGhpcy5sYXN0U2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5uZXh0QWN0aXZlTWF0Y2goKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJTZWFyY2goKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlIHx8ICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZUFoZWFkRHJvcERvd24gPSB0aGlzLmRyb3Bkb3duRWw7XG4gICAgICAgIGNvbnN0ICRsYXN0SXRlbSA9IHR5cGVBaGVhZERyb3BEb3duLmZpbmQoJ2xpJykubGFzdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGxhc3QgaXRlbSBpcyBub3QgYmVsb3cgdGhlIGZ1bGwgc2NyZWVuXG4gICAgICAgIGlmICgkbGFzdEl0ZW0ubGVuZ3RoICYmIHR5cGVBaGVhZERyb3BEb3duLmxlbmd0aCAmJiAodHlwZUFoZWFkRHJvcERvd24uaGVpZ2h0KCkgKyB0eXBlQWhlYWREcm9wRG93bi5wb3NpdGlvbigpLnRvcCA+ICRsYXN0SXRlbS5oZWlnaHQoKSArICRsYXN0SXRlbS5wb3NpdGlvbigpLnRvcCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1VwZGF0ZU9uS2V5UHJlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaG9uID09PSAndHlwaW5nJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYm91bmNlRGVmYXVsdFF1ZXJ5KGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhLCB0cnVlKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5TW9kZWxbMF0ubGFiZWwgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdGhpcy5xdWVyeU1vZGVsWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlLZXkgPSB0aGlzLnF1ZXJ5TW9kZWxbMF0ua2V5O1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhckRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0KCh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLCAnX3R5cGVhaGVhZC5pc1Nob3duJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCeURhdGF2YWx1ZShkYXRhKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQnlEYXRhc2V0KGRhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YVNvdXJjZShkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJ5RGF0YVNvdXJjZShkYXRhKSB7XG4gICAgICAgIC8vIHZhbHVlIGlzIHByZXNlbnQgYnV0IHRoZSBjb3JyZXNwb25kaW5nIGtleSBpcyBub3QgZm91bmQgdGhlbiBmZXRjaCBuZXh0IHNldFxuICAgICAgICAvLyBtb2RlbEJ5S2V5IHdpbGwgYmUgc2V0IG9ubHkgd2hlbiBkYXRhdmFsdWUgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgbG9jYWxEYXRhIG90aGVyd2lzZSBtYWtlIGEgTi93IGNhbGwuXG4gICAgICAgIGlmIChpc0RlZmluZWQoZGF0YSkgJiYgIWlzT2JqZWN0KGRhdGEpICYmIHRoaXMuZGF0YXNvdXJjZSAmJiAhaXNEZWZpbmVkKHRoaXMuX21vZGVsQnlLZXkpICYmIHRoaXMuZGF0YWZpZWxkICE9PSBBTExGSUVMRFMpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIG1ha2luZyBkZWZhdWx0IHF1ZXJ5IGlmIHF1ZXJ5TW9kZWwgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMucXVlcnlNb2RlbCkgJiYgIWlzRW1wdHkodGhpcy5xdWVyeU1vZGVsKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YXZhbHVlRnJvbVF1ZXJ5TW9kZWwoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1ha2UgZGVmYXVsdCBxdWVyeSBjYWxsIG9ubHkgd2hlbiBkYXRhc291cmNlIHN1cHBvcnRzIENSVUQgKGxpdmUgdmFyaWFibGUpLlxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkICYmIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLlNVUFBPUlRTX0NSVUQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZURlZmF1bHRRdWVyeShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZXMgdGhlIG1vZGVsIHZhbHVlIHVzaW5nIHF1ZXJ5TW9kZWxcbiAgICBwcml2YXRlIHVwZGF0ZURhdGF2YWx1ZUZyb21RdWVyeU1vZGVsKCkge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMucXVlcnlNb2RlbCkpIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IGlzQXJyYXkodGhpcy5xdWVyeU1vZGVsKSA/ICh0aGlzLnF1ZXJ5TW9kZWxbMF0gYXMgRGF0YVNldEl0ZW0pLnZhbHVlIDogdGhpcy5xdWVyeU1vZGVsO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IGlzQXJyYXkodGhpcy5xdWVyeU1vZGVsKSA/ICh0aGlzLnF1ZXJ5TW9kZWxbMF0gYXMgRGF0YVNldEl0ZW0pLmtleSA6IHRoaXMucXVlcnlNb2RlbDtcbiAgICAgICAgICAgIHRoaXMudG9CZVByb2Nlc3NlZERhdGF2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQnlEYXRhc2V0KGRhdGE6IGFueSkge1xuICAgICAgICAvLyBkZWZhdWx0IHF1ZXJ5IGlzIGFscmVhZHkgaW52b2tlZCB0aGVuIGRvIG5vdCBtYWtlIG90aGVyIGRlZmF1bHQgcXVlcnkgY2FsbC5cbiAgICAgICAgLy8gRm9yIGxvY2FsIHNlYXJjaCBpLmUuIHNlYXJjaGtleSBpcyB1bmRlZmluZWQsIGRvIG5vdCByZXR1cm4sIHZlcmlmeSB0aGUgZGF0YXZhbHVlIGFnYWluc3QgdGhlIGRhdGFzZXRJdGVtcyAuXG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkICYmIHRoaXMuc2VhcmNoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gZmluZCh0aGlzLmRhdGFzZXRJdGVtcywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaXNPYmplY3QoaXRlbS52YWx1ZSkgPyBpc0VxdWFsKGl0ZW0udmFsdWUsIGRhdGEpIDogKHRvU3RyaW5nKGl0ZW0udmFsdWUpKS50b0xvd2VyQ2FzZSgpID09PSAodG9TdHJpbmcoZGF0YSkpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgb25seSB3aGVuIGl0IGlzIGF2YWlsYWJsZSBpbiBkYXRhc2V0LlxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSBbc2VsZWN0ZWRJdGVtXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFmaWVsZCA9PT0gQUxMRklFTERTICYmIGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB0aGlzLmdldFRyYW5zZm9ybWVkRGF0YShleHRyYWN0RGF0YUFzQXJyYXkoZGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVzZXR0aW5nIHRoZSBxdWVyeU1vZGVsIG9ubHkgd2hlbiBwcmV2RGF0YXZhbHVlIGlzIGVxdWFsIHRvIGRhdGFcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpLnByZXZEYXRhdmFsdWUgIT09IGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGF2YWx1ZUZyb21RdWVyeU1vZGVsKCk7XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgbGFiZWwgdmFsdWUgb24gaW5wdXQuXG4gICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHRoaXMucXVlcnkgPSBpc0RlZmluZWQodGhpcy5xdWVyeU1vZGVsKSAmJiB0aGlzLnF1ZXJ5TW9kZWwubGVuZ3RoID8gZ2V0KHRoaXMucXVlcnlNb2RlbFswXSwgJ2xhYmVsJykgOiAnJztcbiAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbGFzdCBzZWFyY2ggcmVzdWx0cyB0aGVuIG9wZW4gZHJvcGRvd24gb24gZm9jdXNcbiAgICBwcml2YXRlIGhhbmRsZUZvY3VzKCRldmVudCkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2VhcmNoJyAmJiB0aGlzLnF1ZXJ5ID09PSB0aGlzLl9sYXN0UXVlcnkgJiYgdGhpcy5fbGFzdFJlc3VsdCkge1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkIGFzIGFueSkua2V5VXBFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLnF1ZXJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnlTdWJzY3JpYmVyKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRFbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcuYXBwLWNvbXBvc2l0ZS13aWRnZXQuY2FwdGlvbi1mbG9hdGluZycpO1xuICAgICAgICBpZiAocGFyZW50RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5KCdjYXB0aW9uUG9zaXRpb25BbmltYXRlJywge2Rpc3BsYXlWYWw6IHRydWUsIG5hdGl2ZUVsOiBwYXJlbnRFbH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgdGhhdCBwcm92aWRlcyB0aGUgZmlsdGVyZWQgZGF0YSBmcm9tIHRoZSBkYXRhc291cmNlLlxuICAgIHB1YmxpYyBnZXREYXRhU291cmNlKHF1ZXJ5OiBBcnJheTxzdHJpbmc+IHwgc3RyaW5nLCBzZWFyY2hPbkRhdGFGaWVsZD86IGJvb2xlYW4sIG5leHRJdGVtSW5kZXg/OiBudW1iZXIpOiBQcm9taXNlPERhdGFTZXRJdGVtW10+IHtcbiAgICAgICAgLy8gRm9yIGRlZmF1bHQgcXVlcnksIHNlYXJjaE9uRGF0YUZpZWxkIGlzIHNldCB0byB0cnVlLCB0aGVuIGRvIG5vdCBtYWtlIGEgbi93IGNhbGwgd2hlbiBkYXRhZmllbGQgaXMgQUxMRklFTERTXG4gICAgICAgIGlmIChzZWFyY2hPbkRhdGFGaWVsZCAmJiB0aGlzLmRhdGFmaWVsZCA9PT0gQUxMRklFTERTKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIGRlZmF1bHQgZGF0YXZhbHVlLCBzZWFyY2gga2V5IGFzIHRvIGJlIG9uIGRhdGFmaWVsZCB0byBnZXQgdGhlIGRlZmF1bHQgZGF0YSBmcm9tIHRoZSBmaWx0ZXIgY2FsbC5cbiAgICAgICAgY29uc3QgZGF0YUNvbmZpZzogSURhdGFQcm92aWRlckNvbmZpZyA9IHtcbiAgICAgICAgICAgIGRhdGFzZXQ6IHRoaXMuZGF0YXNldCA/IGNvbnZlcnREYXRhVG9PYmplY3QodGhpcy5kYXRhc2V0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJpbmRkYXRhc2V0OiB0aGlzLmJpbmRkYXRhc2V0LFxuICAgICAgICAgICAgZGF0YXNvdXJjZTogdGhpcy5kYXRhc291cmNlLFxuICAgICAgICAgICAgZGF0YWZpZWxkOiB0aGlzLmRhdGFmaWVsZCxcbiAgICAgICAgICAgIGhhc0RhdGE6IHRoaXMuZGF0YXNldCAmJiB0aGlzLmRhdGFzZXQubGVuZ3RoLFxuICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICAgICAgaXNMb2NhbEZpbHRlcjogIXRoaXMuc2VhcmNoa2V5LFxuICAgICAgICAgICAgc2VhcmNoS2V5OiBzZWFyY2hPbkRhdGFGaWVsZCA/IHRoaXMuZGF0YWZpZWxkIDogdGhpcy5zZWFyY2hrZXksXG4gICAgICAgICAgICAvLyBkZWZhdWx0IHNlYXJjaCBjYWxsIG1hdGNoIG1vZGUgc2hvdWxkIGJlIHN0YXJ0aWdub3JlY2FzZVxuICAgICAgICAgICAgbWF0Y2hNb2RlOiBzZWFyY2hPbkRhdGFGaWVsZCA/ICdzdGFydGlnbm9yZWNhc2UnIDogdGhpcy5tYXRjaG1vZGUsXG4gICAgICAgICAgICBjYXNlc2Vuc2l0aXZlOiB0aGlzLmNhc2VzZW5zaXRpdmUsXG4gICAgICAgICAgICBpc2Zvcm1maWVsZDogdGhpcy5pc2Zvcm1maWVsZCxcbiAgICAgICAgICAgIG9yZGVyYnk6IHRoaXMub3JkZXJieSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LFxuICAgICAgICAgICAgcGFnZXNpemU6IHRoaXMucGFnZXNpemUsXG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBvbkJlZm9yZXNlcnZpY2VjYWxsOiB0aGlzLmludm9rZU9uQmVmb3JlU2VydmljZUNhbGwuYmluZCh0aGlzKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFvcHRpb25zKSB7XG4gICAgICAgICAgICBkYXRhQ29uZmlnLmRhdGFvcHRpb25zID0gdGhpcy5kYXRhb3B0aW9ucztcbiAgICAgICAgICAgIGRhdGFDb25maWcudmlld1BhcmVudCA9IHRoaXMudmlld1BhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmZpbHRlcihkYXRhQ29uZmlnKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBmcm9tIGRhdGFQcm92aWRlciByZXR1cm5zIGFsd2F5cyBkYXRhIG9iamVjdC5cbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgLy8gZm9yIHNlcnZpY2UgdmFyaWFibGUsIHVwZGF0aW5nIHRoZSBkYXRhc2V0IG9ubHkgaWYgaXQgaXMgbm90IGRlZmluZWQgb3IgZW1wdHlcbiAgICAgICAgICAgICAgICBpZiAoKCFpc0RlZmluZWQodGhpcy5kYXRhc2V0KSB8fCAhdGhpcy5kYXRhc2V0Lmxlbmd0aCkgJiYgdGhpcy5kYXRhUHJvdmlkZXIudXBkYXRlRGF0YXNldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzZXQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuaGFzTW9yZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhc2V0ID0gdGhpcy5mb3JtYXR0ZWREYXRhc2V0LmNvbmNhdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhc2V0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSBzZXR0aW5nIHRoZSBvcHRpb25zbGltaXQgYXMgdGhlIG1hdGNoZXMgbW9yZSB0aGFuIDIwIHdpbGwgYmUgaWdub3JlZCBpZiBvcHRpb25zbGltaXQgaXMgbm90IHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtYXR0ZWREYXRhc2V0Lmxlbmd0aCA+IDIwICYmICFpc0RlZmluZWQodGhpcy5saW1pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQudHlwZWFoZWFkT3B0aW9uc0xpbWl0ID0gdGhpcy5mb3JtYXR0ZWREYXRhc2V0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJbiBtb2JpbGUsIHRyaWdnZXIgdGhlIHNlYXJjaCBieSBkZWZhdWx0IHVudGlsIHRoZSByZXN1bHRzIGhhdmUgaGVpZ2h0IHVwdG8gcGFnZSBoZWlnaHQuIE90aGVyIHJlc3VsdHMgY2FuIGJlIGZldGNoZWQgYnkgc2Nyb2xsaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc09wZW4gJiYgdGhpcy5pc01vYmlsZUF1dG9Db21wbGV0ZSgpICYmICFpc1VuZGVmaW5lZCh0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJTZWFyY2goKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0aGlzLmdldFRyYW5zZm9ybWVkRGF0YSh0aGlzLmZvcm1hdHRlZERhdGFzZXQsIG5leHRJdGVtSW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVzdWx0IGNvbnRhaW5zIHRoZSBkYXRhZmllbGQgdmFsdWVzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IG1hcCh0cmFuc2Zvcm1lZERhdGEsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIChkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExhc3RBY3RpdmVNYXRjaEFzU2VsZWN0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMzApKSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBubyByZXN1bHQgaXMgZm91bmQsIHNldCB0aGUgZGF0YXZhbHVlIHRvIHVuZGVmaW5lZC5cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSAocXVlcnkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gb24gZm9jdXNvdXQgaS5lLiBvbiBvdGhlciB3aWRnZXQgZm9jdXMsIGlmIG4vdyBpcyBwZW5kaW5nIGxvYWRpbmcgaWNvbiBpcyBzaG93biwgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZSB0aGVuIGRyb3Bkb3duIGlzIHNob3duIGFnYWluLlxuICAgICAgICAgICAgICAgIC8vIG9uIHVuc3Vic2NyaWJpbmcgZG8gbm90IHNob3cgdGhlIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlRHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBhcmVudCBjb250ZXh0IGkuZS4gUGFnZSBjb250ZXh0IGFuZCBub3QgcGFyZW50IGNvbXBvbmVudCdzIGNvbnRleHQuXG4gICAgcHJpdmF0ZSBnZXRDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgZ2V0KGNvbnRleHQsICd3aWRnZXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGV4dChjb250ZXh0LnZpZXdQYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFuc2Zvcm1lZERhdGEoZGF0YTogYW55LCBpdGVtSW5kZXg/OiBudW1iZXIsIGlzY3VzdG9tPzogYm9vbGVhbik6IERhdGFTZXRJdGVtW10ge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICAgIGl0ZW1JbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdHJhbnNmb3JtRm9ybURhdGEoXG4gICAgICAgICAgICB0aGlzLmdldENvbnRleHQodGhpcy52aWV3UGFyZW50KSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB0aGlzLmRhdGFmaWVsZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHRoaXMuZGlzcGxheWxhYmVsIHx8IHRoaXMuZGlzcGxheWZpZWxkLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiBpc2N1c3RvbSA/ICcnIDogdGhpcy5kaXNwbGF5ZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICBiaW5kRGlzcGxheUV4cHI6IGlzY3VzdG9tID8gJycgOiB0aGlzLmJpbmRkaXNwbGF5bGFiZWwsXG4gICAgICAgICAgICAgICAgYmluZERpc3BsYXlJbWdTcmM6IHRoaXMuYmluZGRpc3BsYXlpbWFnZXNyYyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5SW1nU3JjOiB0aGlzLmRpc3BsYXlpbWFnZXNyY1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRleCxcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGdldFVuaXFPYmpzQnlEYXRhRmllbGQodHJhbnNmb3JtZWREYXRhLCB0aGlzLmRhdGFmaWVsZCwgdGhpcy5kaXNwbGF5ZmllbGQgfHwgdGhpcy5kaXNwbGF5bGFiZWwsIHRvQm9vbGVhbih0aGlzLmFsbG93ZW1wdHkpKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zTGlzdFRlbXBsYXRlIGxpc3RlbnMgdG8gdGhlIHNjcm9sbCBldmVudCBhbmQgdHJpZ2dlcnMgdGhpcyBmdW5jdGlvbi5cbiAgICBwdWJsaWMgb25TY3JvbGwoJHNjcm9sbEVsOiBFbGVtZW50LCBldnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gJHNjcm9sbEVsLnNjcm9sbEhlaWdodCxcbiAgICAgICAgICAgIGNsaWVudEhlaWdodCA9ICRzY3JvbGxFbC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgLy8gSWYgc2Nyb2xsIGlzIGF0IHRoZSBib3R0b20gYW5kIG5vIHJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5leHQgcGFnZSByZWNvcmRzIGFyZSBhdmFpbGFibGUsIGZldGNoIG5leHQgcGFnZSBpdGVtcy5cbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkaW5nSXRlbXMgJiYgIXRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UgJiYgKCRzY3JvbGxFbC5zY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgPj0gdG90YWxIZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBpZiAoIWlzRGVmaW5lZCh0aGlzLm1pbmNoYXJzKSkge1xuICAgICAgICAgICAgLy8gZm9yIGF1dG9jb21wbGV0ZSBzZXQgdGhlIG1pbmNoYXJzIHRvIDBcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdhdXRvY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5jaGFycyA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWluY2hhcnMgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IHRoaXMuaXNVcGRhdGVPbktleVByZXNzKCk7XG5cbiAgICAgICAgLy8gYnkgZGVmYXVsdCBmb3IgYXV0b2NvbXBsZXRlIGRvIG5vdCBzaG93IHRoZSBzZWFyY2ggaWNvblxuICAgICAgICAvLyBieSBkZWZhdWx0IHNob3cgdGhlIHNlYXJjaGljb24gZm9yIHR5cGUgPSBzZWFyY2hcbiAgICAgICAgdGhpcy5zaG93c2VhcmNoaWNvbiA9IGlzRGVmaW5lZCh0aGlzLnNob3dzZWFyY2hpY29uKSA/IHRoaXMuc2hvd3NlYXJjaGljb24gOiAodGhpcy50eXBlID09PSAnc2VhcmNoJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCwgdGhpcyk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyVGFyZ2V0ID0gZ2V0Q29udGFpbmVyVGFyZ2V0Q2xhc3ModGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBjb25zdCBzZWFyY2hJbnB1dEVsID0gJCgnLmFwcC1zZWFyY2gtaW5wdXQnKTtcbiAgICAgICAgaWYgKHNlYXJjaElucHV0RWwpIHtcbiAgICAgICAgICAgIHNlYXJjaElucHV0RWwucmVtb3ZlQXR0cignYXJpYS1leHBhbmRlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmVudERhdGEoJGV2ZW50LCBpdGVtKSB7XG4gICAgICAgIGlmICgkZXZlbnQpIHtcbiAgICAgICAgICAgICRldmVudFsnZGF0YSddID0ge1xuICAgICAgICAgICAgICAgIGl0ZW0gIDogaXRlbS5kYXRhT2JqZWN0LFxuICAgICAgICAgICAgICAgIG1vZGVsIDogaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgICBsYWJlbCA6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICAgICAgcXVlcnkgOiB0aGlzLnF1ZXJ5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICRldmVudDtcbiAgICB9XG5cbiAgICAvLyB0cmlnZ2VyZWQgb24gc2VsZWN0IG9uIG9wdGlvbiBmcm9tIHRoZSBsaXN0LiBTZXQgdGhlIHF1ZXJ5TW9kZWwsIHF1ZXJ5IGFuZCBtb2RlbEJ5S2V5IGZyb20gdGhlIG1hdGNoZWQgaXRlbS5cbiAgICBwdWJsaWMgdHlwZWFoZWFkT25TZWxlY3QobWF0Y2g6IFR5cGVhaGVhZE1hdGNoLCAkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBtYXRjaC5pdGVtO1xuICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSBpdGVtO1xuICAgICAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5xdWVyeSA9IGl0ZW0ubGFiZWw7XG4gICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICAgICAgJGV2ZW50ID0gJGV2ZW50IHx8IHRoaXMuJHR5cGVhaGVhZEV2ZW50O1xuXG4gICAgICAgIC8vIEFzIGl0ZW0ua2V5IGNhbiB2YXJ5IGZyb20ga2V5IGluIHRoZSBkYXRhc2V0SXRlbXNcbiAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IGl0ZW0ua2V5O1xuICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSBpdGVtLnZhbHVlO1xuXG4gICAgICAgICRldmVudCA9IHRoaXMuZXZlbnREYXRhKCRldmVudCwgaXRlbSk7XG5cbiAgICAgICAgdGhpcy5pbnZva2VPblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgJGV2ZW50IHx8IHt9KTtcbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIHZhcmlhYmxlIGJvdW5kIHRvIGRlZmF1bHQgdmFsdWUgYXMgaW52b2tlT25DaGFuZ2UgaXMgbm90IHVwZGF0aW5nIHRoZSB2YXJpYWJsZS5cbiAgICAgICAgaWYgKHRoaXMuZGF0YXZhbHVlICE9PSAodGhpcyBhcyBhbnkpLnByZXZEYXRhdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRWYXJpYWJsZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2Z1bGwtc2NyZWVuJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHsgJGV2ZW50LCBzZWxlY3RlZFZhbHVlOiB0aGlzLmRhdGF2YWx1ZSB9KTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCB7ICRldmVudCB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVByZXZEYXRhdmFsdWUodGhpcy5kYXRhdmFsdWUpO1xuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5OiBzdHJpbmcsIG52OiBhbnksIG92OiBhbnkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFja3dhcmQgY29tcGF0YWJpbGl0eSBmcm9tIDEwLjMuMSB0byAxMC4zLjJcbiAgICAgICAgLy8gMTAuMy4xIHdlIGhhZCBkaXNwbGF5bGFiZWwgYXMgbW9kYWwgdmFsdWVcbiAgICAgICAgLy8gRnJvbSAxMC4zLjIgb253b3JkcyB3ZSB3aWxsIGJlIGhhdmluZyBkaXNwbGF5ZXhwcmVzaW9uIGFzIG1vZGFsIHZhbHVlXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdhdXRvY29tcGxldGUnICYmIGtleSA9PT0gJ2Rpc3BsYXlsYWJlbCcgJiYgdGhpcy5kaXNwbGF5bGFiZWwgJiYgKCF0aGlzLmRpc3BsYXlleHByZXNzaW9uIHx8ICh0aGlzLmRpc3BsYXlleHByZXNzaW9uICYmICF0aGlzLmRhdGFzb3VyY2UpKSkgIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWV4cHJlc3Npb24gPSB0aGlzLmRpc3BsYXlsYWJlbDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWxhYmVsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBkYXRhb3B0aW9ucyBhcmUgcHJvdmlkZWQgYW5kIHRoZXJlIGlzIG5vIGRpc3BsYXlsYWJlbCBnaXZlbiB0aGVuIGRpc3BsYXlsYWJlbCBpcyBzZXQgYXMgdGhlIHJlbGF0ZWRmaWVsZFxuICAgICAgICBpZiAoa2V5ID09PSAnZGlzcGxheWxhYmVsJyAmJiB0aGlzLmRhdGFvcHRpb25zICYmIHRoaXMuYmluZGRpc3BsYXlsYWJlbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IGdldCh0aGlzLl9tb2RlbEJ5VmFsdWUsIG52KSB8fCB0aGlzLl9tb2RlbEJ5VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIHNlYXJjaCBpcyBkaXNhYmxlZCwgZG8gbm90IGxvYWQgYW55IG1vcmUgZGF0YSBvciBqdXN0IGNsZWFyIHRoZSBkYXRhIHRoYXQgaXMgYWxyZWFkeSBpbiBwcm9jZXNzIG9yIGxvYWRlZC5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgaWYgKG52ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEYXRhID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0KCh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLCAnX3R5cGVhaGVhZC5pc1Nob3duJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjY3VzdG9tSXRlbVRlbXBsYXRlIGxldC1tb2RlbD1cIml0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1xdWVyeT1cInF1ZXJ5XCIgbGV0LW1hdGNoPVwibWF0Y2hcIj5cbiAgPCEtLSBEZWZhdWx0IGl0ZW0gdGVtcGxhdGUgLS0+XG4gIEBpZiAoIWNvbnRlbnQpIHtcbiAgICA8YT5cbiAgICAgIEBpZiAobW9kZWwuaW1nU3JjKSB7XG4gICAgICAgIDxpbWcgW3NyY109XCJtb2RlbC5pbWdTcmNcIiBhbHQ9XCJTZWFyY2hcIiBbc3R5bGUud2lkdGhdPVwiaW1hZ2V3aWR0aFwiPlxuICAgICAgfVxuICAgICAgPHNwYW4gW3RpdGxlXT1cIm1vZGVsLmxhYmVsXCIgW2lubmVySHRtbF09XCJoaWdobGlnaHQobWF0Y2gsIHF1ZXJ5KSB8fCBtb2RlbC5sYWJlbFwiPjwvc3Bhbj5cbiAgICA8L2E+XG4gIH1cbiAgPCEtLSBDdXN0b20gcGFydGlhbCB0ZW1wbGF0ZSAtLT5cbiAgQGlmIChjb250ZW50KSB7XG4gICAgPGEgW25nQ2xhc3NdPVwie2N1c3RvbVRlbXBsYXRlOiBjb250ZW50fVwiIHBhcnRpYWxDb250YWluZXIgW3dtSXRlbVRlbXBsYXRlXT1cImNvbnRlbnRcIiBbdXNlckNvbXBvbmVudFBhcmFtc109XCJtYXRjaC5pdGVtXCI+XG4gICAgICA8ZGl2IHBhcnRpYWwtY29udGFpbmVyLXRhcmdldD48L2Rpdj5cbiAgICA8L2E+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tTGlzdFRlbXBsYXRlIGxldC1tYXRjaGVzPVwibWF0Y2hlc1wiIGxldC1pdGVtVGVtcGxhdGU9XCJpdGVtVGVtcGxhdGVcIiBsZXQtcXVlcnk9XCJxdWVyeVwiPlxuICA8dWwgI3VsRWxlbWVudCBjbGFzcz1cImFwcC1zZWFyY2ggZHJvcGRvd24tbWVudVwiIHNjcm9sbGFibGU+XG4gICAgQGZvciAobWF0Y2ggb2YgbWF0Y2hlczsgdHJhY2sgbWF0Y2g7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8bGkgI2xpRWxlbWVudHMgW25nQ2xhc3NdPVwie2FjdGl2ZTogdHlwZWFoZWFkQ29udGFpbmVyICYmIHR5cGVhaGVhZENvbnRhaW5lci5pc0FjdGl2ZShtYXRjaCksICdsaXN0LWdyb3VwLWhlYWRlcic6IG1hdGNoICYmIG1hdGNoLmlzSGVhZGVyKCl9XCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwidHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdEFjdGl2ZShtYXRjaCk7XCJcbiAgICAgICAgKGNsaWNrKT1cIm1hdGNoICYmICFtYXRjaC5pc0hlYWRlcigpICYmIHR5cGVhaGVhZENvbnRhaW5lci5zZWxlY3RNYXRjaChtYXRjaCwgJGV2ZW50KTsgJHR5cGVhaGVhZEV2ZW50ID0gJGV2ZW50OyBub3RpZnlTdWJzY3JpYmVyKCk7XCI+XG4gICAgICAgIDwhLS0gaXRlbVRlbXBsYXRlIGNvbWVzIGZyb20gdGhlIDxpbnB1dD4gLS0+XG4gICAgICAgIEBpZiAobWF0Y2guaXNIZWFkZXIoKSkge1xuICAgICAgICAgIDxoNCBjbGFzcz1cImdyb3VwLXRpdGxlXCI+e3ttYXRjaC52YWx1ZX19PC9oND5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKCFtYXRjaC5pc0hlYWRlcigpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBtYXRjaC5pdGVtLCBpbmRleDogaSwgbWF0Y2g6IG1hdGNoLCBxdWVyeTogcXVlcnl9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiBbaGlkZGVuXT1cIl9sb2FkaW5nSXRlbXMgfHwgIShkYXRhY29tcGxldGVtc2cgJiYgZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpXCI+XG4gICAgICA8c3BhbiBbdGV4dENvbnRlbnRdPVwiZGF0YWNvbXBsZXRlbXNnXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiBbaGlkZGVuXT1cIiFfbG9hZGluZ0l0ZW1zXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLWNpcmNsZS1vLW5vdGNoIGZhLXNwaW5cIj48L2k+XG4gICAgICA8c3BhbiBbdGV4dENvbnRlbnRdPVwibG9hZGluZ2RhdGFtc2dcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tVGhpcyB0ZW1wbGF0ZSBpcyBmb3Igc2VhcmNoIGluc2lkZSBtb2JpbGUgbmF2YmFyLi0tPlxuQGlmIChuYXZzZWFyY2hiYXIpIHtcbiAgPGlucHV0IFt0aXRsZV09XCJxdWVyeSB8fCAnJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhcHAtdGV4dGJveCBmb3JtLWNvbnRyb2wgbGlzdC1vZi1vYmpzIGFwcC1zZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgIGZvY3VzLXRhcmdldFxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYWNjZXNza2V5XT1cInNob3J0Y3V0a2V5XCJcbiAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3R5cGVhaGVhZF09XCJ0eXBlYWhlYWREYXRhU291cmNlXCJcbiAgICBbdHlwZWFoZWFkV2FpdE1zXT1cImRlYm91bmNldGltZVwiXG4gICAgW3R5cGVhaGVhZEl0ZW1UZW1wbGF0ZV09XCJjdXN0b21JdGVtVGVtcGxhdGVcIlxuICAgIFtvcHRpb25zTGlzdFRlbXBsYXRlXT1cImN1c3RvbUxpc3RUZW1wbGF0ZVwiXG4gICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwibGlzdGVuUXVlcnkgPSB0cnVlXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCIkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7aGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwic2VsZWN0TmV4dCgkZXZlbnQpXCJcbiAgICAoYmx1cik9XCJpbnZva2VPblRvdWNoZWQoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cImhhbmRsZUZvY3VzKCRldmVudCk7XCJcbiAgICAoZm9jdXMpPVwiX3Vuc3Vic2NyaWJlRHYgPSBmYWxzZTsgbGlzdGVuUXVlcnkgPSB0cnVlOyBoYW5kbGVGb2N1cygkZXZlbnQpOyBpbnZva2VPbkZvY3VzKCRldmVudCk7XCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCJcbiAgICBbdHlwZWFoZWFkTWluTGVuZ3RoXT1cIm1pbmNoYXJzXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0xpbWl0XT1cImxpbWl0XCJcbiAgICAodHlwZWFoZWFkTG9hZGluZyk9XCJfbG9hZGluZ0l0ZW1zXCJcbiAgICAodHlwZWFoZWFkT25TZWxlY3QpPVwidHlwZWFoZWFkT25TZWxlY3QoJGV2ZW50KVwiXG4gICAgdHlwZWFoZWFkT3B0aW9uRmllbGQ9XCJsYWJlbFwiXG4gICAgW3R5cGVhaGVhZEdyb3VwRmllbGRdPVwiZ3JvdXBieSA/ICdncm91cGJ5JyA6IG51bGxcIlxuICAgIFt0eXBlYWhlYWRBc3luY109XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwib3B0aW9uc2xpbWl0aW5zY3JvbGxhYmxldmlld1wiXG4gICAgW2Ryb3B1cF09XCJkcm9wdXBcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFsYWJlbCB8fCAnU2VhcmNoIGZpZWxkJ1wiLz5cbiAgPGkgY2xhc3M9XCJidG4tY2xvc2Ugd2kgd2ktY2FuY2VsXCIgW2hpZGRlbl09XCIhc2hvd0Nsb3NlYnRuXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKCRldmVudCk7XCI+PC9pPlxufSBAZWxzZSB7XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFjayBiYWNrLWJ0blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIChjbGljayk9XCJjbG9zZVNlYXJjaCgpXCI+PGkgY2xhc3M9XCJhcHAtaWNvbiB7e2JhY2tzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+QmFjayBidXR0b248L3NwYW4+XG4gIDxpbnB1dCBbdGl0bGVdPVwicXVlcnkgfHwgJydcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXBwLXRleHRib3ggZm9ybS1jb250cm9sIGxpc3Qtb2Ytb2JqcyBhcHAtc2VhcmNoLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICBmb2N1cy10YXJnZXRcbiAgICBbY29udGFpbmVyXT1cImNvbnRhaW5lclRhcmdldCB8fCAnLndtLWFwcCdcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYWNjZXNza2V5XT1cInNob3J0Y3V0a2V5XCJcbiAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3R5cGVhaGVhZF09XCJ0eXBlYWhlYWREYXRhU291cmNlXCJcbiAgICBbdHlwZWFoZWFkV2FpdE1zXT1cImRlYm91bmNldGltZVwiXG4gICAgW3R5cGVhaGVhZEl0ZW1UZW1wbGF0ZV09XCJjdXN0b21JdGVtVGVtcGxhdGVcIlxuICAgIFtvcHRpb25zTGlzdFRlbXBsYXRlXT1cImN1c3RvbUxpc3RUZW1wbGF0ZVwiXG4gICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwibGlzdGVuUXVlcnkgPSB0cnVlXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCIkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7aGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwic2VsZWN0TmV4dCgkZXZlbnQpXCJcbiAgICAoYmx1cik9XCJpbnZva2VPblRvdWNoZWQoJGV2ZW50KTsgb25Gb2N1c091dCgpXCJcbiAgICAoY2xpY2spPVwiaGFuZGxlRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1cyk9XCJfdW5zdWJzY3JpYmVEdiA9IGZhbHNlOyBsaXN0ZW5RdWVyeSA9IHRydWU7IGhhbmRsZUZvY3VzKCRldmVudCk7IGludm9rZU9uRm9jdXMoJGV2ZW50KVwiXG4gICAgW3R5cGVhaGVhZE1pbkxlbmd0aF09XCJtaW5jaGFyc1wiXG4gICAgW3R5cGVhaGVhZE9wdGlvbnNMaW1pdF09XCJsaW1pdFwiXG4gICAgKHR5cGVhaGVhZExvYWRpbmcpPVwiX2xvYWRpbmdJdGVtc1wiXG4gICAgKHR5cGVhaGVhZE9uU2VsZWN0KT1cInR5cGVhaGVhZE9uU2VsZWN0KCRldmVudClcIlxuICAgIHR5cGVhaGVhZE9wdGlvbkZpZWxkPVwibGFiZWxcIlxuICAgIFt0eXBlYWhlYWRHcm91cEZpZWxkXT1cImdyb3VwYnkgPyAnZ3JvdXBieScgOiBudWxsXCJcbiAgICBbdHlwZWFoZWFkQXN5bmNdPVwidHJ1ZVwiXG4gICAgW3R5cGVhaGVhZFNjcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgW2FkYXB0aXZlUG9zaXRpb25dPVwidHJ1ZVwiXG4gICAgW3R5cGVhaGVhZE9wdGlvbnNJblNjcm9sbGFibGVWaWV3XT1cIm9wdGlvbnNsaW1pdGluc2Nyb2xsYWJsZXZpZXdcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgW2Ryb3B1cF09XCJkcm9wdXBcIlxuICAgIFthdHRyLm5hbWVdPVwibmFtZVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhbGFiZWwgfHwgJ1NlYXJjaCBmaWVsZCdcIj5cbiAgPGlucHV0IGNsYXNzPVwibW9kZWwtaG9sZGVyXCIgbmctbW9kZWw9XCJwcm94eU1vZGVsXCIgbmctcmVxdWlyZWQ9XCJyZXF1aXJlZFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgQGlmIChfbG9hZGluZ0l0ZW1zKSB7XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJmYSBmYS1jaXJjbGUtby1ub3RjaCBmYS1zcGluIGZvcm0tY29udHJvbC1mZWVkYmFja1wiPjwvc3Bhbj5cbiAgfVxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4taWNvbiBmb3JtLWNvbnRyb2wtZmVlZGJhY2sgY2xlYXItYnRuXCIgW25nQ2xhc3NdPVwieydzaG93LWJ0bic6IGlzUXVlcnlFbnRlcmVkKCl9XCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKCRldmVudCwgdHJ1ZSlcIj48aSBjbGFzcz1cImFwcC1pY29uIHt7Y2xlYXJzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xlYXIgYnV0dG9uPC9zcGFuPlxuICBAaWYgKHNob3dzZWFyY2hpY29uKSB7XG4gICAgPHNwYW4gW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IGRpc2FibGVkfVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgIDxmb3JtPlxuICAgICAgICA8YnV0dG9uIHRpdGxlPVwiU2VhcmNoXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgY2xhc3M9XCJhcHAtc2VhcmNoLWJ1dHRvbiBidG4gYnRuLWljb25cIiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWFyY2hTZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24ge3tzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9zcGFuPlxuICAgIH1cbiAgfVxuICA8IS0tVGhpcyB0ZW1wbGF0ZSBpcyBmb3IgYm90aCB3ZWIgYW5kIGZ1bGxzY3JlZW4gbW9kZSBpbiBtb2JpbGUuLS0+XG4iXX0=
|
|
752
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9iYXNpYy9zZWFyY2gvc3JjL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvc2VhcmNoL3NyYy9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBR1IsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFFSCxrQkFBa0IsRUFFbEIsZUFBZSxFQUNsQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM1RyxPQUFPLEVBQ0gsU0FBUyxFQUNULG1CQUFtQixFQUVuQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIseUJB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QUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSx5QkFBeUIsQ0FBQyxZQUN0SyxZQUFZLGFBRVg7d0JBQ1AsU0FBUyxrQkFBa0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO3dCQUNuRCxTQUFTLGtCQUFrQixhQUFhLEVBQUUsSUFBSSxDQUFDO3dCQUMvQyxrQkFBa0IsaUJBQWlCO3FCQUN0Qzs7MEJBK0VJLFNBQVM7MkJBQUMsZ0JBQWdCOzswQkFDMUIsU0FBUzsyQkFBQyxjQUFjOzswQkFDeEIsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUFHLFFBQVE7eUNBNUNWLFNBQVM7c0JBQXZDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUNMLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDTSxVQUFVO3NCQUFyQyxZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1Njcm9sbGFibGVEaXJlY3RpdmV9IGZyb20gJy4vc2Nyb2xsYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge2Zyb20sIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBtZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIFR5cGVhaGVhZENvbnRhaW5lckNvbXBvbmVudCxcbiAgICBUeXBlYWhlYWREaXJlY3RpdmUsXG4gICAgVHlwZWFoZWFkTWF0Y2gsXG4gICAgVHlwZWFoZWFkTW9kdWxlXG59IGZyb20gJ25neC1ib290c3RyYXAvdHlwZWFoZWFkJztcblxuaW1wb3J0IHthZGRDbGFzcywgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sIEFwcCwgRGF0YVNvdXJjZSwgaXNEZWZpbmVkLCBpc01vYmlsZSwgdG9Cb29sZWFufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFMTEZJRUxEUyxcbiAgICBjb252ZXJ0RGF0YVRvT2JqZWN0LFxuICAgIERhdGFTZXRJdGVtLFxuICAgIGV4dHJhY3REYXRhQXNBcnJheSxcbiAgICBnZXRDb250YWluZXJUYXJnZXRDbGFzcyxcbiAgICBnZXRVbmlxT2Jqc0J5RGF0YUZpZWxkLFxuICAgIEl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBQYXJ0aWFsQ29udGFpbmVyRGlyZWN0aXZlLFxuICAgIFBhcnRpYWxQYXJhbUhhbmRsZXJEaXJlY3RpdmUsXG4gICAgcHJvdmlkZUFzLFxuICAgIHByb3ZpZGVBc1dpZGdldFJlZixcbiAgICBzdHlsZXIsXG4gICAgVGV4dENvbnRlbnREaXJlY3RpdmUsXG4gICAgdHJhbnNmb3JtRm9ybURhdGFcbn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQge0RhdGFzZXRBd2FyZUZvcm1Db21wb25lbnR9IGZyb20gJ0B3bS9jb21wb25lbnRzL2lucHV0L2RhdGFzZXQtYXdhcmUtZm9ybSc7XG5pbXBvcnQge3JlZ2lzdGVyUHJvcHN9IGZyb20gJy4vc2VhcmNoLnByb3BzJztcbmltcG9ydCB7RGF0YVByb3ZpZGVyLCBJRGF0YVByb3ZpZGVyLCBJRGF0YVByb3ZpZGVyQ29uZmlnfSBmcm9tICcuL2RhdGEtcHJvdmlkZXIvZGF0YS1wcm92aWRlcic7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlLFxuICAgIGZpbmQsXG4gICAgZ2V0LFxuICAgIGluY2x1ZGVzLFxuICAgIGlzQXJyYXksXG4gICAgaXNFbXB0eSxcbiAgICBpc0VxdWFsLFxuICAgIGlzT2JqZWN0LFxuICAgIGlzVW5kZWZpbmVkLFxuICAgIG1hcCxcbiAgICBzcGxpdCxcbiAgICB0b1N0cmluZyxcbiAgICB0cmltXG59IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuY29uc3QgV0lER0VUX0NPTkZJRyA9IHsgd2lkZ2V0VHlwZTogJ3dtLXNlYXJjaCcsIGhvc3RDbGFzczogJ2lucHV0LWdyb3VwJyB9O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBTY3JvbGxhYmxlRGlyZWN0aXZlLCBUeXBlYWhlYWRNb2R1bGUsIFRleHRDb250ZW50RGlyZWN0aXZlLCBJdGVtVGVtcGxhdGVEaXJlY3RpdmUsIFBhcnRpYWxQYXJhbUhhbmRsZXJEaXJlY3RpdmUsIFBhcnRpYWxDb250YWluZXJEaXJlY3RpdmVdLFxuICAgIHNlbGVjdG9yOiAnW3dtU2VhcmNoXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBcyhTZWFyY2hDb21wb25lbnQsIE5HX1ZBTFVFX0FDQ0VTU09SLCB0cnVlKSxcbiAgICAgICAgcHJvdmlkZUFzKFNlYXJjaENvbXBvbmVudCwgTkdfVkFMSURBVE9SUywgdHJ1ZSksXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihTZWFyY2hDb21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgcHVibGljIGNhc2VzZW5zaXRpdmU6IGJvb2xlYW47XG4gICAgcHVibGljIHNlYXJjaGtleTogc3RyaW5nO1xuICAgIHB1YmxpYyBxdWVyeU1vZGVsOiBBcnJheTxEYXRhU2V0SXRlbT4gfCBzdHJpbmc7XG4gICAgcHVibGljIHF1ZXJ5ID0gJyc7XG4gICAgcHVibGljIGxpbWl0OiBhbnk7XG4gICAgcHVibGljIHNob3dzZWFyY2hpY29uOiBib29sZWFuO1xuICAgIHB1YmxpYyBtaW5jaGFyczogbnVtYmVyO1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG4gICAgcHVibGljIG5hdnNlYXJjaGJhcjogYW55O1xuICAgIHB1YmxpYyBkZWJvdW5jZXRpbWU6IG51bWJlcjtcbiAgICBwdWJsaWMgaGludDogc3RyaW5nO1xuICAgIHB1YmxpYyBhcmlhbGFiZWw6IHN0cmluZztcblxuICAgIHByaXZhdGUgYXBwOiBBcHA7XG4gICAgcHJpdmF0ZSB0eXBlYWhlYWREYXRhU291cmNlOiBPYnNlcnZhYmxlPGFueT47XG4gICAgcHJpdmF0ZSBwYWdlc2l6ZTogYW55O1xuICAgIHByaXZhdGUgcGFnZSA9IDE7XG4gICAgcHVibGljIF9sb2FkaW5nSXRlbXM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXI6IElEYXRhUHJvdmlkZXI7XG4gICAgcHJpdmF0ZSByZXN1bHQ6IEFycmF5PGFueT47IC8vIGNvbnRhaW5zIHRoZSBzZWFyY2ggcmVzdWx0IGkuZS4gbWF0Y2hlc1xuICAgIHByaXZhdGUgZm9ybWF0dGVkRGF0YXNldDogYW55O1xuICAgIHByaXZhdGUgaXNmb3JtZmllbGQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSAkdHlwZWFoZWFkRXZlbnQ6IEV2ZW50O1xuXG4gICAgcHVibGljIHRhYmluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIHN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBwdWJsaWMgYmluZGRpc3BsYXlsYWJlbDogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlYWhlYWRDb250YWluZXI6IFR5cGVhaGVhZENvbnRhaW5lckNvbXBvbmVudDtcbiAgICBwdWJsaWMgY29udGFpbmVyVGFyZ2V0OiBzdHJpbmc7XG4gICAgcHVibGljIGNsZWFyc2VhcmNoaWNvbmNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIGJhY2tzZWFyY2hpY29uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgc2VhcmNoaWNvbmNsYXNzOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKFR5cGVhaGVhZERpcmVjdGl2ZSkgdHlwZWFoZWFkOiBUeXBlYWhlYWREaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgndWxFbGVtZW50JykgdWxFbGVtZW50OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGRyZW4oJ2xpRWxlbWVudHMnKSBsaUVsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICBwcml2YXRlIGFsbG93b25seXNlbGVjdDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNsYXNzOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZEluZGV4OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBkYXRhb3B0aW9uczogYW55O1xuICAgIHB1YmxpYyBkcm9wZG93bkVsOiBhbnk7XG4gICAgcHJpdmF0ZSBfbGFzdFF1ZXJ5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbGFzdFJlc3VsdDogYW55O1xuICAgIHByaXZhdGUgX2lzT3BlbjogYm9vbGVhbjsgLy8gc2V0IHRvIHRydWUgd2hlbiBkcm9wZG93biBpcyBvcGVuXG4gICAgcHJpdmF0ZSBzaG93Q2xvc2VidG46IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfdW5zdWJzY3JpYmVEdjogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9kYXRhc291cmNlOiBhbnk7XG4gICAgcHJpdmF0ZSBpc1Njcm9sbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcGFyZW50RWw6IGFueTtcbiAgICBwcml2YXRlIHBvc2l0aW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBlbEluZGV4OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsaXN0ZW5RdWVyeTogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9kb21VcGRhdGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgc2VhcmNob246IHN0cmluZztcbiAgICBwcml2YXRlIHNob3djbGVhcjogYm9vbGVhbjtcbiAgICBwdWJsaWMgbWF0Y2htb2RlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjbGVhckRhdGE6IGJvb2xlYW47XG5cblxuICAgIC8vIGdldHRlciBzZXR0ZXIgaXMgYWRkZWQgdG8gcGFzcyB0aGUgZGF0YXNvdXJjZSB0byBzZWFyY2hjb21wb25lbnQuXG4gICAgZ2V0IGRhdGFzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhc291cmNlO1xuICAgIH1cblxuICAgIHNldCBkYXRhc291cmNlKG52KSB7XG4gICAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBudjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YXZhbHVlIHx8IHRoaXMudG9CZVByb2Nlc3NlZERhdGF2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVCeURhdGF2YWx1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qOiBJbmplY3RvcixcbiAgICAgICAgYXBwOiBBcHAsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGF2YWx1ZS5iaW5kJykgcHVibGljIGJpbmRkYXRhdmFsdWUsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGFzZXQuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXNldCxcbiAgICAgICAgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgLy8gdGhpcyBmbGFnIHdpbGwgbm90IGFsbG93IHRoZSBlbXB0eSBkYXRhZmllbGQgdmFsdWVzLlxuICAgICAgICB0aGlzLmFsbG93ZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIGFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgJ2FwcC1zZWFyY2gnLCB0cnVlKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVucyBmb3IgdGhlIGNoYW5nZSBpbiB0aGUgbmdNb2RlbCBvbiBldmVyeSBzZWFyY2ggYW5kIHJldHJpZXZlcyB0aGUgZGF0YSBhcyBvYnNlcnZhYmxlLlxuICAgICAgICAgKiBUaGlzIG9ic2VydmFibGUgZGF0YSBpcyBwYXNzZWQgdG8gdGhlIHR5cGVhaGVhZC5cbiAgICAgICAgICogQHR5cGUge09ic2VydmFibGU8YW55Pn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZWFoZWFkRGF0YVNvdXJjZSA9IE9ic2VydmFibGVcbiAgICAgICAgICAgIC5jcmVhdGUoKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBSdW5zIG9uIGV2ZXJ5IHNlYXJjaFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlblF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRRdWVyeUludm9rZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gb24ga2V5ZG93biwgd2hpbGUgc2Nyb2xsaW5nIHRoZSBkcm9wZG93biBpdGVtcywgd2hlbiBsYXN0IGl0ZW0gaXMgcmVhY2hlZCBuZXh0IGNhbGwgaXMgdHJpZ2dlcmVkXG4gICAgICAgICAgICAgICAgLy8gdW5sZXNzIHRoZSBjYWxsIGlzIHJlc29sdmVkLCB3ZSBhcmUgYWJsZSB0byBzY3JvbGwgbmV4dCB0byBmaXJzdCBpdGVtIGFuZCBzb29uXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG93cyBmbGlja2VyaW5nIGZyb20gZmlyc3QgaXRlbSB0byBuZXh0IG5ldyBpdGVtcyBhcHBlbmRlZC5cbiAgICAgICAgICAgICAgICAvLyBCeSBzZXR0aW5nIGNvbnRhaW5lciB0byB1bmRlZmluZWQsIGtleSBldmVudHMgY2hhbmdlcyB3aWxsIGJlIHN0b3BwZWQgd2hpbGUgbG9hZGluZyBpdGVtc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLl9jb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1pbmNoYXJzID09PSAwIHx8ICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkubGVuZ3RoID49IHRoaXMubWluY2hhcnMpKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgodG9rZW46IHN0cmluZykgPT4gdGhpcy5nZXREYXRhU291cmNlQXNPYnNlcnZhYmxlKHRva2VuKSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXIgPSBuZXcgRGF0YVByb3ZpZGVyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gZGVmYXVsdCBkYXRhdmFsdWUgaXMgbm90IGZvdW5kIHdpdGhpbiB0aGUgZGF0YXNldCwgYSBmaWx0ZXIgY2FsbCBpcyBtYWRlIHRvIGdldCB0aGUgcmVjb3JkIHVzaW5nIGZldGNoRGVmYXVsdE1vZGVsLlxuICAgICAgICAgKiBhZnRlciBnZXR0aW5nIHRoZSByZXNwb25zZSwgc2V0IHRoZSBxdWVyeU1vZGVsIGFuZCBxdWVyeS5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGRhdGF2YWx1ZVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YXZhbHVlJC5zdWJzY3JpYmUoKHZhbDogQXJyYXk8c3RyaW5nPiB8IHN0cmluZykgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IChpc0FycmF5KHZhbCkgPyB2YWxbMF0gOiB2YWwpIGFzIHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHF1ZXJ5ID09PSBudWxsIHx8IHF1ZXJ5ID09PSAnJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeU1vZGVsID0gJyc7XG4gICAgICAgICAgICAgICAgLy8gb24gY2xlYXIgb3IgcmVzZXQgZmlsdGVyLCBlbXB0eSB0aGUgbGFzdFJlc3VsdHMgdG8gZmV0Y2ggbmV3IHJlY29yZHMuXG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fdW5zdWJzY3JpYmVEdikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRRdWVyeUludm9rZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBpZiBwcmV2IGRhdGF2YWx1ZSBpcyBub3QgZXF1YWwgdG8gY3VycmVudCBkYXRhdmFsdWUgdGhlbiBjbGVhciB0aGUgbW9kZWxCeUtleSBhbmQgcXVlcnlNb2RlbFxuICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3QodmFsKSAmJiAodGhpcyBhcyBhbnkpLnByZXZEYXRhdmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5S2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeU1vZGVsID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhZmllbGQgaXMgQUxMRklMRURTIGRvIG5vdCBmZXRjaCB0aGUgcmVjb3Jkc1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcXVlcnkgbW9kZWwgd2l0aCB0aGUgdmFsdWVzIHdlIGhhdmVcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YXZhbHVlKHZhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHR1cm4gb24gc2hvd0Nsb3NlQnRuIHdoZW4gYSBkZWZhdWx0IHZhbHVlIGlzIGdpdmVuXG4gICAgICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IGRhdGF2YWx1ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcblxuICAgICAgICBjb25zdCBkYXRhc2V0U3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhc2V0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXh0IGl0ZW0gaW5kZXguXG4gICAgICAgICAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmRhdGFzZXRJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhdmFsdWUgfHwgdGhpcy50b0JlUHJvY2Vzc2VkRGF0YXZhbHVlO1xuICAgICAgICAgICAgLy8gaW52b2tpbmcgdXBkYXRlQnlEYXRhc2V0IG9ubHkgd2hlbiBkYXRhdmFsdWUgaXMgcHJlc2VudCwgYXMgZW50ZXJlZCB2YWx1ZSBpLmUuIHF1ZXJ5IGlzIHNldHRpbmcgYmFjayB0byAnJ1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCeURhdGFzZXQoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4gZGF0YXNldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICAvLyBvbiBjbGVhciwgdHJpZ2dlciBzZWFyY2ggd2l0aCBwYWdlIHNpemUgMVxuICAgIHByaXZhdGUgY2xlYXJTZWFyY2goJGV2ZW50LCBsb2FkT25DbGVhcikge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgkZXZlbnQpO1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxvYWRPbkNsZWFyKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRHYgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjbGVhcnNlYXJjaCcpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgLy8gd2hlbiBzZWFyY2ggaW5wdXQgaXMgY2xlYXJlZCwgZm9jdXMgb24gdGhlIGlucHV0IGZpZWxkXG4gICAgICAgIGlmICgkZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmFwcC1zZWFyY2gtaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZnVuY3Rpb24gdG8gIGNsZWFyIHRoZSBpbnB1dCB2YWx1ZVxuICAgIHB1YmxpYyBjbGVhclRleHQoKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgZnVsbCBzY3JlZW4gbW9kZSBpbiBtb2JpbGUgdmlldyBvZiBhdXRvIGNvbXBsZXRlXG4gICAgcHJpdmF0ZSBjbG9zZVNlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIC8vIGFmdGVyIGNsb3NpbmcgdGhlIHNlYXJjaCwgaW5zZXJ0IHRoZSBlbGVtZW50IGF0IGl0cyBwcmV2aW91cyBwb3NpdGlvbiAoZWxJbmRleClcbiAgICAgICAgdGhpcy5pbnNlcnRBdEluZGV4KHRoaXMuZWxJbmRleCk7XG4gICAgICAgIHRoaXMuZWxJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wYXJlbnRFbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygnZnVsbC1zY3JlZW4nKTtcbiAgICAgICAgaWYgKHRoaXMuX2RvbVVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbVVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRHYgPSB0cnVlO1xuICAgICAgICB0aGlzLnR5cGVhaGVhZC5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJNb2JpbGVBdXRvQ29tcGxldGUoKSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIHNlYXJjaCBlbGVtZW50IHdoaWNoIGNhbiBiZSBuZXh0IG9yIHByZXYgZWxlbWVudCwgaWYgYm90aCBhcmUgZW1wdHkgdGhlbiBnZXQgdGhlIHBhcmVudCBvZiBlbGVtZW50LlxuICAgICAgICBpZiAoIWlzRGVmaW5lZCh0aGlzLmVsSW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsID0gdGhpcy4kZWxlbWVudC5wYXJlbnQoKTtcbiAgICAgICAgICAgIHRoaXMuZWxJbmRleCA9IHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5pbmRleCh0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2Z1bGwtc2NyZWVuJykpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgZmxhZyBpcyBzZXQgdG8gbm90aWZ5IHRoYXQgdGhlIHR5cGVhaGVhZC1jb250YWluZXIgZG9tIGhhcyBjaGFuZ2VkIGl0cyBwb3NpdGlvblxuICAgICAgICAgICAgdGhpcy5fZG9tVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBBZGQgZnVsbCBzY3JlZW4gY2xhc3Mgb24gZm9jdXMgb2YgdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKCdmdWxsLXNjcmVlbicpO1xuXG4gICAgICAgICAgICAvLyBBZGQgcG9zaXRpb24gdG8gc2V0IHRoZSBoZWlnaHQgdG8gYXV0b1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmb2N1cyBpcyBsb3N0IHdoZW4gZWxlbWVudCBpcyBjaGFuZ2VkIHRvIGZ1bGwtc2NyZWVuLCBrZXlkb3duIHRvIHNlbGVjdCBuZXh0IGl0ZW1zIHdpbGwgbm90IHdvcmtcbiAgICAgICAgLy8gSGVuY2UgZXhwbGljaXRseSBmb2N1c2luZyB0aGUgaW5wdXRcbiAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2Z1bGwtc2NyZWVuJykpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmFwcC1zZWFyY2gtaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhU291cmNlQXNPYnNlcnZhYmxlKHF1ZXJ5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICAvLyBzaG93IGRyb3Bkb3duIG9ubHkgd2hlbiB0aGVyZSBpcyBjaGFuZ2UgaW4gcXVlcnkuIFRoaXMgc2hvdWxkIG5vdCBhcHBseSB3aGVuIGRhdGFvcHRpb25zIHdpdGggZmlsdGVyRmllbGRzIGFyZSB1cGRhdGVkLlxuICAgICAgICAvLyB3aGVuIGxhc3RSZXN1bHQgaXMgbm90IGF2YWlsYWJsZSBpLmUuIHN0aWxsIHRoZSBmaXJzdCBjYWxsIGlzIHBlbmRpbmcgYW5kIHNlY29uZCBxdWVyeSBpcyBpbnZva2VkIHRoZW4gZG8gbm90IHJldHVybi5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RRdWVyeSA9PT0gcXVlcnkgJiYgIWdldCh0aGlzLmRhdGFvcHRpb25zLCAnZmlsdGVyRmllbGRzJykgJiYgaXNEZWZpbmVkKHRoaXMuX2xhc3RSZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLl9sYXN0UmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAgICAgV01TLTE5MTc3OiBPbiBmb2N1cyBvZiBpbnB1dCBmaWVsZCBmb3IgYXV0b2NvbXBsZXRlIHR5cGUsIGRvIG5vdCB0cmlnZ2VyIGFwaSBjYWxsIHdoZW5cbiAgICAgICAgICAgICAgICAgYSkgc2VhcmNoa2V5IGFuZCBkaXNwbGF5ZXhwcmVzc2lvbiBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgIGIpIGJpbmRkaXNwbGF5bGFiZWwgY29udGFpbnMgbXVsdGlwbGUgdmFsdWVzXG4gICAgICAgICAgICAgICAgIGMpIGJpbmRkaXNwbGF5bGFiZWwgY29udGFpbnMgc2luZ2xlIHZhbHVlIHdoaWNoIGRvZXMgbm90IG1hdGNoIHdpdGggc2VhcmNoa2V5XG4gICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdhdXRvY29tcGxldGUnICYmIHRoaXMuc2VhcmNoa2V5ICYmIHRoaXMucXVlcnkgJiYgdGhpcy5kYXRhdmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBiaW5kRGlzcGxheUxhYmVsQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaEtleUFycmF5ID0gc3BsaXQodGhpcy5zZWFyY2hrZXksICcsJyk7XG4gICAgICAgICAgICBsZXQgZGlzcGxheWxhYmVsO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmluZGRpc3BsYXlsYWJlbCkge1xuICAgICAgICAgICAgICAgIGJpbmREaXNwbGF5TGFiZWxBcnJheSA9IHNwbGl0KHRoaXMuYmluZGRpc3BsYXlsYWJlbCwgJysnKTtcbiAgICAgICAgICAgICAgICBpZiAoYmluZERpc3BsYXlMYWJlbEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVzKGJpbmREaXNwbGF5TGFiZWxBcnJheVswXSwgJ3wnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSAvXFxbKC4qPylcXF0vO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWxhYmVsID0gcmVnZXguZXhlYyhiaW5kRGlzcGxheUxhYmVsQXJyYXlbMF0pWzFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWxhYmVsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoYmluZERpc3BsYXlMYWJlbEFycmF5Lmxlbmd0aCA+IDEgfHwgKGRpc3BsYXlsYWJlbCAmJiAhaW5jbHVkZXMoc2VhcmNoS2V5QXJyYXksIGRpc3BsYXlsYWJlbCkpXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuZGlzcGxheWV4cHJlc3Npb24gJiYgIWluY2x1ZGVzKHNlYXJjaEtleUFycmF5LCB0aGlzLmRpc3BsYXlleHByZXNzaW9uKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYXN0UXVlcnkgPSB0aGlzLnF1ZXJ5O1xuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmdldERhdGFTb3VyY2UocXVlcnkpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBldmVudENhbGxiYWNrOiBGdW5jdGlvbiwgbG9jYWxzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhbJ2JsdXInLCAnZm9jdXMnLCAnc2VsZWN0JywgJ3N1Ym1pdCcsICdjaGFuZ2UnXSwgZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXZlbnQobm9kZSwgZXZlbnROYW1lLCBldmVudENhbGxiYWNrLCBsb2NhbHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGlnaGxpZ2h0IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBkcm9wZG93biBtYXRjaGluZyB0aGUgcXVlcnkuXG4gICAgcHJpdmF0ZSBoaWdobGlnaHQobWF0Y2g6IFR5cGVhaGVhZE1hdGNoLCBxdWVyeTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lcikge1xuICAgICAgICAgICAgLy8gaGlnaGxpZ2h0IG9mIGNoYXJzIHdpbGwgd29yayBvbmx5IHdoZW4gbGFiZWwgYXJlIHN0cmluZ3MuXG4gICAgICAgICAgICAobWF0Y2ggYXMgYW55KS52YWx1ZSA9IG1hdGNoLml0ZW0ubGFiZWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5oaWdobGlnaHQobWF0Y2gsIHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGluc2VydHMgdGhlIGVsZW1lbnQgYXQgdGhlIGluZGV4IHBvc2l0aW9uXG4gICAgcHJpdmF0ZSBpbnNlcnRBdEluZGV4KGkpIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWwucHJlcGVuZCh0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0ICRlbEF0SW5kZXggPSB0aGlzLnBhcmVudEVsLmNoaWxkcmVuKCkuZXEoaSk7XG4gICAgICAgICAgICBpZiAoJGVsQXRJbmRleC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLnBhcmVudEVsLmNoaWxkcmVuKCkuZXEoaSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50Lmluc2VydEFmdGVyKHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5lcShpIC0gMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdpZGdldCBpcyBvZiB0eXBlIGF1dG9jb21wbGV0ZSBpbiBtb2JpbGUgdmlldy8gYXBwXG4gICAgcHVibGljIGlzTW9iaWxlQXV0b0NvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnYXV0b2NvbXBsZXRlJyAmJiBpc01vYmlsZSgpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBlbnRlcmVkIGluIHRoZSBpbnB1dCBhbmQgdGhlIHZpZXcgaXMgbm90IG1vYmlsZVxuICAgIHB1YmxpYyBpc1F1ZXJ5RW50ZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd2NsZWFyICYmIHRoaXMuc2hvd0Nsb3NlYnRuO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZE1vcmVEYXRhKGluY3JlbWVudFBhZ2U/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5jcmVhc2UgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0cmlnZ2VyIGZvcmNlIHF1ZXJ5IHVwZGF0ZVxuICAgICAgICB0aGlzLnBhZ2UgPSBpbmNyZW1lbnRQYWdlID8gdGhpcy5wYWdlICsgMSA6IHRoaXMucGFnZTtcblxuICAgICAgICB0aGlzLmlzU2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIHdoZW4gaW52b2tpbmcgbmV3IHNldCBvZiByZXN1bHRzLCByZXNldCB0aGUgbGFzdFF1ZXJ5LlxuICAgICAgICBpZiAoaW5jcmVtZW50UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFF1ZXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciB0aGUgdHlwZWFoZWFkIGNoYW5nZSBtYW51YWxseSB0byBmZXRjaCB0aGUgbmV4dCBzZXQgb2YgcmVzdWx0cy5cbiAgICAgICAgdGhpcy50eXBlYWhlYWQub25JbnB1dCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHJpbSh0aGlzLnF1ZXJ5KSB8fCAnMCcgLy8gZHVtbXkgZGF0YSB0byBub3RpZnkgdGhlIG9ic2VydmFibGVzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIG9uIGZvY3Vzb3V0LCBzdWJzY3JpYmUgdG8gdGhlIGRhdGF2YWx1ZSBjaGFuZ2VzIGFnYWluXG4gICAgcHJpdmF0ZSBvbkZvY3VzT3V0KCkge1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUR2ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAvLyByZXNldCB0aGUgcGFnZSB2YWx1ZSBvbiBmb2N1c291dC5cbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgLy8gaWYgZG9tVXBkYXRlZCBpcyB0cnVlIHRoZW4gZG8gbm90IGhpZGUgdGhlIGRyb3Bkb3duIGluIHRoZSBmdWxsc2NyZWVuXG4gICAgICAgIGlmICghdGhpcy5fZG9tVXBkYXRlZCAmJiB0aGlzLl9pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgLy8gb24gb3V0c2lkZSBjbGljaywgdHlwZWFoZWFkIGlzIGhpZGRlbi4gVG8gYXZvaWQgdGhpcywgd2hlbiBmdWxsc2NyZWVuIGlzIHNldCwgb3ZlcnJpZGRpbmcgaXNGb2N1c2VkIGZsYWcgb24gdGhlIHR5cGVhaGVhZCBjb250YWluZXJcbiAgICAgICAgaWYgKHRoaXMuX2RvbVVwZGF0ZWQgJiYgdGhpcy50eXBlYWhlYWQgJiYgKHRoaXMudHlwZWFoZWFkIGFzIGFueSkuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkIGFzIGFueSkuX2NvbnRhaW5lci5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbklucHV0Q2hhbmdlKCRldmVudCkge1xuICAgICAgICAvLyByZXNldCBhbGwgdGhlIHByZXZpb3VzIHBhZ2UgZGV0YWlscyBpbiBvcmRlciB0byBmZXRjaCBuZXcgc2V0IG9mIHJlc3VsdC5cbiAgICAgICAgdGhpcy5yZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IHRoaXMuaXNVcGRhdGVPbktleVByZXNzKCk7XG4gICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyB3aGVuIGlucHV0IGlzIGNsZWFyZWQsIHJlc2V0IHRoZSBkYXRhdmFsdWVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQcmV2RGF0YXZhbHVlKHRoaXMuX2xhc3RRdWVyeSk7XG4gICAgICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuX21vZGVsQnlWYWx1ZSwge30sIHRydWUpO1xuXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NsZWFyJywgeyAkZXZlbnQgfSk7XG5cbiAgICAgICAgICAgIC8vIHRyaWdnZXIgb25TdWJtaXQgb25seSB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaXMgY2xlYXJlZCBvZmYgYW5kIGRvIG5vdCB0cmlnZ2VyIHdoZW4gdGFiIGlzIHByZXNzZWQuXG4gICAgICAgICAgICBpZiAoJGV2ZW50ICYmICRldmVudC53aGljaCAhPT0gOSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VibWl0JywgeyAkZXZlbnQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbnZva2luZyBjaGFuZ2UgZXZlbnQgb24gZXZlcnkgaW5wdXQgdmFsdWUgY2hhbmdlLlxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50OiAkZXZlbnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsOiB0aGlzLl9tb2RlbEJ5VmFsdWUgfHwgdGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgICBvbGRWYWw6ICh0aGlzIGFzIGFueSkucHJldkRhdGF2YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJlZCBmb3IgZW50ZXIgZXZlbnRcbiAgICBwcml2YXRlIGhhbmRsZUVudGVyRXZlbnQoJGV2ZW50KSB7XG4gICAgICAgIC8vIHN1Ym1pdCBldmVudCB0cmlnZ2VyZWQgd2hlbiB0aGVyZSBpcyBubyBzZWFyY2ggcmVzdWx0c1xuICAgICAgICBpZiAoIWdldCh0aGlzLnR5cGVhaGVhZCwgJ21hdGNoZXMubGVuZ3RoJykpIHtcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hTZWxlY3QoJGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmlnZ2VycmVkIHdoZW4gdHlwZWFoZWFkIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICBwcml2YXRlIG9uU2VhcmNoU2VsZWN0KCRldmVudDogRXZlbnQpIHtcbiAgICAgICAgbGV0IGl0ZW07XG4gICAgICAgIC8vIFdNUy0yMjUzMzogQmVmb3JlIGFkZGluZyBhY3RpdmUgdHlwZWFoZWFkIGVsLCBjaGVjayBpZiB0aGUgZW50ZXJlZCBxdWVyeSBtYXRjaGVzIHdpdGggdGhlIGFjdGl2ZSBlbCBvciBub3RcbiAgICAgICAgY29uc3QgaXNRdWVyeU1hdGNoID0gdGhpcy50eXBlYWhlYWRDb250YWluZXI/LmFjdGl2ZT8udmFsdWUgPT09IHRoaXMucXVlcnk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyICYmIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmFjdGl2ZSAmJiBpc1F1ZXJ5TWF0Y2gpIHtcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5hY3RpdmUuaXRlbTtcbiAgICAgICAgfVxuICAgICAgICAkZXZlbnQgPSB0aGlzLmV2ZW50RGF0YSgkZXZlbnQsIGl0ZW0gfHwge30pO1xuXG4gICAgICAgIC8vIHNlYXJjaE9uIGlzIHNldCBhcyBvbkJ0bkNsaWNrLCB0aGVuIGludm9rZSB0aGUgc2VhcmNoIGFwaSBjYWxsIG1hbnVhbGx5LlxuICAgICAgICBpZiAoIXRoaXMuaXNVcGRhdGVPbktleVByZXNzKCkpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSB0cnVlO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciB0aGUgdHlwZWFoZWFkIGNoYW5nZSBtYW51YWxseSB0byBmZXRjaCB0aGUgbmV4dCBzZXQgb2YgcmVzdWx0cy5cbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLm9uSW5wdXQoe1xuICAgICAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeSAvLyBkdW1teSBkYXRhIHRvIG5vdGlmeSB0aGUgb2JzZXJ2YWJsZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIG1hdGNoZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgaWYgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyICYmIHRoaXMubGlFbGVtZW50cy5sZW5ndGggJiYgaXNRdWVyeU1hdGNoKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5zZWxlY3RBY3RpdmVNYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gdGhpcy5xdWVyeTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VibWl0JywgeyAkZXZlbnQgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGludm9rZU9uQmVmb3JlU2VydmljZUNhbGwoaW5wdXREYXRhKSB7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VydmljZWNhbGwnLCB7IGlucHV0RGF0YSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRHJvcGRvd25PcGVuKCkge1xuICAgICAgICBpZiAodGhpcy5jbGVhckRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXR0aW5nIHRoZSB1bEVsZW1lbnRzLCBsaUVsZW1lbnQgb24gdHlwZWFoZWFkQ29udGFpbmVyLlxuICAgICAgICAvLyBhcyB3ZSBhcmUgdXNpbmcgY3VzdG9tT3B0aW9uIHRlbXBsYXRlLCBsaUVsZW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHR5cGVhaGVhZENvbnRhaW5lciBzbyBhcHBlbmQgdGhlbSBleHBsaWNpdGx5LlxuICAgICAgICBjb25zdCBmbiA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZENvbnRhaW5lciA9IHRoaXMudHlwZWFoZWFkLl9jb250YWluZXIgfHwgKHRoaXMudHlwZWFoZWFkIGFzIGFueSkuX3R5cGVhaGVhZC5pbnN0YW5jZTtcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciBhcyBhbnkpLmxpRWxlbWVudHMgPSB0aGlzLmxpRWxlbWVudHM7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWRDb250YWluZXIgYXMgYW55KS51bEVsZW1lbnQgPSB0aGlzLnVsRWxlbWVudDtcbiAgICAgICAgICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uKCQoJ3R5cGVhaGVhZC1jb250YWluZXInKSwgdGhpcy5uYXRpdmVFbGVtZW50LCAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fdHlwZWFoZWFkLCAkKCd0eXBlYWhlYWQtY29udGFpbmVyIC5kcm9wZG93bi1tZW51JykpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZuKCk7XG5cbiAgICAgICAgLy8gb3BlbiBmdWxsLXNjcmVlbiBzZWFyY2ggdmlld1xuICAgICAgICBpZiAodGhpcy5pc01vYmlsZUF1dG9Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2Z1bGwtc2NyZWVuJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlck1vYmlsZUF1dG9Db21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25FbCA9IHRoaXMuZHJvcGRvd25FbC5jbG9zZXN0KCd0eXBlYWhlYWQtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgIGRyb3Bkb3duRWwuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudC5maW5kKCdpbnB1dCcpLmZpcnN0KCkpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCcuYXBwLWNvbnRlbnQnKS5oZWlnaHQoKTtcbiAgICAgICAgICAgIGRyb3Bkb3duRWwuY3NzKHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHRvcDogMCwgaGVpZ2h0OiBzY3JlZW5IZWlnaHQgKyAncHgnIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSB0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkgIT09ICcnO1xuXG4gICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpICYmICF0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyU2VhcmNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE5leHQoKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5tYXRjaGVzO1xuXG4gICAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2hlcy5pbmRleE9mKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmFjdGl2ZSk7XG5cbiAgICAgICAgLy8gb24ga2V5ZG93biwgaWYgc2Nyb2xsIGlzIGF0IHRoZSBib3R0b20gYW5kIG5leHQgcGFnZSByZWNvcmRzIGFyZSBhdmFpbGFibGUsIGZldGNoIG5leHQgcGFnZSBpdGVtcy5cbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkaW5nSXRlbXMgJiYgIXRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UgJiYgaW5kZXggKyAxID4gbWF0Y2hlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAvLyBpbmRleCBpcyBzYXZlZCBpbiBvcmRlciB0byBzZWxlY3QgdGhlIGxhc3RTZWxlY3RlZCBpdGVtIGluIHRoZSBkcm9wZG93biBhZnRlciBmZXRjaGluZyBuZXh0IHBhZ2UgaXRlbXMuXG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TGFzdEFjdGl2ZU1hdGNoQXNTZWxlY3RlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdGVkSW5kZXgpIHtcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciBhcyBhbnkpLl9hY3RpdmUgPSB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5tYXRjaGVzW3RoaXMubGFzdFNlbGVjdGVkSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWRDb250YWluZXIubmV4dEFjdGl2ZU1hdGNoKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyU2VhcmNoKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSB8fCAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGVBaGVhZERyb3BEb3duID0gdGhpcy5kcm9wZG93bkVsO1xuICAgICAgICBjb25zdCAkbGFzdEl0ZW0gPSB0eXBlQWhlYWREcm9wRG93bi5maW5kKCdsaScpLmxhc3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBsYXN0IGl0ZW0gaXMgbm90IGJlbG93IHRoZSBmdWxsIHNjcmVlblxuICAgICAgICBpZiAoJGxhc3RJdGVtLmxlbmd0aCAmJiB0eXBlQWhlYWREcm9wRG93bi5sZW5ndGggJiYgKHR5cGVBaGVhZERyb3BEb3duLmhlaWdodCgpICsgdHlwZUFoZWFkRHJvcERvd24ucG9zaXRpb24oKS50b3AgPiAkbGFzdEl0ZW0uaGVpZ2h0KCkgKyAkbGFzdEl0ZW0ucG9zaXRpb24oKS50b3ApKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNVcGRhdGVPbktleVByZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hvbiA9PT0gJ3R5cGluZyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWJvdW5jZURlZmF1bHRRdWVyeShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRRdWVyeUludm9rZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldERhdGFTb3VyY2UoZGF0YSwgdHJ1ZSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UXVlcnkgPSB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeU1vZGVsWzBdLmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IHRoaXMucXVlcnlNb2RlbFswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5S2V5ID0gdGhpcy5xdWVyeU1vZGVsWzBdLmtleTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdldCgodGhpcy50eXBlYWhlYWQgYXMgYW55KSwgJ190eXBlYWhlYWQuaXNTaG93bicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQnlEYXRhdmFsdWUoZGF0YSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YXNldChkYXRhKTtcbiAgICAgICAgdGhpcy51cGRhdGVCeURhdGFTb3VyY2UoZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCeURhdGFTb3VyY2UoZGF0YSkge1xuICAgICAgICAvLyB2YWx1ZSBpcyBwcmVzZW50IGJ1dCB0aGUgY29ycmVzcG9uZGluZyBrZXkgaXMgbm90IGZvdW5kIHRoZW4gZmV0Y2ggbmV4dCBzZXRcbiAgICAgICAgLy8gbW9kZWxCeUtleSB3aWxsIGJlIHNldCBvbmx5IHdoZW4gZGF0YXZhbHVlIGlzIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGxvY2FsRGF0YSBvdGhlcndpc2UgbWFrZSBhIE4vdyBjYWxsLlxuICAgICAgICBpZiAoaXNEZWZpbmVkKGRhdGEpICYmICFpc09iamVjdChkYXRhKSAmJiB0aGlzLmRhdGFzb3VyY2UgJiYgIWlzRGVmaW5lZCh0aGlzLl9tb2RlbEJ5S2V5KSAmJiB0aGlzLmRhdGFmaWVsZCAhPT0gQUxMRklFTERTKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBtYWtpbmcgZGVmYXVsdCBxdWVyeSBpZiBxdWVyeU1vZGVsIGFscmVhZHkgZXhpc3RzLlxuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLnF1ZXJ5TW9kZWwpICYmICFpc0VtcHR5KHRoaXMucXVlcnlNb2RlbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGF2YWx1ZUZyb21RdWVyeU1vZGVsKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYWtlIGRlZmF1bHQgcXVlcnkgY2FsbCBvbmx5IHdoZW4gZGF0YXNvdXJjZSBzdXBwb3J0cyBDUlVEIChsaXZlIHZhcmlhYmxlKS5cbiAgICAgICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCAmJiB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5TVVBQT1JUU19DUlVEKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VEZWZhdWx0UXVlcnkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1cGRhdGVzIHRoZSBtb2RlbCB2YWx1ZSB1c2luZyBxdWVyeU1vZGVsXG4gICAgcHJpdmF0ZSB1cGRhdGVEYXRhdmFsdWVGcm9tUXVlcnlNb2RlbCgpIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLnF1ZXJ5TW9kZWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSBpc0FycmF5KHRoaXMucXVlcnlNb2RlbCkgPyAodGhpcy5xdWVyeU1vZGVsWzBdIGFzIERhdGFTZXRJdGVtKS52YWx1ZSA6IHRoaXMucXVlcnlNb2RlbDtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsQnlLZXkgPSBpc0FycmF5KHRoaXMucXVlcnlNb2RlbCkgPyAodGhpcy5xdWVyeU1vZGVsWzBdIGFzIERhdGFTZXRJdGVtKS5rZXkgOiB0aGlzLnF1ZXJ5TW9kZWw7XG4gICAgICAgICAgICB0aGlzLnRvQmVQcm9jZXNzZWREYXRhdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJ5RGF0YXNldChkYXRhOiBhbnkpIHtcbiAgICAgICAgLy8gZGVmYXVsdCBxdWVyeSBpcyBhbHJlYWR5IGludm9rZWQgdGhlbiBkbyBub3QgbWFrZSBvdGhlciBkZWZhdWx0IHF1ZXJ5IGNhbGwuXG4gICAgICAgIC8vIEZvciBsb2NhbCBzZWFyY2ggaS5lLiBzZWFyY2hrZXkgaXMgdW5kZWZpbmVkLCBkbyBub3QgcmV0dXJuLCB2ZXJpZnkgdGhlIGRhdGF2YWx1ZSBhZ2FpbnN0IHRoZSBkYXRhc2V0SXRlbXMgLlxuICAgICAgICBpZiAodGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCAmJiB0aGlzLnNlYXJjaGtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGZpbmQodGhpcy5kYXRhc2V0SXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGlzT2JqZWN0KGl0ZW0udmFsdWUpID8gaXNFcXVhbChpdGVtLnZhbHVlLCBkYXRhKSA6ICh0b1N0cmluZyhpdGVtLnZhbHVlKSkudG9Mb3dlckNhc2UoKSA9PT0gKHRvU3RyaW5nKGRhdGEpKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IG9ubHkgd2hlbiBpdCBpcyBhdmFpbGFibGUgaW4gZGF0YXNldC5cbiAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gW3NlbGVjdGVkSXRlbV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhZmllbGQgPT09IEFMTEZJRUxEUyAmJiBpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gdGhpcy5nZXRUcmFuc2Zvcm1lZERhdGEoZXh0cmFjdERhdGFBc0FycmF5KGRhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlc2V0dGluZyB0aGUgcXVlcnlNb2RlbCBvbmx5IHdoZW4gcHJldkRhdGF2YWx1ZSBpcyBlcXVhbCB0byBkYXRhXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlICE9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVEYXRhdmFsdWVGcm9tUXVlcnlNb2RlbCgpO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGxhYmVsIHZhbHVlIG9uIGlucHV0LlxuICAgICAgICB0aGlzLl9sYXN0UXVlcnkgPSB0aGlzLnF1ZXJ5ID0gaXNEZWZpbmVkKHRoaXMucXVlcnlNb2RlbCkgJiYgdGhpcy5xdWVyeU1vZGVsLmxlbmd0aCA/IGdldCh0aGlzLnF1ZXJ5TW9kZWxbMF0sICdsYWJlbCcpIDogJyc7XG4gICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGxhc3Qgc2VhcmNoIHJlc3VsdHMgdGhlbiBvcGVuIGRyb3Bkb3duIG9uIGZvY3VzXG4gICAgcHJpdmF0ZSBoYW5kbGVGb2N1cygkZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NlYXJjaCcgJiYgdGhpcy5xdWVyeSA9PT0gdGhpcy5fbGFzdFF1ZXJ5ICYmIHRoaXMuX2xhc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLmtleVVwRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5xdWVyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbm90aWZ5U3Vic2NyaWJlcigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50RWwgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkuY2xvc2VzdCgnLmFwcC1jb21wb3NpdGUtd2lkZ2V0LmNhcHRpb24tZmxvYXRpbmcnKTtcbiAgICAgICAgaWYgKHBhcmVudEVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnY2FwdGlvblBvc2l0aW9uQW5pbWF0ZScsIHtkaXNwbGF5VmFsOiB0cnVlLCBuYXRpdmVFbDogcGFyZW50RWx9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcHJvdmlkZXMgdGhlIGZpbHRlcmVkIGRhdGEgZnJvbSB0aGUgZGF0YXNvdXJjZS5cbiAgICBwdWJsaWMgZ2V0RGF0YVNvdXJjZShxdWVyeTogQXJyYXk8c3RyaW5nPiB8IHN0cmluZywgc2VhcmNoT25EYXRhRmllbGQ/OiBib29sZWFuLCBuZXh0SXRlbUluZGV4PzogbnVtYmVyKTogUHJvbWlzZTxEYXRhU2V0SXRlbVtdPiB7XG4gICAgICAgIC8vIEZvciBkZWZhdWx0IHF1ZXJ5LCBzZWFyY2hPbkRhdGFGaWVsZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBkbyBub3QgbWFrZSBhIG4vdyBjYWxsIHdoZW4gZGF0YWZpZWxkIGlzIEFMTEZJRUxEU1xuICAgICAgICBpZiAoc2VhcmNoT25EYXRhRmllbGQgJiYgdGhpcy5kYXRhZmllbGQgPT09IEFMTEZJRUxEUykge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvciBkZWZhdWx0IGRhdGF2YWx1ZSwgc2VhcmNoIGtleSBhcyB0byBiZSBvbiBkYXRhZmllbGQgdG8gZ2V0IHRoZSBkZWZhdWx0IGRhdGEgZnJvbSB0aGUgZmlsdGVyIGNhbGwuXG4gICAgICAgIGNvbnN0IGRhdGFDb25maWc6IElEYXRhUHJvdmlkZXJDb25maWcgPSB7XG4gICAgICAgICAgICBkYXRhc2V0OiB0aGlzLmRhdGFzZXQgPyBjb252ZXJ0RGF0YVRvT2JqZWN0KHRoaXMuZGF0YXNldCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBiaW5kZGF0YXNldDogdGhpcy5iaW5kZGF0YXNldCxcbiAgICAgICAgICAgIGRhdGFzb3VyY2U6IHRoaXMuZGF0YXNvdXJjZSxcbiAgICAgICAgICAgIGRhdGFmaWVsZDogdGhpcy5kYXRhZmllbGQsXG4gICAgICAgICAgICBoYXNEYXRhOiB0aGlzLmRhdGFzZXQgJiYgdGhpcy5kYXRhc2V0Lmxlbmd0aCxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgICAgIGlzTG9jYWxGaWx0ZXI6ICF0aGlzLnNlYXJjaGtleSxcbiAgICAgICAgICAgIHNlYXJjaEtleTogc2VhcmNoT25EYXRhRmllbGQgPyB0aGlzLmRhdGFmaWVsZCA6IHRoaXMuc2VhcmNoa2V5LFxuICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWFyY2ggY2FsbCBtYXRjaCBtb2RlIHNob3VsZCBiZSBzdGFydGlnbm9yZWNhc2VcbiAgICAgICAgICAgIG1hdGNoTW9kZTogc2VhcmNoT25EYXRhRmllbGQgPyAnc3RhcnRpZ25vcmVjYXNlJyA6IHRoaXMubWF0Y2htb2RlLFxuICAgICAgICAgICAgY2FzZXNlbnNpdGl2ZTogdGhpcy5jYXNlc2Vuc2l0aXZlLFxuICAgICAgICAgICAgaXNmb3JtZmllbGQ6IHRoaXMuaXNmb3JtZmllbGQsXG4gICAgICAgICAgICBvcmRlcmJ5OiB0aGlzLm9yZGVyYnksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5saW1pdCxcbiAgICAgICAgICAgIHBhZ2VzaXplOiB0aGlzLnBhZ2VzaXplLFxuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgb25CZWZvcmVzZXJ2aWNlY2FsbDogdGhpcy5pbnZva2VPbkJlZm9yZVNlcnZpY2VDYWxsLmJpbmQodGhpcylcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhb3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YUNvbmZpZy5kYXRhb3B0aW9ucyA9IHRoaXMuZGF0YW9wdGlvbnM7XG4gICAgICAgICAgICBkYXRhQ29uZmlnLnZpZXdQYXJlbnQgPSB0aGlzLnZpZXdQYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5maWx0ZXIoZGF0YUNvbmZpZylcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgZnJvbSBkYXRhUHJvdmlkZXIgcmV0dXJucyBhbHdheXMgZGF0YSBvYmplY3QuXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIC8vIGZvciBzZXJ2aWNlIHZhcmlhYmxlLCB1cGRhdGluZyB0aGUgZGF0YXNldCBvbmx5IGlmIGl0IGlzIG5vdCBkZWZpbmVkIG9yIGVtcHR5XG4gICAgICAgICAgICAgICAgaWYgKCghaXNEZWZpbmVkKHRoaXMuZGF0YXNldCkgfHwgIXRoaXMuZGF0YXNldC5sZW5ndGgpICYmIHRoaXMuZGF0YVByb3ZpZGVyLnVwZGF0ZURhdGFzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLmhhc01vcmVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YXNldCA9IHRoaXMuZm9ybWF0dGVkRGF0YXNldC5jb25jYXQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YXNldCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgb3B0aW9uc2xpbWl0IGFzIHRoZSBtYXRjaGVzIG1vcmUgdGhhbiAyMCB3aWxsIGJlIGlnbm9yZWQgaWYgb3B0aW9uc2xpbWl0IGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0dGVkRGF0YXNldC5sZW5ndGggPiAyMCAmJiAhaXNEZWZpbmVkKHRoaXMubGltaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLnR5cGVhaGVhZE9wdGlvbnNMaW1pdCA9IHRoaXMuZm9ybWF0dGVkRGF0YXNldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW4gbW9iaWxlLCB0cmlnZ2VyIHRoZSBzZWFyY2ggYnkgZGVmYXVsdCB1bnRpbCB0aGUgcmVzdWx0cyBoYXZlIGhlaWdodCB1cHRvIHBhZ2UgaGVpZ2h0LiBPdGhlciByZXN1bHRzIGNhbiBiZSBmZXRjaGVkIGJ5IHNjcm9sbGluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNPcGVuICYmIHRoaXMuaXNNb2JpbGVBdXRvQ29tcGxldGUoKSAmJiAhaXNVbmRlZmluZWQodGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkgJiYgIXRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5nZXRUcmFuc2Zvcm1lZERhdGEodGhpcy5mb3JtYXR0ZWREYXRhc2V0LCBuZXh0SXRlbUluZGV4KTtcblxuICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBjb250YWlucyB0aGUgZGF0YWZpZWxkIHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSBtYXAodHJhbnNmb3JtZWREYXRhLCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTY3JvbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAoZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMYXN0QWN0aXZlTWF0Y2hBc1NlbGVjdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDMwKSkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdoZW4gbm8gcmVzdWx0IGlzIGZvdW5kLCBzZXQgdGhlIGRhdGF2YWx1ZSB0byB1bmRlZmluZWQuXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gKHF1ZXJ5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9uIGZvY3Vzb3V0IGkuZS4gb24gb3RoZXIgd2lkZ2V0IGZvY3VzLCBpZiBuL3cgaXMgcGVuZGluZyBsb2FkaW5nIGljb24gaXMgc2hvd24sIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUgdGhlbiBkcm9wZG93biBpcyBzaG93biBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAvLyBvbiB1bnN1YnNjcmliaW5nIGRvIG5vdCBzaG93IHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl91bnN1YnNjcmliZUR2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBwYXJlbnQgY29udGV4dCBpLmUuIFBhZ2UgY29udGV4dCBhbmQgbm90IHBhcmVudCBjb21wb25lbnQncyBjb250ZXh0LlxuICAgIHByaXZhdGUgZ2V0Q29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGdldChjb250ZXh0LCAnd2lkZ2V0JykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbnRleHQoY29udGV4dC52aWV3UGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhbnNmb3JtZWREYXRhKGRhdGE6IGFueSwgaXRlbUluZGV4PzogbnVtYmVyLCBpc2N1c3RvbT86IGJvb2xlYW4pOiBEYXRhU2V0SXRlbVtdIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZChpdGVtSW5kZXgpKSB7XG4gICAgICAgICAgICBpdGVtSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRyYW5zZm9ybUZvcm1EYXRhKFxuICAgICAgICAgICAgdGhpcy5nZXRDb250ZXh0KHRoaXMudmlld1BhcmVudCksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdGhpcy5kYXRhZmllbGQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkOiB0aGlzLmRpc3BsYXlsYWJlbCB8fCB0aGlzLmRpc3BsYXlmaWVsZCxcbiAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogaXNjdXN0b20gPyAnJyA6IHRoaXMuZGlzcGxheWV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgYmluZERpc3BsYXlFeHByOiBpc2N1c3RvbSA/ICcnIDogdGhpcy5iaW5kZGlzcGxheWxhYmVsLFxuICAgICAgICAgICAgICAgIGJpbmREaXNwbGF5SW1nU3JjOiB0aGlzLmJpbmRkaXNwbGF5aW1hZ2VzcmMsXG4gICAgICAgICAgICAgICAgZGlzcGxheUltZ1NyYzogdGhpcy5kaXNwbGF5aW1hZ2VzcmNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpdGVtSW5kZXgsXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBnZXRVbmlxT2Jqc0J5RGF0YUZpZWxkKHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5kYXRhZmllbGQsIHRoaXMuZGlzcGxheWZpZWxkIHx8IHRoaXMuZGlzcGxheWxhYmVsLCB0b0Jvb2xlYW4odGhpcy5hbGxvd2VtcHR5KSk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uc0xpc3RUZW1wbGF0ZSBsaXN0ZW5zIHRvIHRoZSBzY3JvbGwgZXZlbnQgYW5kIHRyaWdnZXJzIHRoaXMgZnVuY3Rpb24uXG4gICAgcHVibGljIG9uU2Nyb2xsKCRzY3JvbGxFbDogRWxlbWVudCwgZXZ0OiBFdmVudCkge1xuICAgICAgICBjb25zdCB0b3RhbEhlaWdodCA9ICRzY3JvbGxFbC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICBjbGllbnRIZWlnaHQgPSAkc2Nyb2xsRWwuY2xpZW50SGVpZ2h0O1xuXG4gICAgICAgIC8vIElmIHNjcm9sbCBpcyBhdCB0aGUgYm90dG9tIGFuZCBubyByZXF1ZXN0IGlzIGluIHByb2dyZXNzIGFuZCBuZXh0IHBhZ2UgcmVjb3JkcyBhcmUgYXZhaWxhYmxlLCBmZXRjaCBuZXh0IHBhZ2UgaXRlbXMuXG4gICAgICAgIGlmICghdGhpcy5fbG9hZGluZ0l0ZW1zICYmICF0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlICYmICgkc2Nyb2xsRWwuc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ID49IHRvdGFsSGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5taW5jaGFycykpIHtcbiAgICAgICAgICAgIC8vIGZvciBhdXRvY29tcGxldGUgc2V0IHRoZSBtaW5jaGFycyB0byAwXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xuICAgICAgICAgICAgICAgIHRoaXMubWluY2hhcnMgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbmNoYXJzID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSB0aGlzLmlzVXBkYXRlT25LZXlQcmVzcygpO1xuXG4gICAgICAgIC8vIGJ5IGRlZmF1bHQgZm9yIGF1dG9jb21wbGV0ZSBkbyBub3Qgc2hvdyB0aGUgc2VhcmNoIGljb25cbiAgICAgICAgLy8gYnkgZGVmYXVsdCBzaG93IHRoZSBzZWFyY2hpY29uIGZvciB0eXBlID0gc2VhcmNoXG4gICAgICAgIHRoaXMuc2hvd3NlYXJjaGljb24gPSBpc0RlZmluZWQodGhpcy5zaG93c2VhcmNoaWNvbikgPyB0aGlzLnNob3dzZWFyY2hpY29uIDogKHRoaXMudHlwZSA9PT0gJ3NlYXJjaCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsIHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclRhcmdldCA9IGdldENvbnRhaW5lclRhcmdldENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoSW5wdXRFbCA9ICQoJy5hcHAtc2VhcmNoLWlucHV0Jyk7XG4gICAgICAgIGlmIChzZWFyY2hJbnB1dEVsKSB7XG4gICAgICAgICAgICBzZWFyY2hJbnB1dEVsLnJlbW92ZUF0dHIoJ2FyaWEtZXhwYW5kZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXZlbnREYXRhKCRldmVudCwgaXRlbSkge1xuICAgICAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAkZXZlbnRbJ2RhdGEnXSA9IHtcbiAgICAgICAgICAgICAgICBpdGVtICA6IGl0ZW0uZGF0YU9iamVjdCxcbiAgICAgICAgICAgICAgICBtb2RlbCA6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgICAgbGFiZWwgOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICAgIHF1ZXJ5IDogdGhpcy5xdWVyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAkZXZlbnQ7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlcmVkIG9uIHNlbGVjdCBvbiBvcHRpb24gZnJvbSB0aGUgbGlzdC4gU2V0IHRoZSBxdWVyeU1vZGVsLCBxdWVyeSBhbmQgbW9kZWxCeUtleSBmcm9tIHRoZSBtYXRjaGVkIGl0ZW0uXG4gICAgcHVibGljIHR5cGVhaGVhZE9uU2VsZWN0KG1hdGNoOiBUeXBlYWhlYWRNYXRjaCwgJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtID0gbWF0Y2guaXRlbTtcbiAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gaXRlbTtcbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucXVlcnkgPSBpdGVtLmxhYmVsO1xuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgICAgICRldmVudCA9ICRldmVudCB8fCB0aGlzLiR0eXBlYWhlYWRFdmVudDtcblxuICAgICAgICAvLyBBcyBpdGVtLmtleSBjYW4gdmFyeSBmcm9tIGtleSBpbiB0aGUgZGF0YXNldEl0ZW1zXG4gICAgICAgIHRoaXMuX21vZGVsQnlLZXkgPSBpdGVtLmtleTtcbiAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gaXRlbS52YWx1ZTtcblxuICAgICAgICAkZXZlbnQgPSB0aGlzLmV2ZW50RGF0YSgkZXZlbnQsIGl0ZW0pO1xuXG4gICAgICAgIHRoaXMuaW52b2tlT25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsICRldmVudCB8fCB7fSk7XG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB2YXJpYWJsZSBib3VuZCB0byBkZWZhdWx0IHZhbHVlIGFzIGludm9rZU9uQ2hhbmdlIGlzIG5vdCB1cGRhdGluZyB0aGUgdmFyaWFibGUuXG4gICAgICAgIGlmICh0aGlzLmRhdGF2YWx1ZSAhPT0gKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kVmFyaWFibGUodGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCB7ICRldmVudCwgc2VsZWN0ZWRWYWx1ZTogdGhpcy5kYXRhdmFsdWUgfSk7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VibWl0JywgeyAkZXZlbnQgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVQcmV2RGF0YXZhbHVlKHRoaXMuZGF0YXZhbHVlKTtcbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdjogYW55KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICd0YWJpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgZnJvbSAxMC4zLjEgdG8gMTAuMy4yXG4gICAgICAgIC8vIDEwLjMuMSB3ZSBoYWQgZGlzcGxheWxhYmVsIGFzIG1vZGFsIHZhbHVlXG4gICAgICAgIC8vIEZyb20gMTAuMy4yIG9ud29yZHMgd2Ugd2lsbCBiZSBoYXZpbmcgZGlzcGxheWV4cHJlc2lvbiBhcyBtb2RhbCB2YWx1ZVxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnYXV0b2NvbXBsZXRlJyAmJiBrZXkgPT09ICdkaXNwbGF5bGFiZWwnICYmIHRoaXMuZGlzcGxheWxhYmVsICYmICghdGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiB8fCAodGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiAmJiAhdGhpcy5kYXRhc291cmNlKSkpICB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlleHByZXNzaW9uID0gdGhpcy5kaXNwbGF5bGFiZWw7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlsYWJlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gZGF0YW9wdGlvbnMgYXJlIHByb3ZpZGVkIGFuZCB0aGVyZSBpcyBubyBkaXNwbGF5bGFiZWwgZ2l2ZW4gdGhlbiBkaXNwbGF5bGFiZWwgaXMgc2V0IGFzIHRoZSByZWxhdGVkZmllbGRcbiAgICAgICAgaWYgKGtleSA9PT0gJ2Rpc3BsYXlsYWJlbCcgJiYgdGhpcy5kYXRhb3B0aW9ucyAmJiB0aGlzLmJpbmRkaXNwbGF5bGFiZWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnkgPSBnZXQodGhpcy5fbW9kZWxCeVZhbHVlLCBudikgfHwgdGhpcy5fbW9kZWxCeVZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBzZWFyY2ggaXMgZGlzYWJsZWQsIGRvIG5vdCBsb2FkIGFueSBtb3JlIGRhdGEgb3IganVzdCBjbGVhciB0aGUgZGF0YSB0aGF0IGlzIGFscmVhZHkgaW4gcHJvY2VzcyBvciBsb2FkZWQuXG4gICAgICAgIGlmIChrZXkgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgIGlmIChudiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGF0YSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGdldCgodGhpcy50eXBlYWhlYWQgYXMgYW55KSwgJ190eXBlYWhlYWQuaXNTaG93bicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBDbGVhciBRdWVyeUxpc3QgcmVmZXJlbmNlXG4gICAgICAgIHRoaXMubGlFbGVtZW50cyA9IG51bGw7XG5cbiAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBDbGVhciBkYXRhIHByb3ZpZGVyXG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBDbGVhciB0eXBlYWhlYWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICh0aGlzLnR5cGVhaGVhZCkge1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBDbGVhciBxdWVyeSBtb2RlbFxuICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSBudWxsO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG5cbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgbmdPbkRlc3Ryb3kgKERhdGFzZXRBd2FyZUZvcm1Db21wb25lbnQgaGFzIGNsZWFudXApXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNjdXN0b21JdGVtVGVtcGxhdGUgbGV0LW1vZGVsPVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LXF1ZXJ5PVwicXVlcnlcIiBsZXQtbWF0Y2g9XCJtYXRjaFwiPlxuICA8IS0tIERlZmF1bHQgaXRlbSB0ZW1wbGF0ZSAtLT5cbiAgQGlmICghY29udGVudCkge1xuICAgIDxhPlxuICAgICAgQGlmIChtb2RlbC5pbWdTcmMpIHtcbiAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmltZ1NyY1wiIGFsdD1cIlNlYXJjaFwiIFtzdHlsZS53aWR0aF09XCJpbWFnZXdpZHRoXCI+XG4gICAgICB9XG4gICAgICA8c3BhbiBbdGl0bGVdPVwibW9kZWwubGFiZWxcIiBbaW5uZXJIdG1sXT1cImhpZ2hsaWdodChtYXRjaCwgcXVlcnkpIHx8IG1vZGVsLmxhYmVsXCI+PC9zcGFuPlxuICAgIDwvYT5cbiAgfVxuICA8IS0tIEN1c3RvbSBwYXJ0aWFsIHRlbXBsYXRlIC0tPlxuICBAaWYgKGNvbnRlbnQpIHtcbiAgICA8YSBbbmdDbGFzc109XCJ7Y3VzdG9tVGVtcGxhdGU6IGNvbnRlbnR9XCIgcGFydGlhbENvbnRhaW5lciBbd21JdGVtVGVtcGxhdGVdPVwiY29udGVudFwiIFt1c2VyQ29tcG9uZW50UGFyYW1zXT1cIm1hdGNoLml0ZW1cIj5cbiAgICAgIDxkaXYgcGFydGlhbC1jb250YWluZXItdGFyZ2V0PjwvZGl2PlxuICAgIDwvYT5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjdXN0b21MaXN0VGVtcGxhdGUgbGV0LW1hdGNoZXM9XCJtYXRjaGVzXCIgbGV0LWl0ZW1UZW1wbGF0ZT1cIml0ZW1UZW1wbGF0ZVwiIGxldC1xdWVyeT1cInF1ZXJ5XCI+XG4gIDx1bCAjdWxFbGVtZW50IGNsYXNzPVwiYXBwLXNlYXJjaCBkcm9wZG93bi1tZW51XCIgc2Nyb2xsYWJsZUhhbmRsZXI+XG4gICAgQGZvciAobWF0Y2ggb2YgbWF0Y2hlczsgdHJhY2sgbWF0Y2g7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8bGkgI2xpRWxlbWVudHMgW25nQ2xhc3NdPVwie2FjdGl2ZTogdHlwZWFoZWFkQ29udGFpbmVyICYmIHR5cGVhaGVhZENvbnRhaW5lci5pc0FjdGl2ZShtYXRjaCksICdsaXN0LWdyb3VwLWhlYWRlcic6IG1hdGNoICYmIG1hdGNoLmlzSGVhZGVyKCl9XCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwidHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdEFjdGl2ZShtYXRjaCk7XCJcbiAgICAgICAgKGNsaWNrKT1cIm1hdGNoICYmICFtYXRjaC5pc0hlYWRlcigpICYmIHR5cGVhaGVhZENvbnRhaW5lci5zZWxlY3RNYXRjaChtYXRjaCwgJGV2ZW50KTsgJHR5cGVhaGVhZEV2ZW50ID0gJGV2ZW50OyBub3RpZnlTdWJzY3JpYmVyKCk7XCI+XG4gICAgICAgIDwhLS0gaXRlbVRlbXBsYXRlIGNvbWVzIGZyb20gdGhlIDxpbnB1dD4gLS0+XG4gICAgICAgIEBpZiAobWF0Y2guaXNIZWFkZXIoKSkge1xuICAgICAgICAgIDxoNCBjbGFzcz1cImdyb3VwLXRpdGxlXCI+e3ttYXRjaC52YWx1ZX19PC9oND5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKCFtYXRjaC5pc0hlYWRlcigpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBtYXRjaC5pdGVtLCBpbmRleDogaSwgbWF0Y2g6IG1hdGNoLCBxdWVyeTogcXVlcnl9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiBbaGlkZGVuXT1cIl9sb2FkaW5nSXRlbXMgfHwgIShkYXRhY29tcGxldGVtc2cgJiYgZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpXCI+XG4gICAgICA8c3BhbiBbdGV4dENvbnRlbnRdPVwiZGF0YWNvbXBsZXRlbXNnXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiBbaGlkZGVuXT1cIiFfbG9hZGluZ0l0ZW1zXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLWNpcmNsZS1vLW5vdGNoIGZhLXNwaW5cIj48L2k+XG4gICAgICA8c3BhbiBbdGV4dENvbnRlbnRdPVwibG9hZGluZ2RhdGFtc2dcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tVGhpcyB0ZW1wbGF0ZSBpcyBmb3Igc2VhcmNoIGluc2lkZSBtb2JpbGUgbmF2YmFyLi0tPlxuQGlmIChuYXZzZWFyY2hiYXIpIHtcbiAgPGlucHV0IFt0aXRsZV09XCJxdWVyeSB8fCAnJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhcHAtdGV4dGJveCBmb3JtLWNvbnRyb2wgbGlzdC1vZi1vYmpzIGFwcC1zZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgIGZvY3VzLXRhcmdldFxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYWNjZXNza2V5XT1cInNob3J0Y3V0a2V5XCJcbiAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3R5cGVhaGVhZF09XCJ0eXBlYWhlYWREYXRhU291cmNlXCJcbiAgICBbdHlwZWFoZWFkV2FpdE1zXT1cImRlYm91bmNldGltZVwiXG4gICAgW3R5cGVhaGVhZEl0ZW1UZW1wbGF0ZV09XCJjdXN0b21JdGVtVGVtcGxhdGVcIlxuICAgIFtvcHRpb25zTGlzdFRlbXBsYXRlXT1cImN1c3RvbUxpc3RUZW1wbGF0ZVwiXG4gICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwibGlzdGVuUXVlcnkgPSB0cnVlXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCIkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7aGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwic2VsZWN0TmV4dCgkZXZlbnQpXCJcbiAgICAoYmx1cik9XCJpbnZva2VPblRvdWNoZWQoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cImhhbmRsZUZvY3VzKCRldmVudCk7XCJcbiAgICAoZm9jdXMpPVwiX3Vuc3Vic2NyaWJlRHYgPSBmYWxzZTsgbGlzdGVuUXVlcnkgPSB0cnVlOyBoYW5kbGVGb2N1cygkZXZlbnQpOyBpbnZva2VPbkZvY3VzKCRldmVudCk7XCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCJcbiAgICBbdHlwZWFoZWFkTWluTGVuZ3RoXT1cIm1pbmNoYXJzXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0xpbWl0XT1cImxpbWl0XCJcbiAgICAodHlwZWFoZWFkTG9hZGluZyk9XCJfbG9hZGluZ0l0ZW1zXCJcbiAgICAodHlwZWFoZWFkT25TZWxlY3QpPVwidHlwZWFoZWFkT25TZWxlY3QoJGV2ZW50KVwiXG4gICAgdHlwZWFoZWFkT3B0aW9uRmllbGQ9XCJsYWJlbFwiXG4gICAgW3R5cGVhaGVhZEdyb3VwRmllbGRdPVwiZ3JvdXBieSA/ICdncm91cGJ5JyA6IG51bGxcIlxuICAgIFt0eXBlYWhlYWRBc3luY109XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwib3B0aW9uc2xpbWl0aW5zY3JvbGxhYmxldmlld1wiXG4gICAgW2Ryb3B1cF09XCJkcm9wdXBcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFsYWJlbCB8fCAnU2VhcmNoIGZpZWxkJ1wiLz5cbiAgPGkgY2xhc3M9XCJidG4tY2xvc2Ugd2kgd2ktY2FuY2VsXCIgW2hpZGRlbl09XCIhc2hvd0Nsb3NlYnRuXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKCRldmVudCk7XCI+PC9pPlxufSBAZWxzZSB7XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFjayBiYWNrLWJ0blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIChjbGljayk9XCJjbG9zZVNlYXJjaCgpXCI+PGkgY2xhc3M9XCJhcHAtaWNvbiB7e2JhY2tzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+QmFjayBidXR0b248L3NwYW4+XG4gIDxpbnB1dCBbdGl0bGVdPVwicXVlcnkgfHwgJydcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXBwLXRleHRib3ggZm9ybS1jb250cm9sIGxpc3Qtb2Ytb2JqcyBhcHAtc2VhcmNoLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICBmb2N1cy10YXJnZXRcbiAgICBbY29udGFpbmVyXT1cImNvbnRhaW5lclRhcmdldCB8fCAnLndtLWFwcCdcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYWNjZXNza2V5XT1cInNob3J0Y3V0a2V5XCJcbiAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3R5cGVhaGVhZF09XCJ0eXBlYWhlYWREYXRhU291cmNlXCJcbiAgICBbdHlwZWFoZWFkV2FpdE1zXT1cImRlYm91bmNldGltZVwiXG4gICAgW3R5cGVhaGVhZEl0ZW1UZW1wbGF0ZV09XCJjdXN0b21JdGVtVGVtcGxhdGVcIlxuICAgIFtvcHRpb25zTGlzdFRlbXBsYXRlXT1cImN1c3RvbUxpc3RUZW1wbGF0ZVwiXG4gICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwibGlzdGVuUXVlcnkgPSB0cnVlXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCIkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7aGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwic2VsZWN0TmV4dCgkZXZlbnQpXCJcbiAgICAoYmx1cik9XCJpbnZva2VPblRvdWNoZWQoJGV2ZW50KTsgb25Gb2N1c091dCgpXCJcbiAgICAoY2xpY2spPVwiaGFuZGxlRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1cyk9XCJfdW5zdWJzY3JpYmVEdiA9IGZhbHNlOyBsaXN0ZW5RdWVyeSA9IHRydWU7IGhhbmRsZUZvY3VzKCRldmVudCk7IGludm9rZU9uRm9jdXMoJGV2ZW50KVwiXG4gICAgW3R5cGVhaGVhZE1pbkxlbmd0aF09XCJtaW5jaGFyc1wiXG4gICAgW3R5cGVhaGVhZE9wdGlvbnNMaW1pdF09XCJsaW1pdFwiXG4gICAgKHR5cGVhaGVhZExvYWRpbmcpPVwiX2xvYWRpbmdJdGVtc1wiXG4gICAgKHR5cGVhaGVhZE9uU2VsZWN0KT1cInR5cGVhaGVhZE9uU2VsZWN0KCRldmVudClcIlxuICAgIHR5cGVhaGVhZE9wdGlvbkZpZWxkPVwibGFiZWxcIlxuICAgIFt0eXBlYWhlYWRHcm91cEZpZWxkXT1cImdyb3VwYnkgPyAnZ3JvdXBieScgOiBudWxsXCJcbiAgICBbdHlwZWFoZWFkQXN5bmNdPVwidHJ1ZVwiXG4gICAgW3R5cGVhaGVhZFNjcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgW2FkYXB0aXZlUG9zaXRpb25dPVwidHJ1ZVwiXG4gICAgW3R5cGVhaGVhZE9wdGlvbnNJblNjcm9sbGFibGVWaWV3XT1cIm9wdGlvbnNsaW1pdGluc2Nyb2xsYWJsZXZpZXdcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgW2Ryb3B1cF09XCJkcm9wdXBcIlxuICAgIFthdHRyLm5hbWVdPVwibmFtZVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhbGFiZWwgfHwgJ1NlYXJjaCBmaWVsZCdcIj5cbiAgPGlucHV0IGNsYXNzPVwibW9kZWwtaG9sZGVyXCIgbmctbW9kZWw9XCJwcm94eU1vZGVsXCIgbmctcmVxdWlyZWQ9XCJyZXF1aXJlZFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgQGlmIChfbG9hZGluZ0l0ZW1zKSB7XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJmYSBmYS1jaXJjbGUtby1ub3RjaCBmYS1zcGluIGZvcm0tY29udHJvbC1mZWVkYmFja1wiPjwvc3Bhbj5cbiAgfVxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4taWNvbiBmb3JtLWNvbnRyb2wtZmVlZGJhY2sgY2xlYXItYnRuXCIgW25nQ2xhc3NdPVwieydzaG93LWJ0bic6IGlzUXVlcnlFbnRlcmVkKCl9XCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKCRldmVudCwgdHJ1ZSlcIj48aSBjbGFzcz1cImFwcC1pY29uIHt7Y2xlYXJzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xlYXIgYnV0dG9uPC9zcGFuPlxuICBAaWYgKHNob3dzZWFyY2hpY29uKSB7XG4gICAgPHNwYW4gW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IGRpc2FibGVkfVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgIDxmb3JtPlxuICAgICAgICA8YnV0dG9uIHRpdGxlPVwiU2VhcmNoXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgY2xhc3M9XCJhcHAtc2VhcmNoLWJ1dHRvbiBidG4gYnRuLWljb25cIiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWFyY2hTZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24ge3tzZWFyY2hpY29uY2xhc3N9fVwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9zcGFuPlxuICAgIH1cbiAgfVxuICA8IS0tVGhpcyB0ZW1wbGF0ZSBpcyBmb3IgYm90aCB3ZWIgYW5kIGZ1bGxzY3JlZW4gbW9kZSBpbiBtb2JpbGUuLS0+XG4iXX0=
|