obsidian-dev-utils 65.0.0 → 66.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/CHANGELOG.md +36 -8
- package/dist/dev/main.js +4892 -4807
- package/dist/lib/cjs/async-events.cjs +15 -18
- package/dist/lib/cjs/async-events.d.cts +19 -19
- package/dist/lib/cjs/async.cjs +1 -1
- package/dist/lib/cjs/async.d.cts +9 -8
- package/dist/lib/cjs/function.cjs +1 -1
- package/dist/lib/cjs/function.d.cts +43 -3
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/typings/obsidian-ex.d.cts +1 -1
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +1 -1
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
- package/dist/lib/cjs/obsidian/{plugin/components → components}/abort-signal-component.cjs +4 -4
- package/dist/lib/cjs/obsidian/{plugin/components → components}/abort-signal-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +201 -0
- package/dist/lib/{esm/obsidian/components/all-windows-event-handler.d.mts → cjs/obsidian/components/all-windows-event-component.d.cts} +6 -7
- package/dist/lib/cjs/obsidian/components/async-component.cjs +3 -2
- package/dist/lib/cjs/obsidian/components/async-component.d.cts +2 -1
- package/dist/lib/cjs/obsidian/{plugin/components → components}/async-error-handler-component.cjs +5 -5
- package/dist/lib/cjs/obsidian/{plugin/components → components}/async-error-handler-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/async-events-component.cjs +3 -2
- package/dist/lib/cjs/obsidian/components/async-events-component.d.cts +2 -1
- package/dist/lib/cjs/obsidian/{plugin/components → components}/console-debug-component.cjs +4 -4
- package/dist/lib/cjs/obsidian/{plugin/components → components}/console-debug-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +160 -0
- package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +34 -0
- package/dist/lib/cjs/obsidian/{plugin/components → components}/i18n-component.cjs +4 -4
- package/dist/lib/cjs/obsidian/{plugin/components → components}/i18n-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/index.cjs +40 -7
- package/dist/lib/cjs/obsidian/components/index.d.cts +13 -2
- package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +185 -0
- package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +47 -0
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +172 -0
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +41 -0
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +197 -0
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +113 -0
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-context-component.cjs +6 -6
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-context-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-notice-component.cjs +3 -2
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-notice-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +534 -0
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-component.d.cts +6 -21
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-tab-component.cjs +3 -2
- package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-tab-component.d.cts +5 -5
- package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.cjs +20 -16
- package/dist/lib/cjs/obsidian/dataview.cjs +1 -1
- package/dist/lib/cjs/obsidian/dataview.d.cts +1 -1
- package/dist/lib/cjs/obsidian/index.cjs +7 -4
- package/dist/lib/cjs/obsidian/index.d.cts +2 -1
- package/dist/lib/cjs/obsidian/loop.cjs +1 -1
- package/dist/lib/cjs/obsidian/loop.d.cts +2 -2
- package/dist/lib/cjs/obsidian/markdown.cjs +13 -7
- package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -50
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -35
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/prompt.d.cts +1 -1
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
- package/dist/lib/cjs/obsidian/path-settings.cjs +239 -0
- package/dist/lib/cjs/obsidian/plugin/index.cjs +1 -7
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +0 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +4 -4
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +5 -5
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +40 -34
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +16 -13
- package/dist/lib/cjs/obsidian/queue.cjs +1 -1
- package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
- package/dist/lib/cjs/obsidian/rename-delete-handler.cjs +19 -12
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +209 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +356 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/code-highlighter-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-component.cjs +3 -3
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-time-component.cjs +3 -3
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/email-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/file-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/month-component.cjs +3 -3
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +241 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-file-component.cjs +3 -3
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +254 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-text-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/number-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/password-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.cjs +4 -4
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/telephone-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/text-based-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/time-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +210 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/tri-state-checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +247 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +249 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-range-text-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +224 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-text-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/url-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +226 -0
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/validator-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.cjs +1 -1
- package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/week-component.cjs +3 -3
- package/dist/lib/cjs/obsidian/setting-ex.cjs +21 -21
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +20 -20
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
- package/dist/lib/cjs/script-utils/linters/eslint-config.d.cts +2 -2
- package/dist/lib/cjs/type.cjs +1 -1
- package/dist/lib/esm/async-events.d.mts +19 -19
- package/dist/lib/esm/async-events.mjs +15 -18
- package/dist/lib/esm/async.d.mts +9 -8
- package/dist/lib/esm/async.mjs +1 -1
- package/dist/lib/esm/function.d.mts +43 -3
- package/dist/lib/esm/function.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/typings/obsidian-ex.d.mts +1 -1
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
- package/dist/lib/esm/obsidian/async-with-notice.mjs +1 -1
- package/dist/lib/esm/obsidian/{plugin/components → components}/abort-signal-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +59 -0
- package/dist/lib/{cjs/obsidian/components/all-windows-event-handler.d.cts → esm/obsidian/components/all-windows-event-component.d.mts} +6 -7
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +93 -0
- package/dist/lib/esm/obsidian/components/async-component.d.mts +2 -1
- package/dist/lib/esm/obsidian/components/async-component.mjs +3 -2
- package/dist/lib/esm/obsidian/{plugin/components → components}/async-error-handler-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +62 -0
- package/dist/lib/esm/obsidian/components/async-events-component.d.mts +2 -1
- package/dist/lib/esm/obsidian/components/async-events-component.mjs +3 -2
- package/dist/lib/esm/obsidian/{plugin/components → components}/console-debug-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/console-debug-component.mjs +56 -0
- package/dist/lib/esm/obsidian/components/disposable-component.d.mts +34 -0
- package/dist/lib/esm/obsidian/components/disposable-component.mjs +50 -0
- package/dist/lib/esm/obsidian/{plugin/components → components}/i18n-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/i18n-component.mjs +53 -0
- package/dist/lib/esm/obsidian/components/index.d.mts +13 -2
- package/dist/lib/esm/obsidian/components/index.mjs +27 -5
- package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +47 -0
- package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +76 -0
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +41 -0
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +64 -0
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +113 -0
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +87 -0
- package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-context-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +61 -0
- package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-notice-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +58 -0
- package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-settings-component.d.mts +6 -21
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +433 -0
- package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-settings-tab-component.d.mts +5 -5
- package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +50 -0
- package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.mjs +20 -16
- package/dist/lib/esm/obsidian/dataview.d.mts +1 -1
- package/dist/lib/esm/obsidian/dataview.mjs +1 -1
- package/dist/lib/esm/obsidian/index.d.mts +2 -1
- package/dist/lib/esm/obsidian/index.mjs +5 -3
- package/dist/lib/esm/obsidian/loop.d.mts +2 -2
- package/dist/lib/esm/obsidian/loop.mjs +1 -1
- package/dist/lib/esm/obsidian/markdown.mjs +13 -7
- package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -35
- package/dist/lib/esm/obsidian/menu-event-registrar.mjs +1 -42
- package/dist/lib/esm/obsidian/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/obsidian/modals/prompt.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.mjs +1 -1
- package/dist/lib/esm/obsidian/path-settings.mjs +135 -0
- package/dist/lib/esm/obsidian/plugin/index.d.mts +0 -2
- package/dist/lib/esm/obsidian/plugin/index.mjs +1 -5
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +5 -5
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +4 -4
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +16 -13
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +40 -34
- package/dist/lib/esm/obsidian/queue.d.mts +2 -2
- package/dist/lib/esm/obsidian/queue.mjs +1 -1
- package/dist/lib/esm/obsidian/rename-delete-handler.mjs +22 -12
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/checkbox-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +101 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/code-highlighter-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +254 -0
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +62 -0
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +62 -0
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +72 -0
- package/dist/lib/esm/obsidian/setting-components/file-component.mjs +66 -0
- package/dist/lib/esm/obsidian/setting-components/index.mjs +78 -0
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +70 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +136 -0
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +59 -0
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +68 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-text-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +149 -0
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +82 -0
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +58 -0
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +45 -0
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +72 -0
- package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +58 -0
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +67 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/tri-state-checkbox-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +102 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +142 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +141 -0
- package/dist/lib/esm/obsidian/setting-components/typed-range-text-component.mjs +60 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-text-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +119 -0
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +72 -0
- package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/validator-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +127 -0
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +70 -0
- package/dist/lib/esm/obsidian/setting-ex.d.mts +20 -20
- package/dist/lib/esm/obsidian/setting-ex.mjs +21 -21
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +2 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-config.d.mts +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
- package/dist/lib/esm/type.mjs +1 -1
- package/obsidian/Components/abort-signal-component/package.json +6 -0
- package/obsidian/Components/{all-windows-event-handler → all-windows-event-component}/package.json +3 -3
- package/obsidian/Components/async-error-handler-component/package.json +6 -0
- package/obsidian/Components/console-debug-component/package.json +6 -0
- package/obsidian/Components/disposable-component/package.json +6 -0
- package/obsidian/Components/i18n-component/package.json +6 -0
- package/obsidian/Components/layout-ready-component/package.json +6 -0
- package/obsidian/Components/menu-event-registrar-component/package.json +6 -0
- package/obsidian/Components/monkey-around-component/package.json +6 -0
- package/obsidian/Components/plugin-context-component/package.json +6 -0
- package/obsidian/Components/plugin-notice-component/package.json +6 -0
- package/obsidian/Components/plugin-settings-component/package.json +6 -0
- package/obsidian/Components/plugin-settings-tab-component/package.json +6 -0
- package/obsidian/path-settings/package.json +6 -0
- package/obsidian/setting-components/checkbox-component/package.json +6 -0
- package/obsidian/setting-components/code-highlighter-component/package.json +6 -0
- package/obsidian/setting-components/date-component/package.json +6 -0
- package/obsidian/setting-components/date-time-component/package.json +6 -0
- package/obsidian/setting-components/email-component/package.json +6 -0
- package/obsidian/setting-components/file-component/package.json +6 -0
- package/obsidian/setting-components/index/package.json +6 -0
- package/obsidian/setting-components/month-component/package.json +6 -0
- package/obsidian/setting-components/multiple-dropdown-component/package.json +6 -0
- package/obsidian/setting-components/multiple-email-component/package.json +6 -0
- package/obsidian/setting-components/multiple-file-component/package.json +6 -0
- package/obsidian/setting-components/multiple-text-component/package.json +6 -0
- package/obsidian/setting-components/number-component/package.json +6 -0
- package/obsidian/setting-components/package.json +6 -0
- package/obsidian/setting-components/password-component/package.json +6 -0
- package/obsidian/setting-components/setting-component-wrapper/package.json +6 -0
- package/obsidian/setting-components/telephone-component/package.json +6 -0
- package/obsidian/setting-components/text-based-component/package.json +6 -0
- package/obsidian/setting-components/time-component/package.json +6 -0
- package/obsidian/setting-components/tri-state-checkbox-component/package.json +6 -0
- package/obsidian/setting-components/typed-dropdown-component/package.json +6 -0
- package/obsidian/setting-components/typed-multiple-dropdown-component/package.json +6 -0
- package/obsidian/setting-components/typed-range-text-component/package.json +6 -0
- package/obsidian/setting-components/typed-text-component/package.json +6 -0
- package/obsidian/setting-components/url-component/package.json +6 -0
- package/obsidian/setting-components/validator-component/package.json +6 -0
- package/obsidian/setting-components/value-component-with-change-tracking/package.json +6 -0
- package/obsidian/setting-components/week-component/package.json +6 -0
- package/package.json +23 -43
- package/dist/lib/cjs/obsidian/components/all-windows-event-handler.cjs +0 -196
- package/dist/lib/cjs/obsidian/components/setting-components/checkbox-component.cjs +0 -209
- package/dist/lib/cjs/obsidian/components/setting-components/code-highlighter-component.cjs +0 -356
- package/dist/lib/cjs/obsidian/components/setting-components/multiple-dropdown-component.cjs +0 -241
- package/dist/lib/cjs/obsidian/components/setting-components/multiple-text-component.cjs +0 -254
- package/dist/lib/cjs/obsidian/components/setting-components/tri-state-checkbox-component.cjs +0 -210
- package/dist/lib/cjs/obsidian/components/setting-components/typed-dropdown-component.cjs +0 -247
- package/dist/lib/cjs/obsidian/components/setting-components/typed-multiple-dropdown-component.cjs +0 -249
- package/dist/lib/cjs/obsidian/components/setting-components/typed-text-component.cjs +0 -224
- package/dist/lib/cjs/obsidian/components/setting-components/validator-component.cjs +0 -226
- package/dist/lib/cjs/obsidian/monkey-around.cjs +0 -177
- package/dist/lib/cjs/obsidian/monkey-around.d.cts +0 -62
- package/dist/lib/cjs/obsidian/plugin/components/index.cjs +0 -170
- package/dist/lib/cjs/obsidian/plugin/components/index.d.cts +0 -9
- package/dist/lib/cjs/obsidian/plugin/components/layout-ready-component.cjs +0 -124
- package/dist/lib/cjs/obsidian/plugin/components/layout-ready-component.d.cts +0 -18
- package/dist/lib/cjs/obsidian/plugin/components/plugin-settings-component.cjs +0 -563
- package/dist/lib/cjs/obsidian/plugin/path-settings.cjs +0 -239
- package/dist/lib/esm/obsidian/components/all-windows-event-handler.mjs +0 -88
- package/dist/lib/esm/obsidian/components/setting-components/checkbox-component.mjs +0 -101
- package/dist/lib/esm/obsidian/components/setting-components/code-highlighter-component.mjs +0 -254
- package/dist/lib/esm/obsidian/components/setting-components/date-component.mjs +0 -62
- package/dist/lib/esm/obsidian/components/setting-components/date-time-component.mjs +0 -62
- package/dist/lib/esm/obsidian/components/setting-components/email-component.mjs +0 -72
- package/dist/lib/esm/obsidian/components/setting-components/file-component.mjs +0 -66
- package/dist/lib/esm/obsidian/components/setting-components/index.mjs +0 -78
- package/dist/lib/esm/obsidian/components/setting-components/month-component.mjs +0 -70
- package/dist/lib/esm/obsidian/components/setting-components/multiple-dropdown-component.mjs +0 -136
- package/dist/lib/esm/obsidian/components/setting-components/multiple-email-component.mjs +0 -59
- package/dist/lib/esm/obsidian/components/setting-components/multiple-file-component.mjs +0 -68
- package/dist/lib/esm/obsidian/components/setting-components/multiple-text-component.mjs +0 -149
- package/dist/lib/esm/obsidian/components/setting-components/number-component.mjs +0 -82
- package/dist/lib/esm/obsidian/components/setting-components/password-component.mjs +0 -58
- package/dist/lib/esm/obsidian/components/setting-components/setting-component-wrapper.mjs +0 -45
- package/dist/lib/esm/obsidian/components/setting-components/telephone-component.mjs +0 -72
- package/dist/lib/esm/obsidian/components/setting-components/text-based-component.mjs +0 -58
- package/dist/lib/esm/obsidian/components/setting-components/time-component.mjs +0 -67
- package/dist/lib/esm/obsidian/components/setting-components/tri-state-checkbox-component.mjs +0 -102
- package/dist/lib/esm/obsidian/components/setting-components/typed-dropdown-component.mjs +0 -142
- package/dist/lib/esm/obsidian/components/setting-components/typed-multiple-dropdown-component.mjs +0 -141
- package/dist/lib/esm/obsidian/components/setting-components/typed-range-text-component.mjs +0 -60
- package/dist/lib/esm/obsidian/components/setting-components/typed-text-component.mjs +0 -119
- package/dist/lib/esm/obsidian/components/setting-components/url-component.mjs +0 -72
- package/dist/lib/esm/obsidian/components/setting-components/validator-component.mjs +0 -127
- package/dist/lib/esm/obsidian/components/setting-components/week-component.mjs +0 -70
- package/dist/lib/esm/obsidian/monkey-around.d.mts +0 -62
- package/dist/lib/esm/obsidian/monkey-around.mjs +0 -66
- package/dist/lib/esm/obsidian/plugin/components/abort-signal-component.mjs +0 -59
- package/dist/lib/esm/obsidian/plugin/components/async-error-handler-component.mjs +0 -62
- package/dist/lib/esm/obsidian/plugin/components/console-debug-component.mjs +0 -56
- package/dist/lib/esm/obsidian/plugin/components/i18n-component.mjs +0 -53
- package/dist/lib/esm/obsidian/plugin/components/index.d.mts +0 -9
- package/dist/lib/esm/obsidian/plugin/components/index.mjs +0 -44
- package/dist/lib/esm/obsidian/plugin/components/layout-ready-component.d.mts +0 -18
- package/dist/lib/esm/obsidian/plugin/components/layout-ready-component.mjs +0 -24
- package/dist/lib/esm/obsidian/plugin/components/plugin-context-component.mjs +0 -61
- package/dist/lib/esm/obsidian/plugin/components/plugin-notice-component.mjs +0 -60
- package/dist/lib/esm/obsidian/plugin/components/plugin-settings-component.mjs +0 -461
- package/dist/lib/esm/obsidian/plugin/components/plugin-settings-tab-component.mjs +0 -49
- package/dist/lib/esm/obsidian/plugin/path-settings.mjs +0 -135
- package/obsidian/Components/setting-components/checkbox-component/package.json +0 -6
- package/obsidian/Components/setting-components/code-highlighter-component/package.json +0 -6
- package/obsidian/Components/setting-components/date-component/package.json +0 -6
- package/obsidian/Components/setting-components/date-time-component/package.json +0 -6
- package/obsidian/Components/setting-components/email-component/package.json +0 -6
- package/obsidian/Components/setting-components/file-component/package.json +0 -6
- package/obsidian/Components/setting-components/index/package.json +0 -6
- package/obsidian/Components/setting-components/month-component/package.json +0 -6
- package/obsidian/Components/setting-components/multiple-dropdown-component/package.json +0 -6
- package/obsidian/Components/setting-components/multiple-email-component/package.json +0 -6
- package/obsidian/Components/setting-components/multiple-file-component/package.json +0 -6
- package/obsidian/Components/setting-components/multiple-text-component/package.json +0 -6
- package/obsidian/Components/setting-components/number-component/package.json +0 -6
- package/obsidian/Components/setting-components/package.json +0 -6
- package/obsidian/Components/setting-components/password-component/package.json +0 -6
- package/obsidian/Components/setting-components/setting-component-wrapper/package.json +0 -6
- package/obsidian/Components/setting-components/telephone-component/package.json +0 -6
- package/obsidian/Components/setting-components/text-based-component/package.json +0 -6
- package/obsidian/Components/setting-components/time-component/package.json +0 -6
- package/obsidian/Components/setting-components/tri-state-checkbox-component/package.json +0 -6
- package/obsidian/Components/setting-components/typed-dropdown-component/package.json +0 -6
- package/obsidian/Components/setting-components/typed-multiple-dropdown-component/package.json +0 -6
- package/obsidian/Components/setting-components/typed-range-text-component/package.json +0 -6
- package/obsidian/Components/setting-components/typed-text-component/package.json +0 -6
- package/obsidian/Components/setting-components/url-component/package.json +0 -6
- package/obsidian/Components/setting-components/validator-component/package.json +0 -6
- package/obsidian/Components/setting-components/value-component-with-change-tracking/package.json +0 -6
- package/obsidian/Components/setting-components/week-component/package.json +0 -6
- package/obsidian/Plugin/components/abort-signal-component/package.json +0 -6
- package/obsidian/Plugin/components/async-error-handler-component/package.json +0 -6
- package/obsidian/Plugin/components/console-debug-component/package.json +0 -6
- package/obsidian/Plugin/components/i18n-component/package.json +0 -6
- package/obsidian/Plugin/components/index/package.json +0 -6
- package/obsidian/Plugin/components/layout-ready-component/package.json +0 -6
- package/obsidian/Plugin/components/package.json +0 -6
- package/obsidian/Plugin/components/plugin-context-component/package.json +0 -6
- package/obsidian/Plugin/components/plugin-notice-component/package.json +0 -6
- package/obsidian/Plugin/components/plugin-settings-component/package.json +0 -6
- package/obsidian/Plugin/components/plugin-settings-tab-component/package.json +0 -6
- package/obsidian/Plugin/path-settings/package.json +0 -6
- package/obsidian/monkey-around/package.json +0 -6
- /package/dist/lib/cjs/obsidian/{plugin/path-settings.d.cts → path-settings.d.cts} +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-time-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/email-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/file-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/index.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/month-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-email-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-file-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/number-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/password-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/telephone-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/text-based-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/time-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-range-text-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/url-component.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.d.cts +0 -0
- /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/week-component.d.cts +0 -0
- /package/dist/lib/esm/obsidian/{plugin/path-settings.d.mts → path-settings.d.mts} +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/date-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/date-time-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/email-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/file-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/index.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/month-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-email-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-file-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/number-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/password-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/telephone-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/text-based-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/time-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-range-text-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/url-component.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.d.mts +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.mjs +0 -0
- /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/week-component.d.mts +0 -0
|
@@ -1,563 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
-
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
(function initCjs() {
|
|
7
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
8
|
-
const globalThisRecord = globalThis;
|
|
9
|
-
globalThisRecord['__name'] ??= name;
|
|
10
|
-
const originalRequire = require;
|
|
11
|
-
if (originalRequire && !originalRequire.__isPatched) {
|
|
12
|
-
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
13
|
-
require = Object.assign(
|
|
14
|
-
(id) => requirePatched(id),
|
|
15
|
-
originalRequire,
|
|
16
|
-
{
|
|
17
|
-
__isPatched: true
|
|
18
|
-
}
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const newFuncs = {
|
|
23
|
-
__extractDefault() {
|
|
24
|
-
return extractDefault;
|
|
25
|
-
},
|
|
26
|
-
process() {
|
|
27
|
-
const browserProcess = {
|
|
28
|
-
browser: true,
|
|
29
|
-
cwd() {
|
|
30
|
-
return '/';
|
|
31
|
-
},
|
|
32
|
-
env: {},
|
|
33
|
-
platform: 'android'
|
|
34
|
-
};
|
|
35
|
-
return browserProcess;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
for (const key of Object.keys(newFuncs)) {
|
|
40
|
-
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function name(obj) {
|
|
44
|
-
return obj;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function extractDefault(module) {
|
|
48
|
-
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
-
'obsidian',
|
|
53
|
-
'@codemirror/autocomplete',
|
|
54
|
-
'@codemirror/collab',
|
|
55
|
-
'@codemirror/commands',
|
|
56
|
-
'@codemirror/language',
|
|
57
|
-
'@codemirror/lint',
|
|
58
|
-
'@codemirror/search',
|
|
59
|
-
'@codemirror/state',
|
|
60
|
-
'@codemirror/text',
|
|
61
|
-
'@codemirror/view',
|
|
62
|
-
'@lezer/common',
|
|
63
|
-
'@lezer/lr',
|
|
64
|
-
'@lezer/highlight'];
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
68
|
-
'@codemirror/closebrackets',
|
|
69
|
-
'@codemirror/comment',
|
|
70
|
-
'@codemirror/fold',
|
|
71
|
-
'@codemirror/gutter',
|
|
72
|
-
'@codemirror/highlight',
|
|
73
|
-
'@codemirror/history',
|
|
74
|
-
'@codemirror/matchbrackets',
|
|
75
|
-
'@codemirror/panel',
|
|
76
|
-
'@codemirror/rangeset',
|
|
77
|
-
'@codemirror/rectangular-selection',
|
|
78
|
-
'@codemirror/stream-parser',
|
|
79
|
-
'@codemirror/tooltip'];
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
function requirePatched(id) {
|
|
83
|
-
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
|
|
84
|
-
return originalRequire?.(id);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
88
|
-
if (globalThis.app.isMobile) {
|
|
89
|
-
if (id === 'process' || id === 'node:process') {
|
|
90
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
91
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
92
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
93
|
-
return globalThis.process;
|
|
94
|
-
}
|
|
95
|
-
} else {
|
|
96
|
-
const module = originalRequire?.(id);
|
|
97
|
-
if (module) {
|
|
98
|
-
return extractDefault(module);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
103
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
104
|
-
return {};
|
|
105
|
-
}
|
|
106
|
-
})();
|
|
107
|
-
|
|
108
|
-
"use strict";
|
|
109
|
-
var __defProp = Object.defineProperty;
|
|
110
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
111
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
112
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
113
|
-
var __export = (target, all) => {
|
|
114
|
-
for (var name in all)
|
|
115
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
116
|
-
};
|
|
117
|
-
var __copyProps = (to, from, except, desc) => {
|
|
118
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
119
|
-
for (let key of __getOwnPropNames(from))
|
|
120
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
121
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
122
|
-
}
|
|
123
|
-
return to;
|
|
124
|
-
};
|
|
125
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
126
|
-
var plugin_settings_component_exports = {};
|
|
127
|
-
__export(plugin_settings_component_exports, {
|
|
128
|
-
EmptyPluginSettingsComponent: () => EmptyPluginSettingsComponent,
|
|
129
|
-
PluginSettingsComponentBase: () => PluginSettingsComponentBase
|
|
130
|
-
});
|
|
131
|
-
module.exports = __toCommonJS(plugin_settings_component_exports);
|
|
132
|
-
var import_async_events = require('../../../async-events.cjs');
|
|
133
|
-
var import_debug = require('../../../debug.cjs');
|
|
134
|
-
var import_function = require('../../../function.cjs');
|
|
135
|
-
var import_object_utils = require('../../../object-utils.cjs');
|
|
136
|
-
var import_date_transformer = require('../../../transformers/date-transformer.cjs');
|
|
137
|
-
var import_duration_transformer = require('../../../transformers/duration-transformer.cjs');
|
|
138
|
-
var import_group_transformer = require('../../../transformers/group-transformer.cjs');
|
|
139
|
-
var import_map_transformer = require('../../../transformers/map-transformer.cjs');
|
|
140
|
-
var import_set_transformer = require('../../../transformers/set-transformer.cjs');
|
|
141
|
-
var import_skip_private_property_transformer = require('../../../transformers/skip-private-property-transformer.cjs');
|
|
142
|
-
var import_two_way_map_transformer = require('../../../transformers/two-way-map-transformer.cjs');
|
|
143
|
-
var import_async_component = require('../../components/async-component.cjs');
|
|
144
|
-
var import_async_events_component = require('../../components/async-events-component.cjs');
|
|
145
|
-
const defaultTransformer = new import_group_transformer.GroupTransformer([
|
|
146
|
-
new import_skip_private_property_transformer.SkipPrivatePropertyTransformer(),
|
|
147
|
-
new import_date_transformer.DateTransformer(),
|
|
148
|
-
new import_duration_transformer.DurationTransformer(),
|
|
149
|
-
new import_map_transformer.MapTransformer(),
|
|
150
|
-
new import_set_transformer.SetTransformer(),
|
|
151
|
-
new import_two_way_map_transformer.TwoWayMapTransformer()
|
|
152
|
-
]);
|
|
153
|
-
class EmptyDataHandler {
|
|
154
|
-
async loadData() {
|
|
155
|
-
await (0, import_function.noopAsync)();
|
|
156
|
-
return {};
|
|
157
|
-
}
|
|
158
|
-
/* v8 ignore start -- unreachable because EmptyPluginSettingsComponent has no properties to change, so saveToFile always short-circuits. */
|
|
159
|
-
async saveData() {
|
|
160
|
-
await (0, import_function.noopAsync)();
|
|
161
|
-
}
|
|
162
|
-
/* v8 ignore stop */
|
|
163
|
-
}
|
|
164
|
-
class PluginSettingsComponentBase extends import_async_component.AsyncComponentBase {
|
|
165
|
-
/**
|
|
166
|
-
* Creates a new plugin settings component.
|
|
167
|
-
*
|
|
168
|
-
* @param dataHandler - The data handler.
|
|
169
|
-
*/
|
|
170
|
-
constructor(dataHandler) {
|
|
171
|
-
super();
|
|
172
|
-
this.dataHandler = dataHandler;
|
|
173
|
-
this.defaultSettings = this.createDefaultSettings();
|
|
174
|
-
this.currentState = this.createDefaultState();
|
|
175
|
-
this.lastSavedState = this.createDefaultState();
|
|
176
|
-
this.propertyNames = (0, import_object_utils.getAllKeys)(this.currentState.inputValues);
|
|
177
|
-
this.registerValidators();
|
|
178
|
-
this.registerLegacySettingsConverters();
|
|
179
|
-
}
|
|
180
|
-
dataHandler;
|
|
181
|
-
/**
|
|
182
|
-
* Component key for singleton replacement via {@link PluginBase.addChild}.
|
|
183
|
-
*/
|
|
184
|
-
static COMPONENT_KEY = Symbol(PluginSettingsComponentBase.name);
|
|
185
|
-
/**
|
|
186
|
-
* Gets the readonly default settings.
|
|
187
|
-
*
|
|
188
|
-
* @returns The default settings (as a readonly object).
|
|
189
|
-
*/
|
|
190
|
-
defaultSettings;
|
|
191
|
-
/**
|
|
192
|
-
* Gets the readonly effective settings (validated, with defaults substituted for invalid values).
|
|
193
|
-
*
|
|
194
|
-
* @returns The readonly effective settings.
|
|
195
|
-
*/
|
|
196
|
-
get settings() {
|
|
197
|
-
return this.settingsState.effectiveValues;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Gets the current settings state snapshot.
|
|
201
|
-
*
|
|
202
|
-
* @returns The current settings state.
|
|
203
|
-
*/
|
|
204
|
-
get settingsState() {
|
|
205
|
-
return this.currentState;
|
|
206
|
-
}
|
|
207
|
-
asyncEvents = new import_async_events.AsyncEvents();
|
|
208
|
-
currentState;
|
|
209
|
-
lastSavedState;
|
|
210
|
-
legacySettingsConverters = [];
|
|
211
|
-
propertyNames;
|
|
212
|
-
validators = /* @__PURE__ */ new Map();
|
|
213
|
-
/**
|
|
214
|
-
* Edits the plugin settings and saves them.
|
|
215
|
-
*
|
|
216
|
-
* @param settingsEditor - The editor.
|
|
217
|
-
* @param context - The context.
|
|
218
|
-
* @returns A {@link Promise} that resolves when the settings are saved.
|
|
219
|
-
*/
|
|
220
|
-
async editAndSave(settingsEditor, context) {
|
|
221
|
-
await this.edit(settingsEditor);
|
|
222
|
-
await this.saveToFile(context);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Ensures the settings are safe.
|
|
226
|
-
*
|
|
227
|
-
* It runs validation for each property and sets the default value if the validation fails.
|
|
228
|
-
*
|
|
229
|
-
* @param settings - The settings.
|
|
230
|
-
* @returns A {@link Promise} that resolves when the settings are safe.
|
|
231
|
-
*/
|
|
232
|
-
async ensureSafe(settings) {
|
|
233
|
-
const validationResult = await this.validate(settings);
|
|
234
|
-
const defaults = this.defaultSettings;
|
|
235
|
-
for (const propertyName of this.propertyNames) {
|
|
236
|
-
if (validationResult[propertyName]) {
|
|
237
|
-
settings[propertyName] = defaults[propertyName];
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Gets a safe copy of the settings.
|
|
243
|
-
*
|
|
244
|
-
* @param settings - The settings.
|
|
245
|
-
* @returns A {@link Promise} that resolves to the safe copy of the settings.
|
|
246
|
-
*/
|
|
247
|
-
async getSafeCopy(settings) {
|
|
248
|
-
const safeSettings = await this.cloneSettings(settings);
|
|
249
|
-
await this.ensureSafe(safeSettings);
|
|
250
|
-
return safeSettings;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Loads the plugin settings from the file.
|
|
254
|
-
*
|
|
255
|
-
* @param isInitialLoad - Whether the settings are being loaded for the first time.
|
|
256
|
-
* @returns A {@link Promise} that resolves when the settings are loaded.
|
|
257
|
-
*/
|
|
258
|
-
async loadFromFile(isInitialLoad) {
|
|
259
|
-
const data = await this.dataHandler.loadData();
|
|
260
|
-
this.lastSavedState = this.createDefaultState();
|
|
261
|
-
this.currentState = this.createDefaultState();
|
|
262
|
-
try {
|
|
263
|
-
if (data === void 0 || data === null) {
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
if (typeof data !== "object") {
|
|
267
|
-
console.error(`Invalid settings from data.json. Expected Object, got: ${typeof data}`);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
const rawRecord = data;
|
|
271
|
-
const parsedSettings = await this.rawRecordToSettings(rawRecord);
|
|
272
|
-
const validationResult = await this.validate(parsedSettings);
|
|
273
|
-
for (const propertyName of this.propertyNames) {
|
|
274
|
-
this.setPropertyImpl(propertyName, parsedSettings[propertyName], validationResult[propertyName]);
|
|
275
|
-
}
|
|
276
|
-
this.lastSavedState = await this.cloneState(this.currentState);
|
|
277
|
-
const newRecord = await this.settingsToRawRecord(this.currentState.inputValues);
|
|
278
|
-
if (!(0, import_object_utils.deepEqual)(newRecord, data)) {
|
|
279
|
-
await this.saveToFileImpl();
|
|
280
|
-
}
|
|
281
|
-
} finally {
|
|
282
|
-
await this.asyncEvents.triggerAsync("loadSettings", this.currentState, isInitialLoad);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Subscribes to an event.
|
|
287
|
-
*
|
|
288
|
-
* @param name - The name of the event.
|
|
289
|
-
* @param callback - The callback.
|
|
290
|
-
* @param thisArg - The `this` context.
|
|
291
|
-
* @returns A reference to the event listener.
|
|
292
|
-
*/
|
|
293
|
-
on(name, callback, thisArg) {
|
|
294
|
-
return this.asyncEvents.on(name, callback, thisArg);
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Called when the external settings change.
|
|
298
|
-
*
|
|
299
|
-
* @returns A {@link Promise} that resolves when the settings are reloaded.
|
|
300
|
-
*/
|
|
301
|
-
async onExternalSettingsChange() {
|
|
302
|
-
await this.loadFromFile(false);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Loads settings from file and registers event handlers.
|
|
306
|
-
*/
|
|
307
|
-
async onload() {
|
|
308
|
-
await super.onload();
|
|
309
|
-
(0, import_async_events_component.registerAsyncEvent)(this, this.on("loadSettings", this.onLoadSettings.bind(this)));
|
|
310
|
-
(0, import_async_events_component.registerAsyncEvent)(this, this.on("saveSettings", this.onSaveSettings.bind(this)));
|
|
311
|
-
await this.loadFromFile(true);
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Registers a legacy settings converter.
|
|
315
|
-
*
|
|
316
|
-
* @typeParam LegacySettings - The legacy settings class.
|
|
317
|
-
* @param legacySettingsClass - The legacy settings class.
|
|
318
|
-
* @param converter - The converter.
|
|
319
|
-
*/
|
|
320
|
-
registerLegacySettingsConverter(legacySettingsClass, converter) {
|
|
321
|
-
const that = this;
|
|
322
|
-
this.legacySettingsConverters.push(legacySettingsConverter);
|
|
323
|
-
function legacySettingsConverter(record) {
|
|
324
|
-
const legacySettingsKeys = new Set(Object.keys(new legacySettingsClass()));
|
|
325
|
-
const pluginSettingKeys = new Set(that.propertyNames);
|
|
326
|
-
const legacySettings = record;
|
|
327
|
-
converter(legacySettings);
|
|
328
|
-
for (const key of Object.keys(legacySettings)) {
|
|
329
|
-
if (pluginSettingKeys.has(key)) {
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
if (!legacySettingsKeys.has(key)) {
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
delete record[key];
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Registers a validator for a property.
|
|
341
|
-
*
|
|
342
|
-
* @param propertyName - The name of the property.
|
|
343
|
-
* @param validator - The validator.
|
|
344
|
-
*/
|
|
345
|
-
registerValidator(propertyName, validator) {
|
|
346
|
-
this.validators.set(propertyName, validator);
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Revalidates the settings.
|
|
350
|
-
*
|
|
351
|
-
* @returns The validation messages.
|
|
352
|
-
*/
|
|
353
|
-
async revalidate() {
|
|
354
|
-
await this.edit(import_function.noop);
|
|
355
|
-
return this.currentState.validationMessages;
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* Saves the new plugin settings.
|
|
359
|
-
*
|
|
360
|
-
* @param context - The context of the save to file operation.
|
|
361
|
-
* @returns A {@link Promise} that resolves when the settings are saved.
|
|
362
|
-
*/
|
|
363
|
-
async saveToFile(context) {
|
|
364
|
-
if ((0, import_object_utils.deepEqual)(this.lastSavedState.inputValues, this.currentState.inputValues)) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
await this.saveToFileImpl();
|
|
368
|
-
await this.asyncEvents.triggerAsync("saveSettings", this.currentState, this.lastSavedState, context);
|
|
369
|
-
this.lastSavedState = await this.cloneState(this.currentState);
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Sets the value of a property.
|
|
373
|
-
*
|
|
374
|
-
* @typeParam PropertyName - The name of the property.
|
|
375
|
-
* @param propertyName - The name of the property.
|
|
376
|
-
* @param value - The value to set.
|
|
377
|
-
* @returns A {@link Promise} that resolves to the validation message.
|
|
378
|
-
*/
|
|
379
|
-
async setProperty(propertyName, value) {
|
|
380
|
-
await this.edit((settings) => {
|
|
381
|
-
settings[propertyName] = value;
|
|
382
|
-
});
|
|
383
|
-
return this.currentState.validationMessages[propertyName];
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Validates the settings.
|
|
387
|
-
*
|
|
388
|
-
* @param settings - The settings.
|
|
389
|
-
* @returns A {@link Promise} that resolves to the validation result.
|
|
390
|
-
*/
|
|
391
|
-
async validate(settings) {
|
|
392
|
-
const result = {};
|
|
393
|
-
for (const [propertyName, validator] of this.validators.entries()) {
|
|
394
|
-
const validationMessage = await validator(settings[propertyName], settings);
|
|
395
|
-
if (validationMessage) {
|
|
396
|
-
result[propertyName] = validationMessage;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
return result;
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Gets the transformer.
|
|
403
|
-
*
|
|
404
|
-
* @returns The transformer.
|
|
405
|
-
*/
|
|
406
|
-
getTransformer() {
|
|
407
|
-
return defaultTransformer;
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Called when the plugin settings record is loaded from disk.
|
|
411
|
-
*
|
|
412
|
-
* @param record - The record.
|
|
413
|
-
*/
|
|
414
|
-
async onLoadRecord(record) {
|
|
415
|
-
for (const converter of this.legacySettingsConverters) {
|
|
416
|
-
converter(record);
|
|
417
|
-
}
|
|
418
|
-
await Promise.resolve();
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Called when settings are loaded or reloaded.
|
|
422
|
-
*
|
|
423
|
-
* @param _loadedState - The loaded settings state.
|
|
424
|
-
* @param _isInitialLoad - Whether this is the initial load.
|
|
425
|
-
*/
|
|
426
|
-
async onLoadSettings(_loadedState, _isInitialLoad) {
|
|
427
|
-
await (0, import_function.noopAsync)();
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Called when settings are saved.
|
|
431
|
-
*
|
|
432
|
-
* @param _newState - The new settings state.
|
|
433
|
-
* @param _oldState - The old settings state.
|
|
434
|
-
* @param _context - The save context.
|
|
435
|
-
*/
|
|
436
|
-
async onSaveSettings(_newState, _oldState, _context) {
|
|
437
|
-
await (0, import_function.noopAsync)();
|
|
438
|
-
}
|
|
439
|
-
/**
|
|
440
|
-
* Called when the plugin settings record is about to be saved to disk.
|
|
441
|
-
*
|
|
442
|
-
* @param _record - The record.
|
|
443
|
-
*/
|
|
444
|
-
async onSavingRecord(_record) {
|
|
445
|
-
await (0, import_function.noopAsync)();
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Registers the legacy settings converters.
|
|
449
|
-
* Override to register legacy settings converters.
|
|
450
|
-
*/
|
|
451
|
-
registerLegacySettingsConverters() {
|
|
452
|
-
(0, import_function.noop)();
|
|
453
|
-
}
|
|
454
|
-
/**
|
|
455
|
-
* Registers the validators.
|
|
456
|
-
* Override to register validators for properties.
|
|
457
|
-
*/
|
|
458
|
-
registerValidators() {
|
|
459
|
-
(0, import_function.noop)();
|
|
460
|
-
}
|
|
461
|
-
async cloneSettings(settings) {
|
|
462
|
-
const record = await this.settingsToRawRecord(settings);
|
|
463
|
-
const json = JSON.stringify(record);
|
|
464
|
-
const cloneRecord = JSON.parse(json);
|
|
465
|
-
return await this.rawRecordToSettings(cloneRecord);
|
|
466
|
-
}
|
|
467
|
-
async cloneState(state) {
|
|
468
|
-
return {
|
|
469
|
-
effectiveValues: await this.cloneSettings(state.effectiveValues),
|
|
470
|
-
inputValues: await this.cloneSettings(state.inputValues),
|
|
471
|
-
validationMessages: { ...state.validationMessages }
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
createDefaultState() {
|
|
475
|
-
return {
|
|
476
|
-
effectiveValues: this.createDefaultSettings(),
|
|
477
|
-
inputValues: this.createDefaultSettings(),
|
|
478
|
-
validationMessages: (0, import_object_utils.castTo)({})
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
async edit(settingsEditor) {
|
|
482
|
-
try {
|
|
483
|
-
await settingsEditor(this.currentState.inputValues);
|
|
484
|
-
} finally {
|
|
485
|
-
const validationResult = await this.validate(this.currentState.inputValues);
|
|
486
|
-
for (const propertyName of this.propertyNames) {
|
|
487
|
-
const validationMessage = validationResult[propertyName] ?? "";
|
|
488
|
-
this.currentState.validationMessages[propertyName] = validationMessage;
|
|
489
|
-
const defaults = this.defaultSettings;
|
|
490
|
-
this.currentState.effectiveValues[propertyName] = validationMessage ? defaults[propertyName] : this.currentState.inputValues[propertyName];
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
isValidPropertyName(prop) {
|
|
495
|
-
if (typeof prop !== "string") {
|
|
496
|
-
return false;
|
|
497
|
-
}
|
|
498
|
-
return this.propertyNames.includes(prop);
|
|
499
|
-
}
|
|
500
|
-
async rawRecordToSettings(rawRecord) {
|
|
501
|
-
rawRecord = this.getTransformer().transformObjectRecursively(rawRecord);
|
|
502
|
-
await this.onLoadRecord(rawRecord);
|
|
503
|
-
const settings = this.createDefaultSettings();
|
|
504
|
-
const defaults = this.defaultSettings;
|
|
505
|
-
for (const [propertyName, value] of Object.entries(rawRecord)) {
|
|
506
|
-
if (!this.isValidPropertyName(propertyName)) {
|
|
507
|
-
(0, import_debug.getLibDebugger)("PluginSettingsComponentBase:rawRecordToSettings")(`Unknown property: ${propertyName}`);
|
|
508
|
-
continue;
|
|
509
|
-
}
|
|
510
|
-
if (typeof value !== typeof defaults[propertyName]) {
|
|
511
|
-
(0, import_debug.getLibDebugger)("PluginSettingsComponentBase:rawRecordToSettings")(
|
|
512
|
-
"Possible invalid value type. It might lead to an unexpected behavior of the plugin. There is also a chance it is a false-negative warning, as we are unable to determine the exact type of the value in runtime.",
|
|
513
|
-
{
|
|
514
|
-
defaultValue: defaults[propertyName],
|
|
515
|
-
propertyName,
|
|
516
|
-
value
|
|
517
|
-
}
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
settings[propertyName] = value;
|
|
521
|
-
}
|
|
522
|
-
return settings;
|
|
523
|
-
}
|
|
524
|
-
async saveToFileImpl() {
|
|
525
|
-
await this.dataHandler.saveData(await this.settingsToRawRecord(this.currentState.inputValues));
|
|
526
|
-
}
|
|
527
|
-
setPropertyImpl(propertyName, value, validationMessage) {
|
|
528
|
-
const defaults = this.defaultSettings;
|
|
529
|
-
this.currentState.inputValues[propertyName] = value;
|
|
530
|
-
this.currentState.validationMessages[propertyName] = validationMessage ?? "";
|
|
531
|
-
this.currentState.effectiveValues[propertyName] = validationMessage ? defaults[propertyName] : value;
|
|
532
|
-
}
|
|
533
|
-
async settingsToRawRecord(settings) {
|
|
534
|
-
const rawRecord = {};
|
|
535
|
-
for (const propertyName of this.propertyNames) {
|
|
536
|
-
rawRecord[propertyName] = settings[propertyName];
|
|
537
|
-
}
|
|
538
|
-
await this.onSavingRecord(rawRecord);
|
|
539
|
-
return this.getTransformer().transformObjectRecursively(rawRecord);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
class EmptyPluginSettingsComponent extends PluginSettingsComponentBase {
|
|
543
|
-
/**
|
|
544
|
-
* Creates a new empty plugin settings component.
|
|
545
|
-
*/
|
|
546
|
-
constructor() {
|
|
547
|
-
super(new EmptyDataHandler());
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Creates empty default settings.
|
|
551
|
-
*
|
|
552
|
-
* @returns An empty object.
|
|
553
|
-
*/
|
|
554
|
-
createDefaultSettings() {
|
|
555
|
-
return {};
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
559
|
-
0 && (module.exports = {
|
|
560
|
-
EmptyPluginSettingsComponent,
|
|
561
|
-
PluginSettingsComponentBase
|
|
562
|
-
});
|
|
563
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIHBsdWdpbiBzZXR0aW5nczogZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIHB1YmxpYy1mYWNpbmcgc2V0dGluZ3MgQVBJIGZvciBwbHVnaW4gYXV0aG9ycy5cbiAqIEFsbCBzZXR0aW5ncyBsb2dpYyAobG9hZCwgc2F2ZSwgdmFsaWRhdGUsIHRyYW5zZm9ybSwgY2xvbmUpIGlzIGhhbmRsZWQgZGlyZWN0bHlcbiAqIGJ5IHRoaXMgY29tcG9uZW50IFx1MjAxNCBubyBzZXBhcmF0ZSBtYW5hZ2VyIGNsYXNzIGlzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRSZWYgfSBmcm9tICcuLi8uLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybWVycy90cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4uLy4uLy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhSGFuZGxlciB9IGZyb20gJy4uLy4uL2RhdGEtaGFuZGxlci50cyc7XG5cbmltcG9ydCB7IEFzeW5jRXZlbnRzIH0gZnJvbSAnLi4vLi4vLi4vYXN5bmMtZXZlbnRzLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7XG4gIGNhc3RUbyxcbiAgZGVlcEVxdWFsLFxuICBnZXRBbGxLZXlzXG59IGZyb20gJy4uLy4uLy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvZGF0ZS10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL2R1cmF0aW9uLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IEdyb3VwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvZ3JvdXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgTWFwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvbWFwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNldFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL3NldC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvc2tpcC1wcml2YXRlLXByb3BlcnR5LXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFR3b1dheU1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL3R3by13YXktbWFwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IEFzeW5jQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXN5bmMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgcGx1Z2luIHNldHRpbmdzIHN0YXRlLCBpbmNsdWRpbmcgcmF3IGlucHV0IHZhbHVlcywgZWZmZWN0aXZlICh2YWxpZGF0ZWQpIHZhbHVlcyxcbiAqIGFuZCBwZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNldHRpbmdzIHZhbHVlcyB1c2VkIGJ5IHRoZSBwbHVnaW4uIEludmFsaWQgcHJvcGVydGllcyBhcmUgcmVwbGFjZWQgd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGVmZmVjdGl2ZVZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFRoZSByYXcgaW5wdXQgdmFsdWVzIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIuIE1heSBjb250YWluIGludmFsaWQgdmFsdWVzLlxuICAgKi9cbiAgaW5wdXRWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBQZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy4gRW1wdHkgc3RyaW5nIG1lYW5zIHZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz47XG59XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NTdGF0ZX0gZm9yIHVzZSBpbiBldmVudCBjYWxsYmFja3MgYW5kIHB1YmxpYyBnZXR0ZXJzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PjtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgYSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+ID0gKFxuICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSxcbiAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzXG4pID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbnR5cGUgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPjtcblxudHlwZSBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPl07XG5cbnR5cGUgVmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQYXJ0aWFsPFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj47XG5cbmNsYXNzIEVtcHR5RGF0YUhhbmRsZXIgaW1wbGVtZW50cyBEYXRhSGFuZGxlciB7XG4gIHB1YmxpYyBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdW5yZWFjaGFibGUgYmVjYXVzZSBFbXB0eVBsdWdpblNldHRpbmdzQ29tcG9uZW50IGhhcyBubyBwcm9wZXJ0aWVzIHRvIGNoYW5nZSwgc28gc2F2ZVRvRmlsZSBhbHdheXMgc2hvcnQtY2lyY3VpdHMuICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnRzLlxuICpcbiAqIE1hbmFnZXMgc2V0dGluZ3MgZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKiBQbHVnaW4gYXV0aG9ycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHtAbGluayBjcmVhdGVEZWZhdWx0U2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNDb21wb25lbnRCYXNlIHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBrZXkgZm9yIHNpbmdsZXRvbiByZXBsYWNlbWVudCB2aWEge0BsaW5rIFBsdWdpbkJhc2UuYWRkQ2hpbGR9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT01QT05FTlRfS0VZID0gU3ltYm9sKFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZS5uYW1lKTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgc2V0dGluZ3MgKGFzIGEgcmVhZG9ubHkgb2JqZWN0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0U2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGVmZmVjdGl2ZSBzZXR0aW5ncyAodmFsaWRhdGVkLCB3aXRoIGRlZmF1bHRzIHN1YnN0aXR1dGVkIGZvciBpbnZhbGlkIHZhbHVlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzU3RhdGUuZWZmZWN0aXZlVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgc3RhdGUgc25hcHNob3QuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5nc1N0YXRlKCk6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3luY0V2ZW50cyA9IG5ldyBBc3luY0V2ZW50cygpO1xuICBwcml2YXRlIGN1cnJlbnRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgbGFzdFNhdmVkU3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxlZ2FjeVNldHRpbmdzQ29udmVydGVyczogKChyZWNvcmQ6IEdlbmVyaWNPYmplY3QpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWVzOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFIYW5kbGVyIC0gVGhlIGRhdGEgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMucHJvcGVydHlOYW1lcyA9IGdldEFsbEtleXModGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgdGhpcy5yZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYW5kIHNhdmVzIHRoZW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nc0VkaXRvciAtIFRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCBjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZWRpdChzZXR0aW5nc0VkaXRvcik7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKlxuICAgKiBJdCBydW5zIHZhbGlkYXRpb24gZm9yIGVhY2ggcHJvcGVydHkgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2FmZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVTYWZlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHNldHRpbmdzKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gZGVmYXVsdHNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNhZmUgY29weSBvZiB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTYWZlQ29weShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2FmZVNldHRpbmdzID0gYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNhZmUoc2FmZVNldHRpbmdzKTtcbiAgICByZXR1cm4gc2FmZVNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgZnJvbSB0aGUgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGlzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoZSBzZXR0aW5ncyBhcmUgYmVpbmcgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZShpc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZGF0YUhhbmRsZXIubG9hZERhdGEoKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHNldHRpbmdzIGZyb20gZGF0YS5qc29uLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlb2YgZGF0YX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXdSZWNvcmQgPSBkYXRhIGFzIEdlbmVyaWNPYmplY3Q7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGF3YWl0IHRoaXMucmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUocGFyc2VkU2V0dGluZ3MpO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eUltcGwocHJvcGVydHlOYW1lLCBwYXJzZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gYXdhaXQgdGhpcy5jbG9uZVN0YXRlKHRoaXMuY3VycmVudFN0YXRlKTtcblxuICAgICAgY29uc3QgbmV3UmVjb3JkID0gYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcblxuICAgICAgaWYgKCFkZWVwRXF1YWwobmV3UmVjb3JkLCBkYXRhKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKCdsb2FkU2V0dGluZ3MnLCB0aGlzLmN1cnJlbnRTdGF0ZSwgaXNJbml0aWFsTG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGBsb2FkU2V0dGluZ3NgIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFsd2F5cyBgbG9hZFNldHRpbmdzYC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgY29udGV4dC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uKFxuICAgIG5hbWU6ICdsb2FkU2V0dGluZ3MnLFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIGlzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgICApID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZjtcbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGBzYXZlU2V0dGluZ3NgIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFsd2F5cyBgc2F2ZVNldHRpbmdzYC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgY29udGV4dC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uKFxuICAgIG5hbWU6ICdzYXZlU2V0dGluZ3MnLFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgY29udGV4dDogdW5rbm93blxuICAgICkgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJnPzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmO1xuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhbiBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgYHRoaXNgIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbjxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmFzeW5jRXZlbnRzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSByZWxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHNldHRpbmdzIGZyb20gZmlsZSBhbmQgcmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5vbmxvYWQoKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignbG9hZFNldHRpbmdzJywgdGhpcy5vbkxvYWRTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMub24oJ3NhdmVTZXR0aW5ncycsIHRoaXMub25TYXZlU2V0dGluZ3MuYmluZCh0aGlzKSkpO1xuICAgIGF3YWl0IHRoaXMubG9hZEZyb21GaWxlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gTGVnYWN5U2V0dGluZ3MgLSBUaGUgbGVnYWN5IHNldHRpbmdzIGNsYXNzLlxuICAgKiBAcGFyYW0gbGVnYWN5U2V0dGluZ3NDbGFzcyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBUaGUgY29udmVydGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXI8TGVnYWN5U2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIGxlZ2FjeVNldHRpbmdzQ2xhc3M6IG5ldyAoKSA9PiBMZWdhY3lTZXR0aW5ncyxcbiAgICBjb252ZXJ0ZXI6IChsZWdhY3lTZXR0aW5nczogUGFydGlhbDxMZWdhY3lTZXR0aW5ncz4gJiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICB0aGlzLmxlZ2FjeVNldHRpbmdzQ29udmVydGVycy5wdXNoKGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKTtcblxuICAgIGZ1bmN0aW9uIGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKHJlY29yZDogR2VuZXJpY09iamVjdCk6IHZvaWQge1xuICAgICAgY29uc3QgbGVnYWN5U2V0dGluZ3NLZXlzID0gbmV3IFNldDxzdHJpbmc+KE9iamVjdC5rZXlzKG5ldyBsZWdhY3lTZXR0aW5nc0NsYXNzKCkpKTtcbiAgICAgIGNvbnN0IHBsdWdpblNldHRpbmdLZXlzID0gbmV3IFNldDxzdHJpbmc+KHRoYXQucHJvcGVydHlOYW1lcyk7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5ncyA9IHJlY29yZCBhcyBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+O1xuICAgICAgY29udmVydGVyKGxlZ2FjeVNldHRpbmdzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxlZ2FjeVNldHRpbmdzKSkge1xuICAgICAgICBpZiAocGx1Z2luU2V0dGluZ0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGVnYWN5U2V0dGluZ3NLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSByZWNvcmRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmFsaWRhdG9yIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHlOYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yIGFzIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPik7XG4gIH1cblxuICAvKipcbiAgICogUmV2YWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZhbGlkYXRlKCk6IFByb21pc2U8UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZGVlcEVxdWFsKHRoaXMubGFzdFNhdmVkU3RhdGUuaW5wdXRWYWx1ZXMsIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYygnc2F2ZVNldHRpbmdzJywgdGhpcy5jdXJyZW50U3RhdGUsIHRoaXMubGFzdFNhdmVkU3RhdGUsIGNvbnRleHQpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KChzZXR0aW5ncykgPT4ge1xuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWxpZGF0b3JdIG9mIHRoaXMudmFsaWRhdG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdmFsaWRhdG9yKHNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHNldHRpbmdzKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgbG9hZGVkIGZyb20gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKHJlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKSB7XG4gICAgICBjb252ZXJ0ZXIocmVjb3JkKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIGxvYWRlZCBvciByZWxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgaW5pdGlhbCBsb2FkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFNldHRpbmdzKFxuICAgIF9sb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfbmV3U3RhdGUgLSBUaGUgbmV3IHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX29sZFN0YXRlIC0gVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9jb250ZXh0IC0gVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmVTZXR0aW5ncyhcbiAgICBfbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX29sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9jb250ZXh0OiB1bmtub3duXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGFib3V0IHRvIGJlIHNhdmVkIHRvIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmluZ1JlY29yZChfcmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgdmFsaWRhdG9ycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgdmFsaWRhdG9ycyBmb3IgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVNldHRpbmdzKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZWNvcmQpO1xuICAgIGNvbnN0IGNsb25lUmVjb3JkID0gSlNPTi5wYXJzZShqc29uKSBhcyBHZW5lcmljT2JqZWN0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MoY2xvbmVSZWNvcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVN0YXRlKFxuICAgIHN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPlxuICApOiBQcm9taXNlPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmVmZmVjdGl2ZVZhbHVlcyksXG4gICAgICBpbnB1dFZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmlucHV0VmFsdWVzKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogeyAuLi5zdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXMgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRTdGF0ZSgpOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKSxcbiAgICAgIGlucHV0VmFsdWVzOiB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBjYXN0VG88UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+Pih7fSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlZGl0KHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHRpbmdzRWRpdG9yKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdID8/ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgICAgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgOiB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wOiB1bmtub3duKTogcHJvcCBpcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiB7XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5wcm9wZXJ0eU5hbWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmF3UmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVjb3JkKSkge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgZGVmYXVsdHNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZSBhcyBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLnNhdmVEYXRhKGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eUltcGwoXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPixcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2UgPz8gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuZWZmZWN0aXZlVmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0gOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dGluZ3NUb1Jhd1JlY29yZChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPEdlbmVyaWNPYmplY3Q+IHtcbiAgICBjb25zdCByYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgcmF3UmVjb3JkW3Byb3BlcnR5TmFtZV0gPSBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub25TYXZpbmdSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmF3UmVjb3JkKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbm8tb3Agc2V0dGluZ3MgY29tcG9uZW50IGZvciBwbHVnaW5zIHdpdGhvdXQgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbXB0eVBsdWdpblNldHRpbmdzQ29tcG9uZW50IGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBFbXB0eURhdGFIYW5kbGVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZW1wdHkgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gZW1wdHkgb2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZURlZmF1bHRTZXR0aW5ncygpOiBvYmplY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3QkEsMEJBQTRCO0FBQzVCLG1CQUErQjtBQUMvQixzQkFHTztBQUNQLDBCQUlPO0FBQ1As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
|