@mnaoumov/obsidian-lib 10.12.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +409 -292
- package/dist/lib/cjs/__merged.d.cts +17 -8
- package/dist/lib/cjs/anchored-suggest.cjs +1 -1
- package/dist/lib/cjs/app.cjs +2 -2
- package/dist/lib/cjs/async-with-notice.cjs +4 -4
- package/dist/lib/cjs/attachment-path.cjs +9 -9
- package/dist/lib/cjs/attachment-path.d.cts +3 -3
- package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
- package/dist/lib/cjs/backlink-index.cjs +5 -5
- package/dist/lib/cjs/backlink.cjs +7 -7
- package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
- package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
- package/dist/lib/cjs/bug-report.cjs +3 -3
- package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
- package/dist/lib/cjs/bulk-operation.cjs +2 -2
- package/dist/lib/cjs/callout.cjs +6 -6
- package/dist/lib/cjs/canvas.cjs +11 -9
- package/dist/lib/cjs/canvas.d.cts +13 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
- package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
- package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
- package/dist/lib/cjs/codemirror/index.cjs +7 -7
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
- package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
- package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
- package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
- package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
- package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
- package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/index.cjs +15 -15
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +6 -6
- package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
- package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
- package/dist/lib/cjs/community-plugins.cjs +3 -3
- package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +3 -3
- package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
- package/dist/lib/cjs/components/async-events-component.cjs +1 -1
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
- package/dist/lib/cjs/components/component-ex.cjs +21 -11
- package/dist/lib/cjs/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
- package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
- package/dist/lib/cjs/components/disposable-component.cjs +2 -2
- package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -1
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +8 -8
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
- package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
- package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
- package/dist/lib/cjs/components/index.cjs +46 -40
- package/dist/lib/cjs/components/index.d.cts +2 -0
- package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
- package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
- package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
- package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-gate-component.cjs +68 -28
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
- package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.cjs +113 -17
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
- package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
- package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
- package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
- package/dist/lib/cjs/components/registry-component.cjs +2 -2
- package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
- package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
- package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +6 -6
- package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
- package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
- package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
- package/dist/lib/cjs/components/worker-component.cjs +363 -0
- package/dist/lib/cjs/components/worker-component.d.cts +156 -0
- package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
- package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +7 -7
- package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
- package/dist/lib/cjs/constructors/index.cjs +1 -1
- package/dist/lib/cjs/data-handler.cjs +111 -4
- package/dist/lib/cjs/data-handler.d.cts +92 -1
- package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
- package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
- package/dist/lib/cjs/data-stores/index.cjs +6 -6
- package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
- package/dist/lib/cjs/dataview-link.cjs +2 -2
- package/dist/lib/cjs/dataview.cjs +27 -7
- package/dist/lib/cjs/dataview.d.cts +14 -0
- package/dist/lib/cjs/debug.cjs +3 -3
- package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
- package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
- package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
- package/dist/lib/cjs/desktop-git-runner.cjs +2 -2
- package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
- package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
- package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
- package/dist/lib/cjs/disposable.cjs +150 -0
- package/dist/lib/cjs/disposable.d.cts +39 -0
- package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
- package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
- package/dist/lib/cjs/editor-suggest.cjs +1 -1
- package/dist/lib/cjs/editor.cjs +6 -6
- package/dist/lib/cjs/events.cjs +2 -2
- package/dist/lib/cjs/extensions-registrar.cjs +1 -1
- package/dist/lib/cjs/feature-request.cjs +1 -1
- package/dist/lib/cjs/file-change.cjs +10 -10
- package/dist/lib/cjs/file-explorer.cjs +2 -2
- package/dist/lib/cjs/file-manager.cjs +5 -5
- package/dist/lib/cjs/file-system.cjs +10 -10
- package/dist/lib/cjs/folder-note.cjs +4 -4
- package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
- package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
- package/dist/lib/cjs/frontmatter.cjs +5 -5
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/hotkey.cjs +1 -1
- package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
- package/dist/lib/cjs/html-element.cjs +2 -2
- package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
- package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
- package/dist/lib/cjs/i18n/i18n.cjs +7 -7
- package/dist/lib/cjs/i18n/index.cjs +4 -4
- package/dist/lib/cjs/i18n/locales/en.cjs +5 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +4 -0
- package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
- package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -0
- package/dist/lib/cjs/index.cjs +145 -127
- package/dist/lib/cjs/index.d.cts +6 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
- package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/library-styles.cjs +3 -3
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
- package/dist/lib/cjs/link.cjs +76 -56
- package/dist/lib/cjs/link.d.cts +20 -14
- package/dist/lib/cjs/logger.cjs +4 -4
- package/dist/lib/cjs/loop.cjs +10 -16
- package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
- package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
- package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
- package/dist/lib/cjs/markdown-view.cjs +3 -3
- package/dist/lib/cjs/markdown.cjs +12 -12
- package/dist/lib/cjs/metadata-cache.cjs +23 -23
- package/dist/lib/cjs/metadata-cache.d.cts +5 -4
- package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
- package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
- package/dist/lib/cjs/mobile-app-info.cjs +1 -1
- package/dist/lib/cjs/modals/alert.cjs +4 -4
- package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
- package/dist/lib/cjs/modals/confirm.cjs +4 -4
- package/dist/lib/cjs/modals/copy-text-manually.cjs +4 -4
- package/dist/lib/cjs/modals/index.cjs +12 -12
- package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
- package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
- package/dist/lib/cjs/modals/modal.cjs +3 -3
- package/dist/lib/cjs/modals/prompt.cjs +10 -10
- package/dist/lib/cjs/modals/prompt.d.cts +1 -1
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +5 -5
- package/dist/lib/cjs/modals/select-item.cjs +6 -6
- package/dist/lib/cjs/modals/select-option.cjs +3 -3
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/note-priority.cjs +2 -2
- package/dist/lib/cjs/notebook-navigator.cjs +12 -2
- package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
- package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian-settings.cjs +1 -1
- package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
- package/dist/lib/cjs/parse-link.cjs +14 -14
- package/dist/lib/cjs/path-compatibility.cjs +368 -0
- package/dist/lib/cjs/path-compatibility.d.cts +263 -0
- package/dist/lib/cjs/path-settings.cjs +3 -3
- package/dist/lib/cjs/pdf.cjs +2 -2
- package/dist/lib/cjs/plugin/index.cjs +16 -13
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +8 -8
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
- package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
- package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +4 -4
- package/dist/lib/cjs/plugin/plugin-instance.cjs +14 -12
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +7 -0
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
- package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
- package/dist/lib/cjs/plugin/plugin.cjs +118 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +28 -5
- package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
- package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
- package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
- package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
- package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
- package/dist/lib/cjs/popovers/index.cjs +3 -3
- package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
- package/dist/lib/cjs/popovers/popover.cjs +5 -5
- package/dist/lib/cjs/queue.cjs +8 -8
- package/dist/lib/cjs/react/app-context.cjs +3 -3
- package/dist/lib/cjs/react/index.cjs +1 -1
- package/dist/lib/cjs/reference-definition.cjs +1 -1
- package/dist/lib/cjs/reference.cjs +3 -3
- package/dist/lib/cjs/release-asset.cjs +5 -5
- package/dist/lib/cjs/rendered-markdown.cjs +4 -4
- package/dist/lib/cjs/request-url.cjs +4 -4
- package/dist/lib/cjs/resource-lock.cjs +46 -42
- package/dist/lib/cjs/resource-lock.d.cts +8 -7
- package/dist/lib/cjs/resource-url.cjs +3 -3
- package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
- package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/index.cjs +30 -30
- package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
- package/dist/lib/cjs/setting-ex.cjs +26 -26
- package/dist/lib/cjs/setting-group-ex.cjs +2 -2
- package/dist/lib/cjs/settings-recovery.cjs +217 -0
- package/dist/lib/cjs/settings-recovery.d.cts +178 -0
- package/dist/lib/cjs/settings-tabs.cjs +5 -5
- package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
- package/dist/lib/cjs/templater.cjs +14 -4
- package/dist/lib/cjs/templater.d.cts +6 -0
- package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
- package/dist/lib/cjs/transformers/index.cjs +1 -1
- package/dist/lib/cjs/trusted-input.cjs +1 -1
- package/dist/lib/cjs/validation.cjs +4 -4
- package/dist/lib/cjs/vault-delete.cjs +6 -6
- package/dist/lib/cjs/vault-transaction.cjs +5 -5
- package/dist/lib/cjs/vault.cjs +12 -12
- package/dist/lib/cjs/view-registrar.cjs +1 -1
- package/dist/lib/cjs/virtual-file.cjs +16 -14
- package/dist/lib/cjs/virtual-file.d.cts +2 -1
- package/dist/lib/cjs/wasm.cjs +119 -0
- package/dist/lib/cjs/wasm.d.cts +54 -0
- package/dist/lib/cjs/worker-protocol.cjs +209 -0
- package/dist/lib/cjs/worker-protocol.d.cts +282 -0
- package/dist/lib/cjs/workspace.cjs +1 -1
- package/dist/lib/esm/__merged.d.mts +17 -8
- package/dist/lib/esm/__merged.mjs +133 -3
- package/dist/lib/esm/app.mjs +2 -2
- package/dist/lib/esm/attachment-path.d.mts +3 -3
- package/dist/lib/esm/attachment-path.mjs +2 -2
- package/dist/lib/esm/backlink-index.mjs +2 -2
- package/dist/lib/esm/canvas.d.mts +13 -0
- package/dist/lib/esm/canvas.mjs +6 -5
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
- package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
- package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
- package/dist/lib/esm/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/components/component-ex.mjs +19 -6
- package/dist/lib/esm/components/disposable-component.mjs +1 -1
- package/dist/lib/esm/components/index.d.mts +2 -0
- package/dist/lib/esm/components/index.mjs +5 -1
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +57 -14
- package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
- package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
- package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
- package/dist/lib/esm/components/plugin-settings-component.mjs +99 -3
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- package/dist/lib/esm/components/worker-component.d.mts +156 -0
- package/dist/lib/esm/components/worker-component.mjs +279 -0
- package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
- package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +1 -1
- package/dist/lib/esm/data-handler.d.mts +92 -1
- package/dist/lib/esm/data-handler.mjs +112 -3
- package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
- package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
- package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
- package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
- package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
- package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
- package/dist/lib/esm/dataview.d.mts +14 -0
- package/dist/lib/esm/dataview.mjs +19 -1
- package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
- package/dist/lib/esm/demo-vault-helper.mjs +29 -1
- package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
- package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
- package/dist/lib/esm/disposable.d.mts +39 -0
- package/dist/lib/esm/disposable.mjs +64 -0
- package/dist/lib/esm/file-system.mjs +2 -2
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +4 -0
- package/dist/lib/esm/i18n/locales/en.mjs +5 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -0
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +13 -1
- package/dist/lib/esm/link.d.mts +20 -14
- package/dist/lib/esm/link.mjs +57 -38
- package/dist/lib/esm/loop.mjs +2 -8
- package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
- package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
- package/dist/lib/esm/metadata-cache.d.mts +5 -4
- package/dist/lib/esm/metadata-cache.mjs +6 -6
- package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
- package/dist/lib/esm/misplaced-attachment.mjs +212 -0
- package/dist/lib/esm/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- package/dist/lib/esm/notebook-navigator.d.mts +6 -0
- package/dist/lib/esm/notebook-navigator.mjs +11 -2
- package/dist/lib/esm/parse-link.mjs +4 -4
- package/dist/lib/esm/path-compatibility.d.mts +263 -0
- package/dist/lib/esm/path-compatibility.mjs +277 -0
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +4 -2
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
- package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +7 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +28 -5
- package/dist/lib/esm/plugin/plugin.mjs +103 -9
- package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
- package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
- package/dist/lib/esm/release-asset.mjs +1 -1
- package/dist/lib/esm/resource-lock.d.mts +8 -7
- package/dist/lib/esm/resource-lock.mjs +31 -26
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
- package/dist/lib/esm/settings-recovery.d.mts +178 -0
- package/dist/lib/esm/settings-recovery.mjs +125 -0
- package/dist/lib/esm/settings-tabs.mjs +2 -2
- package/dist/lib/esm/templater.d.mts +6 -0
- package/dist/lib/esm/templater.mjs +11 -2
- package/dist/lib/esm/vault.mjs +1 -1
- package/dist/lib/esm/virtual-file.d.mts +2 -1
- package/dist/lib/esm/virtual-file.mjs +7 -5
- package/dist/lib/esm/wasm.d.mts +54 -0
- package/dist/lib/esm/wasm.mjs +30 -0
- package/dist/lib/esm/worker-protocol.d.mts +282 -0
- package/dist/lib/esm/worker-protocol.mjs +113 -0
- package/package.json +9 -8
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Component that manages displaying notices to the user.
|
|
7
7
|
*/
|
|
8
|
+
import type { DisposableEx } from '@mnaoumov/typescript-lib/disposable';
|
|
8
9
|
import type { ValueProvider } from '@mnaoumov/typescript-lib/value-provider';
|
|
9
10
|
import type { App } from 'obsidian';
|
|
10
11
|
import type { Promisable } from 'type-fest';
|
|
@@ -51,10 +52,10 @@ export interface PluginNoticeCloseClickEvent {
|
|
|
51
52
|
}
|
|
52
53
|
/**
|
|
53
54
|
* A handle to a delayed notice created by {@link PluginNoticeComponent.showNoticeAfterDelay}. It is a
|
|
54
|
-
* {@link
|
|
55
|
+
* {@link DisposableEx} (so it can be used with `using`) that also lets the content be updated while the
|
|
55
56
|
* notice is shown.
|
|
56
57
|
*/
|
|
57
|
-
export interface PluginNoticeComponentDelayedNotice extends
|
|
58
|
+
export interface PluginNoticeComponentDelayedNotice extends DisposableEx {
|
|
58
59
|
/**
|
|
59
60
|
* Replaces this handle's message, re-applying the plugin-name prefix, the interactive-click guard, and
|
|
60
61
|
* the Cancel button. Useful for reporting progress. If the delay has not elapsed yet, the new content
|
|
@@ -243,7 +244,7 @@ export declare class PluginNoticeComponent extends ComponentEx {
|
|
|
243
244
|
/**
|
|
244
245
|
* Shows a notice describing a long-running operation, but only once the operation has run for longer
|
|
245
246
|
* than {@link PluginNoticeComponentShowNoticeAfterDelayParams.delayInMilliseconds} — so operations
|
|
246
|
-
* that finish sooner never flash a notice. The notice stays until the returned {@link
|
|
247
|
+
* that finish sooner never flash a notice. The notice stays until the returned {@link DisposableEx} is
|
|
247
248
|
* disposed (which also cancels the pending timer if it has not fired yet), so it can be used with
|
|
248
249
|
* `using`. When an {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController} is given, a
|
|
249
250
|
* Cancel button that aborts it is appended (and, being interactive, does not dismiss the notice).
|
|
@@ -38,7 +38,10 @@ ensureBrowserProcess();
|
|
|
38
38
|
|
|
39
39
|
import { snapshot } from "@mnaoumov/typescript-lib/array";
|
|
40
40
|
import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
|
|
41
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
castTo,
|
|
43
|
+
normalizeOptionalProperties
|
|
44
|
+
} from "@mnaoumov/typescript-lib/object-utils";
|
|
42
45
|
import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
|
|
43
46
|
import { resolveValue } from "@mnaoumov/typescript-lib/value-provider";
|
|
44
47
|
import {
|
|
@@ -146,7 +149,7 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
146
149
|
/**
|
|
147
150
|
* Shows a notice describing a long-running operation, but only once the operation has run for longer
|
|
148
151
|
* than {@link PluginNoticeComponentShowNoticeAfterDelayParams.delayInMilliseconds} — so operations
|
|
149
|
-
* that finish sooner never flash a notice. The notice stays until the returned {@link
|
|
152
|
+
* that finish sooner never flash a notice. The notice stays until the returned {@link DisposableEx} is
|
|
150
153
|
* disposed (which also cancels the pending timer if it has not fired yet), so it can be used with
|
|
151
154
|
* `using`. When an {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController} is given, a
|
|
152
155
|
* Cancel button that aborts it is appended (and, being interactive, does not dismiss the notice).
|
|
@@ -204,7 +207,24 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
204
207
|
});
|
|
205
208
|
}, params.delayInMilliseconds ?? DEFAULT_DELAY_BEFORE_SHOW_IN_MILLISECONDS);
|
|
206
209
|
this.pendingTimerCancellations.add(cancelPendingTimer);
|
|
210
|
+
const disposeNotice = () => {
|
|
211
|
+
isDisposed = true;
|
|
212
|
+
cancelPendingTimer();
|
|
213
|
+
if (!shown) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (shown.isNoticeOwned) {
|
|
217
|
+
shown.notice.hide();
|
|
218
|
+
this.standaloneNotices.delete(shown.notice);
|
|
219
|
+
if (this.notice === shown.notice) {
|
|
220
|
+
this.notice = null;
|
|
221
|
+
}
|
|
222
|
+
} else {
|
|
223
|
+
shown.contentEl.remove();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
207
226
|
return {
|
|
227
|
+
dispose: disposeNotice,
|
|
208
228
|
setContent: (content) => {
|
|
209
229
|
currentContent = content;
|
|
210
230
|
if (!shown) {
|
|
@@ -217,22 +237,7 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
217
237
|
shown.contentEl.replaceWith(rebuilt.fragment);
|
|
218
238
|
shown = { ...shown, contentEl: rebuilt.contentEl };
|
|
219
239
|
},
|
|
220
|
-
[Symbol.dispose]:
|
|
221
|
-
isDisposed = true;
|
|
222
|
-
cancelPendingTimer();
|
|
223
|
-
if (!shown) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
if (shown.isNoticeOwned) {
|
|
227
|
-
shown.notice.hide();
|
|
228
|
-
this.standaloneNotices.delete(shown.notice);
|
|
229
|
-
if (this.notice === shown.notice) {
|
|
230
|
-
this.notice = null;
|
|
231
|
-
}
|
|
232
|
-
} else {
|
|
233
|
-
shown.contentEl.remove();
|
|
234
|
-
}
|
|
235
|
-
}
|
|
240
|
+
[Symbol.dispose]: disposeNotice
|
|
236
241
|
};
|
|
237
242
|
}
|
|
238
243
|
/**
|
|
@@ -356,7 +361,7 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
356
361
|
$event.stopPropagation();
|
|
357
362
|
return;
|
|
358
363
|
}
|
|
359
|
-
if ($event.target
|
|
364
|
+
if (isInteractiveClickTarget($event.target)) {
|
|
360
365
|
$event.stopPropagation();
|
|
361
366
|
}
|
|
362
367
|
});
|
|
@@ -433,7 +438,7 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
433
438
|
}
|
|
434
439
|
addPluginCssClasses(notice.containerEl, CssClass.PluginNoticeRequiresExplicitClose);
|
|
435
440
|
notice.containerEl.addEventListener("click", ($event) => {
|
|
436
|
-
if ($event.target
|
|
441
|
+
if (isInteractiveClickTarget($event.target)) {
|
|
437
442
|
return;
|
|
438
443
|
}
|
|
439
444
|
$event.stopPropagation();
|
|
@@ -591,6 +596,10 @@ function getTextNodes(node) {
|
|
|
591
596
|
}
|
|
592
597
|
return textNodes;
|
|
593
598
|
}
|
|
599
|
+
function isInteractiveClickTarget(target) {
|
|
600
|
+
const node = castTo(target);
|
|
601
|
+
return node?.instanceOf(Element) === true && node.closest(INTERACTIVE_ELEMENT_SELECTOR) !== null;
|
|
602
|
+
}
|
|
594
603
|
function isTextNode(node) {
|
|
595
604
|
return node.nodeType === Node.TEXT_NODE;
|
|
596
605
|
}
|
|
@@ -598,4 +607,4 @@ export {
|
|
|
598
607
|
PluginNoticeComponent,
|
|
599
608
|
PluginNoticeMode
|
|
600
609
|
};
|
|
601
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG5jb25zdCBQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVkgPSAncGx1Z2luLW5vdGljZS1jb21wb25lbnQ6cGVybWFuZW50LW5vdGljZXMnO1xuY29uc3QgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSAwO1xuY29uc3QgREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG4vLyBPYnNpZGlhbidzIG93biBkZWZhdWx0IG5vdGljZSBkdXJhdGlvbiwgYXBwbGllZCBieSB0aGUgYE5vdGljZWAgY29uc3RydWN0b3Igd2hlbiBub25lIGlzIGdpdmVuLiBJdCBpc1xuLy8gcmVwZWF0ZWQgaGVyZSBiZWNhdXNlIHJlc3RhcnRpbmcgdGhlIGNvdW50ZG93biBvbiBhbiBhcHBlbmQgZ29lcyB0aHJvdWdoIGBzZXRBdXRvSGlkZWAsIHdoaWNoIHRha2VzIGFuXG4vLyBleHBsaWNpdCBkdXJhdGlvbiBhbmQgc28gY2Fubm90IGZhbGwgYmFjayB0byB0aGF0IGRlZmF1bHQgaXRzZWxmLlxuY29uc3QgT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gNDAwMDtcblxuLy8gRWxlbWVudHMgYSB1c2VyIGNsaWNrcyB0byBhY3Qgb24gdGhlbSByYXRoZXIgdGhhbiB0byBkaXNtaXNzIHRoZSBub3RpY2UuIEEgY2xpY2sgbGFuZGluZyBvbiAob3Jcbi8vIGluc2lkZSkgb25lIG9mIHRoZXNlIGlzIGtlcHQgZnJvbSBidWJibGluZyB0byB0aGUgbm90aWNlLCBzbyB0aGUgbm90aWNlIHN0YXlzIG9wZW4uXG5jb25zdCBJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SID0gJ2EsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGxhYmVsLCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSwgW3JvbGU9XCJidXR0b25cIl0sIFtyb2xlPVwibGlua1wiXSwgW3JvbGU9XCJjaGVja2JveFwiXSwgW3JvbGU9XCJ0YWJcIl0sIFtyb2xlPVwibWVudWl0ZW1cIl0nO1xuXG4vKipcbiAqIEhvdyBhIG5ldyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHRoZSBvbmUgb2NjdXB5aW5nIHRoZSBzaW5nbGUgcGVyLXBsdWdpblxuICogc2xvdCB0aGlzIGNvbXBvbmVudCBrZWVwcy5cbiAqXG4gKiBSYXcgYG5ldyBOb3RpY2UoLi4uKWAgY2FsbHMgYWx3YXlzIHBpbGUgdXAsIHdoaWNoIGlzIHJhcmVseSB3aGF0IGEgcGx1Z2luIHdhbnRzOiB1c3VhbGx5IG9ubHkgdGhlXG4gKiBsYXRlc3QgbWVzc2FnZSBtYXR0ZXJzLiBTbyB0aGUgc2xvdCBleGlzdHMsIGFuZCB0aGlzIGNob29zZXMgd2hhdCBhIG5ldyBtZXNzYWdlIGRvZXMgd2l0aCBpdC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luTm90aWNlTW9kZSB7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IG5vdGljZSwgc28gYm90aCBtZXNzYWdlcyBzdGF5IHZpc2libGUgaW4gYSBzaW5nbGUgbm90aWNlIOKAlCBmb3IgYVxuICAgKiBydW5uaW5nIGFjY291bnQgb2YgYW4gb3BlcmF0aW9uLiBUaGUgY291bnRkb3duIHJlc3RhcnRzLCBzbyBhbiBhcHBlbmRlZCBtZXNzYWdlIGlzIHJlYWRhYmxlIGZvciBhXG4gICAqIGZ1bGwgZHVyYXRpb24gcmF0aGVyIHRoYW4gaW5oZXJpdGluZyB0aGUgcmVtYWlucyBvZiB0aGUgY3VycmVudCBvbmUuXG4gICAqXG4gICAqIEZhbGxzIGJhY2sgdG8ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IG5vdGljZSBvbiBzY3JlZW4gKGl0IHdhc1xuICAgKiBuZXZlciBzaG93biwgb3IgaXQgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkKS5cbiAgICovXG4gIEFwcGVuZCA9ICdhcHBlbmQnLFxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2UgYW5kIHNob3dzIHRoaXMgb25lIGluIGl0cyBwbGFjZSwgc28gb25seSB0aGUgbGF0ZXN0IG1lc3NhZ2UgaXMgb24gc2NyZWVuLlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgdGhlIHJlYXNvbiB0aGUgc2xvdCBleGlzdHMuXG4gICAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgbWVzc2FnZSBhcyBpdHMgb3duIG5vdGljZSwgbGVhdmluZyB0aGUgY3VycmVudCBvbmUgYWxvbmU6IGJvdGggYXJlIG9uIHNjcmVlbiwgcGlsZWQgdXBcbiAgICogbGlrZSBwbGFpbiBgbmV3IE5vdGljZSguLi4pYCBjYWxscy4gQSBzZXBhcmF0ZSBub3RpY2UgbmV2ZXIgcmVwbGFjZXMsIGFuZCBpcyBuZXZlciByZXBsYWNlZCBieSwgYVxuICAgKiBzbG90IG5vdGljZTsgYW55IG51bWJlciBvZiB0aGVtIGNvZXhpc3QuIFRoZXkgYXJlIHN0aWxsIGhpZGRlbiB0b2dldGhlciBvbiB1bmxvYWQuXG4gICAqL1xuICBTZXBhcmF0ZSA9ICdzZXBhcmF0ZSdcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnQgcGFzc2VkIHRvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9IHdoZW4gdGhlIG5vdGljZSdzXG4gKiBjbG9zZSAoWCkgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50IHtcbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGNsb3NlLCBsZWF2aW5nIHRoZSBub3RpY2Ugb3Blbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbDogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIGRlbGF5ZWQgbm90aWNlIGNyZWF0ZWQgYnkge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uIEl0IGlzIGFcbiAqIHtAbGluayBEaXNwb3NhYmxlfSAoc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBgdXNpbmdgKSB0aGF0IGFsc28gbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIHRoZVxuICogbm90aWNlIGlzIHNob3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoaXMgaGFuZGxlJ3MgbWVzc2FnZSwgcmUtYXBwbHlpbmcgdGhlIHBsdWdpbi1uYW1lIHByZWZpeCwgdGhlIGludGVyYWN0aXZlLWNsaWNrIGd1YXJkLCBhbmRcbiAgICogdGhlIENhbmNlbCBidXR0b24uIFVzZWZ1bCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzLiBJZiB0aGUgZGVsYXkgaGFzIG5vdCBlbGFwc2VkIHlldCwgdGhlIG5ldyBjb250ZW50XG4gICAqIGJlY29tZXMgd2hhdCBpcyBzaG93biBvbmNlIGl0IGRvZXMuXG4gICAqXG4gICAqIE9ubHkgdGhpcyBoYW5kbGUncyBvd24gbWVzc2FnZSBpcyByZXdyaXR0ZW46IHdoZW4gdGhlIG5vdGljZSB3YXMgam9pbmVkIHJhdGhlciB0aGFuIG9wZW5lZCAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5tb2RlfSksIHRoZSBtZXNzYWdlcyBhbHJlYWR5IGluIGl0IGFyZSBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBuZXcgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhIENhbmNlbCBidXR0b24gaXMgYXBwZW5kZWQgdG8gdGhlIG5vdGljZTsgY2xpY2tpbmcgaXQgYWJvcnRzIHRoaXMgY29udHJvbGxlci4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBDYW5jZWwgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG93biB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIGlzIHByb3ZpZGVkLiBXaGVuIG9taXR0ZWQsIHRoZSBsb2NhbGl6ZWQgYENhbmNlbGAgbGFiZWwgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29udGVudCwgcmVzb2x2ZWQgbGF6aWx5IG9ubHkgaWYgdGhlIGRlbGF5IGVsYXBzZXMg4oCUIHNvIGFuIG9wZXJhdGlvbiB0aGF0IGZpbmlzaGVzXG4gICAqIHNvb25lciBuZXZlciBidWlsZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG11c3QgcnVuIGJlZm9yZSB0aGUgbm90aWNlIGlzIHNob3duLiBPcGVyYXRpb25zIHRoYXQgZmluaXNoIHNvb25lciBuZXZlclxuICAgKiBzaG93IGEgbm90aWNlLCBhdm9pZGluZyBhIGRpc3RyYWN0aW5nIGZsYXNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoaXMgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIOKAlCBzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9LlxuICAgKlxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gaXMgd29ydGggY29uc2lkZXJpbmcgZm9yIGEgbG9uZyBvcGVyYXRpb246IG9uIHRoZSBkZWZhdWx0XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IHRoZSBwcm9ncmVzcyBub3RpY2UgdGFrZXMgdGhlIHNoYXJlZCBzbG90LCBzbyBhbnkgb3JkaW5hcnkgbm90aWNlXG4gICAqIHJhaXNlZCB3aGlsZSB0aGUgb3BlcmF0aW9uIHJ1bnMgaGlkZXMgaXQsIGFuZCB0aGUgcHJvZ3Jlc3MgdGhlIHVzZXIgd2FzIHdhdGNoaW5nIGRvZXMgbm90IGNvbWUgYmFjay5cbiAgICpcbiAgICogV2hpY2hldmVyIG1vZGUgaXMgdXNlZCwgdGhlIHJldHVybmVkIGhhbmRsZSBvd25zIG9ubHkgSVRTIG1lc3NhZ2U6IHVwZGF0aW5nIHRoZSBjb250ZW50IHJld3JpdGVzXG4gICAqIHRoYXQgbWVzc2FnZSBhbG9uZSwgYW5kIGRpc3Bvc2luZyB0YWtlcyBhd2F5IG9ubHkgdGhhdCBtZXNzYWdlIHdoZW4gdGhlIG5vdGljZSB3YXMgYWxyZWFkeSBvblxuICAgKiBzY3JlZW4gKGEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBpcyBoaWRkZW4gYXMgYSB3aG9sZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9XG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQZXJtYW5lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBjYW5ub3QgYmUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IChpdCBuZWVkcyB0aGUgc2hhcmVkIHNsb3QgaXQgaXNcbiAgICogdHJhY2tlZCBpbiksIGFuZCBhIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKHNvIGEgbGF0ZXIgbm90aWNlIG5ldmVyIHNpbGVudGx5IHJlcGxhY2VzIGl0KTsgZWl0aGVyXG4gICAqIGNvbnRyYWRpY3Rpb24gdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSwgb3Ige0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IHdoZW5cbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBpcyBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBiZWZvcmUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIENhbGxcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudC5jYW5jZWx9IG9uIHRoZSBldmVudCB0byBjYW5jZWwgdGhlIGNsb3NlIGFuZCBrZWVwIHRoZSBub3RpY2VcbiAgICogb3BlbiDigJQgZm9yIGV4YW1wbGUgYWZ0ZXIgeW91ciBvd24gY29uZmlybWF0aW9uIGRlY2xpbmVzLiBBbiBhc3luYyBjYWxsYmFjayBpcyBhd2FpdGVkIGJlZm9yZSB0aGVcbiAgICogbm90aWNlIGlzIGhpZGRlbi4gUnVucyBvbmx5IHdoZW4gYSBjbG9zZSBidXR0b24gaXMgc2hvd24gKGJvdGhcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWAgYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRTaG93Q2xvc2VCdXR0b259IGFyZSBzZXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIG5vdGljZSBoaWRlcyBpdC4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIG5vdGljZSBkaXNtaXNzZXMgb24gY2xpY2sgbGlrZVxuICAgKiBhIG5vcm1hbCBPYnNpZGlhbiBub3RpY2UuIFdoZW4gYGZhbHNlYCwgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBpdCBkb2VzIG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheVxuICAgKiBjbGljaywgYW5kIGluc3RlYWQgc2hvd3MgYSBjbG9zZSAoWCkgYnV0dG9uIHRoYXQgaGlkZXMgaXQgZGlyZWN0bHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30pLlxuICAgKlxuICAgKiBBIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBzdGFuZHMgb24gaXRzIG93blxuICAgKiAoaW1wbGllcyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0pLCBzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdDsgcGFzc2luZ1xuICAgKiBhbnkgb3RoZXIge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWBcbiAgICogdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24g4oCUIGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IOKAlCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGdldE5vdGljZTogKCkgPT4gTm90aWNlIHwgbnVsbDtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoJGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBzdG9wcyBldmVyeSBjbGljayBmcm9tIGRpc21pc3NpbmcgaXQgYW5kLCB1bmxlc3Mgc3VwcHJlc3NlZCBieVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0sIGFkZHMgYSBjbG9zZSBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgcHJlZml4ZWQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIE9ubHkgYSBtZXNzYWdlIHRoYXQgb3BlbnMgYSBub3RpY2UgaXNcbiAgICogcHJlZml4ZWQ7IGEgbWVzc2FnZSBhcHBlbmRlZCB0byBvbmUgYWxyZWFkeSBzaG93aW5nIGl0IGlzIG5vdCwgc28gdGhlIG5hbWUgaXMgbm90IHJlcGVhdGVkIG9uIGV2ZXJ5XG4gICAqIGxpbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgY2xvc2UgYnV0dG9uIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcy5yZXF1aXJlc0V4cGxpY2l0Q2xvc2V9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidWlsdCBtZXNzYWdlOiB0aGUgd3JhcHBlciBlbGVtZW50IGhvbGRpbmcgaXQsIGFuZCB0aGUgZnJhZ21lbnQgdGhhdCBlbGVtZW50IHNpdHMgaW4uXG4gKlxuICogVGhlIGVsZW1lbnQgaXMgaGFuZGVkIGJhY2sgYmVjYXVzZSBhIG5vdGljZSBjYW4gaG9sZCBzZXZlcmFsIG9mIHRoZW0gKHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9KSxcbiAqIHNvIHdob2V2ZXIgb3ducyBvbmUgbWVzc2FnZSBoYXMgdG8gYmUgYWJsZSB0byB1cGRhdGUgb3IgcmVtb3ZlIGV4YWN0bHkgdGhhdCBtZXNzYWdlLiBUaGUgcmVmZXJlbmNlXG4gKiBzdGF5cyB2YWxpZCBvbmNlIHRoZSBmcmFnbWVudCBpcyBoYW5kZWQgdG8gYE5vdGljZWA6IGFwcGVuZGluZyBhIGZyYWdtZW50IG1vdmVzIGl0cyBjaGlsZHJlbiByYXRoZXJcbiAqIHRoYW4gY29weWluZyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB3cmFwcGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhZ21lbnQgaG9sZGluZyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudC5jb250ZW50RWx9LCByZWFkeSB0byBoYW5kIHRvIGBOb3RpY2VgXG4gICAqIG9yIHRvIGFwcGVuZCBpbnRvIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50O1xufVxuXG4vKipcbiAqIEEgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHB1dCBvbiBzY3JlZW4sIGFuZCB3aGVyZSBpdCBlbmRlZCB1cC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGhvbGRpbmcgdGhpcyBtZXNzYWdlIGFsb25lLCBpbnNpZGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlLm5vdGljZX0uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBjcmVhdGVkIHRoZSBub3RpY2UsIGFzIG9wcG9zZWQgdG8gam9pbmluZyBvbmUgdGhhdCB3YXMgYWxyZWFkeSBvbiBzY3JlZW4uXG4gICAqIE9ubHkgdGhlIGNyZWF0b3IgbWF5IGhpZGUgaXQ7IGEgam9pbmVkIG1lc3NhZ2UgY2FuIG1lcmVseSByZW1vdmUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb3RpY2VPd25lZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5vdGljZSB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGljZTogTm90aWNlO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IG51bGwgfCBudW1iZXI7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU6IFBsdWdpbk5vdGljZU1vZGU7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljazogKCgkZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQnkgZGVmYXVsdCBhIG5ldyBub3RpY2UgaGlkZXMgdGhlIHByZXZpb3VzIG9uZSwgc28gb25seSB0aGUgbGF0ZXN0XG4gKiBtZXNzYWdlIGlzIG9uIHNjcmVlbjsge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IGNob29zZXMgb3RoZXJ3aXNlIOKAlCBzZWVcbiAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YW5kYWxvbmVOb3RpY2VzID0gbmV3IFNldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTmFtZSA9IHBhcmFtcy5wbHVnaW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgcGVybWFuZW50IG5vdGljZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGxvYWQgKGUuZy4gYSBwcmV2aW91cyBwbHVnaW4gc2Vzc2lvbikgb24gbG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgcGVybWFuZW50Tm90aWNlID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKTtcbiAgICBwZXJtYW5lbnROb3RpY2U/LmhpZGUoKTtcbiAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2Ugb24gdW5sb2FkLCB1bmxlc3MgaXQgaXMgdGhlIHBlcm1hbmVudCBub3RpY2UgKHdoaWNoIGlzIG1lYW50IHRvIG91dGxpdmUgdGhlIHBsdWdpbikuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGFueSBkZWxheWVkIG5vdGljZSB3aG9zZSB0aW1lciBoYXMgbm90IGZpcmVkIHlldCwgc28gaXQgbmV2ZXIgYXBwZWFycyBhZnRlciB1bmxvYWQuXG4gICAgZm9yIChjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgb2Ygc25hcHNob3QodGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zKSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LiBUaGUgbm90aWNlIHNob3dzIHRoZSBwbHVnaW4gbmFtZSBhYm92ZSBpdCwgc28gYSBsZWFkaW5nXG4gICAqIGA8cGx1Z2luIG5hbWU+OmAgaW4gdGhlIG1lc3NhZ2UgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biB0d2ljZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIOKAlCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmNsb3NlQXJpYUxhYmVsKSB9XG4gICAgfSk7XG4gICAgLy8gUmV1c2UgT2JzaWRpYW4ncyBtb2RhbCBjbG9zZS1idXR0b24gY2xhc3NlcyBzbyB0aGlzIGJ1dHRvbiBtYXRjaGVzIHRoZSBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uXG4gICAgLy8gKGxvb2sgYW5kIGhvdmVyKTsgdGhlIHN0eWxlc2hlZXQgb25seSBwb3NpdGlvbnMgaXQgaW4gdGhlIG5vdGljZSBjb3JuZXIuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjbG9zZUJ1dHRvbkVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRDbGFzc2VzKFtDc3NDbGFzcy5DbGlja2FibGVJY29uLCBDc3NDbGFzcy5Nb2RhbEhlYWRlckJ1dHRvbl0pO1xuICAgIHNldEljb24oY2xvc2VCdXR0b25FbCwgJ3gnKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25DbG9zZUNsaWNrPy4oe1xuICAgICAgICAgIGNhbmNlbDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIENhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIGlmIChpc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3RpY2UgPSBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UoKSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgICAgbm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBub3RpY2UgY3VycmVudGx5IGluIHRoZSBwZXItcGx1Z2luIHNsb3QsIHNvIGJvdGggbWVzc2FnZXMgc3RheSBvbiBzY3JlZW4gaW4gYVxuICAgKiBzaW5nbGUgbm90aWNlLlxuICAgKlxuICAgKiBUaGUgYXBwZW5kZWQgbWVzc2FnZSBjYXJyaWVzIG5vIHBsdWdpbi1uYW1lIHByZWZpeCDigJQgdGhlIG5vdGljZSBhbHJlYWR5IG9wZW5zIHdpdGggb25lLCBhbmRcbiAgICogcmVwZWF0aW5nIGl0IG9uIGV2ZXJ5IGxpbmUgcmVhZHMgYXMgbm9pc2UuIEl0IGlzIHdyYXBwZWQgbGlrZSBhbnkgb3RoZXIgbm90aWNlIGNvbnRlbnQsIHNvIGEgbGluayBvclxuICAgKiBidXR0b24gaW5zaWRlIGl0IHN0aWxsIGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEFwcGVuZGluZyByZXN0YXJ0cyB0aGUgbm90aWNlJ3MgY291bnRkb3duICh7QGxpbmsgTm90aWNlLnNldEF1dG9IaWRlfSksIHNvIHRoZSBuZXcgbWVzc2FnZSBnZXRzIGFcbiAgICogZnVsbCBkdXJhdGlvbiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgd2hhdCB3YXMgbGVmdCBvZiB0aGUgY3VycmVudCBvbmUg4oCUIGEgbGluZSBhcHBlbmRlZCBhIG1vbWVudFxuICAgKiBiZWZvcmUgdGhlIG5vdGljZSBleHBpcmVzIHdvdWxkIG90aGVyd2lzZSBmbGFzaCBhbmQgdmFuaXNoLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2V9IGRlc2NyaWJpbmcgdGhlIGpvaW5lZCBub3RpY2UsIG9yIGBudWxsYCB3aGVuXG4gICAqIHRoZXJlIGlzIG5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0byDigJQgdGhlIHNsb3QgaXMgZW1wdHksIG9yIGl0cyBub3RpY2UgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkXG4gICAqIOKAlCBhbmQgdGhlIGNhbGxlciBzaG91bGQgc2hvdyBhIG5ldyBub3RpY2UgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXBwZW5kVG9DdXJyZW50Tm90aWNlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zKTogbnVsbCB8IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG9uSGlkZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGN1cnJlbnROb3RpY2UgPSB0aGlzLm5vdGljZTtcbiAgICAvLyBgaXNTaG93bmAgaXMgdGhlIHNhbWUgY2hlY2sgT2JzaWRpYW4ncyBvd24gYE5vdGljZS5oaWRlYCBtYWtlcyBiZWZvcmUgYW5pbWF0aW5nIGEgbm90aWNlIGF3YXksIHNvXG4gICAgLy8gaXQgaXMgZXhhY3RseSBcInN0aWxsIG9uIHNjcmVlblwiOiBhIG5vdGljZSB0aGF0IGV4cGlyZWQgb3Igd2FzIGRpc21pc3NlZCBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICBpZiAoIWN1cnJlbnROb3RpY2U/LmNvbnRhaW5lckVsLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7IG1lc3NhZ2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lOiBmYWxzZSB9KTtcbiAgICBjdXJyZW50Tm90aWNlLm1lc3NhZ2VFbC5hcHBlbmQoZnJhZ21lbnQpO1xuICAgIC8vIEEgYG51bGxgIGR1cmF0aW9uIG1lYW5zIFwiT2JzaWRpYW4ncyBvd24gZGVmYXVsdFwiLCB3aGljaCBvbmx5IHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVzIOKAlCBzbyByZXN0YXJ0XG4gICAgLy8gdGhlIGNvdW50ZG93biB3aXRoIHRoYXQgc2FtZSBkZWZhdWx0IHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlIGN1cnJlbnQgb25lIHJ1bm5pbmcuXG4gICAgY3VycmVudE5vdGljZS5zZXRBdXRvSGlkZShkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IE9CU0lESUFOX0RFRkFVTFRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyk7XG4gICAgdGhpcy53aXJlT25IaWRlKGN1cnJlbnROb3RpY2UsIG9uSGlkZSk7XG4gICAgLy8gT25seSBldmVyIHJlZ2lzdGVycywgbmV2ZXIgY2xlYXJzOiB0aGUgbm90aWNlIGJlaW5nIGFwcGVuZGVkIHRvIG1heSBhbHJlYWR5IGJlIHRoaXMgcGx1Z2luJ3NcbiAgICAvLyBwZXJtYW5lbnQgbm90aWNlLCBhbmQgYSBsYXRlciBhcHBlbmRlZCBtZXNzYWdlIGlzIG5vIHJlYXNvbiB0byBmb3JnZXQgdGhhdC5cbiAgICBpZiAoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCkge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UoY3VycmVudE5vdGljZSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogZmFsc2UsIG5vdGljZTogY3VycmVudE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZWxheWVkIG5vdGljZTogdGhlIHJlc29sdmVkIGNvbnRlbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBDYW5jZWxcbiAgICogYnV0dG9uIHRoYXQgYWJvcnRzIHRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSBob2xkaW5nIHRoZSBjb250ZW50IGFuZCwgaWYgcmVxdWVzdGVkLCBhIENhbmNlbCBidXR0b24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgeyBhYm9ydENvbnRyb2xsZXIsIGNhbmNlbEJ1dHRvblRleHQsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gZGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNhbmNlbEJ1dHRvbi5idXR0b25FbCwgQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgICAgIC8vIFRoZSBjbGljayBpcyB3aXJlZCB2aWEgYGFkZEV2ZW50TGlzdGVuZXJgIHJhdGhlciB0aGFuIGBCdXR0b25Db21wb25lbnQub25DbGlja2Agc28gaXRcbiAgICAgIC8vIGJ1YmJsZXMgdGhyb3VnaCB0aGUgaW50ZXJhY3RpdmUtZWxlbWVudCBndWFyZCAoa2VlcGluZyB0aGUgbm90aWNlIG9wZW4pIGFuZCBzdGF5c1xuICAgICAgLy8gZGlyZWN0bHkgZXhlcmNpc2FibGUgdmlhIGEgZGlzcGF0Y2hlZCBET00gZXZlbnQgaW4gdW5pdCB0ZXN0cy5cbiAgICAgIGNhbmNlbEJ1dHRvbi5idXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjYW5jZWxCdXR0b24uYnV0dG9uRWwpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCB3cmFwcGVkIGluIGEgY29udGFpbmVyIHRoYXQga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW4gaW50ZXJhY3RpdmVcbiAgICogZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC4gT2JzaWRpYW4gZGlzbWlzc2VzIGEgbm90aWNlIG9uIGFueSBjbGljayB0aGF0IGJ1YmJsZXMgdXAgdG8gaXRzXG4gICAqIGVsZW1lbnQ7IHRoZSBjb250YWluZXIgaW50ZXJjZXB0cyBjbGlja3Mgb3JpZ2luYXRpbmcgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCAoYSBsaW5rLCBidXR0b24sXG4gICAqIGlucHV0LCBldGMuKSBhbmQgc3RvcHMgdGhlbSB0aGVyZSwgc28gdGhlIGVsZW1lbnQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIGJ1dCB0aGUgbm90aWNlIHN0YXlzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb3RpY2VDb250ZW50KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gICAgY29uc3QgeyBnZXROb3RpY2UsIG9uQ2xvc2VDbGljaywgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gZmFsc2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lID0gdHJ1ZSwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnN0cmlwUGx1Z2luTmFtZVByZWZpeChwYXJhbXMubWVzc2FnZSk7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IGNvbnRlbnRFbCA9IGZyYWdtZW50LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGVudEVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDb250ZW50KTtcbiAgICBpZiAoc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWUpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQodGhpcy5idWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAvLyBBIGhhcmQtdG8tY2xvc2Ugbm90aWNlIG11c3Qgbm90IGRpc21pc3Mgb24gYW55IHN0cmF5IGNsaWNrOyBvbmx5IGl0cyBjbG9zZSBidXR0b24gbWF5IGhpZGUgaXQuXG4gICAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlICYmIHNob3VsZFNob3dDbG9zZUJ1dHRvbikge1xuICAgICAgdGhpcy5hcHBlbmRDbG9zZUJ1dHRvbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXM+KHtcbiAgICAgICAgY29udGVudEVsLFxuICAgICAgICBnZXROb3RpY2U6IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSksXG4gICAgICAgIG9uQ2xvc2VDbGlja1xuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGZyYWdtZW50IH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCwgcHJlZml4aW5nIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBsdWdpbiBuYW1lIGluIGEgc3R5bGVkIGVsZW1lbnQgc28gaXQgaXNcbiAgICogdmlzdWFsbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAqXG4gICAqIFRoZSBuYW1lIGlzIHJlbmRlcmVkIGFzIGlubGluZSBjb2RlLCB0aGUgd2F5IGV2ZXJ5IHBsdWdpbiBuYW1lIGluIHRoZSBVSSBpcywgaW5zaWRlIGEgc3BhbiB0aGF0IGtlZXBzXG4gICAqIHRoZSBwcmVmaXgncyBvd24gbGF5b3V0IGFuZCBhY2NlbnQgY29sb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhZnRlciB0aGUgcGx1Z2luIG5hbWUgcHJlZml4LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB3aXRoIHRoZSBzdHlsZWQgcGx1Z2luIG5hbWUgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgICBhcHBlbmRDb2RlQmxvY2sobmFtZUVsLCB0aGlzLnBsdWdpbk5hbWUpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobmFtZUVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VOYW1lKTtcbiAgICBmcmFnbWVudC5hcHBlbmQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZSgpOiBOb3RpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2VzKCkuZ2V0KHRoaXMucGx1Z2luTmFtZSkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlcygpOiBNYXA8c3RyaW5nLCBOb3RpY2U+IHtcbiAgICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxNYXA8c3RyaW5nLCBOb3RpY2U+PihQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBOb3RpY2U+KCkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmVzIGEgbGVhZGluZyBgPHBsdWdpbiBuYW1lPjpgIGluIGEgbWVzc2FnZSwgdG9nZXRoZXIgd2l0aCB0aGUgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGNvbG9uIGFuZFxuICAgKiBhZnRlciBpdC5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgbWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXgsIG9yIGAwYCB3aGVuIHRoZSB0ZXh0IGRvZXMgbm90IG9wZW4gd2l0aCB0aGlzIHBsdWdpbidzIG5hbWUgYW5kIGFcbiAgICogY29sb24uXG4gICAqL1xuICBwcml2YXRlIGdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMucGx1Z2luTmFtZSB8fCAhdGV4dC5zdGFydHNXaXRoKHRoaXMucGx1Z2luTmFtZSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBzZXBhcmF0b3JNYXRjaCA9IC9eXFxzKjpcXHMqLy5leGVjKHRleHQuc2xpY2UodGhpcy5wbHVnaW5OYW1lLmxlbmd0aCkpO1xuICAgIHJldHVybiBzZXBhcmF0b3JNYXRjaCA/IHRoaXMucGx1Z2luTmFtZS5sZW5ndGggKyBzZXBhcmF0b3JNYXRjaFswXS5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgbm90aWNlIGhhcmQgdG8gY2xvc2U6IG1hcmtzIGl0cyBvdXRlciBlbGVtZW50IChzbyB0aGUgQ1NTIG5ldXRyYWxpemVzIGl0cyBwYWRkaW5nKSBhbmRcbiAgICogaW5zdGFsbHMgYSBjYXB0dXJlLXBoYXNlIGNsaWNrIGd1YXJkIHRoYXQgc3RvcHMgZXZlcnkgY2xpY2sgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGFcbiAgICogYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3Mgb3duIGRpc21pc3MgaGFuZGxlciDigJQgc28gYW5cbiAgICogaW50ZXJhY3RpdmUgY2hpbGQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIHdoaWxlIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRpc21pc3MgdGhlIG5vdGljZS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gZ3VhcmQuXG4gICAqIEBwYXJhbSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgLSBXaGV0aGVyIHRoZSBub3RpY2UgcmVxdWlyZXMgZXhwbGljaXQgY2xvc2U7IHdoZW4gYGZhbHNlYCwgbm90aGluZyBpc1xuICAgKiBpbnN0YWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKG5vdGljZTogTm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3V0ZXIgYC5ub3RpY2VgIGVsZW1lbnQgKGBjb250YWluZXJFbGApIGNhcnJpZXMgT2JzaWRpYW4ncyBkaXNtaXNzLW9uLWNsaWNrIGhhbmRsZXIgYW5kIHRoZVxuICAgIC8vIHBhZGRpbmcgYSBzdHJheSBjbGljayBjb3VsZCBsYW5kIG9uOyBtYXJrIGl0IHNvIHRoZSBzdHlsZXNoZWV0IGRyb3BzIHRoYXQgcGFkZGluZy5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5vdGljZS5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAvLyBTdG9wIGV2ZXJ5IGNsaWNrIG9uIHRoZSBub3RpY2Ug4oCUIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IOKAlCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3NcbiAgICAvLyBkaXNtaXNzIGhhbmRsZXIuIFJlZ2lzdGVyZWQgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugb24gdGhlIG91dGVybW9zdCBlbGVtZW50IHNvIGl0IGFsd2F5cyBydW5zIGZpcnN0LlxuICAgIC8vIExldHRpbmcgYSBjbGljayByZWFjaCBhbiBpbnRlcmFjdGl2ZSBjaGlsZCAoYSBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGlzIHdoYXQga2VlcHNcbiAgICAvLyBpdHMgb3duIGhhbmRsZXIgd29ya2luZzsgdGhlIGJ1YmJsZS1waGFzZSBndWFyZCBvbiB0aGUgY29udGVudCB3cmFwcGVyIHRoZW4gc3RvcHMgdGhhdCBjbGljayBmcm9tXG4gICAgLy8gYnViYmxpbmcgdXAgdG8gT2JzaWRpYW4ncyBkaXNtaXNzIGhhbmRsZXIsIHNvIHRoZSBub3RpY2Ugc3RpbGwgc3RheXMgb3Blbi5cbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgY2xpY2sgb24gdGhlIG5vdGljZSBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW4gcmVwb3J0IGFcbiAgICogdXNlciBkaXNtaXNzYWwuIE9ic2lkaWFuIGhpZGVzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoZSBjbGljaywgc28gYVxuICAgKiBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIG1hcmtzIHRoZSBub3RpY2UgYmVmb3JlIHRoYXQgaGlkZSBydW5zOyB0aGUgbWFyayBpcyBjbGVhcmVkIGFmdGVyIHRoZSBldmVudFxuICAgKiBzbyBhIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkLiBBIGNsb3NlLWJ1dHRvbiBjbGljayBpcyB0cmFja2VkIHNlcGFyYXRlbHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LmFwcGVuZENsb3NlQnV0dG9ufSkuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIHRyYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcobm90aWNlOiBOb3RpY2UpOiB2b2lkIHtcbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBPYnNpZGlhbiBkaXNtaXNzZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhpcyBjbGljaywgc28gbWFyayBpdCBub3cgKGJlZm9yZVxuICAgICAgLy8gdGhhdCBoaWRlIHJ1bnMpIGFuZCBjbGVhciBpdCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sg4oCUIGFmdGVyIGFueSBzeW5jaHJvbm91cyBkaXNtaXNzLCBidXQgYmVmb3JlIGFcbiAgICAgIC8vIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlLCBzbyB0aGF0IGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQgYXMgYSB1c2VyIGFjdGlvbi5cbiAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLCBwbGFjaW5nIGl0IGFjY29yZGluZyB0byBpdHMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9OiBhXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IG5vdGljZSB0YWtlcyB0aGUgcGVyLXBsdWdpbiBzbG90IChoaWRpbmcgd2hhdGV2ZXIgd2FzIGluIGl0LCBhbmRcbiAgICogb3B0aW9uYWxseSByZWdpc3RlcmluZyBhcyB0aGlzIHBsdWdpbidzIHBlcm1hbmVudCBub3RpY2UpLCBhbiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9IG9uZVxuICAgKiBqb2lucyB0aGUgbm90aWNlIGFscmVhZHkgaW4gdGhlIHNsb3QsIGFuZCBhIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBvbmUgaXMgdHJhY2tlZCBvbiBpdHNcbiAgICogb3duLCBsZWF2aW5nIHRoZSBzbG90IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlfSBkZXNjcmliaW5nIHdoZXJlIHRoZSBtZXNzYWdlIGVuZGVkIHVwLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm90aWNlV2l0aER1cmF0aW9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG1vZGUsIG9uQ2xvc2VDbGljaywgb25IaWRlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiB9ID0gcGFyYW1zO1xuICAgIC8vIE9ic2lkaWFuJ3MgYE5vdGljZWAgdHJlYXRzIGFuIG9taXR0ZWQgZHVyYXRpb24gYXMgaXRzIGRlZmF1bHQsIHNvIG1hcCB0aGUgYG51bGxgIFwibm8gZXhwbGljaXRcbiAgICAvLyBkdXJhdGlvblwiIHZhbHVlIHRvIGB1bmRlZmluZWRgLlxuICAgIGNvbnN0IG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZCkge1xuICAgICAgY29uc3QgYXBwZW5kZWROb3RpY2UgPSB0aGlzLmFwcGVuZFRvQ3VycmVudE5vdGljZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zPih7XG4gICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG9uSGlkZSxcbiAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudFxuICAgICAgfSkpO1xuICAgICAgaWYgKGFwcGVuZGVkTm90aWNlKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmRlZE5vdGljZTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0bywgc28gdGhpcyBtZXNzYWdlIGJlY29tZXMgdGhlIHNsb3QncyBub3RpY2UgaW5zdGVhZC5cbiAgICB9XG5cbiAgICBjb25zdCBoYXNDbG9zZUJ1dHRvbiA9IHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b247XG4gICAgLy8gVGhlIGNsb3NlIGJ1dHRvbidzIGNsaWNrIGhhbmRsZXIgbmVlZHMgdGhlIGBOb3RpY2VgLCB3aGljaCBkb2VzIG5vdCBleGlzdCB1bnRpbCBpdCBpcyBidWlsdCBmcm9tXG4gICAgLy8gdGhpcyBjb250ZW50OyBjYXB0dXJlIGl0IGxhemlseSB2aWEgYSBob2xkZXIgcmVzb2x2ZWQgYXQgY2xpY2sgdGltZS4gVGhlIGdldHRlciBpcyBjcmVhdGVkIG9ubHlcbiAgICAvLyB3aGVuIGEgY2xvc2UgYnV0dG9uIGlzIHNob3duLlxuICAgIGxldCBidWlsdE5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zPih7XG4gICAgICBnZXROb3RpY2U6IGhhc0Nsb3NlQnV0dG9uID8gKCk6IE5vdGljZSB8IG51bGwgPT4gYnVpbHROb3RpY2UgOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgb25DbG9zZUNsaWNrLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uXG4gICAgfSkpO1xuXG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUpIHtcbiAgICAgIGJ1aWx0Tm90aWNlID0gbmV3IE5vdGljZShmcmFnbWVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5hZGQoYnVpbHROb3RpY2UpO1xuICAgICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgIHRoaXMubm90aWNlID0gYnVpbHROb3RpY2U7XG4gICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuXG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2Uoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCA/IGJ1aWx0Tm90aWNlIDogbnVsbCk7XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgYSBsZWFkaW5nIGA8cGx1Z2luIG5hbWU+OmAgZnJvbSBhIG1lc3NhZ2UuIFRoZSBub3RpY2UgYWxyZWFkeSBvcGVucyB3aXRoIHRoZSBwbHVnaW4gbmFtZSBpbiBpdHNcbiAgICogb3duIHN0eWxlZCBoZWFkZXIsIHNvIGEgbWVzc2FnZSB0aGF0IHJlcGVhdHMgaXQgcmVhZHMgYXMgdGhlIG5hbWUgdHdpY2UuXG4gICAqXG4gICAqIEEgZnJhZ21lbnQgaXMgbWF0Y2hlZCBvbiBpdHMgdGV4dCwgc28gYSBuYW1lIHdyYXBwZWQgaW4gYW4gZWxlbWVudCAoc3VjaCBhcyBpbmxpbmUgY29kZSkgc3RpbGxcbiAgICogY291bnRzOyB0aGUgcHJlZml4IGlzIGN1dCBvdXQgb2YgaXRzIHRleHQgbm9kZXMsIGFuZCBhbiBlbGVtZW50IGl0IGxlYXZlcyBlbXB0eSBpcyByZW1vdmVkLiBUaGUgbmFtZVxuICAgKiBpcyBtYXRjaGVkIGV4YWN0bHksIGFuZCBvbmx5IGF0IHRoZSBzdGFydDogYSBtZXNzYWdlIHRoYXQgbWVyZWx5IG1lbnRpb25zIHRoZSBuYW1lIGxhdGVyIGlzIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIHdpdGhvdXQgdGhlIHByZWZpeC4gQSBmcmFnbWVudCBpcyBjaGFuZ2VkIGluIHBsYWNlIGFuZCByZXR1cm5lZC5cbiAgICovXG4gIHByaXZhdGUgc3RyaXBQbHVnaW5OYW1lUHJlZml4KG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZS5zbGljZSh0aGlzLmdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGxldCByZW1haW5pbmdMZW5ndGggPSB0aGlzLmdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgobWVzc2FnZS50ZXh0Q29udGVudCk7XG4gICAgaWYgKHJlbWFpbmluZ0xlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiBnZXRUZXh0Tm9kZXMobWVzc2FnZSkpIHtcbiAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhLmxlbmd0aCA+IHJlbWFpbmluZ0xlbmd0aCkge1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdGV4dE5vZGUuZGF0YS5zbGljZShyZW1haW5pbmdMZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlbWFpbmluZ0xlbmd0aCAtPSB0ZXh0Tm9kZS5kYXRhLmxlbmd0aDtcbiAgICAgIC8vIENsaW1iIHRvIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBob2xkaW5nIG5vdGhpbmcgYnV0IHRoaXMgdGV4dCwgc28gbm8gZW1wdHkgd3JhcHBlciBpcyBsZWZ0IGJlaGluZC5cbiAgICAgIC8vIEEgbm9kZSBkaXJlY3RseSBpbiB0aGUgZnJhZ21lbnQgaGFzIG5vIHBhcmVudCBlbGVtZW50LCB3aGljaCBpcyB3aGVyZSB0aGUgY2xpbWIgc3RvcHMuXG4gICAgICBsZXQgZW1wdGllZE5vZGU6IENoaWxkTm9kZSA9IHRleHROb2RlO1xuICAgICAgd2hpbGUgKGVtcHRpZWROb2RlLnBhcmVudEVsZW1lbnQ/LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVtcHRpZWROb2RlID0gZW1wdGllZE5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGVtcHRpZWROb2RlLnJlbW92ZSgpO1xuICAgICAgaWYgKHJlbWFpbmluZ0xlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYSBub3RpY2UncyBgaGlkZWAgc28gdGhlIGdpdmVuIGNhbGxiYWNrIHJ1bnMgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4g4oCUIGJ5IHRoZVxuICAgKiB1c2VyLCBieSBhIHJlcGxhY2luZyBub3RpY2UsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gdW5sb2FkLiBEb2VzIG5vdGhpbmcgd2hlbiBubyBjYWxsYmFja1xuICAgKiBpcyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2Ugd2hvc2UgYGhpZGVgIHRvIHdyYXAuXG4gICAqIEBwYXJhbSBvbkhpZGUgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIG9uIHRoZSBmaXJzdCBoaWRlLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIHdyYXBwaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlT25IaWRlKG5vdGljZTogTm90aWNlLCBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFvbkhpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUnVuIGBvbkhpZGVgIHRoZSBmaXJzdCB0aW1lIHRoZSBub3RpY2UgaXMgaGlkZGVuLiBBIGBvbmNlYCBwYXRjaCBvbiBgaGlkZWAgaW50ZXJjZXB0cyBleGFjdGx5IG9uZVxuICAgIC8vIGNhbGwgdGhlbiB1bmluc3RhbGxzIGl0c2VsZiAodW5sb2FkaW5nIHRoaXMgZGVkaWNhdGVkIGNvbXBvbmVudCksIHNvIHRoZXJlIGlzIG5vIG1hbnVhbFxuICAgIC8vIHNpbmdsZS1maXJlIGJvb2trZWVwaW5nIGFuZCBubyBsaW5nZXJpbmcgcGF0Y2ggb24gdGhlIHRyYW5zaWVudCBub3RpY2UuIFRoZSB1c2VyLWNsb3NlIGZsYWdzIHdlcmVcbiAgICAvLyBzZXQgYmVmb3JlIGBoaWRlKClgIHdhcyBpbnZva2VkIChzZWUgYGFwcGVuZENsb3NlQnV0dG9uYCAvIGBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmdgKSwgc28gdGhleVxuICAgIC8vIHN0aWxsIGhvbGQgd2hlbiByZWFkIGhlcmUgYWZ0ZXIgYGZhbGxiYWNrKClgLlxuICAgIGNvbnN0IHBhdGNoQ29tcG9uZW50ID0gbmV3IE1vbmtleUFyb3VuZENvbXBvbmVudCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LmxvYWQoKTtcbiAgICBwYXRjaENvbXBvbmVudC5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IG5vdGljZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdoaWRlJyxcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrIH0pID0+IHtcbiAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgY29uc3QgaXNDbG9zZUJ1dHRvbkNsaWNrZWQgPSB0aGlzLmNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGNvbnN0IGlzVXNlckFjdGlvbiA9IGlzQ2xvc2VCdXR0b25DbGlja2VkIHx8IHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb25IaWRlKHsgaXNDbG9zZUJ1dHRvbkNsaWNrZWQsIGlzVXNlckFjdGlvbiB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgdGV4dCBub2RlcyB1bmRlciBhIG5vZGUsIGluIGRvY3VtZW50IG9yZGVyLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gd2Fsay5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0IG5vZGVzLlxuICovXG5mdW5jdGlvbiBnZXRUZXh0Tm9kZXMobm9kZTogTm9kZSk6IFRleHRbXSB7XG4gIGNvbnN0IHRleHROb2RlczogVGV4dFtdID0gW107XG4gIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xuICAgIGlmIChpc1RleHROb2RlKGNoaWxkTm9kZSkpIHtcbiAgICAgIHRleHROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHROb2Rlcy5wdXNoKC4uLmdldFRleHROb2RlcyhjaGlsZE5vZGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRleHROb2Rlcztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSB0ZXh0IG5vZGUuIEl0IHJlYWRzIHRoZSBub2RlIHR5cGUgcmF0aGVyIHRoYW4gYGluc3RhbmNlb2YgVGV4dGAsIHdoaWNoIGlzXG4gKiBmYWxzZSBmb3IgYSBub2RlIGZyb20gYSBwb3BvdXQgd2luZG93J3MgcmVhbG0uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogTm9kZSk6IG5vZGUgaXMgVGV4dCB7XG4gIHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFNBQVM7QUFDbEIsU0FBUywyQkFBMkI7QUFDcEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyw2QkFBNkI7QUFFdEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSw0Q0FBNEM7QUFJbEQsTUFBTSxtREFBbUQ7QUFJekQsTUFBTSwrQkFBK0I7QUFTOUIsSUFBSyxtQkFBTCxrQkFBS0Esc0JBQUw7QUFTTCxFQUFBQSxrQkFBQSxZQUFTO0FBTVQsRUFBQUEsa0JBQUEsYUFBVTtBQU9WLEVBQUFBLGtCQUFBLGNBQVc7QUF0QkQsU0FBQUE7QUFBQSxHQUFBO0FBaVVM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
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpc3Bvc2FibGVFeCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kaXNwb3NhYmxlJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IHNuYXBzaG90IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNhc3RUbyxcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXByb3ZpZGVyJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgTm90aWNlLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYXBwZW5kQ29kZUJsb2NrIH0gZnJvbSAnLi4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2Ug4oCUIGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGVFeH0gKHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggYHVzaW5nYCkgdGhhdCBhbHNvIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSB0aGVcbiAqIG5vdGljZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIGV4dGVuZHMgRGlzcG9zYWJsZUV4IHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoaXMgaGFuZGxlJ3MgbWVzc2FnZSwgcmUtYXBwbHlpbmcgdGhlIHBsdWdpbi1uYW1lIHByZWZpeCwgdGhlIGludGVyYWN0aXZlLWNsaWNrIGd1YXJkLCBhbmRcbiAgICogdGhlIENhbmNlbCBidXR0b24uIFVzZWZ1bCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzLiBJZiB0aGUgZGVsYXkgaGFzIG5vdCBlbGFwc2VkIHlldCwgdGhlIG5ldyBjb250ZW50XG4gICAqIGJlY29tZXMgd2hhdCBpcyBzaG93biBvbmNlIGl0IGRvZXMuXG4gICAqXG4gICAqIE9ubHkgdGhpcyBoYW5kbGUncyBvd24gbWVzc2FnZSBpcyByZXdyaXR0ZW46IHdoZW4gdGhlIG5vdGljZSB3YXMgam9pbmVkIHJhdGhlciB0aGFuIG9wZW5lZCAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5tb2RlfSksIHRoZSBtZXNzYWdlcyBhbHJlYWR5IGluIGl0IGFyZSBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBuZXcgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhIENhbmNlbCBidXR0b24gaXMgYXBwZW5kZWQgdG8gdGhlIG5vdGljZTsgY2xpY2tpbmcgaXQgYWJvcnRzIHRoaXMgY29udHJvbGxlci4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBDYW5jZWwgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG93biB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIGlzIHByb3ZpZGVkLiBXaGVuIG9taXR0ZWQsIHRoZSBsb2NhbGl6ZWQgYENhbmNlbGAgbGFiZWwgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29udGVudCwgcmVzb2x2ZWQgbGF6aWx5IG9ubHkgaWYgdGhlIGRlbGF5IGVsYXBzZXMg4oCUIHNvIGFuIG9wZXJhdGlvbiB0aGF0IGZpbmlzaGVzXG4gICAqIHNvb25lciBuZXZlciBidWlsZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG11c3QgcnVuIGJlZm9yZSB0aGUgbm90aWNlIGlzIHNob3duLiBPcGVyYXRpb25zIHRoYXQgZmluaXNoIHNvb25lciBuZXZlclxuICAgKiBzaG93IGEgbm90aWNlLCBhdm9pZGluZyBhIGRpc3RyYWN0aW5nIGZsYXNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoaXMgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIOKAlCBzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9LlxuICAgKlxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gaXMgd29ydGggY29uc2lkZXJpbmcgZm9yIGEgbG9uZyBvcGVyYXRpb246IG9uIHRoZSBkZWZhdWx0XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IHRoZSBwcm9ncmVzcyBub3RpY2UgdGFrZXMgdGhlIHNoYXJlZCBzbG90LCBzbyBhbnkgb3JkaW5hcnkgbm90aWNlXG4gICAqIHJhaXNlZCB3aGlsZSB0aGUgb3BlcmF0aW9uIHJ1bnMgaGlkZXMgaXQsIGFuZCB0aGUgcHJvZ3Jlc3MgdGhlIHVzZXIgd2FzIHdhdGNoaW5nIGRvZXMgbm90IGNvbWUgYmFjay5cbiAgICpcbiAgICogV2hpY2hldmVyIG1vZGUgaXMgdXNlZCwgdGhlIHJldHVybmVkIGhhbmRsZSBvd25zIG9ubHkgSVRTIG1lc3NhZ2U6IHVwZGF0aW5nIHRoZSBjb250ZW50IHJld3JpdGVzXG4gICAqIHRoYXQgbWVzc2FnZSBhbG9uZSwgYW5kIGRpc3Bvc2luZyB0YWtlcyBhd2F5IG9ubHkgdGhhdCBtZXNzYWdlIHdoZW4gdGhlIG5vdGljZSB3YXMgYWxyZWFkeSBvblxuICAgKiBzY3JlZW4gKGEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBpcyBoaWRkZW4gYXMgYSB3aG9sZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9XG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQZXJtYW5lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBjYW5ub3QgYmUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IChpdCBuZWVkcyB0aGUgc2hhcmVkIHNsb3QgaXQgaXNcbiAgICogdHJhY2tlZCBpbiksIGFuZCBhIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKHNvIGEgbGF0ZXIgbm90aWNlIG5ldmVyIHNpbGVudGx5IHJlcGxhY2VzIGl0KTsgZWl0aGVyXG4gICAqIGNvbnRyYWRpY3Rpb24gdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSwgb3Ige0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IHdoZW5cbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBpcyBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBiZWZvcmUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIENhbGxcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudC5jYW5jZWx9IG9uIHRoZSBldmVudCB0byBjYW5jZWwgdGhlIGNsb3NlIGFuZCBrZWVwIHRoZSBub3RpY2VcbiAgICogb3BlbiDigJQgZm9yIGV4YW1wbGUgYWZ0ZXIgeW91ciBvd24gY29uZmlybWF0aW9uIGRlY2xpbmVzLiBBbiBhc3luYyBjYWxsYmFjayBpcyBhd2FpdGVkIGJlZm9yZSB0aGVcbiAgICogbm90aWNlIGlzIGhpZGRlbi4gUnVucyBvbmx5IHdoZW4gYSBjbG9zZSBidXR0b24gaXMgc2hvd24gKGJvdGhcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWAgYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRTaG93Q2xvc2VCdXR0b259IGFyZSBzZXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIG5vdGljZSBoaWRlcyBpdC4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIG5vdGljZSBkaXNtaXNzZXMgb24gY2xpY2sgbGlrZVxuICAgKiBhIG5vcm1hbCBPYnNpZGlhbiBub3RpY2UuIFdoZW4gYGZhbHNlYCwgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBpdCBkb2VzIG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheVxuICAgKiBjbGljaywgYW5kIGluc3RlYWQgc2hvd3MgYSBjbG9zZSAoWCkgYnV0dG9uIHRoYXQgaGlkZXMgaXQgZGlyZWN0bHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30pLlxuICAgKlxuICAgKiBBIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBzdGFuZHMgb24gaXRzIG93blxuICAgKiAoaW1wbGllcyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0pLCBzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdDsgcGFzc2luZ1xuICAgKiBhbnkgb3RoZXIge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWBcbiAgICogdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24g4oCUIGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IOKAlCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGdldE5vdGljZTogKCkgPT4gTm90aWNlIHwgbnVsbDtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoJGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBzdG9wcyBldmVyeSBjbGljayBmcm9tIGRpc21pc3NpbmcgaXQgYW5kLCB1bmxlc3Mgc3VwcHJlc3NlZCBieVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0sIGFkZHMgYSBjbG9zZSBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgcHJlZml4ZWQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIE9ubHkgYSBtZXNzYWdlIHRoYXQgb3BlbnMgYSBub3RpY2UgaXNcbiAgICogcHJlZml4ZWQ7IGEgbWVzc2FnZSBhcHBlbmRlZCB0byBvbmUgYWxyZWFkeSBzaG93aW5nIGl0IGlzIG5vdCwgc28gdGhlIG5hbWUgaXMgbm90IHJlcGVhdGVkIG9uIGV2ZXJ5XG4gICAqIGxpbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgY2xvc2UgYnV0dG9uIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcy5yZXF1aXJlc0V4cGxpY2l0Q2xvc2V9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidWlsdCBtZXNzYWdlOiB0aGUgd3JhcHBlciBlbGVtZW50IGhvbGRpbmcgaXQsIGFuZCB0aGUgZnJhZ21lbnQgdGhhdCBlbGVtZW50IHNpdHMgaW4uXG4gKlxuICogVGhlIGVsZW1lbnQgaXMgaGFuZGVkIGJhY2sgYmVjYXVzZSBhIG5vdGljZSBjYW4gaG9sZCBzZXZlcmFsIG9mIHRoZW0gKHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9KSxcbiAqIHNvIHdob2V2ZXIgb3ducyBvbmUgbWVzc2FnZSBoYXMgdG8gYmUgYWJsZSB0byB1cGRhdGUgb3IgcmVtb3ZlIGV4YWN0bHkgdGhhdCBtZXNzYWdlLiBUaGUgcmVmZXJlbmNlXG4gKiBzdGF5cyB2YWxpZCBvbmNlIHRoZSBmcmFnbWVudCBpcyBoYW5kZWQgdG8gYE5vdGljZWA6IGFwcGVuZGluZyBhIGZyYWdtZW50IG1vdmVzIGl0cyBjaGlsZHJlbiByYXRoZXJcbiAqIHRoYW4gY29weWluZyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB3cmFwcGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhZ21lbnQgaG9sZGluZyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudC5jb250ZW50RWx9LCByZWFkeSB0byBoYW5kIHRvIGBOb3RpY2VgXG4gICAqIG9yIHRvIGFwcGVuZCBpbnRvIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50O1xufVxuXG4vKipcbiAqIEEgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHB1dCBvbiBzY3JlZW4sIGFuZCB3aGVyZSBpdCBlbmRlZCB1cC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGhvbGRpbmcgdGhpcyBtZXNzYWdlIGFsb25lLCBpbnNpZGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlLm5vdGljZX0uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBjcmVhdGVkIHRoZSBub3RpY2UsIGFzIG9wcG9zZWQgdG8gam9pbmluZyBvbmUgdGhhdCB3YXMgYWxyZWFkeSBvbiBzY3JlZW4uXG4gICAqIE9ubHkgdGhlIGNyZWF0b3IgbWF5IGhpZGUgaXQ7IGEgam9pbmVkIG1lc3NhZ2UgY2FuIG1lcmVseSByZW1vdmUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb3RpY2VPd25lZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5vdGljZSB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGljZTogTm90aWNlO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IG51bGwgfCBudW1iZXI7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU6IFBsdWdpbk5vdGljZU1vZGU7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljazogKCgkZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQnkgZGVmYXVsdCBhIG5ldyBub3RpY2UgaGlkZXMgdGhlIHByZXZpb3VzIG9uZSwgc28gb25seSB0aGUgbGF0ZXN0XG4gKiBtZXNzYWdlIGlzIG9uIHNjcmVlbjsge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IGNob29zZXMgb3RoZXJ3aXNlIOKAlCBzZWVcbiAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YW5kYWxvbmVOb3RpY2VzID0gbmV3IFNldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTmFtZSA9IHBhcmFtcy5wbHVnaW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgcGVybWFuZW50IG5vdGljZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGxvYWQgKGUuZy4gYSBwcmV2aW91cyBwbHVnaW4gc2Vzc2lvbikgb24gbG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgcGVybWFuZW50Tm90aWNlID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKTtcbiAgICBwZXJtYW5lbnROb3RpY2U/LmhpZGUoKTtcbiAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2Ugb24gdW5sb2FkLCB1bmxlc3MgaXQgaXMgdGhlIHBlcm1hbmVudCBub3RpY2UgKHdoaWNoIGlzIG1lYW50IHRvIG91dGxpdmUgdGhlIHBsdWdpbikuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGFueSBkZWxheWVkIG5vdGljZSB3aG9zZSB0aW1lciBoYXMgbm90IGZpcmVkIHlldCwgc28gaXQgbmV2ZXIgYXBwZWFycyBhZnRlciB1bmxvYWQuXG4gICAgZm9yIChjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgb2Ygc25hcHNob3QodGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zKSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LiBUaGUgbm90aWNlIHNob3dzIHRoZSBwbHVnaW4gbmFtZSBhYm92ZSBpdCwgc28gYSBsZWFkaW5nXG4gICAqIGA8cGx1Z2luIG5hbWU+OmAgaW4gdGhlIG1lc3NhZ2UgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biB0d2ljZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlRXh9IGlzXG4gICAqIGRpc3Bvc2VkICh3aGljaCBhbHNvIGNhbmNlbHMgdGhlIHBlbmRpbmcgdGltZXIgaWYgaXQgaGFzIG5vdCBmaXJlZCB5ZXQpLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIGB1c2luZ2AuIFdoZW4gYW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn0gaXMgZ2l2ZW4sIGFcbiAgICogQ2FuY2VsIGJ1dHRvbiB0aGF0IGFib3J0cyBpdCBpcyBhcHBlbmRlZCAoYW5kLCBiZWluZyBpbnRlcmFjdGl2ZSwgZG9lcyBub3QgZGlzbWlzcyB0aGUgbm90aWNlKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX25vdGljZSA9IHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheSh7XG4gICAqICAgYWJvcnRDb250cm9sbGVyLFxuICAgKiAgIGNvbnRlbnQ6ICgpID0+IGJ1aWxkUHJvZ3Jlc3NGcmFnbWVudCgpXG4gICAqIH0pO1xuICAgKiBhd2FpdCBydW5PcGVyYXRpb24oYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2V9IHRoYXQgaGlkZXMgdGhlIG5vdGljZSAob3IgY2FuY2VscyB0aGUgcGVuZGluZ1xuICAgKiB0aW1lcikgd2hlbiBkaXNwb3NlZCBhbmQgbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIGl0IGlzIHNob3duLlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2VBZnRlckRlbGF5KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIHtcbiAgICBjb25zdCBtb2RlID0gcGFyYW1zLm1vZGUgPz8gUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlO1xuICAgIC8vIFdoZXJlIHRoaXMgbWVzc2FnZSBlbmRlZCB1cDogYSBub3RpY2Ugb2YgaXRzIG93biwgb3IgYSBjaHVuayBpbnNpZGUgb25lIHRoYXQgd2FzIGFscmVhZHkgdXAuIEl0XG4gICAgLy8gZGVjaWRlcyB3aGF0IGBzZXRDb250ZW50YCByZXdyaXRlcyBhbmQgd2hhdCBkaXNwb3NpbmcgdGFrZXMgYXdheS5cbiAgICBsZXQgc2hvd246IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSA9IG51bGw7XG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZXJJZCA9IDA7XG4gICAgbGV0IGN1cnJlbnRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+ID0gcGFyYW1zLmNvbnRlbnQ7XG5cbiAgICBjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmRlbGV0ZShjYW5jZWxQZW5kaW5nVGltZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBidWlsZERlbGF5ZWRNZXNzYWdlID0gKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50ID0+XG4gICAgICB0aGlzLmJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBwYXJhbXMuY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgY29udGVudFxuICAgICAgfSkpO1xuXG4gICAgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXNvbHZpbmcgdGhlIGNvbnRlbnQgaXMgYXN5bmNocm9ub3VzLCBhbmQgdGhlIG9wZXJhdGlvbiB0aGUgbm90aWNlIGRlc2NyaWJlcyBrZWVwcyBydW5uaW5nXG4gICAgICAgIC8vIHdoaWxlIGl0IGhhcHBlbnMg4oCUIHNvIGBzZXRDb250ZW50YCBjYW4gbGFuZCBpbiBiZXR3ZWVuLiBJdCBjYW5ub3QgcmV3cml0ZSBhIG5vdGljZSB0aGF0IGRvZXNcbiAgICAgICAgLy8gbm90IGV4aXN0IHlldCwgc28gcmVzb2x2ZSBhZ2FpbiB3aGVuZXZlciB0aGF0IGhhcHBlbnM6IHRoZSBub3RpY2UgbXVzdCBvcGVuIHdpdGggdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gdGhlIGNhbGxlciBsYXN0IGFza2VkIGZvciwgbm90IHRoZSBvbmUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHJlc29sdXRpb24gc3RhcnRlZC5cbiAgICAgICAgbGV0IHJlcXVlc3RlZENvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG4gICAgICAgIGxldCByZXNvbHZlZENvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXF1ZXN0ZWRDb250ZW50ID0gY3VycmVudENvbnRlbnQ7XG4gICAgICAgICAgcmVzb2x2ZWRDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVZhbHVlKHJlcXVlc3RlZENvbnRlbnQsIHt9KTtcbiAgICAgICAgICAvLyBUaGUgaGFuZGxlIG1heSBoYXZlIGJlZW4gZGlzcG9zZWQgd2hpbGUgdGhlIGNvbnRlbnQgd2FzIGJlaW5nIHJlc29sdmVkOyBkb24ndCBzaG93IGEgc3RhbGUgbm90aWNlLlxuICAgICAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChyZXF1ZXN0ZWRDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCk7XG5cbiAgICAgICAgc2hvd24gPSB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgIG1lc3NhZ2U6IGJ1aWxkRGVsYXllZE1lc3NhZ2UocmVzb2x2ZWRDb250ZW50KSxcbiAgICAgICAgICBtb2RlLFxuICAgICAgICAgIG9uQ2xvc2VDbGljazogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uSGlkZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgcGFyYW1zLmRlbGF5SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmFkZChjYW5jZWxQZW5kaW5nVGltZXIpO1xuXG4gICAgY29uc3QgZGlzcG9zZU5vdGljZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgICBpZiAoIXNob3duKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBnb2VzIGF3YXkgd2l0aCBpdDsgYSBub3RpY2UgaXQgbWVyZWx5IGpvaW5lZCBiZWxvbmdzIHRvIHdob2V2ZXJcbiAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgaWYgKHNob3duLmlzTm90aWNlT3duZWQpIHtcbiAgICAgICAgc2hvd24ubm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgaWYgKHRoaXMubm90aWNlID09PSBzaG93bi5ub3RpY2UpIHtcbiAgICAgICAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3duLmNvbnRlbnRFbC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6IGRpc3Bvc2VOb3RpY2UsXG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlTm90aWNlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0byB0aGUgbm90aWNlIGNvbnRlbnQuIENsaWNraW5nIGl0IGZpcmVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcy5vbkNsb3NlQ2xpY2t9ICh3aGljaCBtYXkgY2FuY2VsIHRoZSBjbG9zZSk7IGlmXG4gICAqIG5vdCBjYW5jZWxsZWQsIGl0IGhpZGVzIHRoZSBub3RpY2UgYW5kIGRyb3BzIGl0IGZyb20gdGhlIHN0YW5kYWxvbmUtbm90aWNlIHRyYWNraW5nIHNldC4gVGhlIGhpZGUgaXNcbiAgICogbWFya2VkIGFzIGEgY2xvc2UtYnV0dG9uIGNsaWNrIHNvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkhpZGV9IGNhblxuICAgKiBkaXN0aW5ndWlzaCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRDbG9zZUJ1dHRvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGdldE5vdGljZSwgb25DbG9zZUNsaWNrIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY2xvc2VCdXR0b25FbCA9IGNvbnRlbnRFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xuICAgICAgYXR0cjogeyAnYXJpYS1sYWJlbCc6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5jbG9zZUFyaWFMYWJlbCkgfVxuICAgIH0pO1xuICAgIC8vIFJldXNlIE9ic2lkaWFuJ3MgbW9kYWwgY2xvc2UtYnV0dG9uIGNsYXNzZXMgc28gdGhpcyBidXR0b24gbWF0Y2hlcyB0aGUgbmF0aXZlIG1vZGFsIGNsb3NlIGJ1dHRvblxuICAgIC8vIChsb29rIGFuZCBob3Zlcik7IHRoZSBzdHlsZXNoZWV0IG9ubHkgcG9zaXRpb25zIGl0IGluIHRoZSBub3RpY2UgY29ybmVyLlxuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY2xvc2VCdXR0b25FbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlQ2xvc2VCdXR0b24pO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkQ2xhc3NlcyhbQ3NzQ2xhc3MuQ2xpY2thYmxlSWNvbiwgQ3NzQ2xhc3MuTW9kYWxIZWFkZXJCdXR0b25dKTtcbiAgICBzZXRJY29uKGNsb3NlQnV0dG9uRWwsICd4Jyk7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGlzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IG9uQ2xvc2VDbGljaz8uKHtcbiAgICAgICAgICBjYW5jZWw6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBDYW4gYmUgY2FuY2VsbGVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICBpZiAoaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm90aWNlID0gZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKCkpO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMuYWRkKG5vdGljZSk7XG4gICAgICAgIG5vdGljZS5oaWRlKCk7XG4gICAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbWVzc2FnZSB0byB0aGUgbm90aWNlIGN1cnJlbnRseSBpbiB0aGUgcGVyLXBsdWdpbiBzbG90LCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgb24gc2NyZWVuIGluIGFcbiAgICogc2luZ2xlIG5vdGljZS5cbiAgICpcbiAgICogVGhlIGFwcGVuZGVkIG1lc3NhZ2UgY2FycmllcyBubyBwbHVnaW4tbmFtZSBwcmVmaXgg4oCUIHRoZSBub3RpY2UgYWxyZWFkeSBvcGVucyB3aXRoIG9uZSwgYW5kXG4gICAqIHJlcGVhdGluZyBpdCBvbiBldmVyeSBsaW5lIHJlYWRzIGFzIG5vaXNlLiBJdCBpcyB3cmFwcGVkIGxpa2UgYW55IG90aGVyIG5vdGljZSBjb250ZW50LCBzbyBhIGxpbmsgb3JcbiAgICogYnV0dG9uIGluc2lkZSBpdCBzdGlsbCBrZWVwcyB0aGUgbm90aWNlIG9wZW4gd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBBcHBlbmRpbmcgcmVzdGFydHMgdGhlIG5vdGljZSdzIGNvdW50ZG93biAoe0BsaW5rIE5vdGljZS5zZXRBdXRvSGlkZX0pLCBzbyB0aGUgbmV3IG1lc3NhZ2UgZ2V0cyBhXG4gICAqIGZ1bGwgZHVyYXRpb24gaW5zdGVhZCBvZiBpbmhlcml0aW5nIHdoYXQgd2FzIGxlZnQgb2YgdGhlIGN1cnJlbnQgb25lIOKAlCBhIGxpbmUgYXBwZW5kZWQgYSBtb21lbnRcbiAgICogYmVmb3JlIHRoZSBub3RpY2UgZXhwaXJlcyB3b3VsZCBvdGhlcndpc2UgZmxhc2ggYW5kIHZhbmlzaC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlfSBkZXNjcmliaW5nIHRoZSBqb2luZWQgbm90aWNlLCBvciBgbnVsbGAgd2hlblxuICAgKiB0aGVyZSBpcyBub3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8g4oCUIHRoZSBzbG90IGlzIGVtcHR5LCBvciBpdHMgbm90aWNlIGhhcyBzaW5jZSBiZWVuIGRpc21pc3NlZFxuICAgKiDigJQgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIHNob3cgYSBuZXcgbm90aWNlIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZFRvQ3VycmVudE5vdGljZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcyk6IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBvbkhpZGUsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjdXJyZW50Tm90aWNlID0gdGhpcy5ub3RpY2U7XG4gICAgLy8gYGlzU2hvd25gIGlzIHRoZSBzYW1lIGNoZWNrIE9ic2lkaWFuJ3Mgb3duIGBOb3RpY2UuaGlkZWAgbWFrZXMgYmVmb3JlIGFuaW1hdGluZyBhIG5vdGljZSBhd2F5LCBzb1xuICAgIC8vIGl0IGlzIGV4YWN0bHkgXCJzdGlsbCBvbiBzY3JlZW5cIjogYSBub3RpY2UgdGhhdCBleHBpcmVkIG9yIHdhcyBkaXNtaXNzZWQgaGFzIGJlZW4gZGV0YWNoZWQuXG4gICAgaWYgKCFjdXJyZW50Tm90aWNlPy5jb250YWluZXJFbC5pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQoeyBtZXNzYWdlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogZmFsc2UgfSk7XG4gICAgY3VycmVudE5vdGljZS5tZXNzYWdlRWwuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAvLyBBIGBudWxsYCBkdXJhdGlvbiBtZWFucyBcIk9ic2lkaWFuJ3Mgb3duIGRlZmF1bHRcIiwgd2hpY2ggb25seSB0aGUgY29uc3RydWN0b3IgYXBwbGllcyDigJQgc28gcmVzdGFydFxuICAgIC8vIHRoZSBjb3VudGRvd24gd2l0aCB0aGF0IHNhbWUgZGVmYXVsdCByYXRoZXIgdGhhbiBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBydW5uaW5nLlxuICAgIGN1cnJlbnROb3RpY2Uuc2V0QXV0b0hpZGUoZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHRoaXMud2lyZU9uSGlkZShjdXJyZW50Tm90aWNlLCBvbkhpZGUpO1xuICAgIC8vIE9ubHkgZXZlciByZWdpc3RlcnMsIG5ldmVyIGNsZWFyczogdGhlIG5vdGljZSBiZWluZyBhcHBlbmRlZCB0byBtYXkgYWxyZWFkeSBiZSB0aGlzIHBsdWdpbidzXG4gICAgLy8gcGVybWFuZW50IG5vdGljZSwgYW5kIGEgbGF0ZXIgYXBwZW5kZWQgbWVzc2FnZSBpcyBubyByZWFzb24gdG8gZm9yZ2V0IHRoYXQuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKGN1cnJlbnROb3RpY2UpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IGZhbHNlLCBub3RpY2U6IGN1cnJlbnROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG1lc3NhZ2UgZm9yIGEgZGVsYXllZCBub3RpY2U6IHRoZSByZXNvbHZlZCBjb250ZW50LCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgQ2FuY2VsXG4gICAqIGJ1dHRvbiB0aGF0IGFib3J0cyB0aGUgcHJvdmlkZWQgY29udHJvbGxlciB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gaG9sZGluZyB0aGUgY29udGVudCBhbmQsIGlmIHJlcXVlc3RlZCwgYSBDYW5jZWwgYnV0dG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHsgYWJvcnRDb250cm9sbGVyLCBjYW5jZWxCdXR0b25UZXh0LCBjb250ZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjb250ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBgQnV0dG9uQ29tcG9uZW50YCByZXF1aXJlcyBhbiBgSFRNTEVsZW1lbnRgIHBhcmVudCwgc28gYnVpbGQgaXQgb24gYSB0aHJvd2F3YXlcbiAgICAgIC8vIGRldGFjaGVkIGVsZW1lbnQgYW5kIG1vdmUgaXRzIGBidXR0b25FbGAgaW50byB0aGUgZnJhZ21lbnQuXG4gICAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGNyZWF0ZURpdigpKTtcbiAgICAgIGNhbmNlbEJ1dHRvbi5zZXRCdXR0b25UZXh0KGNhbmNlbEJ1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idXR0b25zLmNhbmNlbCkpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjYW5jZWxCdXR0b24uYnV0dG9uRWwsIENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gICAgICAvLyBUaGUgY2xpY2sgaXMgd2lyZWQgdmlhIGBhZGRFdmVudExpc3RlbmVyYCByYXRoZXIgdGhhbiBgQnV0dG9uQ29tcG9uZW50Lm9uQ2xpY2tgIHNvIGl0XG4gICAgICAvLyBidWJibGVzIHRocm91Z2ggdGhlIGludGVyYWN0aXZlLWVsZW1lbnQgZ3VhcmQgKGtlZXBpbmcgdGhlIG5vdGljZSBvcGVuKSBhbmQgc3RheXNcbiAgICAgIC8vIGRpcmVjdGx5IGV4ZXJjaXNhYmxlIHZpYSBhIGRpc3BhdGNoZWQgRE9NIGV2ZW50IGluIHVuaXQgdGVzdHMuXG4gICAgICBjYW5jZWxCdXR0b24uYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSA9IHRydWUsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5zdHJpcFBsdWdpbk5hbWVQcmVmaXgocGFyYW1zLm1lc3NhZ2UpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBjb250ZW50RWwgPSBmcmFnbWVudC5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNvbnRlbnRFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlQ29udGVudCk7XG4gICAgaWYgKHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lKSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kKHRoaXMuYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudEVsLmFwcGVuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgLy8gQSBoYXJkLXRvLWNsb3NlIG5vdGljZSBtdXN0IG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheSBjbGljazsgb25seSBpdHMgY2xvc2UgYnV0dG9uIG1heSBoaWRlIGl0LlxuICAgICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ludGVyYWN0aXZlQ2xpY2tUYXJnZXQoJGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b24pIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2xvc2VCdXR0b24obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnRFbCxcbiAgICAgICAgZ2V0Tm90aWNlOiBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UpLFxuICAgICAgICBvbkNsb3NlQ2xpY2tcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBmcmFnbWVudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQsIHByZWZpeGluZyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwbHVnaW4gbmFtZSBpbiBhIHN0eWxlZCBlbGVtZW50IHNvIGl0IGlzXG4gICAqIHZpc3VhbGx5IGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgbWVzc2FnZSBib2R5LlxuICAgKlxuICAgKiBUaGUgbmFtZSBpcyByZW5kZXJlZCBhcyBpbmxpbmUgY29kZSwgdGhlIHdheSBldmVyeSBwbHVnaW4gbmFtZSBpbiB0aGUgVUkgaXMsIGluc2lkZSBhIHNwYW4gdGhhdCBrZWVwc1xuICAgKiB0aGUgcHJlZml4J3Mgb3duIGxheW91dCBhbmQgYWNjZW50IGNvbG9yLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gd2l0aCB0aGUgc3R5bGVkIHBsdWdpbiBuYW1lIHByZWZpeCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBuYW1lRWwgPSBjcmVhdGVTcGFuKCk7XG4gICAgYXBwZW5kQ29kZUJsb2NrKG5hbWVFbCwgdGhpcy5wbHVnaW5OYW1lKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5hbWVFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlTmFtZSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kKG5hbWVFbCk7XG4gICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoJyAodW5sb2FkZWQpJyk7XG4gICAgfVxuICAgIGZyYWdtZW50LmFwcGVuZFRleHQoJ1xcbicpO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2UoKTogTm90aWNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpLmdldCh0aGlzLnBsdWdpbk5hbWUpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZXMoKTogTWFwPHN0cmluZywgTm90aWNlPiB7XG4gICAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlcyBhIGxlYWRpbmcgYDxwbHVnaW4gbmFtZT46YCBpbiBhIG1lc3NhZ2UsIHRvZ2V0aGVyIHdpdGggdGhlIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBjb2xvbiBhbmRcbiAgICogYWZ0ZXIgaXQuXG4gICAqXG4gICAqIEBwYXJhbSB0ZXh0IC0gVGhlIG1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4LCBvciBgMGAgd2hlbiB0aGUgdGV4dCBkb2VzIG5vdCBvcGVuIHdpdGggdGhpcyBwbHVnaW4ncyBuYW1lIGFuZCBhXG4gICAqIGNvbG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnBsdWdpbk5hbWUgfHwgIXRleHQuc3RhcnRzV2l0aCh0aGlzLnBsdWdpbk5hbWUpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3Qgc2VwYXJhdG9yTWF0Y2ggPSAvXlxccyo6XFxzKi8uZXhlYyh0ZXh0LnNsaWNlKHRoaXMucGx1Z2luTmFtZS5sZW5ndGgpKTtcbiAgICByZXR1cm4gc2VwYXJhdG9yTWF0Y2ggPyB0aGlzLnBsdWdpbk5hbWUubGVuZ3RoICsgc2VwYXJhdG9yTWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIg4oCUIHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIOKAlCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCDigJQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKGlzSW50ZXJhY3RpdmVDbGlja1RhcmdldCgkZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIOKAlCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQgPyBidWlsdE5vdGljZSA6IG51bGwpO1xuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgbGVhZGluZyBgPHBsdWdpbiBuYW1lPjpgIGZyb20gYSBtZXNzYWdlLiBUaGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gaXRzXG4gICAqIG93biBzdHlsZWQgaGVhZGVyLCBzbyBhIG1lc3NhZ2UgdGhhdCByZXBlYXRzIGl0IHJlYWRzIGFzIHRoZSBuYW1lIHR3aWNlLlxuICAgKlxuICAgKiBBIGZyYWdtZW50IGlzIG1hdGNoZWQgb24gaXRzIHRleHQsIHNvIGEgbmFtZSB3cmFwcGVkIGluIGFuIGVsZW1lbnQgKHN1Y2ggYXMgaW5saW5lIGNvZGUpIHN0aWxsXG4gICAqIGNvdW50czsgdGhlIHByZWZpeCBpcyBjdXQgb3V0IG9mIGl0cyB0ZXh0IG5vZGVzLCBhbmQgYW4gZWxlbWVudCBpdCBsZWF2ZXMgZW1wdHkgaXMgcmVtb3ZlZC4gVGhlIG5hbWVcbiAgICogaXMgbWF0Y2hlZCBleGFjdGx5LCBhbmQgb25seSBhdCB0aGUgc3RhcnQ6IGEgbWVzc2FnZSB0aGF0IG1lcmVseSBtZW50aW9ucyB0aGUgbmFtZSBsYXRlciBpcyBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBUaGUgbWVzc2FnZSB3aXRob3V0IHRoZSBwcmVmaXguIEEgZnJhZ21lbnQgaXMgY2hhbmdlZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQuXG4gICAqL1xuICBwcml2YXRlIHN0cmlwUGx1Z2luTmFtZVByZWZpeChtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1lc3NhZ2Uuc2xpY2UodGhpcy5nZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKG1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtYWluaW5nTGVuZ3RoID0gdGhpcy5nZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKG1lc3NhZ2UudGV4dENvbnRlbnQpO1xuICAgIGlmIChyZW1haW5pbmdMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgZ2V0VGV4dE5vZGVzKG1lc3NhZ2UpKSB7XG4gICAgICBpZiAodGV4dE5vZGUuZGF0YS5sZW5ndGggPiByZW1haW5pbmdMZW5ndGgpIHtcbiAgICAgICAgdGV4dE5vZGUuZGF0YSA9IHRleHROb2RlLmRhdGEuc2xpY2UocmVtYWluaW5nTGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZW1haW5pbmdMZW5ndGggLT0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XG4gICAgICAvLyBDbGltYiB0byB0aGUgb3V0ZXJtb3N0IGVsZW1lbnQgaG9sZGluZyBub3RoaW5nIGJ1dCB0aGlzIHRleHQsIHNvIG5vIGVtcHR5IHdyYXBwZXIgaXMgbGVmdCBiZWhpbmQuXG4gICAgICAvLyBBIG5vZGUgZGlyZWN0bHkgaW4gdGhlIGZyYWdtZW50IGhhcyBubyBwYXJlbnQgZWxlbWVudCwgd2hpY2ggaXMgd2hlcmUgdGhlIGNsaW1iIHN0b3BzLlxuICAgICAgbGV0IGVtcHRpZWROb2RlOiBDaGlsZE5vZGUgPSB0ZXh0Tm9kZTtcbiAgICAgIHdoaWxlIChlbXB0aWVkTm9kZS5wYXJlbnRFbGVtZW50Py5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbXB0aWVkTm9kZSA9IGVtcHRpZWROb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBlbXB0aWVkTm9kZS5yZW1vdmUoKTtcbiAgICAgIGlmIChyZW1haW5pbmdMZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgbm90aWNlJ3MgYGhpZGVgIHNvIHRoZSBnaXZlbiBjYWxsYmFjayBydW5zIHRoZSBmaXJzdCB0aW1lIHRoZSBub3RpY2UgaXMgaGlkZGVuIOKAlCBieSB0aGVcbiAgICogdXNlciwgYnkgYSByZXBsYWNpbmcgbm90aWNlLCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIHVubG9hZC4gRG9lcyBub3RoaW5nIHdoZW4gbm8gY2FsbGJhY2tcbiAgICogaXMgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHdob3NlIGBoaWRlYCB0byB3cmFwLlxuICAgKiBAcGFyYW0gb25IaWRlIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBvbiB0aGUgZmlyc3QgaGlkZSwgb3IgYHVuZGVmaW5lZGAgdG8gc2tpcCB3cmFwcGluZy5cbiAgICovXG4gIHByaXZhdGUgd2lyZU9uSGlkZShub3RpY2U6IE5vdGljZSwgb25IaWRlOiAoKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+KSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghb25IaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJ1biBgb25IaWRlYCB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQSBgb25jZWAgcGF0Y2ggb24gYGhpZGVgIGludGVyY2VwdHMgZXhhY3RseSBvbmVcbiAgICAvLyBjYWxsIHRoZW4gdW5pbnN0YWxscyBpdHNlbGYgKHVubG9hZGluZyB0aGlzIGRlZGljYXRlZCBjb21wb25lbnQpLCBzbyB0aGVyZSBpcyBubyBtYW51YWxcbiAgICAvLyBzaW5nbGUtZmlyZSBib29ra2VlcGluZyBhbmQgbm8gbGluZ2VyaW5nIHBhdGNoIG9uIHRoZSB0cmFuc2llbnQgbm90aWNlLiBUaGUgdXNlci1jbG9zZSBmbGFncyB3ZXJlXG4gICAgLy8gc2V0IGJlZm9yZSBgaGlkZSgpYCB3YXMgaW52b2tlZCAoc2VlIGBhcHBlbmRDbG9zZUJ1dHRvbmAgLyBgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nYCksIHNvIHRoZXlcbiAgICAvLyBzdGlsbCBob2xkIHdoZW4gcmVhZCBoZXJlIGFmdGVyIGBmYWxsYmFjaygpYC5cbiAgICBjb25zdCBwYXRjaENvbXBvbmVudCA9IG5ldyBNb25rZXlBcm91bmRDb21wb25lbnQoKTtcbiAgICBwYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgcGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBub3RpY2UsXG4gICAgICBtZXRob2ROYW1lOiAnaGlkZScsXG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KSA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIGNvbnN0IGlzQ2xvc2VCdXR0b25DbGlja2VkID0gdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBjb25zdCBpc1VzZXJBY3Rpb24gPSBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCB8fCB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9uSGlkZSh7IGlzQ2xvc2VCdXR0b25DbGlja2VkLCBpc1VzZXJBY3Rpb24gfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIHRleHQgbm9kZXMgdW5kZXIgYSBub2RlLCBpbiBkb2N1bWVudCBvcmRlci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIHdhbGsuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dE5vZGVzKG5vZGU6IE5vZGUpOiBUZXh0W10ge1xuICBjb25zdCB0ZXh0Tm9kZXM6IFRleHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcbiAgICBpZiAoaXNUZXh0Tm9kZShjaGlsZE5vZGUpKSB7XG4gICAgICB0ZXh0Tm9kZXMucHVzaChjaGlsZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0Tm9kZXMucHVzaCguLi5nZXRUZXh0Tm9kZXMoY2hpbGROb2RlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0ZXh0Tm9kZXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjbGljayBsYW5kZWQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBvZiBhIG5vdGljZSwgb3IgaW5zaWRlIG9uZS4gSXQgdXNlcyBPYnNpZGlhbidzXG4gKiBjcm9zcy13aW5kb3cgYGluc3RhbmNlT2ZgLCBzaW5jZSBgaW5zdGFuY2VvZiBFbGVtZW50YCBpcyBmYWxzZSBmb3IgYSBub2RlIG9mIGEgcG9wb3V0IHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGNsaWNrIHRhcmdldCwgd2hpY2ggaXMgYWx3YXlzIGEgbm9kZSBvZiB0aGUgbm90aWNlIHRoZSBsaXN0ZW5lciBzaXRzIG9uLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdGFyZ2V0IGlzIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgb3IgaW5zaWRlIG9uZS5cbiAqL1xuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZUNsaWNrVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vZGUgPSBjYXN0VG88Tm9kZSB8IG51bGw+KHRhcmdldCk7XG4gIHJldHVybiBub2RlPy5pbnN0YW5jZU9mKEVsZW1lbnQpID09PSB0cnVlICYmIG5vZGUuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSB0ZXh0IG5vZGUuIEl0IHJlYWRzIHRoZSBub2RlIHR5cGUgcmF0aGVyIHRoYW4gYGluc3RhbmNlb2YgVGV4dGAsIHdoaWNoIGlzXG4gKiBmYWxzZSBmb3IgYSBub2RlIGZyb20gYSBwb3BvdXQgd2luZG93J3MgcmVhbG0uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogTm9kZSk6IG5vZGUgaXMgVGV4dCB7XG4gIHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsU0FBUztBQUNsQixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUV0QyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQUNsRCxNQUFNLDRDQUE0QztBQUlsRCxNQUFNLG1EQUFtRDtBQUl6RCxNQUFNLCtCQUErQjtBQVM5QixJQUFLLG1CQUFMLGtCQUFLQSxzQkFBTDtBQVNMLEVBQUFBLGtCQUFBLFlBQVM7QUFNVCxFQUFBQSxrQkFBQSxhQUFVO0FBT1YsRUFBQUEsa0JBQUEsY0FBVztBQXRCRCxTQUFBQTtBQUFBLEdBQUE7QUFpVUwsTUFBTSw4QkFBOEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWxDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUYsNEJBQTRCLG9CQUFJLFFBQWdCO0FBQUEsRUFDekQsU0FBd0I7QUFBQSxFQUNmLDRCQUE0QixvQkFBSSxJQUFnQjtBQUFBLEVBQ2hELG9CQUFvQixvQkFBSSxJQUFZO0FBQUEsRUFDcEMscUJBQXFCLG9CQUFJLFFBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* All settings logic (load, save, validate, transform, clone) is handled directly
|
|
9
9
|
* by this component — no separate manager class is needed.
|
|
10
10
|
*/
|
|
11
|
-
import type { AsyncEventRef, AsyncEventSource } from '@mnaoumov/typescript-lib/async-events';
|
|
11
|
+
import type { AsyncEventRef, AsyncEventSource, CallbackArguments } from '@mnaoumov/typescript-lib/async-events';
|
|
12
12
|
import type { Transformer } from '@mnaoumov/typescript-lib/transformers/transformer';
|
|
13
13
|
import type { MaybeReturn, StringKeys } from '@mnaoumov/typescript-lib/type';
|
|
14
14
|
import type { GenericObject } from '@mnaoumov/typescript-lib/type-guards';
|
|
15
15
|
import type { Constructor, Promisable, ReadonlyDeep } from 'type-fest';
|
|
16
16
|
import type { DataHandler } from '../data-handler.mjs';
|
|
17
17
|
import type { PluginEventSource } from '../plugin/plugin-event-source.mjs';
|
|
18
|
+
import type { SettingsRecoveryCopy } from '../settings-recovery.mjs';
|
|
18
19
|
import { ComponentEx } from './component-ex.mjs';
|
|
19
20
|
/**
|
|
20
21
|
* Constructor parameters for {@link PluginSettingsComponentBase}.
|
|
@@ -92,7 +93,7 @@ export type ReadonlyPluginSettingsState<PluginSettings extends object> = Readonl
|
|
|
92
93
|
* @typeParam PluginSettings - The plugin settings type.
|
|
93
94
|
* @typeParam PropertyName - The property name.
|
|
94
95
|
*/
|
|
95
|
-
export type SettingsValidator<PluginSettings extends object, PropertyName extends StringKeys<PluginSettings> = StringKeys<PluginSettings>> = (value: PluginSettings[PropertyName], settings: PluginSettings) => Promisable<MaybeReturn<string>>;
|
|
96
|
+
export type SettingsValidator<PluginSettings extends object, PropertyName extends StringKeys<PluginSettings> = StringKeys<PluginSettings>> = (value: PluginSettings[PropertyName], settings: PluginSettings) => Promisable<MaybeReturn<null | string>>;
|
|
96
97
|
interface PluginSettingsComponentBaseEventMap<PluginSettings extends object> {
|
|
97
98
|
readonly loadSettings: [
|
|
98
99
|
loadedState: ReadonlyPluginSettingsState<PluginSettings>,
|
|
@@ -177,6 +178,13 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
177
178
|
* @returns A {@link Promise} that resolves when the settings are safe.
|
|
178
179
|
*/
|
|
179
180
|
ensureSafe(settings: PluginSettings): Promise<void>;
|
|
181
|
+
/**
|
|
182
|
+
* Lists the recovery copies of `data.json` kept on this device: copies of a file that did not parse, and of a file
|
|
183
|
+
* whose stored values a first save would have dropped or changed.
|
|
184
|
+
*
|
|
185
|
+
* @returns The copies, newest first; none when the data handler keeps no recovery copies.
|
|
186
|
+
*/
|
|
187
|
+
getRecoveryCopies(): Promise<SettingsRecoveryCopy[]>;
|
|
180
188
|
/**
|
|
181
189
|
* Gets a safe copy of the settings.
|
|
182
190
|
*
|
|
@@ -200,7 +208,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
200
208
|
* @param name - The name of the event.
|
|
201
209
|
* @param callback - The callback to remove.
|
|
202
210
|
*/
|
|
203
|
-
off<EventName extends
|
|
211
|
+
off<EventName extends StringKeys<PluginSettingsComponentBaseEventMap<PluginSettings>>, Arguments extends CallbackArguments<PluginSettingsComponentBaseEventMap<PluginSettings>, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>): void;
|
|
204
212
|
/**
|
|
205
213
|
* Remove an event listener by reference.
|
|
206
214
|
*
|
|
@@ -219,7 +227,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
219
227
|
*
|
|
220
228
|
* @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
|
|
221
229
|
*/
|
|
222
|
-
on<EventName extends
|
|
230
|
+
on<EventName extends StringKeys<PluginSettingsComponentBaseEventMap<PluginSettings>>, Arguments extends CallbackArguments<PluginSettingsComponentBaseEventMap<PluginSettings>, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown): AsyncEventRef;
|
|
223
231
|
/**
|
|
224
232
|
* Trigger an event, executing all the listeners in order even if some of them throw an error.
|
|
225
233
|
*
|
|
@@ -234,7 +242,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
234
242
|
*
|
|
235
243
|
* @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
|
|
236
244
|
*/
|
|
237
|
-
once<EventName extends
|
|
245
|
+
once<EventName extends StringKeys<PluginSettingsComponentBaseEventMap<PluginSettings>>, Arguments extends CallbackArguments<PluginSettingsComponentBaseEventMap<PluginSettings>, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown): AsyncEventRef;
|
|
238
246
|
/**
|
|
239
247
|
* Called when the external settings change.
|
|
240
248
|
*
|
|
@@ -261,6 +269,18 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
261
269
|
* @param validator - The validator.
|
|
262
270
|
*/
|
|
263
271
|
registerValidator<PropertyName extends PropertyNames<PluginSettings>>(propertyName: PropertyName, validator: SettingsValidator<PluginSettings, PropertyName>): void;
|
|
272
|
+
/**
|
|
273
|
+
* Restores a recovery copy of `data.json` kept on this device: writes its record back to the file and reloads the
|
|
274
|
+
* settings from it.
|
|
275
|
+
*
|
|
276
|
+
* The settings in use are kept as a recovery copy of their own first, so a restore loses nothing either.
|
|
277
|
+
*
|
|
278
|
+
* @param id - The id of the copy, from {@link getRecoveryCopies}.
|
|
279
|
+
* @returns A {@link Promise} that resolves when the restored settings are loaded.
|
|
280
|
+
* @throws If the data handler keeps no recovery copies, no copy has that id, or the copy is not valid JSON (a copy
|
|
281
|
+
* of an unparseable file has to be repaired by hand first).
|
|
282
|
+
*/
|
|
283
|
+
restoreRecoveryCopy(id: string): Promise<void>;
|
|
264
284
|
/**
|
|
265
285
|
* Revalidates the settings.
|
|
266
286
|
*
|
|
@@ -354,6 +374,16 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
|
|
|
354
374
|
private createDefaultState;
|
|
355
375
|
private edit;
|
|
356
376
|
private isValidPropertyName;
|
|
377
|
+
/**
|
|
378
|
+
* Keeps a recovery copy before the initial load's normalizing save, when that save would drop or change a stored
|
|
379
|
+
* value: an unknown key (a newer plugin version's setting), a legacy migration, a value the transformer rewrites.
|
|
380
|
+
* Adding defaults for keys the file lacks loses nothing and keeps no copy.
|
|
381
|
+
*
|
|
382
|
+
* @param originalJson - The record as the file held it, serialized before anything could mutate it.
|
|
383
|
+
* @param newRecord - The record about to be saved.
|
|
384
|
+
* @returns Whether the save may go ahead: nothing would be lost, a copy was kept, or the handler keeps no copies.
|
|
385
|
+
*/
|
|
386
|
+
private keepCopyBeforeLossyRewrite;
|
|
357
387
|
private markLoadedFromFile;
|
|
358
388
|
private rawRecordToSettings;
|
|
359
389
|
private saveToFileImpl;
|