@mnaoumov/obsidian-lib 10.11.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/README.md +26 -0
- package/components/all-windows-status-bar-item-component/package.json +6 -0
- package/components/shared-component-pool-component/package.json +6 -0
- package/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/components/workspace-layout-state-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +477 -285
- package/dist/lib/cjs/__merged.d.cts +26 -10
- 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-diagnostics.cjs +222 -0
- package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
- package/dist/lib/cjs/bug-report.cjs +38 -12
- package/dist/lib/cjs/bug-report.d.cts +65 -0
- 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 +95 -4
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
- 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 +245 -0
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
- 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 +21 -4
- package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
- 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 +54 -39
- package/dist/lib/cjs/components/index.d.cts +5 -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 +69 -36
- 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 +119 -18
- 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 +368 -0
- package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
- 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 +495 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
- 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/css-class.cjs +5 -1
- package/dist/lib/cjs/css-class.d.cts +16 -0
- package/dist/lib/cjs/data-handler.cjs +264 -6
- package/dist/lib/cjs/data-handler.d.cts +219 -2
- 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 +4 -14
- package/dist/lib/cjs/desktop-git-runner.d.cts +8 -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 +2 -2
- package/dist/lib/cjs/git-rename-history.cjs +1 -1
- package/dist/lib/cjs/git-rename-history.d.cts +2 -2
- 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 +27 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +26 -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 +26 -0
- package/dist/lib/cjs/index.cjs +147 -126
- package/dist/lib/cjs/index.d.cts +7 -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 +191 -3
- package/dist/lib/cjs/markdown-view.d.cts +48 -1
- 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 +181 -0
- package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
- package/dist/lib/cjs/modals/index.cjs +17 -11
- package/dist/lib/cjs/modals/index.d.cts +2 -0
- 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 +202 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
- 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 +18 -12
- package/dist/lib/cjs/plugin/index.d.cts +2 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
- 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 +49 -4
- package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
- package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -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 +133 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +35 -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 +26 -10
- package/dist/lib/esm/__merged.mjs +215 -5
- 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/bug-report-diagnostics.d.mts +186 -0
- package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
- package/dist/lib/esm/bug-report.d.mts +65 -0
- package/dist/lib/esm/bug-report.mjs +33 -10
- 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/command-handlers/open-bug-report-command-handler.d.mts +34 -2
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
- package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
- package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
- 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/embed-extensions-component.d.mts +8 -0
- package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
- package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
- package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
- package/dist/lib/esm/components/index.d.mts +5 -0
- package/dist/lib/esm/components/index.mjs +12 -2
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
- 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 +105 -4
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
- package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
- 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.d.mts +239 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
- package/dist/lib/esm/css-class.d.mts +16 -0
- package/dist/lib/esm/css-class.mjs +5 -1
- package/dist/lib/esm/data-handler.d.mts +219 -2
- package/dist/lib/esm/data-handler.mjs +262 -5
- 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-git-runner.d.mts +8 -2
- package/dist/lib/esm/desktop-git-runner.mjs +3 -3
- 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 +2 -2
- package/dist/lib/esm/git-rename-history.d.mts +2 -2
- package/dist/lib/esm/git-rename-history.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
- package/dist/lib/esm/i18n/locales/en.mjs +27 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +15 -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/markdown-view.d.mts +48 -1
- package/dist/lib/esm/markdown-view.mjs +192 -2
- 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/copy-text-manually.d.mts +38 -0
- package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
- package/dist/lib/esm/modals/index.d.mts +2 -0
- package/dist/lib/esm/modals/index.mjs +5 -1
- package/dist/lib/esm/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
- package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
- 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 +2 -0
- package/dist/lib/esm/plugin/index.mjs +6 -2
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
- package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
- 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-install-state.d.mts +30 -0
- package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
- 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 +35 -5
- package/dist/lib/esm/plugin/plugin.mjs +118 -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/dist/styles.css +16 -1
- package/modals/copy-text-manually/package.json +6 -0
- package/modals/review-bug-report-diagnostics/package.json +6 -0
- package/package.json +10 -8
- package/plugin/plugin-instance/package.json +6 -0
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -287,25 +287,25 @@ function getReferences(params) {
|
|
|
287
287
|
{
|
|
288
288
|
description: "body external links",
|
|
289
289
|
feature: "ExternalLinks" /* ExternalLinks */,
|
|
290
|
-
select: (cacheEx) => cacheEx.externalLinks,
|
|
290
|
+
select: (cacheEx) => ensureNonNullable(cacheEx.externalLinks),
|
|
291
291
|
shouldInclude: shouldIncludeExternalLinks
|
|
292
292
|
},
|
|
293
293
|
{
|
|
294
294
|
description: "frontmatter external links",
|
|
295
295
|
feature: "FrontmatterExternalLinks" /* FrontmatterExternalLinks */,
|
|
296
|
-
select: (cacheEx) => cacheEx.frontmatterExternalLinks,
|
|
296
|
+
select: (cacheEx) => ensureNonNullable(cacheEx.frontmatterExternalLinks),
|
|
297
297
|
shouldInclude: shouldIncludeFrontmatterExternalLinks
|
|
298
298
|
},
|
|
299
299
|
{
|
|
300
300
|
description: "multi-value frontmatter external links",
|
|
301
301
|
feature: "MultiValueFrontmatterExternalLinks" /* MultiValueFrontmatterExternalLinks */,
|
|
302
|
-
select: (cacheEx) => cacheEx.multiValueFrontmatterExternalLinks,
|
|
302
|
+
select: (cacheEx) => ensureNonNullable(cacheEx.multiValueFrontmatterExternalLinks),
|
|
303
303
|
shouldInclude: shouldIncludeMultiValueFrontmatterExternalLinks
|
|
304
304
|
},
|
|
305
305
|
{
|
|
306
306
|
description: "multi-value frontmatter links",
|
|
307
307
|
feature: "MultiValueFrontmatterLinks" /* MultiValueFrontmatterLinks */,
|
|
308
|
-
select: (cacheEx) => cacheEx.multiValueFrontmatterLinks,
|
|
308
|
+
select: (cacheEx) => ensureNonNullable(cacheEx.multiValueFrontmatterLinks),
|
|
309
309
|
shouldInclude: shouldIncludeMultiValueFrontmatterLinks
|
|
310
310
|
}
|
|
311
311
|
];
|
|
@@ -316,7 +316,7 @@ function getReferences(params) {
|
|
|
316
316
|
if (!isCachedMetadataEx(cache) || !cache.features.includes(featureLinkSelector.feature)) {
|
|
317
317
|
throw new Error(`Cannot include ${featureLinkSelector.description}: the cache was not computed with the ${featureLinkSelector.feature} feature.`);
|
|
318
318
|
}
|
|
319
|
-
references.push(...
|
|
319
|
+
references.push(...featureLinkSelector.select(cache));
|
|
320
320
|
}
|
|
321
321
|
sortReferences(references);
|
|
322
322
|
references = references.filter((reference, index) => {
|
|
@@ -488,4 +488,4 @@ export {
|
|
|
488
488
|
unregisterFileCacheForNonExistingFile,
|
|
489
489
|
unregisterFiles
|
|
490
490
|
};
|
|
491
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VGcm9udG1hdHRlckxpbmtzLFxuICBwYXJzZUxpbmtzLFxuICB0b1BhcnNlTGlua1JlZmVyZW5jZVxufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHsgZmluZFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVmZXJlbmNlTGlua1RleHQsXG4gIHNvcnRSZWZlcmVuY2VzXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIGV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIHBhcnNpbmcgZmVhdHVyZXMgdGhhdCB3ZXJlIGFwcGxpZWQgd2hlbiBjb21wdXRpbmcgdGhpcyBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5XG4gICAqIHdoZW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE1ldGFkYXRhIHBhcnNpbmcgcG9wdWxhdGVzIHRoaXMgb3B0aW9uYWwgY2FjaGUgZmVhdHVyZSBhZnRlciByZWFkaW5nIHRoZSBub3RlLlxuICBmcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIGV4dGVuZHMgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zIGV4dGVuZHMgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENhY2hlU2FmZX0uXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlU2FmZU9wdGlvbnMgPSBQYXJzZUNhY2hlT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjYWNoZWQgbWV0YWRhdGEgdG8gcmV0cmlldmUgdGhlIHJlZmVyZW5jZXMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbWJlZHMgKGBjYWNoZS5lbWJlZHNgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRW1iZWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYVxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyXG4gICAqIHZhbHVlcy4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBmcm9udG1hdHRlciBsaW5rcyAoYGNhY2hlLmZyb250bWF0dGVyTGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYm9keSBsaW5rcyAoYGNhY2hlLmxpbmtzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRSZWZlcmVuY2VzfS5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVMaW5rU2VsZWN0b3Ige1xuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluayBjYXRlZ29yeSwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjYWNoZSBmb3IgdGhpcyBjYXRlZ29yeSB0byBiZSBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZTtcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgbGlua3MgZm9yIHRoaXMgY2F0ZWdvcnkgZnJvbSB0aGUgY2FjaGUuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Q6IChjYWNoZTogQ2FjaGVkTWV0YWRhdGFFeCkgPT4gUmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGlzIGNhdGVnb3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5pbnRlcmZhY2UgVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbGFpbiBjYWNoZWQgbWV0YWRhdGEgdG8gd3JhcC5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIG5vdGUgY29udGVudCB0aGUgb2Zmc2V0cyBpbmRleCBpbnRvLCB1c2VkIGZvciBib2R5IGV4dGVybmFsLWxpbmsgcGFyc2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnNlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggbGlua3MgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBQYXJzZUNhY2hlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHBsdWdpbiwgdGhlIHN1Y2Nlc3NvciB0byBgQmFja2xpbmsgQ2FjaGVgLlxuICpcbiAqIFVzZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBhbmQgYXMgdGhlIHByb3ZpZGVyIGlkIHVuZGVyIHdoaWNoIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRofSBhbmQge0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfSBsb29rIHVwIHRoZSBwbHVnaW4ncyBwdWJsaXNoZWQgQVBJLlxuICovXG5leHBvcnQgY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEID0gJ2FkdmFuY2VkLW1ldGFkYXRhLWNhY2hlJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgdmVyc2lvbnMgb2YgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCdzIEFQSSB0aGlzIG1vZHVsZSBjb21waWxlZCBhZ2FpbnN0LiBgMS4zLjBgIGlzIHRoZSBmaXJzdCB0byBjYXJyeSB0aGUgdHdvIGJhY2tsaW5rIG1ldGhvZHMuXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfVkVSU0lPTl9SQU5HRSA9ICdeMS4zLjAnO1xuXG4vKipcbiAqIFRoZSBzY2hlbWFzIG9mIGEgYmFja2xpbmsgbWV0aG9kJ3MgcGF5bG9hZHM6IHRoZSBvbmUgcGF0aC1vci1maWxlIGFyZ3VtZW50LCBhbmQgdGhlIGJhY2tsaW5rcyBvciBgbnVsbGAuXG4gKlxuICogQSBjb3B5IG9mIHRoZSBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgYW5kIGBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZWAgZW50cmllcyBvZiBgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQVBJX0NPTlRSQUNUYCwgd2hpY2ggYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBzaGlwcyBhc1xuICogaXRzIHJvb3QgYGFwaS1jb250cmFjdC50c2AgYW5kIHB1Ymxpc2hlcy4gS2VlcCB0aGUgZ3VhcmRzIGluIGFncmVlbWVudCB3aXRoIHRoYXQgZmlsZSwgc28gdGhlIHByb3ZpZGVyIGFuZCB0aGlzIGNvbnN1bWVyIGNoZWNrIG9uZSBkZWZpbml0aW9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNUID0ge1xuICBpbnB1dDogY3JlYXRlQXJndW1lbnRzU2NoZW1hPFtwYXRoT3JGaWxlOiBQYXRoT3JGaWxlXT4oW3sgZXhwZWN0ZWQ6ICdhIHBhdGggb3IgYSBmaWxlJywgdHlwZUd1YXJkOiBpc1BhdGhPckZpbGUgfV0pLFxuICBvdXRwdXQ6IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IGV4cGVjdGVkOiAnYSBiYWNrbGlua3MgZGljdGlvbmFyeSBvciBudWxsJywgdHlwZUd1YXJkOiBpc051bGxhYmxlQmFja2xpbmtzRGljdCB9KVxufTtcblxuLyoqXG4gKiBUaGUgY29udHJhY3Qgb2YgdGhlIG1lbWJlcnMgb2YgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCdzIEFQSSB0aGlzIG1vZHVsZSBjYWxscywgc28gYSByZWNvcmQgdGhhdCBsYWNrcyBlaXRoZXIgaXMgcGFzc2VkIG92ZXIsIGFuZCBhIHBheWxvYWQgdGhhdCBicmVha3MgaXRzIHNpZ25hdHVyZSBpcyByZXBvcnRlZCB3aGlsZSB0aGUgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBkZWJ1ZyBzd2l0Y2ggaXMgb24uXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1Q6IEFwaUNvbnRyYWN0PEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaT4gPSB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1QsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNUXG59O1xuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgb2YgdGhlIHJldGlyZWQgYEJhY2tsaW5rIENhY2hlYCBwbHVnaW4sIHN1cGVyc2VkZWQgYnkge0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0uXG4gKlxuICogU3RpbGwgcmVjb2duaXplZCBieSB7QGxpbmsgaGFzQmFja2xpbmtDYWNoZVBsdWdpbn0sIGRlbGliZXJhdGVseS4gUmVtb3ZpbmcgYSBwbHVnaW4gZnJvbSB0aGUgY29tbXVuaXR5IHJlZ2lzdHJ5IGJsb2NrcyBuZXcgaW5zdGFsbHM7IGl0IHVuaW5zdGFsbHMgbm90aGluZywgc28gZXZlcnkgZXhpc3RpbmcgdXNlciBrZWVwcyBpdCB1bnRpbCB0aGV5IG1pZ3JhdGUgYnkgaGFuZC5cbiAqXG4gKiBJdCBtYXkgYmUgZHJvcHBlZCB3aGVuIGFsbCB0aHJlZSBvZiB0aGUgZm9sbG93aW5nIGhvbGQsIGFuZCBub3QgYmVmb3JlOiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIGlzIGxpc3RlZCBpbiB0aGUgY29tbXVuaXR5IHJlZ2lzdHJ5LCBzbyBtaWdyYXRpbmcgaXMgcG9zc2libGUgYXQgYWxsOyB0aGUgZmluYWwgYEJhY2tsaW5rIENhY2hlYCBoYW5kb3ZlciByZWxlYXNlIGhhcyBiZWVuIG91dCBmb3IgYXQgbGVhc3QgdHdlbHZlIG1vbnRoczsgYW5kIHRoaXMgbGlicmFyeSBpcyBjdXR0aW5nIGEgbWFqb3IgcmVsZWFzZSBhbnl3YXksIGJlY2F1c2UgZHJvcHBpbmcgdGhlIGlkIHNpbGVudGx5IHVuLWdhdGVzIGNhbnZhcyBsaW5rIGhhbmRsaW5nIGZvciBhbnlvbmUgd2hvIGhhcyBub3QgbWlncmF0ZWQuIFRoZXJlIGlzIG5vIGNvc3QgcHJlc3N1cmUgdG8gZHJvcCBpdCBlYXJsaWVyIC0gcmVjb2duaXppbmcgYSBkZWFkIGlkIGlzIG9uZSBzdHJpbmcgY29tcGFyaXNvbiBvbiBhIHBhdGggdGhhdCBhbHJlYWR5IHJlYWRzIGEgcGx1Z2luIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgY29uc3QgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEID0gJ2JhY2tsaW5rLWNhY2hlJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5IGZvciBhbGwgZmlsZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgYXBwLm1ldGFkYXRhQ2FjaGUub25DbGVhbkNhY2hlKHJlc29sdmUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKiBOT1RFOiBUaGUgZmlsZSBtYXkgYmUgbm9uLWV4aXN0ZW50LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIGl0cyBjYWNoZSBhbnN3ZXJzLlxuICogT3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY29tZXMgZnJvbSBhIGJhY2tsaW5rIGluZGV4IHdob3NlIGNvc3QgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBjYW5kaWRhdGUgbm90ZXMgcmF0aGVyIHRoYW5cbiAqIHRvIGV2ZXJ5IHJlZmVyZW5jZSBpbiB0aGUgdmF1bHQsIGFuZCB3aGljaCBnaXZlcyB0aGUgc2FtZSByZWZlcmVuY2VzIE9ic2lkaWFuJ3Mgb3duIGBnZXRCYWNrbGlua3NGb3JGaWxlYCBnaXZlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MgZm9yIHRoZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbZmlsZV0pO1xuICByZXR1cm4gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpPy5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpID8/IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlKGFwcCwgZmlsZSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBzYWZlbHkuXG4gKlxuICogV2hlbiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHB1Ymxpc2hlcyBpdHMgYmFja2xpbmtzIEFQSSBhbmQgaXRzIGBCYWNrbGlua3NgIG1vZHVsZSBpcyBvbiwgdGhhdCBBUEkgYW5zd2Vycy5cbiAqXG4gKiBPdGhlcndpc2UgdGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQuIEl0IHZlcmlmaWVzXG4gKiBlYWNoIGJhY2tsaW5rIGFnYWluc3QgdGhlIG5vdGUncyBjdXJyZW50IHRleHQsIGFuZCB0byBkbyB0aGF0IGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0gb24gZXZlcnlcbiAqIG5vdGUgdGhhdCBsaW5rcyB0byB0aGUgZmlsZSwgd2hpY2ggc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhvc2Ugbm90ZXMgdGhhdCBoYXMgdW5zYXZlZFxuICogY2hhbmdlcy4gQ2FsbCBpdCBmcm9tIGFuIGV4cGxpY2l0IHVzZXIgYWN0aW9uLiBEbyBub3QgY2FsbCBpdCBmcm9tIGFuIGF1dG9tYXRpYyB0cmlnZ2VyIChhIHZhdWx0IG9yXG4gKiBtZXRhZGF0YSBldmVudCwgYSBzYXZlIG9yIHJlbmRlciBwYXRjaCkgdGhhdCBvbmx5IGRlY2lkZXMgd2hldGhlciB0byBhY3QuIFRoZXJlLCBhIGZvcmNlZCBzYXZlIGNhblxuICogcmFjZSBhbm90aGVyIHBsdWdpbidzIGluLWZsaWdodCBlZGl0b3IgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBkaWN0aW9uYXJ5IG9mIGJhY2tsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhcmFtczogR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMpOiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+PiB7XG4gIGNvbnN0IHsgYXBwLCBwYXRoT3JGaWxlLCAuLi5vcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNhY2hlZEJhY2tsaW5rcyA9IGF3YWl0IGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUocGF0aE9yRmlsZSk7XG4gIGlmIChjYWNoZWRCYWNrbGlua3MpIHtcbiAgICByZXR1cm4gY2FjaGVkQmFja2xpbmtzO1xuICB9XG5cbiAgbGV0IGJhY2tsaW5rczogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gPSBuZXcgQ3VzdG9tQXJyYXlEaWN0SW1wbDxSZWZlcmVuY2U+KCk7XG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsKSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBiYWNrbGlua3MgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgZmlsZSk7XG4gICAgICBmb3IgKGNvbnN0IG5vdGVQYXRoIG9mIGJhY2tsaW5rcy5rZXlzKCkpIHtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgbm90ZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IG5vdGVQYXRoIH0pO1xuICAgICAgICBpZiAoIW5vdGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIGNhbnZhcyBob2xkZXIgY2Fubm90IGJlIGNoZWNrZWQgYWdhaW5zdCBpdHMgdGV4dC4gSXRzIGZpbGUtbm9kZSByZWZlcmVuY2VzIGNhcnJ5IG5vIHBvc2l0aW9uLCBhbmRcbiAgICAgICAgLy8gT2JzaWRpYW4gcmVwb3J0cyBhIHRleHQtbm9kZSBlbWJlZCB3aXRoIGEgcG9zaXRpb24gaW50byB0aGF0IG5vZGUncyBvd24gdGV4dCwgbm90IGludG8gdGhlIGNhbnZhcyBKU09OLFxuICAgICAgICAvLyBzbyBzbGljaW5nIHRoZSBmaWxlIGF0IGl0IG5ldmVyIGdpdmVzIHRoZSBsaW5rIGJhY2sgYW5kIHRoZSByZXRyeSB3b3VsZCBuZXZlciBlbmQuXG4gICAgICAgIGlmIChpc0NhbnZhc0ZpbGUobm90ZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRTYWZlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gYmFja2xpbmtzLmdldChub3RlUGF0aCk7XG4gICAgICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlZCBvbmx5IHdoZW4gYSBmcm9udG1hdHRlciBsaW5rIG5lZWRzIGl0OiBhIG5vdGUgd2hvc2UgWUFNTCBkb2VzIG5vdCBwYXJzZSBzdGlsbCBob2xkcyBib2R5IGxpbmtzLFxuICAgICAgICAvLyBhbmQgYG51bGxgIG1hcmtzIGEgcGFyc2UgdGhhdCBmYWlsZWQsIHNvIGl0cyBmcm9udG1hdHRlciBsaW5rcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZXRyaWVkIGZvcmV2ZXIuXG4gICAgICAgIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICBsZXQgYWN0dWFsTGluazogc3RyaW5nO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNhY2hlKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKHJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIHJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQsIG5vdGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCByZWZlcmVuY2Uua2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaW5rV2l0aE9mZnNldHMgPSB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBwcm9wZXJ0eVZhbHVlLnNsaWNlKGxpbmtXaXRoT2Zmc2V0cy5zdGFydE9mZnNldCwgbGlua1dpdGhPZmZzZXRzLmVuZE9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0dWFsTGluayAhPT0gZ2V0UmVmZXJlbmNlTGlua1RleHQocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlUGF0aCwgeyBmaWxlUGF0aDogZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpIH0pLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICByZXRyeU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IG9wdGlvbnMuc2hvdWxkU2hvd1RpbWVvdXROb3RpY2UgPz8gdHJ1ZVxuICB9KTtcblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY2FjaGVkIG1ldGFkYXRhIGZvciBhIGdpdmVuIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBUaGlzIGlzIE5PVCBhIHB1cmUgcmVhZDogYmVmb3JlIGl0IHJlYWRzIHRoZSBjYWNoZSwgaXQgY2FsbHMge0BsaW5rIHNhdmVOb3RlfSwgd2hpY2ggc2F2ZXMgYW55XG4gKiBvcGVuIGVkaXRvciB2aWV3IG9mIHRoZSBub3RlIHRoYXQgaGFzIHVuc2F2ZWQgY2hhbmdlcy4gVGhhdCBzYXZlIGlzIHdoeSB0aGUgY2FjaGUgbWF0Y2hlcyB3aGF0IHRoZVxuICogdXNlciBzZWVzLCBhbmQgd2h5IGEgY29tbWFuZCB0aGF0IHJld3JpdGVzIHRoZSBub3RlIGNhbiB1c2UgdGhpcyBzYWZlbHkgd2l0aG91dCBpdHMgcmV3cml0ZSBiZWluZ1xuICogY2xvYmJlcmVkLiBJdCBpcyBhbHNvIGEgd3JpdGUgb24gdGhlIG5vdGUuIFNvIGRvIG5vdCBjYWxsIHRoaXMgZnJvbSBhbiBhdXRvbWF0aWMgdHJpZ2dlciAoYSB2YXVsdFxuICogb3IgbWV0YWRhdGEgZXZlbnQsIGEgc2F2ZSBvciByZW5kZXIgcGF0Y2gsIGEgbGF5b3V0IGhvb2spIHRoYXQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0OiBhXG4gKiBmb3JjZWQgc2F2ZSBvbmUgdGljayBhZnRlciBhbm90aGVyIHBsdWdpbiBoYXMgZGlzcGF0Y2hlZCBhIGNoYW5nZSBpbnRvIHRoZSBlZGl0b3IgY2FuIGxlYXZlXG4gKiBPYnNpZGlhbidzIGVkaXRvciByZW5kZXJpbmcgc3RhbGUgc3RhdGUuIEEgcmVhZC1vbmx5IHByb2JlIG9uIHRoZSBub3RlJ3MgY3VycmVudCB0ZXh0IHNob3VsZCB1c2VcbiAqIHtAbGluayBwYXJzZU1ldGFkYXRhfSBvbiB0aGF0IHRleHQgaW5zdGVhZC4gSXQgbmVlZHMgbm8gdmlldywgbm8gY2FjaGUgYW5kIG5vIHNhdmUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZU9yUGF0aCAtIFRoZSBmaWxlIG9yIHBhdGggdG8gcmV0cmlldmUgdGhlIG1ldGFkYXRhIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcnNlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggYWRkaXRpb25hbCBsaW5rcyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIHRoZSBmaWxlLCBvciBgbnVsbGAgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENhY2hlU2FmZShhcHA6IEFwcCwgZmlsZU9yUGF0aDogUGF0aE9yRmlsZSwgb3B0aW9uczogR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4IHwgbnVsbD4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogZmlsZU9yUGF0aCB9KTtcblxuICB0cnkge1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gICAgaWYgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgZmlsZSk7XG5cbiAgICAgIGNvbnN0IGZpbGVDYWNoZUVudHJ5ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gICAgICBjb25zdCBpc1VwVG9EYXRlID0gZmlsZUNhY2hlRW50cnk/Lm10aW1lID09PSBmaWxlLnN0YXQubXRpbWVcbiAgICAgICAgJiYgZmlsZUNhY2hlRW50cnkuc2l6ZSA9PT0gZmlsZS5zdGF0LnNpemVcbiAgICAgICAgJiYgT2JqZWN0Lmhhc093bihhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlLCBmaWxlQ2FjaGVFbnRyeS5oYXNoKTtcbiAgICAgIGlmICghaXNVcFRvRGF0ZSkge1xuICAgICAgICBhd2FpdCBhcHAubWV0YWRhdGFDYWNoZS5jb21wdXRlRmlsZU1ldGFkYXRhQXN5bmMoZmlsZSk7XG4gICAgICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHApO1xuICAgICAgfVxuICAgICAgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgfVxuXG4gICAgaWYgKGNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHRoZSBib2R5LWV4dGVybmFsIHBhcnNlIG5lZWRzIHRoZSBmaWxlIGNvbnRlbnQ7IGZyb250bWF0dGVyIHBhcnNpbmcgdXNlcyB0aGUgY2FjaGVkXG4gICAgLy8gZnJvbnRtYXR0ZXIsIHNvIGF2b2lkIHJlYWRpbmcgdGhlIGNvbnRlbnQgdW5sZXNzIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC5cbiAgICBjb25zdCBjb250ZW50ID0gb3B0aW9ucy5zaG91bGRQYXJzZUV4dGVybmFsTGlua3MgPyBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKSA6ICcnO1xuICAgIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudCwgb3B0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnJvbnQgbWF0dGVyIGZyb20gdGhlIG1ldGFkYXRhIGNhY2hlIHNhZmVseS5cbiAqXG4gKiBJdCByZWFkcyB0aHJvdWdoIHtAbGluayBnZXRDYWNoZVNhZmV9LCBzbyBpdCBzYXZlcyBhbnkgb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhc1xuICogdW5zYXZlZCBjaGFuZ2VzLiBTZWUge0BsaW5rIGdldENhY2hlU2FmZX0gZm9yIHdoZW4gdGhhdCBzYXZlIG1hdHRlcnMgYW5kIHdoYXQgdG8gdXNlIGluc3RlYWQuXG4gKlxuICogQHR5cGVQYXJhbSBDdXN0b21Gcm9udG1hdHRlciAtIFRoZSB0eXBlIG9mIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZXRyaWV2ZSB0aGUgZnJvbnQgbWF0dGVyIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgZnJvbnQgbWF0dGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RnJvbnRtYXR0ZXJTYWZlPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4oYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPENvbWJpbmVkRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+PiB7XG4gIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gIHJldHVybiAoY2FjaGU/LmZyb250bWF0dGVyID8/IHt9KSBhcyBDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHJlZmVyZW5jZXMgKGxpbmtzLCBlbWJlZHMsIGZyb250bWF0dGVyIGxpbmtzIGFuZCB0aGUgb3B0ZWQtaW4gZXh0cmFzKSBmcm9tIHRoZVxuICogcHJvdmlkZWQgY2FjaGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSByZWZlcmVuY2VzLlxuICogQHJldHVybnMgVGhlIHNlbGVjdGVkIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKHBhcmFtczogR2V0UmVmZXJlbmNlc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTGlua3MgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzID0gZmFsc2VcbiAgfSA9IHBhcmFtcztcblxuICBsZXQgcmVmZXJlbmNlczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVMaW5rcyA/IGNhY2hlLmxpbmtzID8/IFtdIDogW10pLFxuICAgIC4uLihzaG91bGRJbmNsdWRlRW1iZWRzID8gY2FjaGUuZW1iZWRzID8/IFtdIDogW10pLFxuICAgIC4uLihzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcyA/IGNhY2hlLmZyb250bWF0dGVyTGlua3MgPz8gW10gOiBbXSlcbiAgXTtcblxuICBjb25zdCBmZWF0dXJlTGlua1NlbGVjdG9yczogRmVhdHVyZUxpbmtTZWxlY3RvcltdID0gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnYm9keSBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5leHRlcm5hbExpbmtzLFxuICAgICAgc2hvdWxkSW5jbHVkZTogc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4Lm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdtdWx0aS12YWx1ZSBmcm9udG1hdHRlciBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgICB9XG4gIF07XG5cbiAgZm9yIChjb25zdCBmZWF0dXJlTGlua1NlbGVjdG9yIG9mIGZlYXR1cmVMaW5rU2VsZWN0b3JzKSB7XG4gICAgaWYgKCFmZWF0dXJlTGlua1NlbGVjdG9yLnNob3VsZEluY2x1ZGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDYWNoZWRNZXRhZGF0YUV4KGNhY2hlKSB8fCAhY2FjaGUuZmVhdHVyZXMuaW5jbHVkZXMoZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5jbHVkZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZGVzY3JpcHRpb259OiB0aGUgY2FjaGUgd2FzIG5vdCBjb21wdXRlZCB3aXRoIHRoZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZmVhdHVyZX0gZmVhdHVyZS5gKTtcbiAgICB9XG5cbiAgICByZWZlcmVuY2VzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhyZWZlcmVuY2VzKTtcblxuICAvLyBCVUc6IGh0dHBzOi8vZm9ydW0ub2JzaWRpYW4ubWQvdC9idWctZHVwbGljYXRlZC1saW5rcy1pbi1tZXRhZGF0YWNhY2hlLWluc2lkZS1mb290bm90ZXMvODU1NTFcbiAgcmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c1JlZmVyZW5jZSA9IGVuc3VyZU5vbk51bGxhYmxlKHJlZmVyZW5jZXNbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpICYmIGlzUmVmZXJlbmNlQ2FjaGUocHJldmlvdXNSZWZlcmVuY2UpKSB7XG4gICAgICByZXR1cm4gcmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNSZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgIH1cblxuICAgIGlmIChpc0Zyb250bWF0dGVyTGlua0NhY2hlKHJlZmVyZW5jZSkgJiYgaXNGcm9udG1hdHRlckxpbmtDYWNoZShwcmV2aW91c1JlZmVyZW5jZSkpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhyZWZlcmVuY2UpID8gcmVmZXJlbmNlLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0ID0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzUmVmZXJlbmNlKSA/IHByZXZpb3VzUmVmZXJlbmNlLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIHJldHVybiByZWZlcmVuY2Uua2V5ICE9PSBwcmV2aW91c1JlZmVyZW5jZS5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHJlZmVyZW5jZSkgIT09IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhwcmV2aW91c1JlZmVyZW5jZSlcbiAgICAgICAgfHwgbGlua1N0YXJ0T2Zmc2V0ICE9PSBwcmV2aW91c0xpbmtTdGFydE9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZSgncmVnaXN0ZXJlZEZpbGVzQ291bnRzJywgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSkudmFsdWU7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbGx5IHJlY29nbml6ZXMgdGhlIGJhY2tsaW5rcyBkaWN0aW9uYXJ5IGFub3RoZXIgcGx1Z2luJ3MgY29weSBidWlsdCwgb3IgYG51bGxgLiBUaGUgY2xhc3MgaXQgd2FzIGJ1aWx0IGZyb20gbGl2ZXMgaW4gdGhhdCBjb3B5LCBzbyBgaW5zdGFuY2VvZmAgY2Fubm90IGJlIHVzZWQgKHJ1bGUgTDkgaW4gYEFHRU5UUy5tZGApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGBudWxsYCBvciByZWFkcyBhcyBhIGJhY2tsaW5rcyBkaWN0aW9uYXJ5LlxuICovXG5mdW5jdGlvbiBpc051bGxhYmxlQmFja2xpbmtzRGljdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHwgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxuICAgIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAmJiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2RhdGEnKSBpbnN0YW5jZW9mIE1hcFxuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZ2V0JykgPT09ICdmdW5jdGlvbidcbiAgICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2tleXMnKSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudDogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBQYXJzZUxpbmtSZWZlcmVuY2VbXSB7XG4gIGNvbnN0IGZyb250bWF0dGVyRW5kT2Zmc2V0ID0gY2FjaGUuZnJvbnRtYXR0ZXJQb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwO1xuICByZXR1cm4gcGFyc2VMaW5rcyhjb250ZW50KVxuICAgIC5maWx0ZXIoKHBhcnNlTGlua1Jlc3VsdCkgPT4gcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwgJiYgcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0ID49IGZyb250bWF0dGVyRW5kT2Zmc2V0KVxuICAgIC5tYXAoKHBhcnNlTGlua1Jlc3VsdCkgPT4gdG9QYXJzZUxpbmtSZWZlcmVuY2UoeyBjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGcm9udG1hdHRlciBwYXJzaW5nIGZhaWxlZCBpbiAke3BhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeChwYXJhbXM6IFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyk6IENhY2hlZE1ldGFkYXRhRXgge1xuICBjb25zdCB7IGNhY2hlLCBjb250ZW50LCBvcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZlYXR1cmVzOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZVtdID0gW0NhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk5hdGl2ZV07XG4gIGNvbnN0IHJlc3VsdDogQ2FjaGVkTWV0YWRhdGFFeCA9IHsgLi4uY2FjaGUsIGZlYXR1cmVzIH07XG5cbiAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzKSB7XG4gICAgcmVzdWx0LmV4dGVybmFsTGlua3MgPSBwYXJzZUV4dGVybmFsQm9keUxpbmtzKGNvbnRlbnQsIGNhY2hlKTtcbiAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MpO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB8fCBvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICApIHtcbiAgICBjb25zdCBmcm9udG1hdHRlckxpbmtzID0gcGFyc2VGcm9udG1hdHRlckxpbmtzKGNhY2hlLmZyb250bWF0dGVyKTtcblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKSB7XG4gICAgICByZXN1bHQuZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5mcm9udG1hdHRlckV4dGVybmFsTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZyb250bWF0dGVyTGlua3MubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcykge1xuICAgICAgcmVzdWx0Lm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4i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
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBEaXNwb3NhYmxlRXggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgdHlwZSB7IEN1c3RvbUFycmF5RGljdCB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjcmVhdGVBcmd1bWVudHNTY2hlbWEsXG4gIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXBpLWNvbnRyYWN0JztcbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kaXNwb3NhYmxlJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tQXJyYXlEaWN0SW1wbCxcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZSxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZEZyb250bWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlLFxuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzLFxuICBQYXJzZUxpbmtSZWZlcmVuY2Vcbn0gZnJvbSAnLi9wYXJzZS1saW5rLnRzJztcblxuaW1wb3J0IHsgcmV0cnlXaXRoVGltZW91dE5vdGljZSB9IGZyb20gJy4vYXN5bmMtd2l0aC1ub3RpY2UudHMnO1xuaW1wb3J0IHsgZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUgfSBmcm9tICcuL2JhY2tsaW5rLWluZGV4LnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlcixcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyxcbiAgdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzXG59IGZyb20gJy4vZnJvbnRtYXR0ZXItbGluay1jYWNoZS13aXRoLW9mZnNldHMudHMnO1xuaW1wb3J0IHsgcGFyc2VGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBmaW5kUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRSZWZlcmVuY2VMaW5rVGV4dCxcbiAgc29ydFJlZmVyZW5jZXNcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuaW1wb3J0IHtcbiAgcmVhZFNhZmUsXG4gIHNhdmVOb3RlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIEEgcGFyc2luZyBmZWF0dXJlIHRoYXQgd2FzIGFwcGxpZWQgd2hlbiBjb21wdXRpbmcgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gKi9cbmV4cG9ydCBlbnVtIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqL1xuICBFeHRlcm5hbExpbmtzID0gJ0V4dGVybmFsTGlua3MnLFxuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICBGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSAnRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICBNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ011bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MnLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayBub3RlIGZyb250bWF0dGVyIHZhbHVlcywgd2hpY2ggT2JzaWRpYW4gZG9lcyBub3QgbmF0aXZlbHkgY2FjaGUuXG4gICAqL1xuICBNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcycsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgbmF0aXZlIG1ldGFkYXRhIHBhcnNpbmcgKGludGVybmFsIGxpbmtzLCBlbWJlZHMsIGZyb250bWF0dGVyIGxpbmtzKS5cbiAgICovXG4gIE5hdGl2ZSA9ICdOYXRpdmUnXG59XG5cbi8qKlxuICogQW4gZXh0ZW5kZWQge0BsaW5rIENhY2hlZE1ldGFkYXRhfSB0aGF0IHJlY29yZHMgd2hpY2ggcGFyc2luZyB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmV9cyB3ZXJlXG4gKiBhcHBsaWVkICh2aWEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9KSBhbmQgY2FycmllcyB0aGUgcmVzdWx0aW5nIGV4dGVybmFsIGxpbmtzLiBFYWNoIGxpbmtzXG4gKiBhcnJheSBpcyBwb3B1bGF0ZWQgb25seSB3aGVuIGl0cyBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgcHJlc2VudCBpbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeC5mZWF0dXJlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVkTWV0YWRhdGFFeCBleHRlbmRzIENhY2hlZE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3N9IGlzIGFwcGxpZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBNZXRhZGF0YSBwYXJzaW5nIHBvcHVsYXRlcyB0aGlzIG9wdGlvbmFsIGNhY2hlIGZlYXR1cmUgYWZ0ZXIgcmVhZGluZyB0aGUgbm90ZS5cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIGZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3N9IGlzIGFwcGxpZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBNZXRhZGF0YSBwYXJzaW5nIHBvcHVsYXRlcyB0aGlzIG9wdGlvbmFsIGNhY2hlIGZlYXR1cmUgYWZ0ZXIgcmVhZGluZyB0aGUgbm90ZS5cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3N9IGlzIGFwcGxpZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBNZXRhZGF0YSBwYXJzaW5nIHBvcHVsYXRlcyB0aGlzIG9wdGlvbmFsIGNhY2hlIGZlYXR1cmUgYWZ0ZXIgcmVhZGluZyB0aGUgbm90ZS5cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0Q2FjaGVTYWZlfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldFJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhY2hlZCBtZXRhZGF0YSB0byByZXRyaWV2ZSB0aGUgcmVmZXJlbmNlcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVtYmVkcyAoYGNhY2hlLmVtYmVkc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWVzLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGZyb250bWF0dGVyIGxpbmtzIChgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBib2R5IGxpbmtzIChgY2FjaGUubGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcyxcbiAgICogaS5lLiB0aGUgb2Zmc2V0LWNhcnJ5aW5nIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzIChuYXJyb3dlZCB2aWFcbiAgICoge0BsaW5rIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c30pLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgcGFyc2luZyBwZXJmb3JtZWQgYnkge0BsaW5rIGdldENhY2hlU2FmZX0gYW5kIHtAbGluayBwYXJzZU1ldGFkYXRhfSBiZXlvbmQgT2JzaWRpYW4nc1xuICogbmF0aXZlIG1ldGFkYXRhIHBhcnNpbmcuIEVhY2ggb3B0aW9uIGlzIG9wdC1pbjsgZW5hYmxpbmcgaXQgYWRkcyB0aGUgY29ycmVzcG9uZGluZ1xuICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfSBhbmQgcG9wdWxhdGVzIHRoZSBtYXRjaGluZyBsaW5rcyBhcnJheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUNhY2hlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBleHRlcm5hbCBsaW5rcyBmcm9tIHRoZSBub3RlIGNvbnRlbnQgYm9keS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBleHRlcm5hbCBsaW5rcyBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgaW50ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwYXJzZU1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VNZXRhZGF0YU9wdGlvbnMgPSBQYXJzZUNhY2hlT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgY2FjaGUgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmVnaXN0ZXIgdGhlIGZpbGUgY2FjaGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCdzIHB1Ymxpc2hlZCBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIGRlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQsXG4gKiBiZWNhdXNlIHRoYXQgcGx1Z2luIGlzIG5vdCBhIGRlcGVuZGVuY3kgKHJ1bGUgTDkgaW4gYEFHRU5UUy5tZGApLiBJdHMgYGFwaS5kLnRzYCBkZWNsYXJlcyB0aGUgd2hvbGUgb2YgaXQuXG4gKi9cbmludGVyZmFjZSBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkge1xuICAvKipcbiAgICogQW5zd2VycyBmcm9tIHRoZSBwbHVnaW4ncyBiYWNrbGluayBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgVGhlIGJhY2tsaW5rcywgb3IgYG51bGxgIHdoaWxlIHRoZSBwbHVnaW4ncyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb2ZmLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0QmFja2xpbmtzRm9yRmlsZTogKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpID0+IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW5zd2VycyBmcm9tIHRoZSBwbHVnaW4ncyBiYWNrbGluayBjYWNoZSBvbmNlIHRoZSBwZW5kaW5nIGZpbGUgY2hhbmdlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBiYWNrbGlua3MsIG9yIHRvIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2BcbiAgICogICBtb2R1bGUgaXMgb2ZmLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHwgbnVsbD47XG59XG5cbi8qKlxuICogQSBzZWxlY3RvciBmb3IgYSBmZWF0dXJlLWdhdGVkIGxpbmsgY2F0ZWdvcnkgaW4ge0BsaW5rIGdldFJlZmVyZW5jZXN9LlxuICovXG5pbnRlcmZhY2UgRmVhdHVyZUxpbmtTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5rIGNhdGVnb3J5LCB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZlYXR1cmUgdGhhdCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNhY2hlIGZvciB0aGlzIGNhdGVnb3J5IHRvIGJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBsaW5rcyBmb3IgdGhpcyBjYXRlZ29yeSBmcm9tIHRoZSBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdDogKGNhY2hlOiBDYWNoZWRNZXRhZGF0YUV4KSA9PiBSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoaXMgY2F0ZWdvcnkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeH0uXG4gKi9cbmludGVyZmFjZSBUb1BhcnNlZENhY2hlZE1ldGFkYXRhRXhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBsYWluIGNhY2hlZCBtZXRhZGF0YSB0byB3cmFwLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSBjb250ZW50IHRoZSBvZmZzZXRzIGluZGV4IGludG8sIHVzZWQgZm9yIGJvZHkgZXh0ZXJuYWwtbGluayBwYXJzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBsaW5rcyB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFBhcnNlQ2FjaGVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgb2YgdGhlIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcGx1Z2luLCB0aGUgc3VjY2Vzc29yIHRvIGBCYWNrbGluayBDYWNoZWAuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgaGFzQmFja2xpbmtDYWNoZVBsdWdpbn0sIGFuZCBhcyB0aGUgcHJvdmlkZXIgaWQgdW5kZXIgd2hpY2gge0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGh9IGFuZCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9IGxvb2sgdXAgdGhlIHBsdWdpbidzIHB1Ymxpc2hlZCBBUEkuXG4gKi9cbmV4cG9ydCBjb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQgPSAnYWR2YW5jZWQtbWV0YWRhdGEtY2FjaGUnO1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCB2ZXJzaW9ucyBvZiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgJ3MgQVBJIHRoaXMgbW9kdWxlIGNvbXBpbGVkIGFnYWluc3QuIGAxLjMuMGAgaXMgdGhlIGZpcnN0IHRvIGNhcnJ5IHRoZSB0d28gYmFja2xpbmsgbWV0aG9kcy5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9WRVJTSU9OX1JBTkdFID0gJ14xLjMuMCc7XG5cbi8qKlxuICogVGhlIHNjaGVtYXMgb2YgYSBiYWNrbGluayBtZXRob2QncyBwYXlsb2FkczogdGhlIG9uZSBwYXRoLW9yLWZpbGUgYXJndW1lbnQsIGFuZCB0aGUgYmFja2xpbmtzIG9yIGBudWxsYC5cbiAqXG4gKiBBIGNvcHkgb2YgdGhlIGBnZXRCYWNrbGlua3NGb3JGaWxlYCBhbmQgYGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlYCBlbnRyaWVzIG9mIGBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9BUElfQ09OVFJBQ1RgLCB3aGljaCBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHNoaXBzIGFzXG4gKiBpdHMgcm9vdCBgYXBpLWNvbnRyYWN0LnRzYCBhbmQgcHVibGlzaGVzLiBLZWVwIHRoZSBndWFyZHMgaW4gYWdyZWVtZW50IHdpdGggdGhhdCBmaWxlLCBzbyB0aGUgcHJvdmlkZXIgYW5kIHRoaXMgY29uc3VtZXIgY2hlY2sgb25lIGRlZmluaXRpb24uXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1QgPSB7XG4gIGlucHV0OiBjcmVhdGVBcmd1bWVudHNTY2hlbWE8W3BhdGhPckZpbGU6IFBhdGhPckZpbGVdPihbeyBleHBlY3RlZDogJ2EgcGF0aCBvciBhIGZpbGUnLCB0eXBlR3VhcmQ6IGlzUGF0aE9yRmlsZSB9XSksXG4gIG91dHB1dDogY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgZXhwZWN0ZWQ6ICdhIGJhY2tsaW5rcyBkaWN0aW9uYXJ5IG9yIG51bGwnLCB0eXBlR3VhcmQ6IGlzTnVsbGFibGVCYWNrbGlua3NEaWN0IH0pXG59O1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCBvZiB0aGUgbWVtYmVycyBvZiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgJ3MgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBzbyBhIHJlY29yZCB0aGF0IGxhY2tzIGVpdGhlciBpcyBwYXNzZWQgb3ZlciwgYW5kIGEgcGF5bG9hZCB0aGF0IGJyZWFrcyBpdHMgc2lnbmF0dXJlIGlzIHJlcG9ydGVkIHdoaWxlIHRoZSBgb2JzaWRpYW4tbGliOnZhbGlkYXRlLXBsdWdpbi1hcGktcGF5bG9hZHNgIGRlYnVnIHN3aXRjaCBpcyBvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9DT05UUkFDVDogQXBpQ29udHJhY3Q8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPiA9IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmU6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1Rcbn07XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgcmV0aXJlZCBgQmFja2xpbmsgQ2FjaGVgIHBsdWdpbiwgc3VwZXJzZWRlZCBieSB7QGxpbmsgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEfS5cbiAqXG4gKiBTdGlsbCByZWNvZ25pemVkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgZGVsaWJlcmF0ZWx5LiBSZW1vdmluZyBhIHBsdWdpbiBmcm9tIHRoZSBjb21tdW5pdHkgcmVnaXN0cnkgYmxvY2tzIG5ldyBpbnN0YWxsczsgaXQgdW5pbnN0YWxscyBub3RoaW5nLCBzbyBldmVyeSBleGlzdGluZyB1c2VyIGtlZXBzIGl0IHVudGlsIHRoZXkgbWlncmF0ZSBieSBoYW5kLlxuICpcbiAqIEl0IG1heSBiZSBkcm9wcGVkIHdoZW4gYWxsIHRocmVlIG9mIHRoZSBmb2xsb3dpbmcgaG9sZCwgYW5kIG5vdCBiZWZvcmU6IGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgaXMgbGlzdGVkIGluIHRoZSBjb21tdW5pdHkgcmVnaXN0cnksIHNvIG1pZ3JhdGluZyBpcyBwb3NzaWJsZSBhdCBhbGw7IHRoZSBmaW5hbCBgQmFja2xpbmsgQ2FjaGVgIGhhbmRvdmVyIHJlbGVhc2UgaGFzIGJlZW4gb3V0IGZvciBhdCBsZWFzdCB0d2VsdmUgbW9udGhzOyBhbmQgdGhpcyBsaWJyYXJ5IGlzIGN1dHRpbmcgYSBtYWpvciByZWxlYXNlIGFueXdheSwgYmVjYXVzZSBkcm9wcGluZyB0aGUgaWQgc2lsZW50bHkgdW4tZ2F0ZXMgY2FudmFzIGxpbmsgaGFuZGxpbmcgZm9yIGFueW9uZSB3aG8gaGFzIG5vdCBtaWdyYXRlZC4gVGhlcmUgaXMgbm8gY29zdCBwcmVzc3VyZSB0byBkcm9wIGl0IGVhcmxpZXIgLSByZWNvZ25pemluZyBhIGRlYWQgaWQgaXMgb25lIHN0cmluZyBjb21wYXJpc29uIG9uIGEgcGF0aCB0aGF0IGFscmVhZHkgcmVhZHMgYSBwbHVnaW4gcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQgPSAnYmFja2xpbmstY2FjaGUnO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkgZm9yIGFsbCBmaWxlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBhcHAubWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUocmVzb2x2ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqIE5PVEU6IFRoZSBmaWxlIG1heSBiZSBub24tZXhpc3RlbnQuXG4gKlxuICogV2hlbiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHB1Ymxpc2hlcyBpdHMgYmFja2xpbmtzIEFQSSBhbmQgaXRzIGBCYWNrbGlua3NgIG1vZHVsZSBpcyBvbiwgaXRzIGNhY2hlIGFuc3dlcnMuXG4gKiBPdGhlcndpc2UgdGhlIGFuc3dlciBjb21lcyBmcm9tIGEgYmFja2xpbmsgaW5kZXggd2hvc2UgY29zdCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGNhbmRpZGF0ZSBub3RlcyByYXRoZXIgdGhhblxuICogdG8gZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdCwgYW5kIHdoaWNoIGdpdmVzIHRoZSBzYW1lIHJlZmVyZW5jZXMgT2JzaWRpYW4ncyBvd24gYGdldEJhY2tsaW5rc0ZvckZpbGVgIGdpdmVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICogQHJldHVybnMgVGhlIGJhY2tsaW5rcyBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFtmaWxlXSk7XG4gIHJldHVybiBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSkgPz8gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwLCBmaWxlKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIHNhZmVseS5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCB0aGF0IEFQSSBhbnN3ZXJzLlxuICpcbiAqIE90aGVyd2lzZSB0aGlzIGlzIE5PVCBhIHB1cmUgcmVhZC4gSXQgdmVyaWZpZXNcbiAqIGVhY2ggYmFja2xpbmsgYWdhaW5zdCB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCwgYW5kIHRvIGRvIHRoYXQgaXQgY2FsbHMge0BsaW5rIHNhdmVOb3RlfSBvbiBldmVyeVxuICogbm90ZSB0aGF0IGxpbmtzIHRvIHRoZSBmaWxlLCB3aGljaCBzYXZlcyBhbnkgb3BlbiBlZGl0b3IgdmlldyBvZiB0aG9zZSBub3RlcyB0aGF0IGhhcyB1bnNhdmVkXG4gKiBjaGFuZ2VzLiBDYWxsIGl0IGZyb20gYW4gZXhwbGljaXQgdXNlciBhY3Rpb24uIERvIG5vdCBjYWxsIGl0IGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHQgb3JcbiAqIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdC4gVGhlcmUsIGEgZm9yY2VkIHNhdmUgY2FuXG4gKiByYWNlIGFub3RoZXIgcGx1Z2luJ3MgaW4tZmxpZ2h0IGVkaXRvciBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUocGFyYW1zOiBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZVBhcmFtcyk6IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4+IHtcbiAgY29uc3QgeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgY2FjaGVkQmFja2xpbmtzID0gYXdhaXQgZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpPy5nZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXRoT3JGaWxlKTtcbiAgaWYgKGNhY2hlZEJhY2tsaW5rcykge1xuICAgIHJldHVybiBjYWNoZWRCYWNrbGlua3M7XG4gIH1cblxuICBsZXQgYmFja2xpbmtzOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiA9IG5ldyBDdXN0b21BcnJheURpY3RJbXBsPFJlZmVyZW5jZT4oKTtcbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dE5vdGljZSh7XG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWwpIHtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHApO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGJhY2tsaW5rcyA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwLCBmaWxlKTtcbiAgICAgIGZvciAoY29uc3Qgbm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBub3RlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogbm90ZVBhdGggfSk7XG4gICAgICAgIGlmICghbm90ZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgY2FudmFzIGhvbGRlciBjYW5ub3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGl0cyB0ZXh0LiBJdHMgZmlsZS1ub2RlIHJlZmVyZW5jZXMgY2Fycnkgbm8gcG9zaXRpb24sIGFuZFxuICAgICAgICAvLyBPYnNpZGlhbiByZXBvcnRzIGEgdGV4dC1ub2RlIGVtYmVkIHdpdGggYSBwb3NpdGlvbiBpbnRvIHRoYXQgbm9kZSdzIG93biB0ZXh0LCBub3QgaW50byB0aGUgY2FudmFzIEpTT04sXG4gICAgICAgIC8vIHNvIHNsaWNpbmcgdGhlIGZpbGUgYXQgaXQgbmV2ZXIgZ2l2ZXMgdGhlIGxpbmsgYmFjayBhbmQgdGhlIHJldHJ5IHdvdWxkIG5ldmVyIGVuZC5cbiAgICAgICAgaWYgKGlzQ2FudmFzRmlsZShub3RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBub3RlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFNhZmUoYXBwLCBub3RlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBiYWNrbGlua3MuZ2V0KG5vdGVQYXRoKTtcbiAgICAgICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VkIG9ubHkgd2hlbiBhIGZyb250bWF0dGVyIGxpbmsgbmVlZHMgaXQ6IGEgbm90ZSB3aG9zZSBZQU1MIGRvZXMgbm90IHBhcnNlIHN0aWxsIGhvbGRzIGJvZHkgbGlua3MsXG4gICAgICAgIC8vIGFuZCBgbnVsbGAgbWFya3MgYSBwYXJzZSB0aGF0IGZhaWxlZCwgc28gaXRzIGZyb250bWF0dGVyIGxpbmtzIGFyZSBza2lwcGVkIHJhdGhlciB0aGFuIHJldHJpZWQgZm9yZXZlci5cbiAgICAgICAgbGV0IGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xuICAgICAgICAgIGxldCBhY3R1YWxMaW5rOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IGNvbnRlbnQuc2xpY2UocmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgcmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudCwgbm90ZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIHJlZmVyZW5jZS5rZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtXaXRoT2Zmc2V0cyA9IHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhyZWZlcmVuY2UpO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBnZXRSZWZlcmVuY2VMaW5rVGV4dChyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5tZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGVQYXRoLCB7IGZpbGVQYXRoOiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkgfSksXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBudWxsLFxuICAgIHJldHJ5T3B0aW9uczogb3B0aW9ucyxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogb3B0aW9ucy5zaG91bGRTaG93VGltZW91dE5vdGljZSA/PyB0cnVlXG4gIH0pO1xuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gZmlsZSBvciBwYXRoLlxuICpcbiAqIFRoaXMgaXMgTk9UIGEgcHVyZSByZWFkOiBiZWZvcmUgaXQgcmVhZHMgdGhlIGNhY2hlLCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9LCB3aGljaCBzYXZlcyBhbnlcbiAqIG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXMgdW5zYXZlZCBjaGFuZ2VzLiBUaGF0IHNhdmUgaXMgd2h5IHRoZSBjYWNoZSBtYXRjaGVzIHdoYXQgdGhlXG4gKiB1c2VyIHNlZXMsIGFuZCB3aHkgYSBjb21tYW5kIHRoYXQgcmV3cml0ZXMgdGhlIG5vdGUgY2FuIHVzZSB0aGlzIHNhZmVseSB3aXRob3V0IGl0cyByZXdyaXRlIGJlaW5nXG4gKiBjbG9iYmVyZWQuIEl0IGlzIGFsc28gYSB3cml0ZSBvbiB0aGUgbm90ZS4gU28gZG8gbm90IGNhbGwgdGhpcyBmcm9tIGFuIGF1dG9tYXRpYyB0cmlnZ2VyIChhIHZhdWx0XG4gKiBvciBtZXRhZGF0YSBldmVudCwgYSBzYXZlIG9yIHJlbmRlciBwYXRjaCwgYSBsYXlvdXQgaG9vaykgdGhhdCBvbmx5IGRlY2lkZXMgd2hldGhlciB0byBhY3Q6IGFcbiAqIGZvcmNlZCBzYXZlIG9uZSB0aWNrIGFmdGVyIGFub3RoZXIgcGx1Z2luIGhhcyBkaXNwYXRjaGVkIGEgY2hhbmdlIGludG8gdGhlIGVkaXRvciBjYW4gbGVhdmVcbiAqIE9ic2lkaWFuJ3MgZWRpdG9yIHJlbmRlcmluZyBzdGFsZSBzdGF0ZS4gQSByZWFkLW9ubHkgcHJvYmUgb24gdGhlIG5vdGUncyBjdXJyZW50IHRleHQgc2hvdWxkIHVzZVxuICoge0BsaW5rIHBhcnNlTWV0YWRhdGF9IG9uIHRoYXQgdGV4dCBpbnN0ZWFkLiBJdCBuZWVkcyBubyB2aWV3LCBubyBjYWNoZSBhbmQgbm8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlT3JQYXRoIC0gVGhlIGZpbGUgb3IgcGF0aCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBhZGRpdGlvbmFsIGxpbmtzIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgdGhlIGZpbGUsIG9yIGBudWxsYCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVTYWZlKGFwcDogQXBwLCBmaWxlT3JQYXRoOiBQYXRoT3JGaWxlLCBvcHRpb25zOiBHZXRDYWNoZVNhZmVPcHRpb25zID0ge30pOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhRXggfCBudWxsPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBmaWxlT3JQYXRoIH0pO1xuXG4gIHRyeSB7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgICBpZiAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcblxuICAgICAgY29uc3QgZmlsZUNhY2hlRW50cnkgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXTtcbiAgICAgIGNvbnN0IGlzVXBUb0RhdGUgPSBmaWxlQ2FjaGVFbnRyeT8ubXRpbWUgPT09IGZpbGUuc3RhdC5tdGltZVxuICAgICAgICAmJiBmaWxlQ2FjaGVFbnRyeS5zaXplID09PSBmaWxlLnN0YXQuc2l6ZVxuICAgICAgICAmJiBPYmplY3QuaGFzT3duKGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGUsIGZpbGVDYWNoZUVudHJ5Lmhhc2gpO1xuICAgICAgaWYgKCFpc1VwVG9EYXRlKSB7XG4gICAgICAgIGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVGaWxlTWV0YWRhdGFBc3luYyhmaWxlKTtcbiAgICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICB9XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdGhlIGJvZHktZXh0ZXJuYWwgcGFyc2UgbmVlZHMgdGhlIGZpbGUgY29udGVudDsgZnJvbnRtYXR0ZXIgcGFyc2luZyB1c2VzIHRoZSBjYWNoZWRcbiAgICAvLyBmcm9udG1hdHRlciwgc28gYXZvaWQgcmVhZGluZyB0aGUgY29udGVudCB1bmxlc3MgaXQgaXMgYWN0dWFsbHkgbmVlZGVkLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcyA/IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpIDogJyc7XG4gICAgcmV0dXJuIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeCh7IGNhY2hlLCBjb250ZW50LCBvcHRpb25zIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmcm9udCBtYXR0ZXIgZnJvbSB0aGUgbWV0YWRhdGEgY2FjaGUgc2FmZWx5LlxuICpcbiAqIEl0IHJlYWRzIHRocm91Z2gge0BsaW5rIGdldENhY2hlU2FmZX0sIHNvIGl0IHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRoZSBub3RlIHRoYXQgaGFzXG4gKiB1bnNhdmVkIGNoYW5nZXMuIFNlZSB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSBmb3Igd2hlbiB0aGF0IHNhdmUgbWF0dGVycyBhbmQgd2hhdCB0byB1c2UgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEN1c3RvbUZyb250bWF0dGVyIC0gVGhlIHR5cGUgb2YgY3VzdG9tIGZyb250IG1hdHRlci5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHJldHJpZXZlIHRoZSBmcm9udCBtYXR0ZXIgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBjb21iaW5lZCBmcm9udCBtYXR0ZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcm9udG1hdHRlclNhZmU8Q3VzdG9tRnJvbnRtYXR0ZXIgPSB1bmtub3duPihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8Q29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj4+IHtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgcmV0dXJuIChjYWNoZT8uZnJvbnRtYXR0ZXIgPz8ge30pIGFzIENvbWJpbmVkRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlcyAobGlua3MsIGVtYmVkcywgZnJvbnRtYXR0ZXIgbGlua3MgYW5kIHRoZSBvcHRlZC1pbiBleHRyYXMpIGZyb20gdGhlXG4gKiBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHJlZmVyZW5jZXMuXG4gKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZmVyZW5jZXMocGFyYW1zOiBHZXRSZWZlcmVuY2VzUGFyYW1zKTogUmVmZXJlbmNlW10ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAgc2hvdWxkSW5jbHVkZUVtYmVkcyA9IHRydWUsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyTGlua3MgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVMaW5rcyA9IHRydWUsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSA9IFtcbiAgICAuLi4oc2hvdWxkSW5jbHVkZUxpbmtzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBlbnN1cmVOb25OdWxsYWJsZShjYWNoZUV4LmV4dGVybmFsTGlua3MpLFxuICAgICAgc2hvdWxkSW5jbHVkZTogc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gZW5zdXJlTm9uTnVsbGFibGUoY2FjaGVFeC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MpLFxuICAgICAgc2hvdWxkSW5jbHVkZTogc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdtdWx0aS12YWx1ZSBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gZW5zdXJlTm9uTnVsbGFibGUoY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKSxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gZW5zdXJlTm9uTnVsbGFibGUoY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyksXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgICB9XG4gIF07XG5cbiAgZm9yIChjb25zdCBmZWF0dXJlTGlua1NlbGVjdG9yIG9mIGZlYXR1cmVMaW5rU2VsZWN0b3JzKSB7XG4gICAgaWYgKCFmZWF0dXJlTGlua1NlbGVjdG9yLnNob3VsZEluY2x1ZGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDYWNoZWRNZXRhZGF0YUV4KGNhY2hlKSB8fCAhY2FjaGUuZmVhdHVyZXMuaW5jbHVkZXMoZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5jbHVkZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZGVzY3JpcHRpb259OiB0aGUgY2FjaGUgd2FzIG5vdCBjb21wdXRlZCB3aXRoIHRoZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZmVhdHVyZX0gZmVhdHVyZS5gKTtcbiAgICB9XG5cbiAgICByZWZlcmVuY2VzLnB1c2goLi4uZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKTtcbiAgfVxuXG4gIHNvcnRSZWZlcmVuY2VzKHJlZmVyZW5jZXMpO1xuXG4gIC8vIEJVRzogaHR0cHM6Ly9mb3J1bS5vYnNpZGlhbi5tZC90L2J1Zy1kdXBsaWNhdGVkLWxpbmtzLWluLW1ldGFkYXRhY2FjaGUtaW5zaWRlLWZvb3Rub3Rlcy84NTU1MVxuICByZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzUmVmZXJlbmNlID0gZW5zdXJlTm9uTnVsbGFibGUocmVmZXJlbmNlc1tpbmRleCAtIDFdKTtcblxuICAgIGlmIChpc1JlZmVyZW5jZUNhY2hlKHJlZmVyZW5jZSkgJiYgaXNSZWZlcmVuY2VDYWNoZShwcmV2aW91c1JlZmVyZW5jZSkpIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICE9PSBwcmV2aW91c1JlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUocmVmZXJlbmNlKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzUmVmZXJlbmNlKSkge1xuICAgICAgY29uc3QgbGlua1N0YXJ0T2Zmc2V0ID0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHJlZmVyZW5jZSkgPyByZWZlcmVuY2Uuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNSZWZlcmVuY2UpID8gcHJldmlvdXNSZWZlcmVuY2Uuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgcmV0dXJuIHJlZmVyZW5jZS5rZXkgIT09IHByZXZpb3VzUmVmZXJlbmNlLmtleSB8fCBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocmVmZXJlbmNlKSAhPT0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzUmVmZXJlbmNlKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgY3VycmVudGx5IGxvYWRlZCAtIGVpdGhlciBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgICh7QGxpbmsgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEfSkgb3IgaXRzIHJldGlyZWQgcHJlZGVjZXNzb3IgYEJhY2tsaW5rIENhY2hlYCAoe0BsaW5rIEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRH0pLlxuICpcbiAqIFN1Y2ggYSBwbHVnaW4ga2VlcHMgYSBkcmFpbi1vbi1yZWFkIGJhY2tsaW5rIGluZGV4IGFuZCBpbmRleGVzIGNhbnZhcyBtZXRhZGF0YSwgc28gYSBjYWxsZXIgdGhhdCBjb21wZW5zYXRlcyBmb3IgT2JzaWRpYW4ncyBvd24gZ2FwcyBjYW4gc3RhbmQgZG93biB3aGlsZSBvbmUgaXMgcHJlc2VudC4gQm90aCBpZHMgYXJlIHJlY29nbml6ZWQ7IHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9IHJlY29yZHMgd2hlbiB0aGUgcmV0aXJlZCBvbmUgbWF5IGJlIGRyb3BwZWQuXG4gKlxuICogVGhpcyByZWFkcyB0aGUgTE9BREVEIHBsdWdpbiBpbnN0YW5jZSByYXRoZXIgdGhhbiBgYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnNgLCBkZWxpYmVyYXRlbHk6IHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoZSBwbHVnaW4ncyBwYXRjaGVzIGFyZSBpbiBwbGFjZSByaWdodCBub3csIGFuZCB0aGV5IGFyZSBub3QgdW50aWwgaXQgaGFzIGxvYWRlZC4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLCBzbyBjYWxsIHRoaXMgZnJvbSBhIHVzZXItZHJpdmVuIHBhdGggcmF0aGVyIHRoYW4gZnJvbSBwbHVnaW4gbG9hZCAtIHNlZSBydWxlIEwyNSBpbiBgQUdFTlRTLm1kYC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIGJhY2tsaW5rIGNhY2hlIHBsdWdpbiBpcyBsb2FkZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQmFja2xpbmtDYWNoZVBsdWdpbihhcHA6IEFwcCk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRCkgIT09IG51bGwgfHwgYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRCkgIT09IG51bGw7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2FjaGUgaXMgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0gKGkuZS4gaXQgd2FzIGNvbXB1dGVkIHdpdGggZXh0ZXJuYWwtbGlua1xuICogcGFyc2luZyBlbmFibGVkKS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgY2FjaGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FjaGVkTWV0YWRhdGFFeChjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBjYWNoZSBpcyBDYWNoZWRNZXRhZGF0YUV4IHtcbiAgcmV0dXJuICdmZWF0dXJlcycgaW4gY2FjaGU7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBtZXRhZGF0YSBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gcGFyc2UgdGhlIG1ldGFkYXRhIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcnNlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggYWRkaXRpb25hbCBsaW5rcyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKGFwcDogQXBwLCAkc3RyaW5nOiBzdHJpbmcsIG9wdGlvbnM6IFBhcnNlTWV0YWRhdGFPcHRpb25zID0ge30pOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhRXg+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBidWZmZXIgPSBlbmNvZGVyLmVuY29kZSgkc3RyaW5nKS5idWZmZXI7XG4gIGNvbnN0IGNhY2hlID0gYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZU1ldGFkYXRhQXN5bmMoYnVmZmVyKSA/PyB7fTtcbiAgcmV0dXJuIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeCh7IGNhY2hlLCBjb250ZW50OiAkc3RyaW5nLCBvcHRpb25zIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZmlsZSBjYWNoZSBmb3IgYSBub24tZXhpc3RpbmcgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIHRoZSBmaWxlIGNhY2hlLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUocGFyYW1zOiBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyk6IERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBmaWxlcyB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRmlsZXMoYXBwOiBBcHAsIGZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiBEaXNwb3NhYmxlRXgge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDA7XG4gICAgICBjb3VudCsrO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcblxuICAgICAgYXBwLnZhdWx0LmZpbGVNYXBbZmlsZS5wYXRoXSA9IGZpbGU7XG5cbiAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUudW5pcXVlRmlsZUxvb2t1cC5hZGQoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCksIGZpbGUpO1xuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlcyhhcHAsIGZpbGVzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIGZvciBhIG5vbi1leGlzdGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHVucmVnaXN0ZXIgdGhlIGZpbGUgY2FjaGUgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gIGRlbGV0ZSBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF07XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgZmlsZXMgZnJvbSB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHVucmVnaXN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZXMoYXBwOiBBcHAsIGZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiB2b2lkIHtcbiAgY29uc3QgcmVnaXN0ZXJlZEZpbGVzQ291bnRzID0gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk7XG5cbiAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgIHdoaWxlIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGxldCBjb3VudCA9IHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5nZXQoZmlsZS5wYXRoKSA/PyAxO1xuICAgICAgY291bnQtLTtcbiAgICAgIHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5zZXQoZmlsZS5wYXRoLCBjb3VudCk7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmRlbGV0ZShmaWxlLnBhdGgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdO1xuXG4gICAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmlsZSA9IGdldEZvbGRlcih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgcGF0aE9yRm9sZGVyOiBwYXJlbnRGb2xkZXJQYXRoKGZpbGUucGF0aCksXG4gICAgICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKTogQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHwgbnVsbCB7XG4gIHJldHVybiBmaW5kUGx1Z2luQXBpPEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaT4oe1xuICAgIGFwaVZlcnNpb25SYW5nZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9WRVJTSU9OX1JBTkdFLFxuICAgIGNvbnRyYWN0OiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNULFxuICAgIHBsdWdpbklkOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSURcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGUoJ3JlZ2lzdGVyZWRGaWxlc0NvdW50cycsIG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCkpLnZhbHVlO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSByZWNvZ25pemVzIHRoZSBiYWNrbGlua3MgZGljdGlvbmFyeSBhbm90aGVyIHBsdWdpbidzIGNvcHkgYnVpbHQsIG9yIGBudWxsYC4gVGhlIGNsYXNzIGl0IHdhcyBidWlsdCBmcm9tIGxpdmVzIGluIHRoYXQgY29weSwgc28gYGluc3RhbmNlb2ZgIGNhbm5vdCBiZSB1c2VkIChydWxlIEw5IGluIGBBR0VOVFMubWRgKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgcmVhZHMgYXMgYSBiYWNrbGlua3MgZGljdGlvbmFyeS5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbiAgICB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgJiYgUmVmbGVjdC5nZXQodmFsdWUsICdkYXRhJykgaW5zdGFuY2VvZiBNYXBcbiAgICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2dldCcpID09PSAnZnVuY3Rpb24nXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdrZXlzJykgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4dGVybmFsQm9keUxpbmtzKGNvbnRlbnQ6IHN0cmluZywgY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogUGFyc2VMaW5rUmVmZXJlbmNlW10ge1xuICBjb25zdCBmcm9udG1hdHRlckVuZE9mZnNldCA9IGNhY2hlLmZyb250bWF0dGVyUG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMDtcbiAgcmV0dXJuIHBhcnNlTGlua3MoY29udGVudClcbiAgICAuZmlsdGVyKChwYXJzZUxpbmtSZXN1bHQpID0+IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsICYmIHBhcnNlTGlua1Jlc3VsdC5zdGFydE9mZnNldCA+PSBmcm9udG1hdHRlckVuZE9mZnNldClcbiAgICAubWFwKChwYXJzZUxpbmtSZXN1bHQpID0+IHRvUGFyc2VMaW5rUmVmZXJlbmNlKHsgY29udGVudCwgcGFyc2VMaW5rUmVzdWx0IH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9udG1hdHRlck9yTnVsbChjb250ZW50OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj4gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRnJvbnRtYXR0ZXIgcGFyc2luZyBmYWlsZWQgaW4gJHtwYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgocGFyYW1zOiBUb1BhcnNlZENhY2hlZE1ldGFkYXRhRXhQYXJhbXMpOiBDYWNoZWRNZXRhZGF0YUV4IHtcbiAgY29uc3QgeyBjYWNoZSwgY29udGVudCwgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlczogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmVbXSA9IFtDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5OYXRpdmVdO1xuICBjb25zdCByZXN1bHQ6IENhY2hlZE1ldGFkYXRhRXggPSB7IC4uLmNhY2hlLCBmZWF0dXJlcyB9O1xuXG4gIGlmIChvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcykge1xuICAgIHJlc3VsdC5leHRlcm5hbExpbmtzID0gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50LCBjYWNoZSk7XG4gICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzKTtcbiAgfVxuXG4gIGlmIChcbiAgICBvcHRpb25zLnNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB8fCBvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgKSB7XG4gICAgY29uc3QgZnJvbnRtYXR0ZXJMaW5rcyA9IHBhcnNlRnJvbnRtYXR0ZXJMaW5rcyhjYWNoZS5mcm9udG1hdHRlcik7XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZyb250bWF0dGVyTGlua3MuZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0Lm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZyb250bWF0dGVyTGlua3MubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFVUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGtDQUFrQztBQUMzQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLFNBQVM7QUFDbEIsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxxQkFBcUI7QUFDOUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLElBQUssMEJBQUwsa0JBQUtBLDZCQUFMO0FBSUwsRUFBQUEseUJBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLHlCQUFBLDhCQUEyQjtBQUszQixFQUFBQSx5QkFBQSx3Q0FBcUM7QUFLckMsRUFBQUEseUJBQUEsZ0NBQTZCO0FBSzdCLEVBQUFBLHlCQUFBLFlBQVM7QUF4QkMsU0FBQUE7QUFBQSxHQUFB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
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Whether an attachment sits outside the attachment folder of the notes that use it, and which notes are its
|
|
6
|
+
* proper home.
|
|
7
|
+
*
|
|
8
|
+
* Two things here are easy to get wrong:
|
|
9
|
+
*
|
|
10
|
+
* - **The judgement is about the FOLDER, not the path.** `getAttachmentFilePath` answers about the proper
|
|
11
|
+
* path, folder and templated base name both, so judging on it raw flags every attachment whose NAME does not
|
|
12
|
+
* match a rename template. That is a different defect. So the comparison is folder against folder, through
|
|
13
|
+
* `getAttachmentFolderPathForAttachment`, which also skips the name generation that dominates the cost of
|
|
14
|
+
* the question when `Custom Attachment Location` answers it.
|
|
15
|
+
* - **The proper folder is asked for the REAL attachment, never a dummy.** A folder template may read the
|
|
16
|
+
* attachment's own name, extension or stats, so `getAttachmentFolderPath`'s dummy-file route can answer
|
|
17
|
+
* about a file that does not exist.
|
|
18
|
+
*
|
|
19
|
+
* A reference is judged from the note that makes it: `A.md` linking `B/image.png`, which sits in `B.md`'s folder,
|
|
20
|
+
* is A linking an EXTERNAL attachment, even when B uses it too. Whether such a reference is worth reporting depends
|
|
21
|
+
* on whether the attachment has a proper note anywhere, which is known only after every note has been judged, so
|
|
22
|
+
* {@link MisplacedAttachmentIndex} collects the verdicts and {@link MisplacedAttachmentIndex.getReported} applies
|
|
23
|
+
* the {@link ExternalAttachmentLinkMode} at the end.
|
|
24
|
+
*
|
|
25
|
+
* Rendering is the caller's: this module only judges and collects.
|
|
26
|
+
*/
|
|
27
|
+
import type { App, Reference, TFile } from 'obsidian';
|
|
28
|
+
/**
|
|
29
|
+
* Which references to an attachment outside the referencing note's attachment folder are reported.
|
|
30
|
+
*/
|
|
31
|
+
export declare enum ExternalAttachmentLinkMode {
|
|
32
|
+
/**
|
|
33
|
+
* Never report one: nothing is judged at all.
|
|
34
|
+
*/
|
|
35
|
+
Ignore = "Ignore",
|
|
36
|
+
/**
|
|
37
|
+
* Report every such reference, including one to an attachment filed in the folder of another note that
|
|
38
|
+
* references it too.
|
|
39
|
+
*/
|
|
40
|
+
Report = "Report",
|
|
41
|
+
/**
|
|
42
|
+
* Report such a reference only when no note that references the attachment has it in its own folder.
|
|
43
|
+
*/
|
|
44
|
+
ReportUnowned = "ReportUnowned"
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The folder an attachment sits in, judged against the folder one note's configuration puts its attachments in.
|
|
48
|
+
*/
|
|
49
|
+
export interface AttachmentPlacement {
|
|
50
|
+
/**
|
|
51
|
+
* Whether the attachment sits in {@link AttachmentPlacement.properAttachmentFolderPath}, compared the way the
|
|
52
|
+
* vault's adapter compares names (case-folded on a case-insensitive adapter).
|
|
53
|
+
*/
|
|
54
|
+
readonly isInProperFolder: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* The vault-relative folder the note's configuration puts this attachment in, `/` for the vault root.
|
|
57
|
+
*/
|
|
58
|
+
readonly properAttachmentFolderPath: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parameters for {@link getAttachmentPlacement}.
|
|
62
|
+
*/
|
|
63
|
+
export interface GetAttachmentPlacementParams {
|
|
64
|
+
/**
|
|
65
|
+
* The Obsidian app instance.
|
|
66
|
+
*/
|
|
67
|
+
readonly app: App;
|
|
68
|
+
/**
|
|
69
|
+
* The attachment to judge.
|
|
70
|
+
*/
|
|
71
|
+
readonly attachmentFile: TFile;
|
|
72
|
+
/**
|
|
73
|
+
* The vault-relative path of the note whose configuration the attachment is judged against.
|
|
74
|
+
*/
|
|
75
|
+
readonly notePath: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* One reference to an attachment outside the attachment folder of the note that makes it.
|
|
79
|
+
*
|
|
80
|
+
* The same attachment referenced from two notes is two entries, because the two notes can configure different
|
|
81
|
+
* attachment folders.
|
|
82
|
+
*/
|
|
83
|
+
export interface MisplacedAttachmentEntry {
|
|
84
|
+
/**
|
|
85
|
+
* The attachment's current vault-relative path.
|
|
86
|
+
*/
|
|
87
|
+
readonly attachmentPath: string;
|
|
88
|
+
/**
|
|
89
|
+
* The vault-relative folder the referencing note's configuration puts the attachment in.
|
|
90
|
+
*/
|
|
91
|
+
readonly properAttachmentFolderPath: string;
|
|
92
|
+
/**
|
|
93
|
+
* The reference that reaches the attachment.
|
|
94
|
+
*/
|
|
95
|
+
readonly reference: Reference;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parameters for {@link recordAttachmentPlacement}.
|
|
99
|
+
*/
|
|
100
|
+
export interface RecordAttachmentPlacementParams {
|
|
101
|
+
/**
|
|
102
|
+
* The Obsidian app instance.
|
|
103
|
+
*/
|
|
104
|
+
readonly app: App;
|
|
105
|
+
/**
|
|
106
|
+
* The file the reference resolved to. Pass only references that resolved: an unresolved one is a broken link,
|
|
107
|
+
* not a misplaced attachment.
|
|
108
|
+
*/
|
|
109
|
+
readonly attachmentFile: TFile;
|
|
110
|
+
/**
|
|
111
|
+
* The index the verdict is recorded in.
|
|
112
|
+
*/
|
|
113
|
+
readonly index: MisplacedAttachmentIndex;
|
|
114
|
+
/**
|
|
115
|
+
* Whether a path is never judged, for example because the user excluded it. Defaults to judging every path.
|
|
116
|
+
*/
|
|
117
|
+
readonly isPathIgnored?: (path: string) => boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Whether a path lies in a shared attachment location, which is anybody's folder, so no reference into it is
|
|
120
|
+
* external. Defaults to no shared location.
|
|
121
|
+
*/
|
|
122
|
+
readonly isSharedAttachmentPath?: (path: string) => boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Whether a note is treated as an attachment (an `.excalidraw.md` file, say), and so judged here. Defaults to
|
|
125
|
+
* no note being one.
|
|
126
|
+
*/
|
|
127
|
+
readonly isTreatedAsAttachment?: (path: string) => boolean;
|
|
128
|
+
/**
|
|
129
|
+
* The vault-relative path of the note that makes the reference.
|
|
130
|
+
*/
|
|
131
|
+
readonly notePath: string;
|
|
132
|
+
/**
|
|
133
|
+
* The reference, kept in the entry so a report can name its line or frontmatter key.
|
|
134
|
+
*/
|
|
135
|
+
readonly reference: Reference;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The verdicts of a walk over every reference to an attachment, grouped by the note that makes the reference.
|
|
139
|
+
*
|
|
140
|
+
* It keeps every external reference, every note that uses each attachment, and each attachment's proper notes:
|
|
141
|
+
* the notes that reference it and whose own folder holds it. Which entries count as reported depends on the
|
|
142
|
+
* {@link ExternalAttachmentLinkMode} and on the proper notes, which are known only once the whole vault has been
|
|
143
|
+
* walked, so ask {@link MisplacedAttachmentIndex.getReported} after the walk.
|
|
144
|
+
*/
|
|
145
|
+
export declare class MisplacedAttachmentIndex extends Map<string, MisplacedAttachmentEntry[]> {
|
|
146
|
+
readonly mode: ExternalAttachmentLinkMode;
|
|
147
|
+
private readonly properNotePathsByAttachment;
|
|
148
|
+
private readonly userNotePathsByAttachment;
|
|
149
|
+
/**
|
|
150
|
+
* Creates an empty index.
|
|
151
|
+
*
|
|
152
|
+
* @param mode - Which external references {@link MisplacedAttachmentIndex.getReported} returns.
|
|
153
|
+
*/
|
|
154
|
+
constructor(mode?: ExternalAttachmentLinkMode);
|
|
155
|
+
/**
|
|
156
|
+
* Records a reference to an attachment outside the referencing note's folder.
|
|
157
|
+
*
|
|
158
|
+
* @param notePath - The referencing note's vault-relative path.
|
|
159
|
+
* @param entry - The reference and the folder the note wants the attachment in.
|
|
160
|
+
*/
|
|
161
|
+
add(notePath: string, entry: MisplacedAttachmentEntry): void;
|
|
162
|
+
/**
|
|
163
|
+
* Records that a note references an attachment, wherever the attachment sits.
|
|
164
|
+
*
|
|
165
|
+
* @param attachmentPath - The attachment's vault-relative path.
|
|
166
|
+
* @param notePath - The referencing note's vault-relative path.
|
|
167
|
+
*/
|
|
168
|
+
addUser(attachmentPath: string, notePath: string): void;
|
|
169
|
+
/**
|
|
170
|
+
* The notes that use an attachment besides the given one, its proper notes first, each group in walk order.
|
|
171
|
+
*
|
|
172
|
+
* @param attachmentPath - The attachment's vault-relative path.
|
|
173
|
+
* @param notePath - The note to leave out: the one whose reference is being reported.
|
|
174
|
+
* @returns The other notes' paths.
|
|
175
|
+
*/
|
|
176
|
+
getOtherUserNotePaths(attachmentPath: string, notePath: string): string[];
|
|
177
|
+
/**
|
|
178
|
+
* The proper notes of an attachment: the notes that reference it and whose own folder holds it, in walk order.
|
|
179
|
+
*
|
|
180
|
+
* @param attachmentPath - The attachment's vault-relative path.
|
|
181
|
+
* @returns The proper notes' paths, empty when the attachment has none.
|
|
182
|
+
*/
|
|
183
|
+
getProperNotePaths(attachmentPath: string): string[];
|
|
184
|
+
/**
|
|
185
|
+
* The entries to report, after the mode is applied, grouped by note, with a note left out once none of its
|
|
186
|
+
* entries survive.
|
|
187
|
+
*
|
|
188
|
+
* @returns The entries to report.
|
|
189
|
+
*/
|
|
190
|
+
getReported(): Map<string, MisplacedAttachmentEntry[]>;
|
|
191
|
+
/**
|
|
192
|
+
* Whether a note is a proper note of an attachment: it references it, and its own folder holds it.
|
|
193
|
+
*
|
|
194
|
+
* @param attachmentPath - The attachment's vault-relative path.
|
|
195
|
+
* @param notePath - The note's vault-relative path.
|
|
196
|
+
* @returns `true` when the note's own attachment folder holds the attachment.
|
|
197
|
+
*/
|
|
198
|
+
isProperNote(attachmentPath: string, notePath: string): boolean;
|
|
199
|
+
/**
|
|
200
|
+
* Records that an attachment sits in the folder configured for a note that references it, which makes that
|
|
201
|
+
* note its proper note.
|
|
202
|
+
*
|
|
203
|
+
* @param attachmentPath - The attachment's vault-relative path.
|
|
204
|
+
* @param notePath - The referencing note whose folder holds it.
|
|
205
|
+
*/
|
|
206
|
+
markHomed(attachmentPath: string, notePath: string): void;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Judges where an attachment sits against the attachment folder of one note.
|
|
210
|
+
*
|
|
211
|
+
* Asks the attachment-path seam once, folder-only, for the REAL attachment, so a `Custom Attachment Location`
|
|
212
|
+
* folder template that reads the attachment's own name is honoured and no name is generated.
|
|
213
|
+
*
|
|
214
|
+
* @param params - The attachment and the note.
|
|
215
|
+
* @returns The note's proper folder for the attachment, and whether the attachment is in it.
|
|
216
|
+
*/
|
|
217
|
+
export declare function getAttachmentPlacement(params: GetAttachmentPlacementParams): Promise<AttachmentPlacement>;
|
|
218
|
+
/**
|
|
219
|
+
* Judges one resolved reference and records the verdict in the index.
|
|
220
|
+
*
|
|
221
|
+
* Records nothing under {@link ExternalAttachmentLinkMode.Ignore}, for a note that is not treated as an
|
|
222
|
+
* attachment, and for an ignored or shared path. Otherwise the referencing note becomes a proper note of the
|
|
223
|
+
* attachment when its folder holds it, and the reference becomes an entry when it does not.
|
|
224
|
+
*
|
|
225
|
+
* @param params - The reference, its note, its target and the index.
|
|
226
|
+
* @returns A {@link Promise} that resolves once the verdict is recorded.
|
|
227
|
+
*/
|
|
228
|
+
export declare function recordAttachmentPlacement(params: RecordAttachmentPlacementParams): Promise<void>;
|