@wavemaker/app-ng-runtime 11.8.0-next.24904 → 11.8.0-next.27301
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.
- app-ng-runtime/build-task/bundles/index.umd.js +5 -5
- app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/page/page.build.mjs +3 -2
- app-ng-runtime/build-task/fesm2022/index.mjs +2 -1
- app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +5 -5
- app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +3 -2
- app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +1 -1
- app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +2 -1
- app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/login/bundles/index.umd.js +6 -6
- app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +4 -3
- app-ng-runtime/components/advanced/login/fesm2022/index.mjs +3 -2
- app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/base/bundles/index.umd.js +203 -171
- app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +1 -1
- app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +12 -11
- app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +3 -2
- app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +30 -29
- app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +47 -41
- app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +8 -7
- app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +28 -27
- app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +4 -3
- app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +24 -21
- app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +12 -11
- app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +40 -14
- app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +3 -2
- app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +3 -2
- app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +3 -2
- app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +3 -2
- app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +6 -5
- app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +3 -2
- app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +4 -3
- app-ng-runtime/components/base/fesm2022/index.mjs +206 -173
- app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
- app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
- app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
- app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
- app-ng-runtime/components/basic/default/bundles/index.umd.js +10 -10
- app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +4 -3
- app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +6 -5
- app-ng-runtime/components/basic/default/fesm2022/index.mjs +7 -6
- app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/progress/bundles/index.umd.js +13 -13
- app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +5 -4
- app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +6 -5
- app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
- app-ng-runtime/components/basic/progress/fesm2022/index.mjs +10 -9
- app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +15 -10
- app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +14 -8
- app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +13 -7
- app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
- app-ng-runtime/components/basic/search/bundles/index.umd.js +67 -65
- app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
- app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +26 -23
- app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +12 -11
- app-ng-runtime/components/basic/search/esm2022/search.component.mjs +31 -30
- app-ng-runtime/components/basic/search/fesm2022/index.mjs +66 -63
- app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/tree/bundles/index.umd.js +9 -9
- app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +7 -6
- app-ng-runtime/components/basic/tree/fesm2022/index.mjs +6 -5
- app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/chart/bundles/index.umd.js +72 -63
- app-ng-runtime/components/chart/chart.component.d.ts +1 -1
- app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
- app-ng-runtime/components/chart/esm2022/chart.component.mjs +58 -48
- app-ng-runtime/components/chart/esm2022/chart.utils.mjs +14 -13
- app-ng-runtime/components/chart/fesm2022/index.mjs +69 -59
- app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/accordion/bundles/index.umd.js +16 -16
- app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +14 -13
- app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +13 -12
- app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/panel/bundles/index.umd.js +5 -5
- app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +3 -2
- app-ng-runtime/components/containers/panel/fesm2022/index.mjs +2 -1
- app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/panel/panel.component.d.ts +1 -1
- app-ng-runtime/components/containers/tabs/bundles/index.umd.js +17 -17
- app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +15 -14
- app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +14 -13
- app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/form/bundles/index.umd.js +75 -75
- app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +3 -2
- app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +10 -9
- app-ng-runtime/components/data/form/esm2022/form.component.mjs +54 -53
- app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +3 -2
- app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +11 -10
- app-ng-runtime/components/data/form/fesm2022/index.mjs +77 -76
- app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/form/form.component.d.ts +2 -2
- app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
- app-ng-runtime/components/data/list/bundles/index.umd.js +692 -687
- app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +1 -1
- app-ng-runtime/components/data/list/esm2022/list.animator.mjs +5 -3
- app-ng-runtime/components/data/list/esm2022/list.component.mjs +687 -682
- app-ng-runtime/components/data/list/fesm2022/index.mjs +690 -684
- app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/list/list.component.d.ts +53 -53
- app-ng-runtime/components/data/live-table/bundles/index.umd.js +1 -1
- app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +2 -2
- app-ng-runtime/components/data/live-table/fesm2022/index.mjs +1 -1
- app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/pagination/bundles/index.umd.js +14 -14
- app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +12 -11
- app-ng-runtime/components/data/pagination/fesm2022/index.mjs +11 -10
- app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/table/bundles/index.umd.js +175 -172
- app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +3 -2
- app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +19 -18
- app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +7 -6
- app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +53 -55
- app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +3 -2
- app-ng-runtime/components/data/table/esm2022/table.component.mjs +98 -91
- app-ng-runtime/components/data/table/fesm2022/index.mjs +172 -168
- app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +6 -6
- app-ng-runtime/components/data/table/table.component.d.ts +2 -2
- app-ng-runtime/components/dialogs/default/bundles/index.umd.js +2 -2
- app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +3 -3
- app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +1 -1
- app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +1 -1
- app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/calendar/bundles/index.umd.js +33 -31
- app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +31 -28
- app-ng-runtime/components/input/calendar/fesm2022/index.mjs +30 -27
- app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/chips/bundles/index.umd.js +29 -28
- app-ng-runtime/components/input/chips/chips.component.d.ts +1 -1
- app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +27 -25
- app-ng-runtime/components/input/chips/fesm2022/index.mjs +26 -24
- app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
- app-ng-runtime/components/input/default/bundles/index.umd.js +75 -62
- app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
- app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
- app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +14 -8
- app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +3 -2
- app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +2 -2
- app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +6 -4
- app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +29 -23
- app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +4 -3
- app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +4 -3
- app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
- app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +4 -3
- app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +20 -18
- app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +2 -2
- app-ng-runtime/components/input/default/fesm2022/index.mjs +75 -62
- app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +1 -1
- app-ng-runtime/components/input/epoch/bundles/index.umd.js +53 -51
- app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +34 -31
- app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +5 -4
- app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +5 -4
- app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +7 -6
- app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +1 -1
- app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +6 -5
- app-ng-runtime/components/input/epoch/fesm2022/index.mjs +48 -45
- app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/file-upload/bundles/index.umd.js +15 -15
- app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +13 -12
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +12 -11
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/rating/bundles/index.umd.js +12 -12
- app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +10 -9
- app-ng-runtime/components/input/rating/fesm2022/index.mjs +9 -8
- app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +1 -1
- app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +2 -2
- app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +1 -1
- app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/menu/bundles/index.umd.js +23 -22
- app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +3 -2
- app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +6 -5
- app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
- app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +10 -8
- app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +20 -18
- app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +12 -1
- app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +1 -1
- app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/prefab/bundles/index.umd.js +6 -6
- app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +3 -2
- app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +3 -2
- app-ng-runtime/components/prefab/fesm2022/index.mjs +3 -2
- app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/core/bundles/index.umd.js +119 -130
- app-ng-runtime/core/esm2022/public_api.mjs +2 -2
- app-ng-runtime/core/esm2022/services/field-type.service.mjs +3 -2
- app-ng-runtime/core/esm2022/services/field-widget.service.mjs +3 -2
- app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -6
- app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -16
- app-ng-runtime/core/esm2022/services/utils.service.mjs +3 -2
- app-ng-runtime/core/esm2022/services/viewport.service.mjs +3 -2
- app-ng-runtime/core/esm2022/utils/build-utils.mjs +5 -4
- app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -4
- app-ng-runtime/core/esm2022/utils/lru-cache.mjs +3 -2
- app-ng-runtime/core/esm2022/utils/utils.mjs +79 -82
- app-ng-runtime/core/esm2022/utils/watcher.mjs +9 -7
- app-ng-runtime/core/fesm2022/index.mjs +117 -123
- app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/core/public_api.d.ts +1 -1
- app-ng-runtime/core/services/pagination.service.d.ts +1 -1
- app-ng-runtime/core/utils/utils.d.ts +5 -9
- app-ng-runtime/http/bundles/index.umd.js +7 -7
- app-ng-runtime/http/esm2022/http.service.mjs +5 -4
- app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
- app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
- app-ng-runtime/http/fesm2022/index.mjs +4 -3
- app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +24 -20
- app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +5 -4
- app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +12 -8
- app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -3
- app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +3 -2
- app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +5 -4
- app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +21 -16
- app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +7 -7
- app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +2 -2
- app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +4 -3
- app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +4 -3
- app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +8 -8
- app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +4 -3
- app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +3 -2
- app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +5 -5
- app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +3 -2
- app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +2 -1
- app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +9 -9
- app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +7 -6
- app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +6 -5
- app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/core/bundles/index.umd.js +25 -25
- app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +5 -4
- app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +3 -2
- app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +4 -3
- app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +6 -5
- app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +3 -2
- app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +5 -4
- app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +9 -8
- app-ng-runtime/mobile/core/fesm2022/index.mjs +22 -21
- app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
- app-ng-runtime/mobile/core/services/network.service.d.ts +7 -1
- app-ng-runtime/mobile/offline/bundles/index.umd.js +161 -144
- app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +23 -21
- app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +7 -6
- app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -35
- app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +54 -45
- app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +5 -4
- app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +4 -3
- app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +18 -13
- app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +9 -5
- app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +12 -11
- app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +5 -4
- app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +3 -2
- app-ng-runtime/mobile/offline/fesm2022/index.mjs +156 -138
- app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/runtime/bundles/index.umd.js +11 -8
- app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +3 -2
- app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +6 -2
- app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +4 -3
- app-ng-runtime/mobile/runtime/fesm2022/index.mjs +8 -4
- app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +2 -2
- app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +3 -3
- app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +2 -2
- app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/variables/bundles/index.umd.js +23 -16
- app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +2 -2
- app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +10 -9
- app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +11 -3
- app-ng-runtime/mobile/variables/fesm2022/index.mjs +19 -11
- app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/oAuth/bundles/index.umd.js +12 -12
- app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +4 -3
- app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +8 -7
- app-ng-runtime/oAuth/fesm2022/index.mjs +9 -8
- app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/package.json +1 -1
- app-ng-runtime/runtime/base/bundles/index.umd.js +121 -120
- app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -3
- app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +14 -13
- app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +13 -12
- app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +15 -14
- app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +14 -13
- app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +6 -5
- app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +11 -10
- app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +1 -1
- app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +3 -2
- app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +1 -1
- app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +17 -14
- app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +7 -6
- app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +3 -2
- app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +4 -3
- app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +12 -10
- app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +8 -7
- app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +3 -2
- app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +7 -6
- app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +6 -5
- app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +6 -7
- app-ng-runtime/runtime/base/fesm2022/index.mjs +119 -117
- app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
- app-ng-runtime/runtime/dynamic/bundles/index.umd.js +7 -7
- app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +4 -3
- app-ng-runtime/runtime/dynamic/esm2022/main.mjs +3 -2
- app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +4 -3
- app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
- app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +13 -10
- app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
- app-ng-runtime/security/bundles/index.umd.js +14 -14
- app-ng-runtime/security/esm2022/security.service.mjs +12 -11
- app-ng-runtime/security/fesm2022/index.mjs +11 -10
- app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/security/security.service.d.ts +1 -1
- app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
- app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/transpiler/bundles/index.umd.js +10 -9
- app-ng-runtime/transpiler/esm2022/build.mjs +8 -6
- app-ng-runtime/transpiler/fesm2022/index.mjs +7 -5
- app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/variables/bundles/index.umd.js +155 -145
- app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +15 -14
- app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +9 -8
- app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +3 -2
- app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +11 -10
- app-ng-runtime/variables/esm2022/service/variables.service.mjs +7 -6
- app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
- app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +30 -23
- app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +29 -28
- app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +75 -70
- app-ng-runtime/variables/fesm2022/index.mjs +169 -158
- app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
|
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
|
|
|
2
2
|
import { AppVersion } from '@awesome-cordova-plugins/app-version/ngx';
|
|
3
3
|
import { File } from '@awesome-cordova-plugins/file/ngx';
|
|
4
4
|
import { SQLite } from '@awesome-cordova-plugins/sqlite/ngx';
|
|
5
|
-
import { DataType, DEFAULT_FORMATS, executePromiseChain, extractType, isAndroid,
|
|
5
|
+
import { DataType, DEFAULT_FORMATS, executePromiseChain, extractType, isAndroid, isIos, noop, toPromise, transformFileURI } from '@wm/core';
|
|
6
6
|
import { DeviceFileService, DeviceService } from '@wm/mobile/core';
|
|
7
7
|
import { SecurityService } from '@wm/security';
|
|
8
8
|
import { formatDate } from '@wm/variables';
|
|
@@ -10,6 +10,7 @@ import { LocalKeyValueService } from './local-key-value.service';
|
|
|
10
10
|
import { LocalDBStore } from '../models/local-db-store';
|
|
11
11
|
import { escapeName } from '../utils/utils';
|
|
12
12
|
import { ColumnInfo, DBInfo, PullType } from '../models/config';
|
|
13
|
+
import { chain, find, forEach, isEmpty, isUndefined, map, now, parseInt, replace, toUpper, toString, values, isArray, assignIn } from "lodash-es";
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
import * as i1 from "@awesome-cordova-plugins/app-version/ngx";
|
|
15
16
|
import * as i2 from "@wm/mobile/core";
|
|
@@ -117,7 +118,8 @@ export class LocalDBManagementService {
|
|
|
117
118
|
return new Promise((resolve, reject) => {
|
|
118
119
|
// Before closing databases, give some time for the pending transactions (if any).
|
|
119
120
|
setTimeout(() => {
|
|
120
|
-
|
|
121
|
+
// @ts-ignore
|
|
122
|
+
const closePromises = map(values(this.databases), db => db.sqliteObject.close());
|
|
121
123
|
Promise.all(closePromises).then(resolve, reject);
|
|
122
124
|
}, 1000);
|
|
123
125
|
});
|
|
@@ -141,14 +143,14 @@ export class LocalDBManagementService {
|
|
|
141
143
|
return Promise.reject(`Query by name ' ${queryName} ' Not Found`);
|
|
142
144
|
}
|
|
143
145
|
queryData = this.databases[dbName].queries[queryName];
|
|
144
|
-
paramPromises =
|
|
146
|
+
paramPromises = chain(queryData.params)
|
|
145
147
|
.filter(p => p.variableType !== 'PROMPT')
|
|
146
148
|
.forEach(p => {
|
|
147
149
|
const paramValue = this.systemProperties[p.variableType].value(p.name, params);
|
|
148
150
|
return toPromise(paramValue).then(v => params[p.name] = v);
|
|
149
151
|
}).value();
|
|
150
152
|
return Promise.all(paramPromises).then(() => {
|
|
151
|
-
params =
|
|
153
|
+
params = map(queryData.params, p => {
|
|
152
154
|
// Sqlite will accept DateTime value as below format.
|
|
153
155
|
if (typeof params[p.name] !== 'string'
|
|
154
156
|
&& (p.type === DataType.DATETIME || p.type === DataType.LOCALDATETIME)) {
|
|
@@ -163,18 +165,18 @@ export class LocalDBManagementService {
|
|
|
163
165
|
return this.executeSQLQuery(dbName, queryData.query, params)
|
|
164
166
|
.then(result => {
|
|
165
167
|
let firstRow, needTransform;
|
|
166
|
-
if (!
|
|
168
|
+
if (!isEmpty(result.rows)) {
|
|
167
169
|
firstRow = result.rows[0];
|
|
168
|
-
needTransform =
|
|
169
|
-
if (!
|
|
170
|
-
result.rows =
|
|
170
|
+
needTransform = find(queryData.response.properties, p => !firstRow.hasOwnProperty(p.fieldName));
|
|
171
|
+
if (!isUndefined(needTransform)) {
|
|
172
|
+
result.rows = map(result.rows, row => {
|
|
171
173
|
const transformedRow = {}, rowWithUpperKeys = {};
|
|
172
174
|
// This is to make search for data as case-insensitive
|
|
173
|
-
|
|
174
|
-
|
|
175
|
+
forEach(row, (v, k) => rowWithUpperKeys[k.toUpperCase()] = v);
|
|
176
|
+
forEach(queryData.response.properties, p => {
|
|
175
177
|
// format the value depending on the typeRef specified in properties.
|
|
176
178
|
const propType = extractType(p.fieldType.typeRef);
|
|
177
|
-
const formatValue = DEFAULT_FORMATS[
|
|
179
|
+
const formatValue = DEFAULT_FORMATS[toUpper(propType)];
|
|
178
180
|
const fieldVal = row[p.name];
|
|
179
181
|
if (fieldVal && typeof fieldVal !== 'string'
|
|
180
182
|
&& (propType === DataType.DATETIME || propType === DataType.LOCALDATETIME || propType === DataType.DATE)) {
|
|
@@ -208,7 +210,7 @@ export class LocalDBManagementService {
|
|
|
208
210
|
*/
|
|
209
211
|
exportDB() {
|
|
210
212
|
return new Promise((resolve, reject) => {
|
|
211
|
-
const folderToExport = 'offline_temp_' +
|
|
213
|
+
const folderToExport = 'offline_temp_' + now(), folderToExportFullPath = cordova.file.cacheDirectory + folderToExport + '/', zipFileName = '_offline_data.zip', metaInfo = {
|
|
212
214
|
app: null,
|
|
213
215
|
OS: '',
|
|
214
216
|
createdOn: 0
|
|
@@ -238,7 +240,7 @@ export class LocalDBManagementService {
|
|
|
238
240
|
else if (isAndroid()) {
|
|
239
241
|
metaInfo.OS = 'ANDROID';
|
|
240
242
|
}
|
|
241
|
-
metaInfo.createdOn =
|
|
243
|
+
metaInfo.createdOn = now();
|
|
242
244
|
return metaInfo;
|
|
243
245
|
}).then(() => executePromiseChain(this.getCallbacksFor('preExport'), [folderToExportFullPath, metaInfo]))
|
|
244
246
|
.then(() => {
|
|
@@ -291,7 +293,7 @@ export class LocalDBManagementService {
|
|
|
291
293
|
*/
|
|
292
294
|
importDB(zipPath, revertIfFails) {
|
|
293
295
|
return new Promise((resolve, reject) => {
|
|
294
|
-
const importFolder = 'offline_temp_' +
|
|
296
|
+
const importFolder = 'offline_temp_' + now(), importFolderFullPath = cordova.file.cacheDirectory + importFolder + '/';
|
|
295
297
|
let zipMeta;
|
|
296
298
|
// Create a temporary folder to unzip the contents of the zip.
|
|
297
299
|
this.file.createDir(cordova.file.cacheDirectory, importFolder, false)
|
|
@@ -411,7 +413,7 @@ export class LocalDBManagementService {
|
|
|
411
413
|
.then(metadata => this.loadNamedQueries(metadata))
|
|
412
414
|
.then(metadata => this.loadOfflineConfig(metadata))
|
|
413
415
|
.then(metadata => {
|
|
414
|
-
return Promise.all(
|
|
416
|
+
return Promise.all(map(metadata, dbMetadata => {
|
|
415
417
|
return this.openDatabase(dbMetadata)
|
|
416
418
|
.then(database => {
|
|
417
419
|
this.databases[dbMetadata.schema.name] = database;
|
|
@@ -430,9 +432,9 @@ export class LocalDBManagementService {
|
|
|
430
432
|
.then(() => this.disableForeignKeys())
|
|
431
433
|
.then(() => this.deviceService.getAppBuildTime())
|
|
432
434
|
.then(dbSeedCreationTime => {
|
|
433
|
-
return executePromiseChain(
|
|
435
|
+
return executePromiseChain(map(this.callbacks, 'onDbCreate'), [{
|
|
434
436
|
'databases': this.databases,
|
|
435
|
-
'dbCreatedOn':
|
|
437
|
+
'dbCreatedOn': now(),
|
|
436
438
|
'dbSeedCreatedOn': dbSeedCreationTime
|
|
437
439
|
}]);
|
|
438
440
|
}).then(() => this.databases);
|
|
@@ -492,13 +494,13 @@ export class LocalDBManagementService {
|
|
|
492
494
|
let defaultValue = col.columnValue ? col.columnValue.defaultValue : '';
|
|
493
495
|
const type = col.sqlType;
|
|
494
496
|
if (type === 'number' && !col.primaryKey) {
|
|
495
|
-
defaultValue =
|
|
497
|
+
defaultValue = isEmpty(defaultValue) ? null : parseInt(defaultValue);
|
|
496
498
|
}
|
|
497
499
|
else if (type === 'boolean') {
|
|
498
|
-
defaultValue =
|
|
500
|
+
defaultValue = isEmpty(defaultValue) ? null : (defaultValue === 'true' ? 1 : 0);
|
|
499
501
|
}
|
|
500
502
|
else {
|
|
501
|
-
defaultValue =
|
|
503
|
+
defaultValue = isEmpty(defaultValue) ? null : defaultValue;
|
|
502
504
|
}
|
|
503
505
|
reqEntity.columns.push({
|
|
504
506
|
name: col['name'],
|
|
@@ -509,10 +511,10 @@ export class LocalDBManagementService {
|
|
|
509
511
|
defaultValue: defaultValue
|
|
510
512
|
});
|
|
511
513
|
});
|
|
512
|
-
|
|
514
|
+
forEach(entity.relations, r => {
|
|
513
515
|
let targetEntitySchema, targetEntity, col, sourceColumn, mapping;
|
|
514
516
|
if (r.cardinality === 'ManyToOne' || r.cardinality === 'OneToOne') {
|
|
515
|
-
targetEntity =
|
|
517
|
+
targetEntity = find(schema.tables, t => t.name === r.targetTable);
|
|
516
518
|
mapping = r.mappings[0];
|
|
517
519
|
if (targetEntity) {
|
|
518
520
|
targetEntity = targetEntity.entityName;
|
|
@@ -529,7 +531,8 @@ export class LocalDBManagementService {
|
|
|
529
531
|
targetFieldName: targetEntitySchema.columns.find(column => column.name === mapping.targetColumn).fieldName
|
|
530
532
|
};
|
|
531
533
|
foreignRelation.targetPath = foreignRelation.sourceFieldName + '.' + foreignRelation.targetFieldName;
|
|
532
|
-
|
|
534
|
+
// @ts-ignore
|
|
535
|
+
foreignRelation.dataMapper = chain(targetEntitySchema.columns)
|
|
533
536
|
.keyBy(childCol => foreignRelation.sourceFieldName + '.' + childCol.fieldName)
|
|
534
537
|
.mapValues(childCol => new ColumnInfo(childCol.name, childCol.fieldName)).value();
|
|
535
538
|
col.foreignRelations = col.foreignRelations || [];
|
|
@@ -542,25 +545,25 @@ export class LocalDBManagementService {
|
|
|
542
545
|
// Loads necessary details of queries
|
|
543
546
|
compactQueries(queriesByDB) {
|
|
544
547
|
const queries = new Map();
|
|
545
|
-
|
|
548
|
+
forEach(queriesByDB.queries, queryData => {
|
|
546
549
|
let query, params;
|
|
547
550
|
if (queryData.nativeSql && queryData.type === 'SELECT') {
|
|
548
|
-
query =
|
|
549
|
-
params =
|
|
550
|
-
const paramObj =
|
|
551
|
+
query = isEmpty(queryData.offlineQueryString) ? queryData.queryString : queryData.offlineQueryString;
|
|
552
|
+
params = map(this.extractQueryParams(query), p => {
|
|
553
|
+
const paramObj = find(queryData.parameters, { 'name': p });
|
|
551
554
|
return {
|
|
552
555
|
name: paramObj.name,
|
|
553
556
|
type: paramObj.type,
|
|
554
557
|
variableType: paramObj.variableType
|
|
555
558
|
};
|
|
556
559
|
});
|
|
557
|
-
params.forEach(p => query =
|
|
560
|
+
params.forEach(p => query = replace(query, ':' + p.name, '?'));
|
|
558
561
|
queries[queryData.name] = {
|
|
559
562
|
name: queryData.name,
|
|
560
563
|
query: query,
|
|
561
564
|
params: params,
|
|
562
565
|
response: {
|
|
563
|
-
properties:
|
|
566
|
+
properties: map(queryData.response.properties, p => {
|
|
564
567
|
p.nameInUpperCase = p.name.toUpperCase();
|
|
565
568
|
return p;
|
|
566
569
|
})
|
|
@@ -586,7 +589,7 @@ export class LocalDBManagementService {
|
|
|
586
589
|
return dbInfo;
|
|
587
590
|
}
|
|
588
591
|
convertBoolToInt(bool) {
|
|
589
|
-
return
|
|
592
|
+
return toString(bool) === 'true' ? 1 : 0;
|
|
590
593
|
}
|
|
591
594
|
convertIntToBool(int) {
|
|
592
595
|
return int ? true : false;
|
|
@@ -596,7 +599,8 @@ export class LocalDBManagementService {
|
|
|
596
599
|
* @returns {*}
|
|
597
600
|
*/
|
|
598
601
|
disableForeignKeys() {
|
|
599
|
-
|
|
602
|
+
// @ts-ignore
|
|
603
|
+
return Promise.all(map(this.databases, db => this.executeSQLQuery(db.schema.name, 'PRAGMA foreign_keys = OFF')));
|
|
600
604
|
}
|
|
601
605
|
/**
|
|
602
606
|
* Executes SQL query;
|
|
@@ -679,7 +683,7 @@ export class LocalDBManagementService {
|
|
|
679
683
|
getMetaInfo(fileNameRegex) {
|
|
680
684
|
const folder = cordova.file.applicationDirectory + META_LOCATION + '/';
|
|
681
685
|
return this.deviceFileService.listFiles(folder, fileNameRegex)
|
|
682
|
-
.then(files => Promise.all(
|
|
686
|
+
.then(files => Promise.all(map(files, f => {
|
|
683
687
|
return new Promise((resolve, reject) => {
|
|
684
688
|
// Cordova File reader has buffer issues with large files.
|
|
685
689
|
// so, using ajax to retrieve local json
|
|
@@ -725,7 +729,7 @@ export class LocalDBManagementService {
|
|
|
725
729
|
loadNamedQueries(metadata) {
|
|
726
730
|
return this.getMetaInfo(/.+_query\.json$/)
|
|
727
731
|
.then((queriesByDBs) => {
|
|
728
|
-
queriesByDBs =
|
|
732
|
+
queriesByDBs = isArray(queriesByDBs) ? queriesByDBs : [queriesByDBs];
|
|
729
733
|
queriesByDBs.map(e => metadata[e.name].queries = this.compactQueries(e));
|
|
730
734
|
return metadata;
|
|
731
735
|
});
|
|
@@ -739,10 +743,12 @@ export class LocalDBManagementService {
|
|
|
739
743
|
loadOfflineConfig(metadata) {
|
|
740
744
|
return this.getMetaInfo(/.+_offline\.json$/)
|
|
741
745
|
.then(configs => {
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
+
forEach(configs, config => {
|
|
747
|
+
// @ts-ignore
|
|
748
|
+
forEach(config.entities, entityConfig => {
|
|
749
|
+
// @ts-ignore
|
|
750
|
+
const entitySchema = find(metadata[config.name].schema.entities, schema => schema.name === entityConfig.name);
|
|
751
|
+
assignIn(entitySchema, entityConfig);
|
|
746
752
|
});
|
|
747
753
|
});
|
|
748
754
|
return metadata;
|
|
@@ -751,14 +757,14 @@ export class LocalDBManagementService {
|
|
|
751
757
|
logSql(sqliteObject) {
|
|
752
758
|
const logger = console, originalExecuteSql = sqliteObject.executeSql;
|
|
753
759
|
sqliteObject.executeSql = (sql, params, logOutput) => {
|
|
754
|
-
const startTime =
|
|
760
|
+
const startTime = now();
|
|
755
761
|
return originalExecuteSql.call(sqliteObject, sql, params).then(result => {
|
|
756
762
|
if (logOutput || this._logSql) {
|
|
757
763
|
const objArr = [], rowCount = result.rows.length;
|
|
758
764
|
for (let i = 0; i < rowCount; i++) {
|
|
759
765
|
objArr.push(result.rows.item(i));
|
|
760
766
|
}
|
|
761
|
-
logger.debug('SQL "%s" with params %O took [%d ms]. And the result is %O', sql, params,
|
|
767
|
+
logger.debug('SQL "%s" with params %O took [%d ms]. And the result is %O', sql, params, now() - startTime, objArr);
|
|
762
768
|
}
|
|
763
769
|
return result;
|
|
764
770
|
}, error => {
|
|
@@ -786,10 +792,12 @@ export class LocalDBManagementService {
|
|
|
786
792
|
* @returns {*}
|
|
787
793
|
*/
|
|
788
794
|
normalizeData() {
|
|
789
|
-
return Promise.all(
|
|
790
|
-
|
|
791
|
-
|
|
795
|
+
return Promise.all(map(this.databases, database => {
|
|
796
|
+
// @ts-ignore
|
|
797
|
+
return Promise.all(map(database.schema.entities, entitySchema => {
|
|
798
|
+
return Promise.all(map(entitySchema.columns, column => {
|
|
792
799
|
if (column.sqlType === 'boolean') {
|
|
800
|
+
// @ts-ignore
|
|
793
801
|
return this.normalizeBooleanData(database.schema.name, entitySchema.name, column.name);
|
|
794
802
|
}
|
|
795
803
|
}));
|
|
@@ -803,12 +811,13 @@ export class LocalDBManagementService {
|
|
|
803
811
|
}).then(sqliteObject => {
|
|
804
812
|
database.sqliteObject = sqliteObject;
|
|
805
813
|
this.logSql(sqliteObject);
|
|
806
|
-
const storePromises =
|
|
814
|
+
const storePromises = map(database.schema.entities, entitySchema => {
|
|
815
|
+
// @ts-ignore
|
|
807
816
|
const store = new LocalDBStore(this.deviceFileService, entitySchema, this.file, this, sqliteObject);
|
|
808
817
|
return store.create();
|
|
809
818
|
});
|
|
810
819
|
return Promise.all(storePromises).then(stores => {
|
|
811
|
-
|
|
820
|
+
forEach(stores, store => {
|
|
812
821
|
database.stores[store.entitySchema.entityName] = store;
|
|
813
822
|
});
|
|
814
823
|
return database;
|
|
@@ -843,4 +852,4 @@ export class LocalDBManagementService {
|
|
|
843
852
|
type: Injectable,
|
|
844
853
|
args: [{ providedIn: 'root' }]
|
|
845
854
|
}], () => [{ type: i1.AppVersion }, { type: i2.DeviceService }, { type: i2.DeviceFileService }, { type: i3.File }, { type: i4.LocalKeyValueService }, { type: i5.SecurityService }, { type: i6.SQLite }], null); })();
|
|
846
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZGItbWFuYWdlbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9iaWxlL29mZmxpbmUvc3JjL3NlcnZpY2VzL2xvY2FsLWRiLW1hbmFnZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNySixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQThCLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7OztBQU81RixNQUFPLGFBQWEsR0FBRywwQkFBMEIsQ0FBQztBQUNsRCxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQztB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VSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQzt5RkE5eUJRLHdCQUF3Qjt1RUFBeEIsd0JBQXdCLFdBQXhCLHdCQUF3QixtQkFEWixNQUFNOztpRkFDbEIsd0JBQXdCO2NBRHBDLFVBQVU7ZUFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcFZlcnNpb24gfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvYXBwLXZlcnNpb24vbmd4JztcbmltcG9ydCB7IEZpbGUgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZmlsZS9uZ3gnO1xuaW1wb3J0IHsgU1FMaXRlLCBTUUxpdGVPYmplY3QgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvc3FsaXRlL25neCc7XG5cbmltcG9ydCB7IERhdGFUeXBlLCBERUZBVUxUX0ZPUk1BVFMsIGV4ZWN1dGVQcm9taXNlQ2hhaW4sIGV4dHJhY3RUeXBlLCBpc0FuZHJvaWQsIGlzQXJyYXksIGlzSW9zLCBub29wLCB0b1Byb21pc2UsIHRyYW5zZm9ybUZpbGVVUkkgfSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQgeyBEZXZpY2VGaWxlU2VydmljZSwgRGV2aWNlU2VydmljZSB9IGZyb20gJ0B3bS9tb2JpbGUvY29yZSc7XG5pbXBvcnQgeyBTZWN1cml0eVNlcnZpY2UgfSBmcm9tICdAd20vc2VjdXJpdHknO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0B3bS92YXJpYWJsZXMnO1xuXG5pbXBvcnQgeyBMb2NhbEtleVZhbHVlU2VydmljZSB9IGZyb20gJy4vbG9jYWwta2V5LXZhbHVlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxEQlN0b3JlIH0gZnJvbSAnLi4vbW9kZWxzL2xvY2FsLWRiLXN0b3JlJztcbmltcG9ydCB7IGVzY2FwZU5hbWUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvLCBEQkluZm8sIEVudGl0eUluZm8sIE5hbWVkUXVlcnlJbmZvLCBQdWxsVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25maWcnO1xuXG5kZWNsYXJlIGNvbnN0IF87XG5kZWNsYXJlIGNvbnN0IGNvcmRvdmE7XG5kZWNsYXJlIGNvbnN0IG1vbWVudDtcbmRlY2xhcmUgY29uc3QgWmVlcDtcblxuY29uc3QgIE5FWFRfSURfQ09VTlQgPSAnbG9jYWxEQlN0b3JlLm5leHRJZENvdW50JztcbmNvbnN0IE1FVEFfTE9DQVRJT04gPSAnd3d3L21ldGFkYXRhL2FwcCc7XG5jb25zdCBPRkZMSU5FX1dBVkVNQUtFUl9EQVRBQkFTRV9TQ0hFTUEgPSB7XG4gICAgbmFtZTogJ3dhdmVtYWtlcicsXG4gICAgdmVyc2lvbjogMSxcbiAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgIHRhYmxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAna2V5X3ZhbHVlJyxcbiAgICAgICAgICAgIGVudGl0eU5hbWU6ICdrZXktdmFsdWUnLFxuICAgICAgICAgICAgY29sdW1uczogW3tcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdpZCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ2lkJyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3JUeXBlIDogJ2RhdGFiYXNlSWRlbnRpdHknLFxuICAgICAgICAgICAgICAgIHNxbFR5cGUgOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAna2V5JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAna2V5J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAndmFsdWUnXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnb2ZmbGluZUNoYW5nZUxvZycsXG4gICAgICAgICAgICBlbnRpdHlOYW1lOiAnb2ZmbGluZUNoYW5nZUxvZycsXG4gICAgICAgICAgICBjb2x1bW5zOiBbe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ2lkJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvclR5cGU6ICdkYXRhYmFzZUlkZW50aXR5JyxcbiAgICAgICAgICAgICAgICBzcWxUeXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3NlcnZpY2UnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ29wZXJhdGlvbicsXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAnb3BlcmF0aW9uJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3BhcmFtcydcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndGltZXN0YW1wJyxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICd0aW1lc3RhbXAnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2hhc0Vycm9yJyxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdoYXNFcnJvcidcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdlcnJvck1lc3NhZ2UnXG4gICAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgXVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBDYWxsQmFjayB7XG4gICAgb25EYkNyZWF0ZT86IChpbmZvOiBhbnkpID0+IGFueTtcbiAgICBwb3N0SW1wb3J0PzogKGltcG9ydEZvbGRlclBhdGg6IHN0cmluZywgbWV0YUluZm86IGFueSkgPT4gYW55O1xuICAgIHByZUV4cG9ydD86IChmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoOiBzdHJpbmcsIG1ldGFJbmZvOiBhbnkpID0+IGFueTtcbn1cblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgTG9jYWxEQk1hbmFnZW1lbnRTZXJ2aWNlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgU0VSVklDRV9OQU1FID0gJ0xvY2FsREJNYW5hZ2VtZW50U2VydmljZSc7XG4gICAgcHJpdmF0ZSBjYWxsYmFja3M6IENhbGxCYWNrW10gPSBbXTtcbiAgICBwcml2YXRlIGRiSW5zdGFsbERpcmVjdG9yeTogc3RyaW5nO1xuICAgIHByaXZhdGUgZGJJbnN0YWxsRGlyZWN0b3J5TmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkYXRhYmFzZXM6IE1hcDxzdHJpbmcsIERCSW5mbz47XG4gICAgcHJpdmF0ZSBfbG9nU3FsID0gZmFsc2U7XG4gICAgcHVibGljIG5leHRJZCA9IDEwMDAwMDAwMDAwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN5c3RlbVByb3BlcnRpZXMgPSB7XG4gICAgICAgICdVU0VSX0lEJyA6IHtcbiAgICAgICAgICAgICduYW1lJyA6ICdVU0VSX0lEJyxcbiAgICAgICAgICAgICd2YWx1ZScgOiAoKSA9PiB0aGlzLnNlY3VyaXR5U2VydmljZS5nZXRMb2dnZWRJblVzZXIoKS50aGVuKCB1c2VySW5mbyA9PiB1c2VySW5mby51c2VySWQpXG4gICAgICAgIH0sXG4gICAgICAgICdVU0VSX05BTUUnIDoge1xuICAgICAgICAgICAgJ25hbWUnIDogJ1VTRVJfTkFNRScsXG4gICAgICAgICAgICAndmFsdWUnIDogKCkgPT4gdGhpcy5zZWN1cml0eVNlcnZpY2UuZ2V0TG9nZ2VkSW5Vc2VyKCkudGhlbiggdXNlckluZm8gPT4gdXNlckluZm8udXNlck5hbWUpXG4gICAgICAgIH0sXG4gICAgICAgICdEQVRFX1RJTUUnIDoge1xuICAgICAgICAgICAgJ25hbWUnIDogJ0RBVEVfVElNRScsXG4gICAgICAgICAgICAndmFsdWUnIDogKCkgPT4gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREVGhoOm1tOnNzJylcbiAgICAgICAgfSxcbiAgICAgICAgJ0RBVEUnIDoge1xuICAgICAgICAgICAgJ25hbWUnIDogJ0NVUlJFTlRfREFURScsXG4gICAgICAgICAgICAndmFsdWUnIDogKCkgPT4gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgfSxcbiAgICAgICAgJ1RJTUUnIDoge1xuICAgICAgICAgICAgJ25hbWUnIDogJ1RJTUUnLFxuICAgICAgICAgICAgJ3ZhbHVlJyA6ICgpID0+IG1vbWVudCgpLmZvcm1hdCgnaGg6bW06c3MnKVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFwcFZlcnNpb246IEFwcFZlcnNpb24sXG4gICAgICAgIHByaXZhdGUgZGV2aWNlU2VydmljZTogRGV2aWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkZXZpY2VGaWxlU2VydmljZTogRGV2aWNlRmlsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmlsZTogRmlsZSxcbiAgICAgICAgcHJpdmF0ZSBsb2NhbEtleVZhbHVlU2VydmljZTogTG9jYWxLZXlWYWx1ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2VjdXJpdHlTZXJ2aWNlOiBTZWN1cml0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3FsaXRlOiBTUUxpdGVcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgYWxsIGRhdGFiYXNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IGEgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSBjbG9zaW5nIGRhdGFiYXNlcywgZ2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyAoaWYgYW55KS5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NlUHJvbWlzZXMgPSBfLm1hcChfLnZhbHVlcyh0aGlzLmRhdGFiYXNlcyksIGRiID0+IGRiLnNxbGl0ZU9iamVjdC5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChjbG9zZVByb21pc2VzKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRJZENvdW50KCkge1xuICAgICAgICB0aGlzLm5leHRJZCA9IHRoaXMubmV4dElkICsgMTtcbiAgICAgICAgdGhpcy5sb2NhbEtleVZhbHVlU2VydmljZS5wdXQoTkVYVF9JRF9DT1VOVCwgdGhpcy5uZXh0SWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBuYW1lZCBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYk5hbWUgbmFtZSBvZiBkYXRhYmFzZSBvbiB3aGljaCB0aGUgbmFtZWQgcXVlcnkgaGFzIHRvIGJlIHJ1blxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeU5hbWUgbmFtZSBvZiB0aGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgcXVlcnkuXG4gICAgICogQHJldHVybnMge29iamVjdH0gYSBwcm9taXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBleGVjdXRlTmFtZWRRdWVyeShkYk5hbWU6IHN0cmluZywgcXVlcnlOYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KSB7XG4gICAgICAgIGxldCBxdWVyeURhdGEsIHBhcmFtUHJvbWlzZXM7XG4gICAgICAgIGlmICghdGhpcy5kYXRhYmFzZXNbZGJOYW1lXSB8fCAhdGhpcy5kYXRhYmFzZXNbZGJOYW1lXS5xdWVyaWVzW3F1ZXJ5TmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgUXVlcnkgYnkgbmFtZSAnICR7cXVlcnlOYW1lfSAnIE5vdCBGb3VuZGApO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5RGF0YSA9IHRoaXMuZGF0YWJhc2VzW2RiTmFtZV0ucXVlcmllc1txdWVyeU5hbWVdO1xuICAgICAgICBwYXJhbVByb21pc2VzID0gXy5jaGFpbihxdWVyeURhdGEucGFyYW1zKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAudmFyaWFibGVUeXBlICE9PSAnUFJPTVBUJylcbiAgICAgICAgICAgIC5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLnN5c3RlbVByb3BlcnRpZXNbcC52YXJpYWJsZVR5cGVdLnZhbHVlKHAubmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9Qcm9taXNlKHBhcmFtVmFsdWUpLnRoZW4odiA9PiBwYXJhbXNbcC5uYW1lXSA9IHYpO1xuICAgICAgICAgICAgfSkudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBhcmFtUHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcGFyYW1zID0gXy5tYXAocXVlcnlEYXRhLnBhcmFtcywgcCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3FsaXRlIHdpbGwgYWNjZXB0IERhdGVUaW1lIHZhbHVlIGFzIGJlbG93IGZvcm1hdC5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtc1twLm5hbWVdICE9PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAmJiAocC50eXBlID09PSBEYXRhVHlwZS5EQVRFVElNRSB8fCBwLnR5cGUgPT09IERhdGFUeXBlLkxPQ0FMREFURVRJTUUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlKHBhcmFtc1twLm5hbWVdLCBwLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzcWxpdGUgYWNjZXB0cyB0aGUgYm9vbCB2YWwgYXMgMSwwIGhlbmNlIGNvbnZlcnQgdGhlIGJvb2xlYW4gdmFsdWUgdG8gbnVtYmVyXG4gICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gRGF0YVR5cGUuQk9PTEVBTikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9vbFRvSW50KHBhcmFtc1twLm5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtc1twLm5hbWVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlU1FMUXVlcnkoZGJOYW1lLCBxdWVyeURhdGEucXVlcnksIHBhcmFtcylcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkVHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV8uaXNFbXB0eShyZXN1bHQucm93cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Um93ID0gcmVzdWx0LnJvd3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkVHJhbnNmb3JtID0gXy5maW5kKHF1ZXJ5RGF0YS5yZXNwb25zZS5wcm9wZXJ0aWVzLCBwID0+ICFmaXJzdFJvdy5oYXNPd25Qcm9wZXJ0eShwLmZpZWxkTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5lZWRUcmFuc2Zvcm0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJvd3MgPSBfLm1hcChyZXN1bHQucm93cywgcm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSb3cgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1dpdGhVcHBlcktleXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBtYWtlIHNlYXJjaCBmb3IgZGF0YSBhcyBjYXNlLWluc2Vuc2l0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyb3csICh2LCBrKSA9PiByb3dXaXRoVXBwZXJLZXlzW2sudG9VcHBlckNhc2UoKV0gPSB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHF1ZXJ5RGF0YS5yZXNwb25zZS5wcm9wZXJ0aWVzLCBwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSB0eXBlUmVmIHNwZWNpZmllZCBpbiBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcFR5cGUgPSBleHRyYWN0VHlwZShwLmZpZWxkVHlwZS50eXBlUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdFZhbHVlID0gREVGQVVMVF9GT1JNQVRTW18udG9VcHBlcihwcm9wVHlwZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRWYWwgPSByb3dbcC5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFZhbCAmJiB0eXBlb2YgZmllbGRWYWwgIT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHByb3BUeXBlID09PSBEYXRhVHlwZS5EQVRFVElNRSB8fCBwcm9wVHlwZSA9PT0gRGF0YVR5cGUuTE9DQUxEQVRFVElNRSB8fCBwcm9wVHlwZSA9PT0gRGF0YVR5cGUuREFURSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9tZW50KGZpZWxkVmFsKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W3AubmFtZV0gPSBmb3JtYXREYXRlKGZpZWxkVmFsLCBwcm9wVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb21lbnQoZmllbGRWYWwsICdISDptbScpLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgaW4gSEg6bW06c3MgZm9ybWF0LCBpdCByZXR1cm5zIGEgd3JvbmcgZGF0ZS4gU28gYXBwZW5kIHRoZSBkYXRlIHRvIHRoZSBnaXZlbiB2YWx1ZSB0byBnZXQgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbcC5uYW1lXSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpICsgJ1QnICsgZmllbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BUeXBlID09PSBEYXRhVHlwZS5CT09MRUFOKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W3AubmFtZV0gPSB0aGlzLmNvbnZlcnRJbnRUb0Jvb2woZmllbGRWYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93V2l0aFVwcGVyS2V5c1twLm5hbWVJblVwcGVyQ2FzZV0gPSByb3dbcC5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkUm93W3AubmFtZV0gPSByb3dbcC5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkUm93W3AuZmllbGROYW1lXSA9IHJvd1twLmZpZWxkTmFtZV0gfHwgcm93V2l0aFVwcGVyS2V5c1twLm5hbWVJblVwcGVyQ2FzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRSb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGV4cG9ydCB0aGUgZGF0YWJhc2VzIGluIGEgemlwIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gemlwIGlzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGV4cG9ydERCKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlclRvRXhwb3J0ID0gJ29mZmxpbmVfdGVtcF8nICsgXy5ub3coKSxcbiAgICAgICAgICAgICAgICBmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoID0gY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5ICsgZm9sZGVyVG9FeHBvcnQgKyAnLycsXG4gICAgICAgICAgICAgICAgemlwRmlsZU5hbWUgPSAnX29mZmxpbmVfZGF0YS56aXAnLFxuICAgICAgICAgICAgICAgIG1ldGFJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBhcHA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIE9TOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE9uOiAwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB6aXBEaXJlY3Rvcnk7XG4gICAgICAgICAgICBpZiAoaXNJb3MoKSkge1xuICAgICAgICAgICAgICAgIC8vIEluIElPUywgc2F2ZSB6aXAgdG8gZG9jdW1lbnRzIGRpcmVjdG9yeSBzbyB0aGF0IHVzZXIgY2FuIGV4cG9ydCB0aGUgZmlsZSBmcm9tIElPUyBkZXZpY2VzIHVzaW5nIGlUVU5FUy5cbiAgICAgICAgICAgICAgICB6aXBEaXJlY3RvcnkgPSBjb3Jkb3ZhLmZpbGUuZG9jdW1lbnRzRGlyZWN0b3J5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBBbmRyb2lkLCBzYXZlIHppcCB0byBkb3dubG9hZCBkaXJlY3RvcnkuXG4gICAgICAgICAgICAgICAgemlwRGlyZWN0b3J5ID0gY29yZG92YS5maWxlLmV4dGVybmFsUm9vdERpcmVjdG9yeSArICdEb3dubG9hZC8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZvbGRlciB0byBjb3B5IGFsbCB0aGUgY29udGVudCB0byBleHBvcnRcbiAgICAgICAgICAgIHRoaXMuZmlsZS5jcmVhdGVEaXIoY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5LCBmb2xkZXJUb0V4cG9ydCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IGRhdGFiYXNlcyB0byB0ZW1wb3JhcnkgZm9sZGVyIGZvciBleHBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5jb3B5RGlyKHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5LCB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeU5hbWUsIGZvbGRlclRvRXhwb3J0RnVsbFBhdGgsICdkYXRhYmFzZXMnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgbWV0YSBpbmZvIHRvIGlkZW50aWZ5IHRoZSB6aXAgYW5kIG90aGVyIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGFwcEluZm8gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLmFwcCA9IChhcHBJbmZvIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW9zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZm8uT1MgPSAnSU9TJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQW5kcm9pZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLk9TID0gJ0FORFJPSUQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mby5jcmVhdGVkT24gPSBfLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhSW5mbztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gZXhlY3V0ZVByb21pc2VDaGFpbih0aGlzLmdldENhbGxiYWNrc0ZvcigncHJlRXhwb3J0JyksIFtmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoLCBtZXRhSW5mb10pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIG1ldGEgZGF0YSB0byBNRVRBLmpzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlLndyaXRlRmlsZShmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoLCAnTUVUQS5qc29uJywgSlNPTi5zdHJpbmdpZnkobWV0YUluZm8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIG5hbWUgdG8gdXNlIGZvciB0aGUgemlwLlxuICAgICAgICAgICAgICAgICAgICBsZXQgYXBwTmFtZSA9IG1ldGFJbmZvLmFwcC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhcHBOYW1lID0gYXBwTmFtZS5yZXBsYWNlKC9cXHMrL2csICdfJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLm5ld0ZpbGVOYW1lKHppcERpcmVjdG9yeSwgYXBwTmFtZSArIHppcEZpbGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZmlsZU5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFppcCB0aGUgdGVtcG9yYXJ5IGZvbGRlciBmb3IgZXhwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChycywgcmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmVlcC56aXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA6IGZvbGRlclRvRXhwb3J0RnVsbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAgIDogemlwRGlyZWN0b3J5ICsgZmlsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKCkgPT4gcnMoemlwRGlyZWN0b3J5ICsgZmlsZU5hbWUpLCByZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgICAgICAgICAgICAuY2F0Y2gobm9vcCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0ZW1wb3JhcnkgZm9sZGVyIGZvciBleHBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UucmVtb3ZlRGlyKGNvcmRvdmEuZmlsZS5jYWNoZURpcmVjdG9yeSArIGZvbGRlclRvRXhwb3J0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIHJldHVybnMgc3RvcmUgYm91bmQgdG8gdGhlIGRhdGFNb2RlbE5hbWUgYW5kIGVudGl0eU5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YU1vZGVsTmFtZVxuICAgICAqIEBwYXJhbSBlbnRpdHlOYW1lXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgcHVibGljIGdldFN0b3JlKGRhdGFNb2RlbE5hbWU6IHN0cmluZywgZW50aXR5TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2NhbERCU3RvcmU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFiYXNlc1tkYXRhTW9kZWxOYW1lXSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5kYXRhYmFzZXNbZGF0YU1vZGVsTmFtZV0uc3RvcmVzW2VudGl0eU5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChgc3RvcmUgd2l0aCBuYW1lJyR7ZW50aXR5TmFtZX0nIGluIGRhdGFtb2RlbCAnJHtkYXRhTW9kZWxOYW1lfScgaXMgbm90IGZvdW5kYCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIHRoZSBkYXRhYmFzZXMgd2l0aCB0aGUgZmlsZXMgcHJvdmlkZWQgaW4gemlwLiBJZiBpbXBvcnQgZ2V0cyBmYWlsZWQsXG4gICAgICogdGhlbiBhcHAgcmV2ZXJ0cyBiYWNrIHRvIHVzZSBvbGQgZGF0YWJhc2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHppcFBhdGggbG9jYXRpb24gb2YgdGhlIHppcCBmaWxlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJ0SWZGYWlscyBJZiB0cnVlLCB0aGVuIGEgYmFja3VwIGlzIGNyZWF0ZWQgYW5kIHdoZW4gaW1wb3J0IGZhaWxzLCBiYWNrdXAgaXMgcmV2ZXJ0ZWQgYmFjay5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHppcCBpcyBjcmVhdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbXBvcnREQih6aXBQYXRoOiBzdHJpbmcsIHJldmVydElmRmFpbHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydEZvbGRlciA9ICdvZmZsaW5lX3RlbXBfJyArIF8ubm93KCksXG4gICAgICAgICAgICAgICAgaW1wb3J0Rm9sZGVyRnVsbFBhdGggPSBjb3Jkb3ZhLmZpbGUuY2FjaGVEaXJlY3RvcnkgKyBpbXBvcnRGb2xkZXIgKyAnLyc7XG4gICAgICAgICAgICBsZXQgemlwTWV0YTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmb2xkZXIgdG8gdW56aXAgdGhlIGNvbnRlbnRzIG9mIHRoZSB6aXAuXG4gICAgICAgICAgICB0aGlzLmZpbGUuY3JlYXRlRGlyKGNvcmRvdmEuZmlsZS5jYWNoZURpcmVjdG9yeSwgaW1wb3J0Rm9sZGVyLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJzLCByZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW56aXAgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBaZWVwLnVuemlwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiB6aXBQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBpbXBvcnRGb2xkZXJGdWxsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcnMsIHJlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiByZWFkIG1ldGEgZGF0YSBhbmQgYWxsb3cgaW1wb3J0IG9ubHkgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHAgZnJvbSB3aGljaCB0aGlzIHppcCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICogYW5kIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhpcyBhcHAgYXJlIHNhbWUuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5yZWFkQXNUZXh0KGltcG9ydEZvbGRlckZ1bGxQYXRoLCAnTUVUQS5qc29uJylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHppcE1ldGEgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBJbmZvKCk7XG4gICAgICAgICAgICAgICAgfSkudGhlbihhcHBJbmZvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF6aXBNZXRhLmFwcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdtZXRhIGluZm9ybWF0aW9uIGlzIG5vdCBmb3VuZCBpbiB6aXAnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoemlwTWV0YS5hcHAucGFja2FnZU5hbWUgIT09IGFwcEluZm8ucGFja2FnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnZGF0YWJhc2UgemlwIG9mIGFwcCB3aXRoIHNhbWUgcGFja2FnZSBuYW1lIGNhbiBvbmx5IGJlIGltcG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiYWNrdXBaaXA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJ0SWZGYWlscykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBiYWNrdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHBvcnREQigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHBhdGggPT4gYmFja3VwWmlwID0gcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGV4aXN0aW5nIGRhdGFiYXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UucmVtb3ZlRGlyKHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGltcG9ydGVkIGRhdGFiYXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5jb3B5RGlyKGltcG9ydEZvbGRlckZ1bGxQYXRoLCAnZGF0YWJhc2VzJywgdGhpcy5kYkluc3RhbGxQYXJlbnREaXJlY3RvcnksIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIGRhdGFiYXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZERhdGFiYXNlcygpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IGV4ZWN1dGVQcm9taXNlQ2hhaW4odGhpcy5nZXRDYWxsYmFja3NGb3IoJ3Bvc3RJbXBvcnQnKSwgW2ltcG9ydEZvbGRlckZ1bGxQYXRoLCB6aXBNZXRhXSkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrdXBaaXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5yZW1vdmVGaWxlKGJhY2t1cFppcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrdXBaaXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnREQihiYWNrdXBaaXAsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLnJlbW92ZUZpbGUoYmFja3VwWmlwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgICAgICAgLmNhdGNoKG5vb3ApXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UucmVtb3ZlRGlyKGNvcmRvdmEuZmlsZS5jYWNoZURpcmVjdG9yeSArIGltcG9ydEZvbGRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFNb2RlbE5hbWUgTmFtZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRpdHlOYW1lIE5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gTmFtZSBvZiB0aGUgb3BlcmF0aW9uIChSRUFELCBJTlNFUlQsIFVQREFURSwgREVMRVRFKVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm5zIHRydWUsIGlmIHRoZSBnaXZlbiBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBhcyBwZXIgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcGVyYXRpb25BbGxvd2VkKGRhdGFNb2RlbE5hbWU6IHN0cmluZywgZW50aXR5TmFtZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZShkYXRhTW9kZWxOYW1lLCBlbnRpdHlOYW1lKS50aGVuKCBzdG9yZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ1JFQUQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmVudGl0eVNjaGVtYS5wdXNoQ29uZmlnLnJlYWRFbmFibGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ0lOU0VSVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuZW50aXR5U2NoZW1hLnB1c2hDb25maWcuaW5zZXJ0RW5hYmxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdVUERBVEUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmVudGl0eVNjaGVtYS5wdXNoQ29uZmlnLnVwZGF0ZUVuYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnREVMRVRFJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5lbnRpdHlTY2hlbWEucHVzaENvbmZpZy5kZWxldGVFbmFibGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRGF0YWJhc2VzKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBuZXdEYXRhYmFzZXNDcmVhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmRhdGFiYXNlcykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmRhdGFiYXNlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNJb3MoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5TmFtZSA9ICdMb2NhbERhdGFiYXNlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRiSW5zdGFsbFBhcmVudERpcmVjdG9yeSA9IGNvcmRvdmEuZmlsZS5hcHBsaWNhdGlvblN0b3JhZ2VEaXJlY3RvcnkgKyAgJ0xpYnJhcnkvJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYkluc3RhbGxEaXJlY3RvcnlOYW1lID0gJ2RhdGFiYXNlcyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kYkluc3RhbGxQYXJlbnREaXJlY3RvcnkgPSBjb3Jkb3ZhLmZpbGUuYXBwbGljYXRpb25TdG9yYWdlRGlyZWN0b3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYkluc3RhbGxEaXJlY3RvcnkgPSB0aGlzLmRiSW5zdGFsbFBhcmVudERpcmVjdG9yeSArIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5TmFtZTtcblxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZXMgPSBuZXcgTWFwPHN0cmluZywgREJJbmZvPigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0VXBEYXRhYmFzZXMoKVxuICAgICAgICAgICAgICAgIC50aGVuKCBmbGFnID0+IG5ld0RhdGFiYXNlc0NyZWF0ZWQgPSBmbGFnKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZERCU2NoZW1hcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKG1ldGFkYXRhID0+IHRoaXMubG9hZE5hbWVkUXVlcmllcyhtZXRhZGF0YSkpXG4gICAgICAgICAgICAgICAgLnRoZW4obWV0YWRhdGEgPT4gdGhpcy5sb2FkT2ZmbGluZUNvbmZpZyhtZXRhZGF0YSkpXG4gICAgICAgICAgICAgICAgLnRoZW4obWV0YWRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXy5tYXAobWV0YWRhdGEsIGRiTWV0YWRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkRhdGFiYXNlKGRiTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZGF0YWJhc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlc1tkYk1ldGFkYXRhLnNjaGVtYS5uYW1lXSA9IGRhdGFiYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKCd3YXZlbWFrZXInLCAna2V5LXZhbHVlJykudGhlbiggc3RvcmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEtleVZhbHVlU2VydmljZS5pbml0KHN0b3JlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsS2V5VmFsdWVTZXJ2aWNlLmdldChORVhUX0lEX0NPVU5UKS50aGVuKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRJZCA9IHZhbCB8fCB0aGlzLm5leHRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RhdGFiYXNlc0NyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZURhdGEoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZGlzYWJsZUZvcmVpZ25LZXlzKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXZpY2VTZXJ2aWNlLmdldEFwcEJ1aWxkVGltZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGRiU2VlZENyZWF0aW9uVGltZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUHJvbWlzZUNoYWluKF8ubWFwKHRoaXMuY2FsbGJhY2tzLCAnb25EYkNyZWF0ZScpLCBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGFiYXNlcycgOiB0aGlzLmRhdGFiYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYkNyZWF0ZWRPbicgOiBfLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RiU2VlZENyZWF0ZWRPbicgOiBkYlNlZWRDcmVhdGlvblRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gdGhpcy5kYXRhYmFzZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uZSBjYW4gbGlzdGVuIGV2ZW50cyBzdWNoIGFzIG9uRGJDcmVhdGUsICdwcmVFeHBvcnQnIGFuZCAncG9zdEltcG9ydCcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbGlzdGVuZXIgYW4gb2JqZWN0IHdpdGggZnVuY3Rpb25zIG1hcHBlZCB0byBldmVudCBuYW1lcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJDYWxsYmFjayhsaXN0ZW5lcjogQ2FsbEJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ1NRbChmbGFnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2xvZ1NxbCA9IGZsYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhbnkgZXhpc3RpbmcgZGF0YWJhc2VzIChleGNlcHQgd2F2ZW1ha2VyIGRiKSBhbmQgY29waWVzIHRoZSBkYXRhYmFzZXMgdGhhdCBhcmUgcGFja2FnZWQgd2l0aCB0aGUgYXBwLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhbkFuZENvcHlEYXRhYmFzZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZGJTZWVkRm9sZGVyID0gY29yZG92YS5maWxlLmFwcGxpY2F0aW9uRGlyZWN0b3J5ICsgTUVUQV9MT0NBVElPTjtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5jcmVhdGVEaXIodGhpcy5kYkluc3RhbGxQYXJlbnREaXJlY3RvcnksIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5TmFtZSwgZmFsc2UpXG4gICAgICAgICAgICAuY2F0Y2gobm9vcClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UubGlzdEZpbGVzKHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5LCAvLitcXC5kYiQvKSlcbiAgICAgICAgICAgIC50aGVuKGZpbGVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZbJ25hbWUnXSAhPT0gJ3dhdmVtYWtlci5kYicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlLnJlbW92ZUZpbGUodGhpcy5kYkluc3RhbGxEaXJlY3RvcnksIGZbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oICgpID0+IHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UubGlzdEZpbGVzKGRiU2VlZEZvbGRlciwgLy4rXFwuZGIkLykpXG4gICAgICAgICAgICAudGhlbihmaWxlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5jcmVhdGVEaXIodGhpcy5kYkluc3RhbGxQYXJlbnREaXJlY3RvcnksIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5TmFtZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2gobm9vcClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IFByb21pc2UuYWxsKGZpbGVzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9PiB0aGlzLmZpbGUuY29weUZpbGUoZGJTZWVkRm9sZGVyLCBmWyduYW1lJ10sIHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5LCBmWyduYW1lJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGlja3MgZXNzZW50aWFsIGRldGFpbHMgZnJvbSB0aGUgZ2l2ZW4gc2NoZW1hLlxuICAgIHByaXZhdGUgY29tcGFjdEVudGl0eVNjaGVtYShzY2hlbWEsIGVudGl0eSwgdHJhbnNmb3JtZWRTY2hlbWFzKTogRW50aXR5SW5mbyB7XG4gICAgICAgIGNvbnN0IHJlcUVudGl0eSA9IHRyYW5zZm9ybWVkU2NoZW1hc1tlbnRpdHlbJ2VudGl0eU5hbWUnXV0gYXMgRW50aXR5SW5mbztcbiAgICAgICAgcmVxRW50aXR5LmVudGl0eU5hbWUgPSBlbnRpdHlbJ2VudGl0eU5hbWUnXTtcbiAgICAgICAgcmVxRW50aXR5Lm5hbWUgPSBlbnRpdHlbJ25hbWUnXTtcbiAgICAgICAgcmVxRW50aXR5LmNvbHVtbnMgPSBbXTtcbiAgICAgICAgZW50aXR5LmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGNvbC5jb2x1bW5WYWx1ZSA/IGNvbC5jb2x1bW5WYWx1ZS5kZWZhdWx0VmFsdWUgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBjb2wuc3FsVHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiAhY29sLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBfLmlzRW1wdHkoZGVmYXVsdFZhbHVlKSA/IG51bGwgOiBfLnBhcnNlSW50KGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IF8uaXNFbXB0eShkZWZhdWx0VmFsdWUpID8gbnVsbCA6IChkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyA/IDEgOiAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gXy5pc0VtcHR5KGRlZmF1bHRWYWx1ZSkgPyBudWxsIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxRW50aXR5LmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogY29sWyduYW1lJ10sXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBjb2xbJ2ZpZWxkTmFtZSddLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvclR5cGU6IGNvbFsnZ2VuZXJhdG9yVHlwZSddLFxuICAgICAgICAgICAgICAgIHNxbFR5cGU6IGNvbFsnc3FsVHlwZSddLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IGNvbFsncHJpbWFyeUtleSddLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgXy5mb3JFYWNoKGVudGl0eS5yZWxhdGlvbnMsIHIgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldEVudGl0eVNjaGVtYSwgdGFyZ2V0RW50aXR5LCBjb2wsIHNvdXJjZUNvbHVtbiwgbWFwcGluZztcbiAgICAgICAgICAgIGlmIChyLmNhcmRpbmFsaXR5ID09PSAnTWFueVRvT25lJyB8fCByLmNhcmRpbmFsaXR5ID09PSAnT25lVG9PbmUnKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RW50aXR5ID0gXy5maW5kKHNjaGVtYS50YWJsZXMsIHQgPT4gdC5uYW1lID09PSByLnRhcmdldFRhYmxlKTtcbiAgICAgICAgICAgICAgICBtYXBwaW5nID0gci5tYXBwaW5nc1swXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eS5lbnRpdHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2x1bW4gPSBtYXBwaW5nLnNvdXJjZUNvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgY29sID0gcmVxRW50aXR5LmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IHNvdXJjZUNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVudGl0eVNjaGVtYSA9IHNjaGVtYS50YWJsZXMuZmluZCh0YWJsZSA9PiB0YWJsZS5uYW1lID09PSByLnRhcmdldFRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yZWlnblJlbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGROYW1lOiByLmZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVudGl0eTogdGFyZ2V0RW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VGFibGU6IHIudGFyZ2V0VGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb2x1bW46IG1hcHBpbmcudGFyZ2V0Q29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UGF0aDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFwcGVyOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpZWxkTmFtZTogdGFyZ2V0RW50aXR5U2NoZW1hLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IG1hcHBpbmcudGFyZ2V0Q29sdW1uKS5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnblJlbGF0aW9uLnRhcmdldFBhdGggPSBmb3JlaWduUmVsYXRpb24uc291cmNlRmllbGROYW1lICsgJy4nICsgZm9yZWlnblJlbGF0aW9uLnRhcmdldEZpZWxkTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnblJlbGF0aW9uLmRhdGFNYXBwZXIgPSBfLmNoYWluKHRhcmdldEVudGl0eVNjaGVtYS5jb2x1bW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmtleUJ5KGNoaWxkQ29sID0+IGZvcmVpZ25SZWxhdGlvbi5zb3VyY2VGaWVsZE5hbWUgKyAnLicgKyBjaGlsZENvbC5maWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwVmFsdWVzKGNoaWxkQ29sID0+IG5ldyBDb2x1bW5JbmZvKGNoaWxkQ29sLm5hbWUsIGNoaWxkQ29sLmZpZWxkTmFtZSkpLnZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbC5mb3JlaWduUmVsYXRpb25zID0gY29sLmZvcmVpZ25SZWxhdGlvbnMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbC5mb3JlaWduUmVsYXRpb25zLnB1c2goZm9yZWlnblJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVxRW50aXR5O1xuICAgIH1cblxuICAgIC8vIExvYWRzIG5lY2Vzc2FyeSBkZXRhaWxzIG9mIHF1ZXJpZXNcbiAgICBwcml2YXRlIGNvbXBhY3RRdWVyaWVzKHF1ZXJpZXNCeURCKTogTWFwPHN0cmluZywgTmFtZWRRdWVyeUluZm8+IHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZFF1ZXJ5SW5mbz4oKTtcblxuICAgICAgICBfLmZvckVhY2gocXVlcmllc0J5REIucXVlcmllcywgcXVlcnlEYXRhID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeSwgcGFyYW1zO1xuICAgICAgICAgICAgaWYgKHF1ZXJ5RGF0YS5uYXRpdmVTcWwgJiYgcXVlcnlEYXRhLnR5cGUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBfLmlzRW1wdHkocXVlcnlEYXRhLm9mZmxpbmVRdWVyeVN0cmluZykgPyBxdWVyeURhdGEucXVlcnlTdHJpbmcgOiBxdWVyeURhdGEub2ZmbGluZVF1ZXJ5U3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IF8ubWFwKHRoaXMuZXh0cmFjdFF1ZXJ5UGFyYW1zKHF1ZXJ5KSwgcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtT2JqID0gXy5maW5kKHF1ZXJ5RGF0YS5wYXJhbWV0ZXJzLCB7J25hbWUnOiBwfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJhbU9iai5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW1PYmoudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVHlwZTogcGFyYW1PYmoudmFyaWFibGVUeXBlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmZvckVhY2gocCA9PiBxdWVyeSA9IF8ucmVwbGFjZShxdWVyeSwgJzonICsgcC5uYW1lLCAnPycpKTtcbiAgICAgICAgICAgICAgICBxdWVyaWVzW3F1ZXJ5RGF0YS5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcXVlcnlEYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBfLm1hcChxdWVyeURhdGEucmVzcG9uc2UucHJvcGVydGllcywgcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uYW1lSW5VcHBlckNhc2UgPSBwLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJpZXM7XG4gICAgfVxuXG4gICAgLy8gTG9hZHMgbmVjZXNzYXJ5IGRldGFpbHMgb2YgcmVtb3RlIHNjaGVtYVxuICAgIHByaXZhdGUgY29tcGFjdFNjaGVtYShzY2hlbWEpOiBEQkluZm8ge1xuICAgICAgICBjb25zdCBkYkluZm8gPSBuZXcgREJJbmZvKCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkU2NoZW1hcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlJbmZvPigpO1xuICAgICAgICBzY2hlbWEudGFibGVzLmZvckVhY2goZW50aXR5U2NoZW1hID0+IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkU2NoZW1hc1tlbnRpdHlTY2hlbWEuZW50aXR5TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaChlbnRpdHlTY2hlbWEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wYWN0RW50aXR5U2NoZW1hKHNjaGVtYSwgZW50aXR5U2NoZW1hLCB0cmFuc2Zvcm1lZFNjaGVtYXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZGJJbmZvLnNjaGVtYS5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgICAgIGRiSW5mby5zY2hlbWEuaXNJbnRlcm5hbCA9IHNjaGVtYS5pc0ludGVybmFsO1xuICAgICAgICBkYkluZm8uc2NoZW1hLmVudGl0aWVzID0gdHJhbnNmb3JtZWRTY2hlbWFzO1xuICAgICAgICByZXR1cm4gZGJJbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udmVydEJvb2xUb0ludChib29sOiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiBfLnRvU3RyaW5nKGJvb2wpID09PSAndHJ1ZScgPyAxIDogMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRJbnRUb0Jvb2woaW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGludCA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUdXJucyBvZmYgZm9yZWlnbiBrZXlzXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNhYmxlRm9yZWlnbktleXMoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChfLm1hcCh0aGlzLmRhdGFiYXNlcywgZGIgPT5cbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZVNRTFF1ZXJ5KGRiLnNjaGVtYS5uYW1lLCAnUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9GRicpXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIFNRTCBxdWVyeTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYk5hbWVcbiAgICAgKiBAcGFyYW0gc3FsXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHB1YmxpYyBleGVjdXRlU1FMUXVlcnkoZGJOYW1lLCBzcWwsIHBhcmFtcz86IGFueVtdLCBsb2dPdXRwdXQ/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGRiID0gdGhpcy5kYXRhYmFzZXNbZGJOYW1lXTtcbiAgICAgICAgaWYgKGRiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGIuc3FsaXRlT2JqZWN0LmV4ZWN1dGVTcWwoc3FsLCBwYXJhbXMsIGxvZ091dHB1dClcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gcmVzdWx0LnJvd3M7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdyb3dzQWZmZWN0ZWQnICA6IHJlc3VsdC5yb3dzQWZmZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAncm93cycgICAgICAgICAgOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBObyBEYXRhYmFzZSB3aXRoIG5hbWUgJHtkYk5hbWV9IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBwYXJhbXMgb2YgdGhlIHF1ZXJ5IG9yIHByb2NlZHVyZS5cbiAgICBwcml2YXRlIGV4dHJhY3RRdWVyeVBhcmFtcyhxdWVyeSkge1xuICAgICAgICBsZXQgcGFyYW1zLCBhbGlhc1BhcmFtcztcbiAgICAgICAgYWxpYXNQYXJhbXMgPSBxdWVyeS5tYXRjaCgvW15cIidcXHdcXFxcXTpcXHMqXFx3K1xccyovZykgfHwgW107XG4gICAgICAgIGlmIChhbGlhc1BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IGFsaWFzUGFyYW1zLm1hcCh4ID0+ICgvWz18XFxXXS9nLnRlc3QoeCkpID8geC5yZXBsYWNlKC9cXFcvZywgJycpLnRyaW0oKSA6IHgudHJpbSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYXBwbGljYXRpb24gaW5mbyBzdWNoIGFzIHBhY2thZ2VOYW1lLCBhcHBOYW1lLCB2ZXJzaW9uTnVtYmVyLCB2ZXJzaW9uQ29kZS5cbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFwcEluZm8oKSB7XG4gICAgICAgIGNvbnN0IGFwcEluZm8gPSB7XG4gICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lOiAnJyxcbiAgICAgICAgICAgIHZlcnNpb25OdW1iZXI6ICcnLFxuICAgICAgICAgICAgdmVyc2lvbkNvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwVmVyc2lvbi5nZXRQYWNrYWdlTmFtZSgpXG4gICAgICAgICAgICAudGhlbihwYWNrYWdlTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgYXBwSW5mby5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0QXBwTmFtZSgpO1xuICAgICAgICAgICAgfSkudGhlbihhcHBOYW1lID0+IHtcbiAgICAgICAgICAgICAgICBhcHBJbmZvLm5hbWUgPSBhcHBOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0VmVyc2lvbk51bWJlcigpO1xuICAgICAgICAgICAgfSkudGhlbih2ZXJzaW9uTnVtYmVyID0+IHtcbiAgICAgICAgICAgICAgICBhcHBJbmZvLnZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0VmVyc2lvbkNvZGUoKTtcbiAgICAgICAgICAgIH0pLnRoZW4odmVyc2lvbkNvZGUgPT4ge1xuICAgICAgICAgICAgICAgIGFwcEluZm8udmVyc2lvbkNvZGUgPSAodmVyc2lvbkNvZGUgYXMgYW55KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwSW5mbztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2FsbGJhY2tzRm9yKGV2ZW50OiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5tYXAoYyA9PiB7XG4gICAgICAgICAgICBpZiAoY1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY1tldmVudF0uYmluZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpbGVzIHdpdGggZ2l2ZW4gcmVnZXggaW4gJ3d3dy9tZXRhZGF0YS9hcHAnYW5kIHJldHVybnMgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgSlNPTlxuICAgICAqIGNvbnRlbnQgcHJlc2VudCBpbiBlYWNoIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVSZWdleCByZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgZmlsZXMuXG4gICAgICogQHJldHVybnMgeyp9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1ldGFJbmZvKGZpbGVOYW1lUmVnZXg6IFJlZ0V4cCkge1xuICAgICAgICBjb25zdCBmb2xkZXIgPSBjb3Jkb3ZhLmZpbGUuYXBwbGljYXRpb25EaXJlY3RvcnkgKyBNRVRBX0xPQ0FUSU9OICsgJy8nO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5saXN0RmlsZXMoZm9sZGVyLCBmaWxlTmFtZVJlZ2V4KVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4gUHJvbWlzZS5hbGwoXy5tYXAoZmlsZXMsIGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29yZG92YSBGaWxlIHJlYWRlciBoYXMgYnVmZmVyIGlzc3VlcyB3aXRoIGxhcmdlIGZpbGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28sIHVzaW5nIGFqYXggdG8gcmV0cmlldmUgbG9jYWwganNvblxuICAgICAgICAgICAgICAgICAgICAgICAgJC5nZXRKU09OKHRyYW5zZm9ybUZpbGVVUkkoZm9sZGVyKSArIGZbJ25hbWUnXSwgZGF0YSA9PiByZXNvbHZlKGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIGVudGl0eSdzIGRhdGEgaXMgYnVuZGxlZCBhbG9uZyB3aXRoIGFwcGxpY2F0aW9uIGluc3RhbGxlci5cbiAgICAgKiBAcGFyYW0gZGF0YU1vZGVsTmFtZSBuYW1lIG9mIHRoZSBkYXRhIG1vZGVsXG4gICAgICogQHBhcmFtIGVudGl0eU5hbWUgbmFtZSBvZiB0aGUgZW50aXR5XG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCdW5kbGVkKGRhdGFNb2RlbE5hbWUsIGVudGl0eU5hbWUpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZShkYXRhTW9kZWxOYW1lLCBlbnRpdHlOYW1lKS50aGVuKHN0b3JlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5lbnRpdHlTY2hlbWEucHVsbENvbmZpZy5wdWxsVHlwZSA9PT0gUHVsbFR5cGUuQlVORExFRDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgbG9jYWwgZGF0YWJhc2Ugc2NoZW1hcyBmcm9tICpfZGF0YV9tb2RlbC5qc29uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyp9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggbWV0YWRhdGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkREJTY2hlbWFzKCk6IFByb21pc2U8TWFwPHN0cmluZywgREJJbmZvPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhSW5mbygvLitfZGF0YU1vZGVsXFwuanNvbiQvKVxuICAgICAgICAgICAgLnRoZW4oIChzY2hlbWFzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBEQkluZm8+KCk7XG4gICAgICAgICAgICAgICAgc2NoZW1hcyA9IGlzQXJyYXkoc2NoZW1hcykgPyBzY2hlbWFzIDogW3NjaGVtYXNdO1xuICAgICAgICAgICAgICAgIHNjaGVtYXMucHVzaChPRkZMSU5FX1dBVkVNQUtFUl9EQVRBQkFTRV9TQ0hFTUEpO1xuICAgICAgICAgICAgICAgIHNjaGVtYXMubWFwKHMgPT4gdGhpcy5jb21wYWN0U2NoZW1hKHMpKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChzID0+ICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVtzLnNjaGVtYS5uYW1lXSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgbmFtZWQgcXVlcmllcyBmcm9tICpfcXVlcnkuanNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gbWV0YWRhdGFcbiAgICAgKiBAcmV0dXJucyB7Kn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBtZXRhZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZE5hbWVkUXVlcmllcyhtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhSW5mbygvLitfcXVlcnlcXC5qc29uJC8pXG4gICAgICAgICAgICAudGhlbigocXVlcmllc0J5REJzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzQnlEQnMgPSBfLmlzQXJyYXkocXVlcmllc0J5REJzKSA/IHF1ZXJpZXNCeURCcyA6IFtxdWVyaWVzQnlEQnNdO1xuICAgICAgICAgICAgICAgIHF1ZXJpZXNCeURCcy5tYXAoZSA9PiBtZXRhZGF0YVtlLm5hbWVdLnF1ZXJpZXMgPSB0aGlzLmNvbXBhY3RRdWVyaWVzKGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG9mZmxpbmUgY29uZmlndXJhdGlvbiBmcm9tICpfb2ZmbGluZS5qc29uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBtZXRhZGF0YVxuICAgICAqIEByZXR1cm5zIHsqfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIG1ldGFkYXRhXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT2ZmbGluZUNvbmZpZyhtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhSW5mbygvLitfb2ZmbGluZVxcLmpzb24kLylcbiAgICAgICAgICAgIC50aGVuKGNvbmZpZ3MgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjb25maWdzLCBjb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goY29uZmlnLmVudGl0aWVzLCBlbnRpdHlDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXR5U2NoZW1hID0gXy5maW5kKG1ldGFkYXRhW2NvbmZpZy5uYW1lXS5zY2hlbWEuZW50aXRpZXMsIHNjaGVtYSA9PiBzY2hlbWEubmFtZSA9PT0gZW50aXR5Q29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5hc3NpZ25JbihlbnRpdHlTY2hlbWEsIGVudGl0eUNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nU3FsKHNxbGl0ZU9iamVjdDogU1FMaXRlT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbnNvbGUsXG4gICAgICAgICAgICBvcmlnaW5hbEV4ZWN1dGVTcWwgPSBzcWxpdGVPYmplY3QuZXhlY3V0ZVNxbDtcbiAgICAgICAgc3FsaXRlT2JqZWN0LmV4ZWN1dGVTcWwgPSAoc3FsLCBwYXJhbXMsIGxvZ091dHB1dD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IF8ubm93KCk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxFeGVjdXRlU3FsLmNhbGwoc3FsaXRlT2JqZWN0LCBzcWwsIHBhcmFtcykudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChsb2dPdXRwdXQgfHwgdGhpcy5fbG9nU3FsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakFyciA9IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgPSByZXN1bHQucm93cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyLnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTUUwgXCIlc1wiICB3aXRoIHBhcmFtcyAlTyB0b29rIFslZCBtc10uIEFuZCB0aGUgcmVzdWx0IGlzICVPJywgc3FsLCBwYXJhbXMsIF8ubm93KCkgLSBzdGFydFRpbWUsIG9iakFycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdTUUwgXCIlc1wiIHdpdGggcGFyYW1zICVPIGZhaWxlZCB3aXRoIGVycm9yIG1lc3NhZ2UgJXMnLCBzcWwsIHBhcmFtcywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNRTGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGJvb2xlYW4gZGF0YS4gSW5zdGVhZCBvZiB1c2luZyBib29sZWFuIHZhbHVlcywgZGF0YSB3aWxsIGJlIGNoYW5nZWQgdG8gMCBvciAxLlxuICAgICAqIElmIHRoZSB2YWx1ZSBpcyAndHJ1ZScsIHRoZW4gMSBpcyBzZXQgYXMgdmFsdWUuIElmIHZhbHVlIGlzIG5vdCAxIG5vciBudWxsLCB0aGVuIGNvbHVtbiB2YWx1ZSBpcyBzZXQgYXMgMC5cbiAgICAgKiBAcGFyYW0gZGJOYW1lXG4gICAgICogQHBhcmFtIHRhYmxlTmFtZVxuICAgICAqIEBwYXJhbSBjb2xOYW1lXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVCb29sZWFuRGF0YShkYk5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSkge1xuICAgICAgICBjb25zdCB0cnVlVG8xUXVlcnkgPSBgdXBkYXRlICR7ZXNjYXBlTmFtZSh0YWJsZU5hbWUpfSBzZXQgJHtlc2NhcGVOYW1lKGNvbE5hbWUpfSA9IDEgd2hlcmUgJHtlc2NhcGVOYW1lKGNvbE5hbWUpfSA9ICd0cnVlJ2AsXG4gICAgICAgICAgICBleGNlcHROdWxsQW5kMXRvMFF1ZXJ5ID0gYHVwZGF0ZSAke2VzY2FwZU5hbWUodGFibGVOYW1lKX0gc2V0ICR7ZXNjYXBlTmFtZShjb2xOYW1lKX0gPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtlc2NhcGVOYW1lKGNvbE5hbWUpfSBpcyBub3QgbnVsbCBhbmQgJHtlc2NhcGVOYW1lKGNvbE5hbWUpfSAhPSAxYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVNRTFF1ZXJ5KGRiTmFtZSwgdHJ1ZVRvMVF1ZXJ5KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5leGVjdXRlU1FMUXVlcnkoZGJOYW1lLCBleGNlcHROdWxsQW5kMXRvMFF1ZXJ5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZGF0YSB0byBzdXBwb3J0IFNRTGl0ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZURhdGEoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChfLm1hcCh0aGlzLmRhdGFiYXNlcywgZGF0YWJhc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKF8ubWFwKGRhdGFiYXNlLnNjaGVtYS5lbnRpdGllcywgZW50aXR5U2NoZW1hID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXy5tYXAoZW50aXR5U2NoZW1hLmNvbHVtbnMsIGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc3FsVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVCb29sZWFuRGF0YShkYXRhYmFzZS5zY2hlbWEubmFtZSwgZW50aXR5U2NoZW1hLm5hbWUsIGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbkRhdGFiYXNlKGRhdGFiYXNlOiBEQkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3FsaXRlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YWJhc2Uuc2NoZW1hLm5hbWUgKyAnLmRiJyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ2RlZmF1bHQnXG4gICAgICAgIH0pLnRoZW4oc3FsaXRlT2JqZWN0ID0+IHtcbiAgICAgICAgICAgIGRhdGFiYXNlLnNxbGl0ZU9iamVjdCA9IHNxbGl0ZU9iamVjdDtcbiAgICAgICAgICAgIHRoaXMubG9nU3FsKHNxbGl0ZU9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCBzdG9yZVByb21pc2VzID0gXy5tYXAoZGF0YWJhc2Uuc2NoZW1hLmVudGl0aWVzLCBlbnRpdHlTY2hlbWEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gbmV3IExvY2FsREJTdG9yZSh0aGlzLmRldmljZUZpbGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgc3FsaXRlT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3RvcmVQcm9taXNlcykudGhlbihzdG9yZXMgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChzdG9yZXMsIHN0b3JlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Uuc3RvcmVzW3N0b3JlLmVudGl0eVNjaGVtYS5lbnRpdHlOYW1lXSA9IHN0b3JlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGFwcCBpcyBvcGVuZWQgZm9yIGZpcnN0IHRpbWUgIGFmdGVyIGEgZnJlc2ggaW5zdGFsbCBvciB1cGRhdGUsIHRoZW4gb2xkIGRhdGFiYXNlcyBhcmUgcmVtb3ZlZCBhbmRcbiAgICAgKiBuZXcgZGF0YWJhc2VzIGFyZSBjcmVhdGVkIHVzaW5nIGJ1bmRsZWQgZGF0YWJhc2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyp9IGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdHJ1ZSwgaWYgdGhlIGRhdGFiYXNlcyBhcmUgbmV3bHkgY3JlYXRlZCBvciByZXNvbHZlZCB3aXRoIGZhbHNlXG4gICAgICogaWYgZXhpc3RpbmcgZGF0YWJhc2VzIGFyZSBiZWluZyB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0VXBEYXRhYmFzZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZVNlcnZpY2UuZ2V0QXBwQnVpbGRUaW1lKClcbiAgICAgICAgICAgIC50aGVuKChidWlsZFRpbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYkluZm8gPSB0aGlzLmRldmljZVNlcnZpY2UuZ2V0RW50cnkoJ2RhdGFiYXNlJykgfHwge307XG4gICAgICAgICAgICAgICAgaWYgKCFkYkluZm8ubGFzdEJ1aWxkVGltZSB8fCBkYkluZm8ubGFzdEJ1aWxkVGltZSAhPT0gYnVpbGRUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFuQW5kQ29weURhdGFiYXNlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmZvLmxhc3RCdWlsZFRpbWUgPSBidWlsZFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlU2VydmljZS5zdG9yZUVudHJ5KCdkYXRhYmFzZScsIGRiSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
855
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZGItbWFuYWdlbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9iaWxlL29mZmxpbmUvc3JjL3NlcnZpY2VzL2xvY2FsLWRiLW1hbmFnZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUUzRSxPQUFPLEVBQ0gsUUFBUSxFQUNSLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFNBQVMsRUFDVCxLQUFLLEVBQ0wsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUE4QixRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RixPQUFPLEVBQ0gsS0FBSyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxHQUFHLEVBQ0gsR0FBRyxF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RkFDbEIsd0JBQXdCO2NBRHBDLFVBQVU7ZUFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcFZlcnNpb24gfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvYXBwLXZlcnNpb24vbmd4JztcbmltcG9ydCB7IEZpbGUgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZmlsZS9uZ3gnO1xuaW1wb3J0IHsgU1FMaXRlLCBTUUxpdGVPYmplY3QgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvc3FsaXRlL25neCc7XG5cbmltcG9ydCB7XG4gICAgRGF0YVR5cGUsXG4gICAgREVGQVVMVF9GT1JNQVRTLFxuICAgIGV4ZWN1dGVQcm9taXNlQ2hhaW4sXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNBbmRyb2lkLFxuICAgIGlzSW9zLFxuICAgIG5vb3AsXG4gICAgdG9Qcm9taXNlLFxuICAgIHRyYW5zZm9ybUZpbGVVUklcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHsgRGV2aWNlRmlsZVNlcnZpY2UsIERldmljZVNlcnZpY2UgfSBmcm9tICdAd20vbW9iaWxlL2NvcmUnO1xuaW1wb3J0IHsgU2VjdXJpdHlTZXJ2aWNlIH0gZnJvbSAnQHdtL3NlY3VyaXR5JztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICdAd20vdmFyaWFibGVzJztcblxuaW1wb3J0IHsgTG9jYWxLZXlWYWx1ZVNlcnZpY2UgfSBmcm9tICcuL2xvY2FsLWtleS12YWx1ZS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsREJTdG9yZSB9IGZyb20gJy4uL21vZGVscy9sb2NhbC1kYi1zdG9yZSc7XG5pbXBvcnQgeyBlc2NhcGVOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mbywgREJJbmZvLCBFbnRpdHlJbmZvLCBOYW1lZFF1ZXJ5SW5mbywgUHVsbFR5cGUgfSBmcm9tICcuLi9tb2RlbHMvY29uZmlnJztcbmltcG9ydCB7XG4gICAgY2hhaW4sXG4gICAgZmluZCxcbiAgICBmb3JFYWNoLFxuICAgIGlzRW1wdHksXG4gICAgaXNVbmRlZmluZWQsXG4gICAgbWFwLFxuICAgIG5vdyxcbiAgICBwYXJzZUludCxcbiAgICByZXBsYWNlLFxuICAgIHRvVXBwZXIsXG4gICAgdG9TdHJpbmcsXG4gICAgdmFsdWVzLFxuICAgIGlzQXJyYXksIGFzc2lnbkluXG59IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmRlY2xhcmUgY29uc3QgbW9tZW50O1xuZGVjbGFyZSBjb25zdCBjb3Jkb3ZhO1xuZGVjbGFyZSBjb25zdCBaZWVwO1xuXG5jb25zdCAgTkVYVF9JRF9DT1VOVCA9ICdsb2NhbERCU3RvcmUubmV4dElkQ291bnQnO1xuY29uc3QgTUVUQV9MT0NBVElPTiA9ICd3d3cvbWV0YWRhdGEvYXBwJztcbmNvbnN0IE9GRkxJTkVfV0FWRU1BS0VSX0RBVEFCQVNFX1NDSEVNQSA9IHtcbiAgICBuYW1lOiAnd2F2ZW1ha2VyJyxcbiAgICB2ZXJzaW9uOiAxLFxuICAgIGlzSW50ZXJuYWw6IHRydWUsXG4gICAgdGFibGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdrZXlfdmFsdWUnLFxuICAgICAgICAgICAgZW50aXR5TmFtZTogJ2tleS12YWx1ZScsXG4gICAgICAgICAgICBjb2x1bW5zOiBbe1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ2lkJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvclR5cGUgOiAnZGF0YWJhc2VJZGVudGl0eScsXG4gICAgICAgICAgICAgICAgc3FsVHlwZSA6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IHRydWVcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdrZXknLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdrZXknXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICd2YWx1ZSdcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdvZmZsaW5lQ2hhbmdlTG9nJyxcbiAgICAgICAgICAgIGVudGl0eU5hbWU6ICdvZmZsaW5lQ2hhbmdlTG9nJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IFt7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdpZCcsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yVHlwZTogJ2RhdGFiYXNlSWRlbnRpdHknLFxuICAgICAgICAgICAgICAgIHNxbFR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IHRydWVcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2VydmljZScsXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAnc2VydmljZSdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnb3BlcmF0aW9uJyxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdvcGVyYXRpb24nXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3BhcmFtcycsXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiAncGFyYW1zJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0aW1lc3RhbXAnLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3RpbWVzdGFtcCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaGFzRXJyb3InLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ2hhc0Vycm9yJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdlcnJvck1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogJ2Vycm9yTWVzc2FnZSdcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICBdXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxCYWNrIHtcbiAgICBvbkRiQ3JlYXRlPzogKGluZm86IGFueSkgPT4gYW55O1xuICAgIHBvc3RJbXBvcnQ/OiAoaW1wb3J0Rm9sZGVyUGF0aDogc3RyaW5nLCBtZXRhSW5mbzogYW55KSA9PiBhbnk7XG4gICAgcHJlRXhwb3J0PzogKGZvbGRlclRvRXhwb3J0RnVsbFBhdGg6IHN0cmluZywgbWV0YUluZm86IGFueSkgPT4gYW55O1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBMb2NhbERCTWFuYWdlbWVudFNlcnZpY2Uge1xuICAgIHN0YXRpYyByZWFkb25seSBTRVJWSUNFX05BTUUgPSAnTG9jYWxEQk1hbmFnZW1lbnRTZXJ2aWNlJztcbiAgICBwcml2YXRlIGNhbGxiYWNrczogQ2FsbEJhY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgZGJJbnN0YWxsRGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkYkluc3RhbGxEaXJlY3RvcnlOYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkYkluc3RhbGxQYXJlbnREaXJlY3Rvcnk6IHN0cmluZztcbiAgICBwcml2YXRlIGRhdGFiYXNlczogTWFwPHN0cmluZywgREJJbmZvPjtcbiAgICBwcml2YXRlIF9sb2dTcWwgPSBmYWxzZTtcbiAgICBwdWJsaWMgbmV4dElkID0gMTAwMDAwMDAwMDAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3lzdGVtUHJvcGVydGllcyA9IHtcbiAgICAgICAgJ1VTRVJfSUQnIDoge1xuICAgICAgICAgICAgJ25hbWUnIDogJ1VTRVJfSUQnLFxuICAgICAgICAgICAgJ3ZhbHVlJyA6ICgpID0+IHRoaXMuc2VjdXJpdHlTZXJ2aWNlLmdldExvZ2dlZEluVXNlcigpLnRoZW4oIHVzZXJJbmZvID0+IHVzZXJJbmZvLnVzZXJJZClcbiAgICAgICAgfSxcbiAgICAgICAgJ1VTRVJfTkFNRScgOiB7XG4gICAgICAgICAgICAnbmFtZScgOiAnVVNFUl9OQU1FJyxcbiAgICAgICAgICAgICd2YWx1ZScgOiAoKSA9PiB0aGlzLnNlY3VyaXR5U2VydmljZS5nZXRMb2dnZWRJblVzZXIoKS50aGVuKCB1c2VySW5mbyA9PiB1c2VySW5mby51c2VyTmFtZSlcbiAgICAgICAgfSxcbiAgICAgICAgJ0RBVEVfVElNRScgOiB7XG4gICAgICAgICAgICAnbmFtZScgOiAnREFURV9USU1FJyxcbiAgICAgICAgICAgICd2YWx1ZScgOiAoKSA9PiBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tRERUaGg6bW06c3MnKVxuICAgICAgICB9LFxuICAgICAgICAnREFURScgOiB7XG4gICAgICAgICAgICAnbmFtZScgOiAnQ1VSUkVOVF9EQVRFJyxcbiAgICAgICAgICAgICd2YWx1ZScgOiAoKSA9PiBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICB9LFxuICAgICAgICAnVElNRScgOiB7XG4gICAgICAgICAgICAnbmFtZScgOiAnVElNRScsXG4gICAgICAgICAgICAndmFsdWUnIDogKCkgPT4gbW9tZW50KCkuZm9ybWF0KCdoaDptbTpzcycpXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgYXBwVmVyc2lvbjogQXBwVmVyc2lvbixcbiAgICAgICAgcHJpdmF0ZSBkZXZpY2VTZXJ2aWNlOiBEZXZpY2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRldmljZUZpbGVTZXJ2aWNlOiBEZXZpY2VGaWxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlOiBGaWxlLFxuICAgICAgICBwcml2YXRlIGxvY2FsS2V5VmFsdWVTZXJ2aWNlOiBMb2NhbEtleVZhbHVlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZWN1cml0eVNlcnZpY2U6IFNlY3VyaXR5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzcWxpdGU6IFNRTGl0ZVxuICAgICkge31cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyBhbGwgZGF0YWJhc2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH0gYSBwcm9taXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gQmVmb3JlIGNsb3NpbmcgZGF0YWJhc2VzLCBnaXZlIHNvbWUgdGltZSBmb3IgdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIChpZiBhbnkpLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NlUHJvbWlzZXMgPSBtYXAodmFsdWVzKHRoaXMuZGF0YWJhc2VzKSwgZGIgPT4gZGIuc3FsaXRlT2JqZWN0LmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGNsb3NlUHJvbWlzZXMpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dElkQ291bnQoKSB7XG4gICAgICAgIHRoaXMubmV4dElkID0gdGhpcy5uZXh0SWQgKyAxO1xuICAgICAgICB0aGlzLmxvY2FsS2V5VmFsdWVTZXJ2aWNlLnB1dChORVhUX0lEX0NPVU5ULCB0aGlzLm5leHRJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIG5hbWVkIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRiTmFtZSBuYW1lIG9mIGRhdGFiYXNlIG9uIHdoaWNoIHRoZSBuYW1lZCBxdWVyeSBoYXMgdG8gYmUgcnVuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5TmFtZSBuYW1lIG9mIHRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBhIHByb21pc2UuXG4gICAgICovXG4gICAgcHVibGljIGV4ZWN1dGVOYW1lZFF1ZXJ5KGRiTmFtZTogc3RyaW5nLCBxdWVyeU5hbWU6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcbiAgICAgICAgbGV0IHF1ZXJ5RGF0YSwgcGFyYW1Qcm9taXNlcztcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFiYXNlc1tkYk5hbWVdIHx8ICF0aGlzLmRhdGFiYXNlc1tkYk5hbWVdLnF1ZXJpZXNbcXVlcnlOYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBRdWVyeSBieSBuYW1lICcgJHtxdWVyeU5hbWV9ICcgTm90IEZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlEYXRhID0gdGhpcy5kYXRhYmFzZXNbZGJOYW1lXS5xdWVyaWVzW3F1ZXJ5TmFtZV07XG4gICAgICAgIHBhcmFtUHJvbWlzZXMgPSBjaGFpbihxdWVyeURhdGEucGFyYW1zKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAudmFyaWFibGVUeXBlICE9PSAnUFJPTVBUJylcbiAgICAgICAgICAgIC5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLnN5c3RlbVByb3BlcnRpZXNbcC52YXJpYWJsZVR5cGVdLnZhbHVlKHAubmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9Qcm9taXNlKHBhcmFtVmFsdWUpLnRoZW4odiA9PiBwYXJhbXNbcC5uYW1lXSA9IHYpO1xuICAgICAgICAgICAgfSkudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBhcmFtUHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcGFyYW1zID0gbWFwKHF1ZXJ5RGF0YS5wYXJhbXMsIHAgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNxbGl0ZSB3aWxsIGFjY2VwdCBEYXRlVGltZSB2YWx1ZSBhcyBiZWxvdyBmb3JtYXQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNbcC5uYW1lXSAhPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgJiYgKHAudHlwZSA9PT0gRGF0YVR5cGUuREFURVRJTUUgfHwgcC50eXBlID09PSBEYXRhVHlwZS5MT0NBTERBVEVUSU1FKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShwYXJhbXNbcC5uYW1lXSwgcC50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc3FsaXRlIGFjY2VwdHMgdGhlIGJvb2wgdmFsIGFzIDEsMCBoZW5jZSBjb252ZXJ0IHRoZSBib29sZWFuIHZhbHVlIHRvIG51bWJlclxuICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IERhdGFUeXBlLkJPT0xFQU4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJvb2xUb0ludChwYXJhbXNbcC5uYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXNbcC5uYW1lXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVNRTFF1ZXJ5KGRiTmFtZSwgcXVlcnlEYXRhLnF1ZXJ5LCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0Um93LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KHJlc3VsdC5yb3dzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb3cgPSByZXN1bHQucm93c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRUcmFuc2Zvcm0gPSBmaW5kKHF1ZXJ5RGF0YS5yZXNwb25zZS5wcm9wZXJ0aWVzLCBwID0+ICFmaXJzdFJvdy5oYXNPd25Qcm9wZXJ0eShwLmZpZWxkTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChuZWVkVHJhbnNmb3JtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yb3dzID0gbWFwKHJlc3VsdC5yb3dzLCByb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJvdyA9IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93V2l0aFVwcGVyS2V5cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIG1ha2Ugc2VhcmNoIGZvciBkYXRhIGFzIGNhc2UtaW5zZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaChyb3csICh2LCBrKSA9PiByb3dXaXRoVXBwZXJLZXlzW2sudG9VcHBlckNhc2UoKV0gPSB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaChxdWVyeURhdGEucmVzcG9uc2UucHJvcGVydGllcywgcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgdHlwZVJlZiBzcGVjaWZpZWQgaW4gcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BUeXBlID0gZXh0cmFjdFR5cGUocC5maWVsZFR5cGUudHlwZVJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXRWYWx1ZSA9IERFRkFVTFRfRk9STUFUU1t0b1VwcGVyKHByb3BUeXBlKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbCA9IHJvd1twLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsICYmIHR5cGVvZiBmaWVsZFZhbCAhPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvcFR5cGUgPT09IERhdGFUeXBlLkRBVEVUSU1FIHx8IHByb3BUeXBlID09PSBEYXRhVHlwZS5MT0NBTERBVEVUSU1FIHx8IHByb3BUeXBlID09PSBEYXRhVHlwZS5EQVRFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb21lbnQoZmllbGRWYWwpLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbcC5uYW1lXSA9IGZvcm1hdERhdGUoZmllbGRWYWwsIHByb3BUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vbWVudChmaWVsZFZhbCwgJ0hIOm1tJykuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBpbiBISDptbTpzcyBmb3JtYXQsIGl0IHJldHVybnMgYSB3cm9uZyBkYXRlLiBTbyBhcHBlbmQgdGhlIGRhdGUgdG8gdGhlIGdpdmVuIHZhbHVlIHRvIGdldCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1twLm5hbWVdID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJykgKyAnVCcgKyBmaWVsZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFR5cGUgPT09IERhdGFUeXBlLkJPT0xFQU4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbcC5uYW1lXSA9IHRoaXMuY29udmVydEludFRvQm9vbChmaWVsZFZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dXaXRoVXBwZXJLZXlzW3AubmFtZUluVXBwZXJDYXNlXSA9IHJvd1twLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSb3dbcC5uYW1lXSA9IHJvd1twLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSb3dbcC5maWVsZE5hbWVdID0gcm93W3AuZmllbGROYW1lXSB8fCByb3dXaXRoVXBwZXJLZXlzW3AubmFtZUluVXBwZXJDYXNlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZXhwb3J0IHRoZSBkYXRhYmFzZXMgaW4gYSB6aXAgZm9ybWF0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH0gYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB6aXAgaXMgY3JlYXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwb3J0REIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyVG9FeHBvcnQgPSAnb2ZmbGluZV90ZW1wXycgKyBub3coKSxcbiAgICAgICAgICAgICAgICBmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoID0gY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5ICsgZm9sZGVyVG9FeHBvcnQgKyAnLycsXG4gICAgICAgICAgICAgICAgemlwRmlsZU5hbWUgPSAnX29mZmxpbmVfZGF0YS56aXAnLFxuICAgICAgICAgICAgICAgIG1ldGFJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBhcHA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIE9TOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE9uOiAwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB6aXBEaXJlY3Rvcnk7XG4gICAgICAgICAgICBpZiAoaXNJb3MoKSkge1xuICAgICAgICAgICAgICAgIC8vIEluIElPUywgc2F2ZSB6aXAgdG8gZG9jdW1lbnRzIGRpcmVjdG9yeSBzbyB0aGF0IHVzZXIgY2FuIGV4cG9ydCB0aGUgZmlsZSBmcm9tIElPUyBkZXZpY2VzIHVzaW5nIGlUVU5FUy5cbiAgICAgICAgICAgICAgICB6aXBEaXJlY3RvcnkgPSBjb3Jkb3ZhLmZpbGUuZG9jdW1lbnRzRGlyZWN0b3J5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBBbmRyb2lkLCBzYXZlIHppcCB0byBkb3dubG9hZCBkaXJlY3RvcnkuXG4gICAgICAgICAgICAgICAgemlwRGlyZWN0b3J5ID0gY29yZG92YS5maWxlLmV4dGVybmFsUm9vdERpcmVjdG9yeSArICdEb3dubG9hZC8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZvbGRlciB0byBjb3B5IGFsbCB0aGUgY29udGVudCB0byBleHBvcnRcbiAgICAgICAgICAgIHRoaXMuZmlsZS5jcmVhdGVEaXIoY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5LCBmb2xkZXJUb0V4cG9ydCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IGRhdGFiYXNlcyB0byB0ZW1wb3JhcnkgZm9sZGVyIGZvciBleHBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5jb3B5RGlyKHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5LCB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeU5hbWUsIGZvbGRlclRvRXhwb3J0RnVsbFBhdGgsICdkYXRhYmFzZXMnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgbWV0YSBpbmZvIHRvIGlkZW50aWZ5IHRoZSB6aXAgYW5kIG90aGVyIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGFwcEluZm8gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLmFwcCA9IChhcHBJbmZvIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW9zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZm8uT1MgPSAnSU9TJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQW5kcm9pZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLk9TID0gJ0FORFJPSUQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mby5jcmVhdGVkT24gPSBub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YUluZm87XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IGV4ZWN1dGVQcm9taXNlQ2hhaW4odGhpcy5nZXRDYWxsYmFja3NGb3IoJ3ByZUV4cG9ydCcpLCBbZm9sZGVyVG9FeHBvcnRGdWxsUGF0aCwgbWV0YUluZm9dKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBtZXRhIGRhdGEgdG8gTUVUQS5qc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS53cml0ZUZpbGUoZm9sZGVyVG9FeHBvcnRGdWxsUGF0aCwgJ01FVEEuanNvbicsIEpTT04uc3RyaW5naWZ5KG1ldGFJbmZvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGFyZSBuYW1lIHRvIHVzZSBmb3IgdGhlIHppcC5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcE5hbWUgPSBtZXRhSW5mby5hcHAubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXBwTmFtZSA9IGFwcE5hbWUucmVwbGFjZSgvXFxzKy9nLCAnXycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5uZXdGaWxlTmFtZSh6aXBEaXJlY3RvcnksIGFwcE5hbWUgKyB6aXBGaWxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZpbGVOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBaaXAgdGhlIHRlbXBvcmFyeSBmb2xkZXIgZm9yIGV4cG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocnMsIHJlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFplZXAuemlwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gOiBmb2xkZXJUb0V4cG9ydEZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gICA6IHppcERpcmVjdG9yeSArIGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICgpID0+IHJzKHppcERpcmVjdG9yeSArIGZpbGVOYW1lKSwgcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAgICAgICAgICAgLmNhdGNoKG5vb3ApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGVtcG9yYXJ5IGZvbGRlciBmb3IgZXhwb3J0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLnJlbW92ZURpcihjb3Jkb3ZhLmZpbGUuY2FjaGVEaXJlY3RvcnkgKyBmb2xkZXJUb0V4cG9ydCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICByZXR1cm5zIHN0b3JlIGJvdW5kIHRvIHRoZSBkYXRhTW9kZWxOYW1lIGFuZCBlbnRpdHlOYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFNb2RlbE5hbWVcbiAgICAgKiBAcGFyYW0gZW50aXR5TmFtZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdG9yZShkYXRhTW9kZWxOYW1lOiBzdHJpbmcsIGVudGl0eU5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9jYWxEQlN0b3JlPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhYmFzZXNbZGF0YU1vZGVsTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZGF0YWJhc2VzW2RhdGFNb2RlbE5hbWVdLnN0b3Jlc1tlbnRpdHlOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoYHN0b3JlIHdpdGggbmFtZScke2VudGl0eU5hbWV9JyBpbiBkYXRhbW9kZWwgJyR7ZGF0YU1vZGVsTmFtZX0nIGlzIG5vdCBmb3VuZGApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSB0aGUgZGF0YWJhc2VzIHdpdGggdGhlIGZpbGVzIHByb3ZpZGVkIGluIHppcC4gSWYgaW1wb3J0IGdldHMgZmFpbGVkLFxuICAgICAqIHRoZW4gYXBwIHJldmVydHMgYmFjayB0byB1c2Ugb2xkIGRhdGFiYXNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB6aXBQYXRoIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldmVydElmRmFpbHMgSWYgdHJ1ZSwgdGhlbiBhIGJhY2t1cCBpcyBjcmVhdGVkIGFuZCB3aGVuIGltcG9ydCBmYWlscywgYmFja3VwIGlzIHJldmVydGVkIGJhY2suXG4gICAgICogQHJldHVybnMge29iamVjdH0gYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB6aXAgaXMgY3JlYXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW1wb3J0REIoemlwUGF0aDogc3RyaW5nLCByZXZlcnRJZkZhaWxzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRGb2xkZXIgPSAnb2ZmbGluZV90ZW1wXycgKyBub3coKSxcbiAgICAgICAgICAgICAgICBpbXBvcnRGb2xkZXJGdWxsUGF0aCA9IGNvcmRvdmEuZmlsZS5jYWNoZURpcmVjdG9yeSArIGltcG9ydEZvbGRlciArICcvJztcbiAgICAgICAgICAgIGxldCB6aXBNZXRhO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZvbGRlciB0byB1bnppcCB0aGUgY29udGVudHMgb2YgdGhlIHppcC5cbiAgICAgICAgICAgIHRoaXMuZmlsZS5jcmVhdGVEaXIoY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5LCBpbXBvcnRGb2xkZXIsIGZhbHNlKVxuICAgICAgICAgICAgICAgIC50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocnMsIHJlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnppcCB0byB0ZW1wb3JhcnkgbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFplZXAudW56aXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IHppcFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86IGltcG9ydEZvbGRlckZ1bGxQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBycywgcmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIHJlYWQgbWV0YSBkYXRhIGFuZCBhbGxvdyBpbXBvcnQgb25seSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBmcm9tIHdoaWNoIHRoaXMgemlwIGlzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGlzIGFwcCBhcmUgc2FtZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlLnJlYWRBc1RleHQoaW1wb3J0Rm9sZGVyRnVsbFBhdGgsICdNRVRBLmpzb24nKVxuICAgICAgICAgICAgICAgICAgICAudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgemlwTWV0YSA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEFwcEluZm8oKTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGFwcEluZm8gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXppcE1ldGEuYXBwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ21ldGEgaW5mb3JtYXRpb24gaXMgbm90IGZvdW5kIGluIHppcCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh6aXBNZXRhLmFwcC5wYWNrYWdlTmFtZSAhPT0gYXBwSW5mby5wYWNrYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdkYXRhYmFzZSB6aXAgb2YgYXBwIHdpdGggc2FtZSBwYWNrYWdlIG5hbWUgY2FuIG9ubHkgYmUgaW1wb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJhY2t1cFppcDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnRJZkZhaWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGJhY2t1cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cG9ydERCKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocGF0aCA9PiBiYWNrdXBaaXAgPSBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgZXhpc3RpbmcgZGF0YWJhc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5yZW1vdmVEaXIodGhpcy5kYkluc3RhbGxEaXJlY3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW1wb3J0ZWQgZGF0YWJhc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlLmNvcHlEaXIoaW1wb3J0Rm9sZGVyRnVsbFBhdGgsICdkYXRhYmFzZXMnLCB0aGlzLmRiSW5zdGFsbFBhcmVudERpcmVjdG9yeSwgdGhpcy5kYkluc3RhbGxEaXJlY3RvcnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZGF0YWJhc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGF0YWJhc2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gZXhlY3V0ZVByb21pc2VDaGFpbih0aGlzLmdldENhbGxiYWNrc0ZvcigncG9zdEltcG9ydCcpLCBbaW1wb3J0Rm9sZGVyRnVsbFBhdGgsIHppcE1ldGFdKSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2t1cFppcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLnJlbW92ZUZpbGUoYmFja3VwWmlwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2t1cFppcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydERCKGJhY2t1cFppcCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlRmlsZVNlcnZpY2UucmVtb3ZlRmlsZShiYWNrdXBaaXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAgICAgICAuY2F0Y2gobm9vcClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5yZW1vdmVEaXIoY29yZG92YS5maWxlLmNhY2hlRGlyZWN0b3J5ICsgaW1wb3J0Rm9sZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YU1vZGVsTmFtZSBOYW1lIG9mIHRoZSBkYXRhIG1vZGVsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVudGl0eU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiBOYW1lIG9mIHRoZSBvcGVyYXRpb24gKFJFQUQsIElOU0VSVCwgVVBEQVRFLCBERUxFVEUpXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGFzIHBlciBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wZXJhdGlvbkFsbG93ZWQoZGF0YU1vZGVsTmFtZTogc3RyaW5nLCBlbnRpdHlOYW1lOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKGRhdGFNb2RlbE5hbWUsIGVudGl0eU5hbWUpLnRoZW4oIHN0b3JlID0+IHtcbiAgICAgICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnUkVBRCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuZW50aXR5U2NoZW1hLnB1c2hDb25maWcucmVhZEVuYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnSU5TRVJUJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5lbnRpdHlTY2hlbWEucHVzaENvbmZpZy5pbnNlcnRFbmFibGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ1VQREFURScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuZW50aXR5U2NoZW1hLnB1c2hDb25maWcudXBkYXRlRW5hYmxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdERUxFVEUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmVudGl0eVNjaGVtYS5wdXNoQ29uZmlnLmRlbGV0ZUVuYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWREYXRhYmFzZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbGV0IG5ld0RhdGFiYXNlc0NyZWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWJhc2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZGF0YWJhc2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0lvcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYkluc3RhbGxEaXJlY3RvcnlOYW1lID0gJ0xvY2FsRGF0YWJhc2UnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5ID0gY29yZG92YS5maWxlLmFwcGxpY2F0aW9uU3RvcmFnZURpcmVjdG9yeSArICAnTGlicmFyeS8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeU5hbWUgPSAnZGF0YWJhc2VzJztcbiAgICAgICAgICAgICAgICB0aGlzLmRiSW5zdGFsbFBhcmVudERpcmVjdG9yeSA9IGNvcmRvdmEuZmlsZS5hcHBsaWNhdGlvblN0b3JhZ2VEaXJlY3Rvcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeSA9IHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5ICsgdGhpcy5kYkluc3RhbGxEaXJlY3RvcnlOYW1lO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBEQkluZm8+KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRVcERhdGFiYXNlcygpXG4gICAgICAgICAgICAgICAgLnRoZW4oIGZsYWcgPT4gbmV3RGF0YWJhc2VzQ3JlYXRlZCA9IGZsYWcpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkREJTY2hlbWFzKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4obWV0YWRhdGEgPT4gdGhpcy5sb2FkTmFtZWRRdWVyaWVzKG1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB0aGlzLmxvYWRPZmZsaW5lQ29uZmlnKG1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChtYXAobWV0YWRhdGEsIGRiTWV0YWRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkRhdGFiYXNlKGRiTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZGF0YWJhc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlc1tkYk1ldGFkYXRhLnNjaGVtYS5uYW1lXSA9IGRhdGFiYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKCd3YXZlbWFrZXInLCAna2V5LXZhbHVlJykudGhlbiggc3RvcmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEtleVZhbHVlU2VydmljZS5pbml0KHN0b3JlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsS2V5VmFsdWVTZXJ2aWNlLmdldChORVhUX0lEX0NPVU5UKS50aGVuKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRJZCA9IHZhbCB8fCB0aGlzLm5leHRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RhdGFiYXNlc0NyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZURhdGEoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZGlzYWJsZUZvcmVpZ25LZXlzKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXZpY2VTZXJ2aWNlLmdldEFwcEJ1aWxkVGltZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGRiU2VlZENyZWF0aW9uVGltZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUHJvbWlzZUNoYWluKG1hcCh0aGlzLmNhbGxiYWNrcywgJ29uRGJDcmVhdGUnKSwgW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhYmFzZXMnIDogdGhpcy5kYXRhYmFzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGJDcmVhdGVkT24nOiBub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYlNlZWRDcmVhdGVkT24nIDogZGJTZWVkQ3JlYXRpb25UaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHRoaXMuZGF0YWJhc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdXNpbmcgdGhpcyBmdW5jdGlvbiBvbmUgY2FuIGxpc3RlbiBldmVudHMgc3VjaCBhcyBvbkRiQ3JlYXRlLCAncHJlRXhwb3J0JyBhbmQgJ3Bvc3RJbXBvcnQnLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGxpc3RlbmVyIGFuIG9iamVjdCB3aXRoIGZ1bmN0aW9ucyBtYXBwZWQgdG8gZXZlbnQgbmFtZXMuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyQ2FsbGJhY2sobGlzdGVuZXI6IENhbGxCYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dTUWwoZmxhZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9sb2dTcWwgPSBmbGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYW55IGV4aXN0aW5nIGRhdGFiYXNlcyAoZXhjZXB0IHdhdmVtYWtlciBkYikgYW5kIGNvcGllcyB0aGUgZGF0YWJhc2VzIHRoYXQgYXJlIHBhY2thZ2VkIHdpdGggdGhlIGFwcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHByaXZhdGUgY2xlYW5BbmRDb3B5RGF0YWJhc2VzKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGRiU2VlZEZvbGRlciA9IGNvcmRvdmEuZmlsZS5hcHBsaWNhdGlvbkRpcmVjdG9yeSArIE1FVEFfTE9DQVRJT047XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGUuY3JlYXRlRGlyKHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5LCB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeU5hbWUsIGZhbHNlKVxuICAgICAgICAgICAgLmNhdGNoKG5vb3ApXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLmxpc3RGaWxlcyh0aGlzLmRiSW5zdGFsbERpcmVjdG9yeSwgLy4rXFwuZGIkLykpXG4gICAgICAgICAgICAudGhlbihmaWxlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVzLm1hcChmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmWyduYW1lJ10gIT09ICd3YXZlbWFrZXIuZGInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5yZW1vdmVGaWxlKHRoaXMuZGJJbnN0YWxsRGlyZWN0b3J5LCBmWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCAoKSA9PiB0aGlzLmRldmljZUZpbGVTZXJ2aWNlLmxpc3RGaWxlcyhkYlNlZWRGb2xkZXIsIC8uK1xcLmRiJC8pKVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGUuY3JlYXRlRGlyKHRoaXMuZGJJbnN0YWxsUGFyZW50RGlyZWN0b3J5LCB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeU5hbWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKG5vb3ApXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBQcm9taXNlLmFsbChmaWxlcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPT4gdGhpcy5maWxlLmNvcHlGaWxlKGRiU2VlZEZvbGRlciwgZlsnbmFtZSddLCB0aGlzLmRiSW5zdGFsbERpcmVjdG9yeSwgZlsnbmFtZSddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBpY2tzIGVzc2VudGlhbCBkZXRhaWxzIGZyb20gdGhlIGdpdmVuIHNjaGVtYS5cbiAgICBwcml2YXRlIGNvbXBhY3RFbnRpdHlTY2hlbWEoc2NoZW1hLCBlbnRpdHksIHRyYW5zZm9ybWVkU2NoZW1hcyk6IEVudGl0eUluZm8ge1xuICAgICAgICBjb25zdCByZXFFbnRpdHkgPSB0cmFuc2Zvcm1lZFNjaGVtYXNbZW50aXR5WydlbnRpdHlOYW1lJ11dIGFzIEVudGl0eUluZm87XG4gICAgICAgIHJlcUVudGl0eS5lbnRpdHlOYW1lID0gZW50aXR5WydlbnRpdHlOYW1lJ107XG4gICAgICAgIHJlcUVudGl0eS5uYW1lID0gZW50aXR5WyduYW1lJ107XG4gICAgICAgIHJlcUVudGl0eS5jb2x1bW5zID0gW107XG4gICAgICAgIGVudGl0eS5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBjb2wuY29sdW1uVmFsdWUgPyBjb2wuY29sdW1uVmFsdWUuZGVmYXVsdFZhbHVlIDogJyc7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gY29sLnNxbFR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgIWNvbC5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXNFbXB0eShkZWZhdWx0VmFsdWUpID8gbnVsbCA6IHBhcnNlSW50KGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzRW1wdHkoZGVmYXVsdFZhbHVlKSA/IG51bGwgOiAoZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgPyAxIDogMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzRW1wdHkoZGVmYXVsdFZhbHVlKSA/IG51bGwgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXFFbnRpdHkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb2xbJ25hbWUnXSxcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGNvbFsnZmllbGROYW1lJ10sXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yVHlwZTogY29sWydnZW5lcmF0b3JUeXBlJ10sXG4gICAgICAgICAgICAgICAgc3FsVHlwZTogY29sWydzcWxUeXBlJ10sXG4gICAgICAgICAgICAgICAgcHJpbWFyeUtleTogY29sWydwcmltYXJ5S2V5J10sXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3JFYWNoKGVudGl0eS5yZWxhdGlvbnMsIHIgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldEVudGl0eVNjaGVtYSwgdGFyZ2V0RW50aXR5LCBjb2wsIHNvdXJjZUNvbHVtbiwgbWFwcGluZztcbiAgICAgICAgICAgIGlmIChyLmNhcmRpbmFsaXR5ID09PSAnTWFueVRvT25lJyB8fCByLmNhcmRpbmFsaXR5ID09PSAnT25lVG9PbmUnKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RW50aXR5ID0gZmluZChzY2hlbWEudGFibGVzLCB0ID0+IHQubmFtZSA9PT0gci50YXJnZXRUYWJsZSk7XG4gICAgICAgICAgICAgICAgbWFwcGluZyA9IHIubWFwcGluZ3NbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHkuZW50aXR5TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlQ29sdW1uID0gbWFwcGluZy5zb3VyY2VDb2x1bW47XG4gICAgICAgICAgICAgICAgICAgIGNvbCA9IHJlcUVudGl0eS5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBzb3VyY2VDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbnRpdHlTY2hlbWEgPSBzY2hlbWEudGFibGVzLmZpbmQodGFibGUgPT4gdGFibGUubmFtZSA9PT0gci50YXJnZXRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25SZWxhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkTmFtZTogci5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbnRpdHk6IHRhcmdldEVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRhYmxlOiByLnRhcmdldFRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29sdW1uOiBtYXBwaW5nLnRhcmdldENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFBhdGg6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU1hcHBlcjogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRGaWVsZE5hbWU6IHRhcmdldEVudGl0eVNjaGVtYS5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBtYXBwaW5nLnRhcmdldENvbHVtbikuZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25SZWxhdGlvbi50YXJnZXRQYXRoID0gZm9yZWlnblJlbGF0aW9uLnNvdXJjZUZpZWxkTmFtZSArICcuJyArIGZvcmVpZ25SZWxhdGlvbi50YXJnZXRGaWVsZE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnblJlbGF0aW9uLmRhdGFNYXBwZXIgPSBjaGFpbih0YXJnZXRFbnRpdHlTY2hlbWEuY29sdW1ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5rZXlCeShjaGlsZENvbCA9PiBmb3JlaWduUmVsYXRpb24uc291cmNlRmllbGROYW1lICsgJy4nICsgY2hpbGRDb2wuZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFZhbHVlcyhjaGlsZENvbCA9PiBuZXcgQ29sdW1uSW5mbyhjaGlsZENvbC5uYW1lLCBjaGlsZENvbC5maWVsZE5hbWUpKS52YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb2wuZm9yZWlnblJlbGF0aW9ucyA9IGNvbC5mb3JlaWduUmVsYXRpb25zIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb2wuZm9yZWlnblJlbGF0aW9ucy5wdXNoKGZvcmVpZ25SZWxhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcUVudGl0eTtcbiAgICB9XG5cbiAgICAvLyBMb2FkcyBuZWNlc3NhcnkgZGV0YWlscyBvZiBxdWVyaWVzXG4gICAgcHJpdmF0ZSBjb21wYWN0UXVlcmllcyhxdWVyaWVzQnlEQik6IE1hcDxzdHJpbmcsIE5hbWVkUXVlcnlJbmZvPiB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBuZXcgTWFwPHN0cmluZywgTmFtZWRRdWVyeUluZm8+KCk7XG5cbiAgICAgICAgZm9yRWFjaChxdWVyaWVzQnlEQi5xdWVyaWVzLCBxdWVyeURhdGEgPT4ge1xuICAgICAgICAgICAgbGV0IHF1ZXJ5LCBwYXJhbXM7XG4gICAgICAgICAgICBpZiAocXVlcnlEYXRhLm5hdGl2ZVNxbCAmJiBxdWVyeURhdGEudHlwZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IGlzRW1wdHkocXVlcnlEYXRhLm9mZmxpbmVRdWVyeVN0cmluZykgPyBxdWVyeURhdGEucXVlcnlTdHJpbmcgOiBxdWVyeURhdGEub2ZmbGluZVF1ZXJ5U3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1hcCh0aGlzLmV4dHJhY3RRdWVyeVBhcmFtcyhxdWVyeSksIHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU9iaiA9IGZpbmQocXVlcnlEYXRhLnBhcmFtZXRlcnMsIHsnbmFtZSc6IHB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwYXJhbU9iai50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVUeXBlOiBwYXJhbU9iai52YXJpYWJsZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChwID0+IHF1ZXJ5ID0gcmVwbGFjZShxdWVyeSwgJzonICsgcC5uYW1lLCAnPycpKTtcbiAgICAgICAgICAgICAgICBxdWVyaWVzW3F1ZXJ5RGF0YS5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcXVlcnlEYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtYXAocXVlcnlEYXRhLnJlc3BvbnNlLnByb3BlcnRpZXMsIHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmFtZUluVXBwZXJDYXNlID0gcC5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBxdWVyaWVzO1xuICAgIH1cblxuICAgIC8vIExvYWRzIG5lY2Vzc2FyeSBkZXRhaWxzIG9mIHJlbW90ZSBzY2hlbWFcbiAgICBwcml2YXRlIGNvbXBhY3RTY2hlbWEoc2NoZW1hKTogREJJbmZvIHtcbiAgICAgICAgY29uc3QgZGJJbmZvID0gbmV3IERCSW5mbygpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5SW5mbz4oKTtcbiAgICAgICAgc2NoZW1hLnRhYmxlcy5mb3JFYWNoKGVudGl0eVNjaGVtYSA9PiB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZFNjaGVtYXNbZW50aXR5U2NoZW1hLmVudGl0eU5hbWVdID0ge307XG4gICAgICAgIH0pO1xuICAgICAgICBzY2hlbWEudGFibGVzLmZvckVhY2goZW50aXR5U2NoZW1hID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcGFjdEVudGl0eVNjaGVtYShzY2hlbWEsIGVudGl0eVNjaGVtYSwgdHJhbnNmb3JtZWRTY2hlbWFzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRiSW5mby5zY2hlbWEubmFtZSA9IHNjaGVtYS5uYW1lO1xuICAgICAgICBkYkluZm8uc2NoZW1hLmlzSW50ZXJuYWwgPSBzY2hlbWEuaXNJbnRlcm5hbDtcbiAgICAgICAgZGJJbmZvLnNjaGVtYS5lbnRpdGllcyA9IHRyYW5zZm9ybWVkU2NoZW1hcztcbiAgICAgICAgcmV0dXJuIGRiSW5mbztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRCb29sVG9JbnQoYm9vbDogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcoYm9vbCkgPT09ICd0cnVlJyA/IDEgOiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udmVydEludFRvQm9vbChpbnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gaW50ID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR1cm5zIG9mZiBmb3JlaWduIGtleXNcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGRpc2FibGVGb3JlaWduS2V5cygpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFwKHRoaXMuZGF0YWJhc2VzLCBkYiA9PiB0aGlzLmV4ZWN1dGVTUUxRdWVyeShkYi5zY2hlbWEubmFtZSwgJ1BSQUdNQSBmb3JlaWduX2tleXMgPSBPRkYnKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIFNRTCBxdWVyeTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYk5hbWVcbiAgICAgKiBAcGFyYW0gc3FsXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHB1YmxpYyBleGVjdXRlU1FMUXVlcnkoZGJOYW1lLCBzcWwsIHBhcmFtcz86IGFueVtdLCBsb2dPdXRwdXQ/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGRiID0gdGhpcy5kYXRhYmFzZXNbZGJOYW1lXTtcbiAgICAgICAgaWYgKGRiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGIuc3FsaXRlT2JqZWN0LmV4ZWN1dGVTcWwoc3FsLCBwYXJhbXMsIGxvZ091dHB1dClcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gcmVzdWx0LnJvd3M7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdyb3dzQWZmZWN0ZWQnICA6IHJlc3VsdC5yb3dzQWZmZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAncm93cycgICAgICAgICAgOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBObyBEYXRhYmFzZSB3aXRoIG5hbWUgJHtkYk5hbWV9IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBwYXJhbXMgb2YgdGhlIHF1ZXJ5IG9yIHByb2NlZHVyZS5cbiAgICBwcml2YXRlIGV4dHJhY3RRdWVyeVBhcmFtcyhxdWVyeSkge1xuICAgICAgICBsZXQgcGFyYW1zLCBhbGlhc1BhcmFtcztcbiAgICAgICAgYWxpYXNQYXJhbXMgPSBxdWVyeS5tYXRjaCgvW15cIidcXHdcXFxcXTpcXHMqXFx3K1xccyovZykgfHwgW107XG4gICAgICAgIGlmIChhbGlhc1BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IGFsaWFzUGFyYW1zLm1hcCh4ID0+ICgvWz18XFxXXS9nLnRlc3QoeCkpID8geC5yZXBsYWNlKC9cXFcvZywgJycpLnRyaW0oKSA6IHgudHJpbSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYXBwbGljYXRpb24gaW5mbyBzdWNoIGFzIHBhY2thZ2VOYW1lLCBhcHBOYW1lLCB2ZXJzaW9uTnVtYmVyLCB2ZXJzaW9uQ29kZS5cbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFwcEluZm8oKSB7XG4gICAgICAgIGNvbnN0IGFwcEluZm8gPSB7XG4gICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lOiAnJyxcbiAgICAgICAgICAgIHZlcnNpb25OdW1iZXI6ICcnLFxuICAgICAgICAgICAgdmVyc2lvbkNvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwVmVyc2lvbi5nZXRQYWNrYWdlTmFtZSgpXG4gICAgICAgICAgICAudGhlbihwYWNrYWdlTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgYXBwSW5mby5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0QXBwTmFtZSgpO1xuICAgICAgICAgICAgfSkudGhlbihhcHBOYW1lID0+IHtcbiAgICAgICAgICAgICAgICBhcHBJbmZvLm5hbWUgPSBhcHBOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0VmVyc2lvbk51bWJlcigpO1xuICAgICAgICAgICAgfSkudGhlbih2ZXJzaW9uTnVtYmVyID0+IHtcbiAgICAgICAgICAgICAgICBhcHBJbmZvLnZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcFZlcnNpb24uZ2V0VmVyc2lvbkNvZGUoKTtcbiAgICAgICAgICAgIH0pLnRoZW4odmVyc2lvbkNvZGUgPT4ge1xuICAgICAgICAgICAgICAgIGFwcEluZm8udmVyc2lvbkNvZGUgPSAodmVyc2lvbkNvZGUgYXMgYW55KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwSW5mbztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2FsbGJhY2tzRm9yKGV2ZW50OiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5tYXAoYyA9PiB7XG4gICAgICAgICAgICBpZiAoY1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY1tldmVudF0uYmluZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpbGVzIHdpdGggZ2l2ZW4gcmVnZXggaW4gJ3d3dy9tZXRhZGF0YS9hcHAnYW5kIHJldHVybnMgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgSlNPTlxuICAgICAqIGNvbnRlbnQgcHJlc2VudCBpbiBlYWNoIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVSZWdleCByZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgZmlsZXMuXG4gICAgICogQHJldHVybnMgeyp9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1ldGFJbmZvKGZpbGVOYW1lUmVnZXg6IFJlZ0V4cCkge1xuICAgICAgICBjb25zdCBmb2xkZXIgPSBjb3Jkb3ZhLmZpbGUuYXBwbGljYXRpb25EaXJlY3RvcnkgKyBNRVRBX0xPQ0FUSU9OICsgJy8nO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGaWxlU2VydmljZS5saXN0RmlsZXMoZm9sZGVyLCBmaWxlTmFtZVJlZ2V4KVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4gUHJvbWlzZS5hbGwobWFwKGZpbGVzLCBmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcmRvdmEgRmlsZSByZWFkZXIgaGFzIGJ1ZmZlciBpc3N1ZXMgd2l0aCBsYXJnZSBmaWxlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvLCB1c2luZyBhamF4IHRvIHJldHJpZXZlIGxvY2FsIGpzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICQuZ2V0SlNPTih0cmFuc2Zvcm1GaWxlVVJJKGZvbGRlcikgKyBmWyduYW1lJ10sIGRhdGEgPT4gcmVzb2x2ZShkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZSBnaXZlbiBlbnRpdHkncyBkYXRhIGlzIGJ1bmRsZWQgYWxvbmcgd2l0aCBhcHBsaWNhdGlvbiBpbnN0YWxsZXIuXG4gICAgICogQHBhcmFtIGRhdGFNb2RlbE5hbWUgbmFtZSBvZiB0aGUgZGF0YSBtb2RlbFxuICAgICAqIEBwYXJhbSBlbnRpdHlOYW1lIG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgcHVibGljIGlzQnVuZGxlZChkYXRhTW9kZWxOYW1lLCBlbnRpdHlOYW1lKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RvcmUoZGF0YU1vZGVsTmFtZSwgZW50aXR5TmFtZSkudGhlbihzdG9yZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZW50aXR5U2NoZW1hLnB1bGxDb25maWcucHVsbFR5cGUgPT09IFB1bGxUeXBlLkJVTkRMRUQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGxvY2FsIGRhdGFiYXNlIHNjaGVtYXMgZnJvbSAqX2RhdGFfbW9kZWwuanNvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsqfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZERCU2NoZW1hcygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIERCSW5mbz4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YUluZm8oLy4rX2RhdGFNb2RlbFxcLmpzb24kLylcbiAgICAgICAgICAgIC50aGVuKCAoc2NoZW1hczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgREJJbmZvPigpO1xuICAgICAgICAgICAgICAgIHNjaGVtYXMgPSBpc0FycmF5KHNjaGVtYXMpID8gc2NoZW1hcyA6IFtzY2hlbWFzXTtcbiAgICAgICAgICAgICAgICBzY2hlbWFzLnB1c2goT0ZGTElORV9XQVZFTUFLRVJfREFUQUJBU0VfU0NIRU1BKTtcbiAgICAgICAgICAgICAgICBzY2hlbWFzLm1hcChzID0+IHRoaXMuY29tcGFjdFNjaGVtYShzKSlcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gocyA9PiAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbcy5zY2hlbWEubmFtZV0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG5hbWVkIHF1ZXJpZXMgZnJvbSAqX3F1ZXJ5Lmpzb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IG1ldGFkYXRhXG4gICAgICogQHJldHVybnMgeyp9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWROYW1lZFF1ZXJpZXMobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YUluZm8oLy4rX3F1ZXJ5XFwuanNvbiQvKVxuICAgICAgICAgICAgLnRoZW4oKHF1ZXJpZXNCeURCczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcXVlcmllc0J5REJzID0gaXNBcnJheShxdWVyaWVzQnlEQnMpID8gcXVlcmllc0J5REJzIDogW3F1ZXJpZXNCeURCc107XG4gICAgICAgICAgICAgICAgcXVlcmllc0J5REJzLm1hcChlID0+IG1ldGFkYXRhW2UubmFtZV0ucXVlcmllcyA9IHRoaXMuY29tcGFjdFF1ZXJpZXMoZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgb2ZmbGluZSBjb25maWd1cmF0aW9uIGZyb20gKl9vZmZsaW5lLmpzb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IG1ldGFkYXRhXG4gICAgICogQHJldHVybnMgeyp9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRPZmZsaW5lQ29uZmlnKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFJbmZvKC8uK19vZmZsaW5lXFwuanNvbiQvKVxuICAgICAgICAgICAgLnRoZW4oY29uZmlncyA9PiB7XG4gICAgICAgICAgICAgICAgZm9yRWFjaChjb25maWdzLCBjb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGZvckVhY2goY29uZmlnLmVudGl0aWVzLCBlbnRpdHlDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXR5U2NoZW1hID0gZmluZChtZXRhZGF0YVtjb25maWcubmFtZV0uc2NoZW1hLmVudGl0aWVzLCBzY2hlbWEgPT4gc2NoZW1hLm5hbWUgPT09IGVudGl0eUNvbmZpZy5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbkluKGVudGl0eVNjaGVtYSwgZW50aXR5Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dTcWwoc3FsaXRlT2JqZWN0OiBTUUxpdGVPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY29uc29sZSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXhlY3V0ZVNxbCA9IHNxbGl0ZU9iamVjdC5leGVjdXRlU3FsO1xuICAgICAgICBzcWxpdGVPYmplY3QuZXhlY3V0ZVNxbCA9IChzcWwsIHBhcmFtcywgbG9nT3V0cHV0PzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxFeGVjdXRlU3FsLmNhbGwoc3FsaXRlT2JqZWN0LCBzcWwsIHBhcmFtcykudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChsb2dPdXRwdXQgfHwgdGhpcy5fbG9nU3FsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakFyciA9IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgPSByZXN1bHQucm93cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyLnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTUUwgXCIlc1wiICB3aXRoIHBhcmFtcyAlTyB0b29rIFslZCBtc10uIEFuZCB0aGUgcmVzdWx0IGlzICVPJywgc3FsLCBwYXJhbXMsIG5vdygpIC0gc3RhcnRUaW1lLCBvYmpBcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU1FMIFwiJXNcIiB3aXRoIHBhcmFtcyAlTyBmYWlsZWQgd2l0aCBlcnJvciBtZXNzYWdlICVzJywgc3FsLCBwYXJhbXMsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTUUxpdGUgZG9lcyBub3Qgc3VwcG9ydCBib29sZWFuIGRhdGEuIEluc3RlYWQgb2YgdXNpbmcgYm9vbGVhbiB2YWx1ZXMsIGRhdGEgd2lsbCBiZSBjaGFuZ2VkIHRvIDAgb3IgMS5cbiAgICAgKiBJZiB0aGUgdmFsdWUgaXMgJ3RydWUnLCB0aGVuIDEgaXMgc2V0IGFzIHZhbHVlLiBJZiB2YWx1ZSBpcyBub3QgMSBub3IgbnVsbCwgdGhlbiBjb2x1bW4gdmFsdWUgaXMgc2V0IGFzIDAuXG4gICAgICogQHBhcmFtIGRiTmFtZVxuICAgICAqIEBwYXJhbSB0YWJsZU5hbWVcbiAgICAgKiBAcGFyYW0gY29sTmFtZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhbkRhdGEoZGJOYW1lLCB0YWJsZU5hbWUsIGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgdHJ1ZVRvMVF1ZXJ5ID0gYHVwZGF0ZSAke2VzY2FwZU5hbWUodGFibGVOYW1lKX0gc2V0ICR7ZXNjYXBlTmFtZShjb2xOYW1lKX0gPSAxIHdoZXJlICR7ZXNjYXBlTmFtZShjb2xOYW1lKX0gPSAndHJ1ZSdgLFxuICAgICAgICAgICAgZXhjZXB0TnVsbEFuZDF0bzBRdWVyeSA9IGB1cGRhdGUgJHtlc2NhcGVOYW1lKHRhYmxlTmFtZSl9IHNldCAke2VzY2FwZU5hbWUoY29sTmFtZSl9ID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlICR7ZXNjYXBlTmFtZShjb2xOYW1lKX0gaXMgbm90IG51bGwgYW5kICR7ZXNjYXBlTmFtZShjb2xOYW1lKX0gIT0gMWA7XG4gICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTUUxRdWVyeShkYk5hbWUsIHRydWVUbzFRdWVyeSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZXhlY3V0ZVNRTFF1ZXJ5KGRiTmFtZSwgZXhjZXB0TnVsbEFuZDF0bzBRdWVyeSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGRhdGEgdG8gc3VwcG9ydCBTUUxpdGUuXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVEYXRhKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFwKHRoaXMuZGF0YWJhc2VzLCBkYXRhYmFzZSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFwKGRhdGFiYXNlLnNjaGVtYS5lbnRpdGllcywgZW50aXR5U2NoZW1hID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFwKGVudGl0eVNjaGVtYS5jb2x1bW5zLCBjb2x1bW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnNxbFR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplQm9vbGVhbkRhdGEoZGF0YWJhc2Uuc2NoZW1hLm5hbWUsIGVudGl0eVNjaGVtYS5uYW1lLCBjb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wZW5EYXRhYmFzZShkYXRhYmFzZTogREJJbmZvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNxbGl0ZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGFiYXNlLnNjaGVtYS5uYW1lICsgJy5kYicsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246ICdkZWZhdWx0J1xuICAgICAgICB9KS50aGVuKHNxbGl0ZU9iamVjdCA9PiB7XG4gICAgICAgICAgICBkYXRhYmFzZS5zcWxpdGVPYmplY3QgPSBzcWxpdGVPYmplY3Q7XG4gICAgICAgICAgICB0aGlzLmxvZ1NxbChzcWxpdGVPYmplY3QpO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVQcm9taXNlcyA9IG1hcChkYXRhYmFzZS5zY2hlbWEuZW50aXRpZXMsIGVudGl0eVNjaGVtYSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gbmV3IExvY2FsREJTdG9yZSh0aGlzLmRldmljZUZpbGVTZXJ2aWNlLCBlbnRpdHlTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgc3FsaXRlT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3RvcmVQcm9taXNlcykudGhlbihzdG9yZXMgPT4ge1xuICAgICAgICAgICAgICAgIGZvckVhY2goc3RvcmVzLCBzdG9yZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlLnN0b3Jlc1tzdG9yZS5lbnRpdHlTY2hlbWEuZW50aXR5TmFtZV0gPSBzdG9yZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YWJhc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhcHAgaXMgb3BlbmVkIGZvciBmaXJzdCB0aW1lICBhZnRlciBhIGZyZXNoIGluc3RhbGwgb3IgdXBkYXRlLCB0aGVuIG9sZCBkYXRhYmFzZXMgYXJlIHJlbW92ZWQgYW5kXG4gICAgICogbmV3IGRhdGFiYXNlcyBhcmUgY3JlYXRlZCB1c2luZyBidW5kbGVkIGRhdGFiYXNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsqfSBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRydWUsIGlmIHRoZSBkYXRhYmFzZXMgYXJlIG5ld2x5IGNyZWF0ZWQgb3IgcmVzb2x2ZWQgd2l0aCBmYWxzZVxuICAgICAqIGlmIGV4aXN0aW5nIGRhdGFiYXNlcyBhcmUgYmVpbmcgdXNlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFVwRGF0YWJhc2VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VTZXJ2aWNlLmdldEFwcEJ1aWxkVGltZSgpXG4gICAgICAgICAgICAudGhlbigoYnVpbGRUaW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5kZXZpY2VTZXJ2aWNlLmdldEVudHJ5KCdkYXRhYmFzZScpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmICghZGJJbmZvLmxhc3RCdWlsZFRpbWUgfHwgZGJJbmZvLmxhc3RCdWlsZFRpbWUgIT09IGJ1aWxkVGltZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbkFuZENvcHlEYXRhYmFzZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiSW5mby5sYXN0QnVpbGRUaW1lID0gYnVpbGRUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRldmljZVNlcnZpY2Uuc3RvcmVFbnRyeSgnZGF0YWJhc2UnLCBkYkluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbigoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|