@openmrs/esm-app-shell 8.0.1-pre.3444 → 8.0.1-pre.3459

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.
Files changed (64) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/dist/{f906ba60760193b0.js.map → 202d63cf2f2e3b44.js.map} +1 -1
  3. package/dist/33486be7493a9e5c.js +1 -0
  4. package/dist/33486be7493a9e5c.js.map +1 -0
  5. package/dist/8e328e1549c5a57f.js +1 -0
  6. package/dist/8e328e1549c5a57f.js.map +1 -0
  7. package/dist/{28a16dd14d0080c1.js.map → 9eea5a16b09c3742.js.map} +1 -1
  8. package/dist/{ea49896a6a7d77d0.js → bd66e41be49f840d.js} +1 -1
  9. package/dist/{ea49896a6a7d77d0.js.map → bd66e41be49f840d.js.map} +1 -1
  10. package/dist/index.html +1 -1
  11. package/dist/{openmrs.444a6071fab8752d.js → openmrs.46713c770e83a9a3.js} +1 -1
  12. package/dist/{openmrs.444a6071fab8752d.js.map → openmrs.46713c770e83a9a3.js.map} +1 -1
  13. package/dist/service-worker.js +1 -1
  14. package/lib/{8467800afbaba396.js → 6a1ebfa2220faf84.js} +3 -3
  15. package/lib/{5728fedd5f5bd566.js → 7ec74365db724ac8.js} +1 -1
  16. package/lib/{777ad55136a6a518.js → e53a077855cc4b82.js} +11 -11
  17. package/lib/esm-devtools-app/629.js +1 -1
  18. package/lib/esm-devtools-app/629.js.map +1 -1
  19. package/lib/esm-devtools-app/main.js +1 -1
  20. package/lib/esm-devtools-app/openmrs-esm-devtools-app.js +1 -1
  21. package/lib/esm-devtools-app/openmrs-esm-devtools-app.js.buildmanifest.json +7 -7
  22. package/lib/esm-devtools-app/routes.json +1 -1
  23. package/lib/esm-implementer-tools-app/3629.js +1 -1
  24. package/lib/esm-implementer-tools-app/3629.js.map +1 -1
  25. package/lib/esm-implementer-tools-app/main.js +1 -1
  26. package/lib/esm-implementer-tools-app/openmrs-esm-implementer-tools-app.js +1 -1
  27. package/lib/esm-implementer-tools-app/openmrs-esm-implementer-tools-app.js.buildmanifest.json +7 -7
  28. package/lib/esm-implementer-tools-app/routes.json +1 -1
  29. package/lib/esm-login-app/7760.js +14 -14
  30. package/lib/esm-login-app/7760.js.map +1 -1
  31. package/lib/esm-login-app/main.js +1 -1
  32. package/lib/esm-login-app/main.js.map +1 -1
  33. package/lib/esm-login-app/openmrs-esm-login-app.js +3 -3
  34. package/lib/esm-login-app/openmrs-esm-login-app.js.buildmanifest.json +5 -5
  35. package/lib/esm-login-app/openmrs-esm-login-app.js.map +1 -1
  36. package/lib/esm-login-app/routes.json +1 -1
  37. package/lib/esm-offline-tools-app/3629.js +1 -1
  38. package/lib/esm-offline-tools-app/3629.js.map +1 -1
  39. package/lib/esm-offline-tools-app/main.js +1 -1
  40. package/lib/esm-offline-tools-app/openmrs-esm-offline-tools-app.js +1 -1
  41. package/lib/esm-offline-tools-app/openmrs-esm-offline-tools-app.js.buildmanifest.json +7 -7
  42. package/lib/esm-offline-tools-app/routes.json +1 -1
  43. package/lib/esm-primary-navigation-app/3629.js +1 -1
  44. package/lib/esm-primary-navigation-app/3629.js.map +1 -1
  45. package/lib/esm-primary-navigation-app/main.js +1 -1
  46. package/lib/esm-primary-navigation-app/openmrs-esm-primary-navigation-app.js +1 -1
  47. package/lib/esm-primary-navigation-app/openmrs-esm-primary-navigation-app.js.buildmanifest.json +7 -7
  48. package/lib/esm-primary-navigation-app/routes.json +1 -1
  49. package/lib/index.html +1 -1
  50. package/lib/openmrs.js +4 -4
  51. package/lib/service-worker.js +1 -1
  52. package/package.json +3 -3
  53. package/dist/9469807bb74be638.js +0 -1
  54. package/dist/9469807bb74be638.js.map +0 -1
  55. package/dist/e3a4c147cdc68510.js +0 -1
  56. package/dist/e3a4c147cdc68510.js.map +0 -1
  57. /package/dist/{f906ba60760193b0.js → 202d63cf2f2e3b44.js} +0 -0
  58. /package/dist/{28a16dd14d0080c1.js → 9eea5a16b09c3742.js} +0 -0
  59. /package/dist/{4f24c76e8251d1aa.js → ba7443539bb1b727.js} +0 -0
  60. /package/dist/{c818c9fa7acc9586.js → c1d6ea14e62e3055.js} +0 -0
  61. /package/lib/{fcbfc4bedc4e2763.js → 017580797c1ef57b.js} +0 -0
  62. /package/lib/{05284713b619253c.js → 6a599e788947f411.js} +0 -0
  63. /package/lib/{6ecc8150bedcc0a8.js → da76db255695f69e.js} +0 -0
  64. /package/lib/{73465691c8316e26.js → ff75b485ada48b91.js} +0 -0
@@ -145,7 +145,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n// eslint-disable-next-line @
145
145
  \************************************************/
146
146
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
147
147
 
148
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Type: () => (/* reexport safe */ _types_js__WEBPACK_IMPORTED_MODULE_4__.Type),\n/* harmony export */ clearConfigErrors: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.clearConfigErrors),\n/* harmony export */ configExtensionStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.configInternalStore),\n/* harmony export */ defineConfigSchema: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.getConfig),\n/* harmony export */ getConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore),\n/* harmony export */ getTranslationOverrides: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.getTranslationOverrides),\n/* harmony export */ implementerToolsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.implementerToolsConfigStore),\n/* harmony export */ inRange: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.inRange),\n/* harmony export */ isUrl: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.isUrl),\n/* harmony export */ isUrlWithTemplateParameters: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.isUrlWithTemplateParameters),\n/* harmony export */ oneOf: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.oneOf),\n/* harmony export */ processConfig: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.processConfig),\n/* harmony export */ provide: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.provide),\n/* harmony export */ registerModuleLoad: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerTranslationNamespace),\n/* harmony export */ temporaryConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.temporaryConfigStore),\n/* harmony export */ validator: () => (/* reexport safe */ _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator),\n/* harmony export */ validators: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.validators)\n/* harmony export */ });\n/* harmony import */ var _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./module-config/module-config.js */ \"../../framework/esm-config/dist/module-config/module-config.js\");\n/* harmony import */ var _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./module-config/state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validators/validators.js */ \"../../framework/esm-config/dist/validators/validators.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types.js */ \"../../framework/esm-config/dist/types.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWlEO0FBQ1I7QUFDQztBQUNDO0FBQ2hCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L2luZGV4LmpzPzI3NzAiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlLWNvbmZpZy9tb2R1bGUtY29uZmlnLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGUtY29uZmlnL3N0YXRlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzL3ZhbGlkYXRvci5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdG9ycy92YWxpZGF0b3JzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy5qc1wiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/index.js\n");
148
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Type: () => (/* reexport safe */ _types_js__WEBPACK_IMPORTED_MODULE_4__.Type),\n/* harmony export */ clearConfigErrors: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.clearConfigErrors),\n/* harmony export */ configExtensionStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.configInternalStore),\n/* harmony export */ defineConfigSchema: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.getConfig),\n/* harmony export */ getConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore),\n/* harmony export */ getTranslationOverrides: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.getTranslationOverrides),\n/* harmony export */ implementerToolsConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.implementerToolsConfigStore),\n/* harmony export */ inRange: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.inRange),\n/* harmony export */ isUrl: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.isUrl),\n/* harmony export */ isUrlWithTemplateParameters: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.isUrlWithTemplateParameters),\n/* harmony export */ oneOf: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.oneOf),\n/* harmony export */ processConfig: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.processConfig),\n/* harmony export */ provide: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.provide),\n/* harmony export */ registerModuleLoad: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.registerTranslationNamespace),\n/* harmony export */ resetConfigSystem: () => (/* reexport safe */ _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__.resetConfigSystem),\n/* harmony export */ temporaryConfigStore: () => (/* reexport safe */ _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__.temporaryConfigStore),\n/* harmony export */ validator: () => (/* reexport safe */ _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator),\n/* harmony export */ validators: () => (/* reexport safe */ _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__.validators)\n/* harmony export */ });\n/* harmony import */ var _module_config_module_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./module-config/module-config.js */ \"../../framework/esm-config/dist/module-config/module-config.js\");\n/* harmony import */ var _module_config_state_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./module-config/state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _validators_validators_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validators/validators.js */ \"../../framework/esm-config/dist/validators/validators.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types.js */ \"../../framework/esm-config/dist/types.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFpRDtBQUNSO0FBQ0M7QUFDQztBQUNoQiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9pbmRleC5qcz8yNzcwIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlLWNvbmZpZy9zdGF0ZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdG9ycy92YWxpZGF0b3IuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMuanNcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/index.js\n");
149
149
 
150
150
  /***/ }),
151
151
 
@@ -155,7 +155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
155
155
  \**********************************************************************/
156
156
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
157
157
 
158
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearConfigErrors: () => (/* binding */ clearConfigErrors),\n/* harmony export */ defineConfigSchema: () => (/* binding */ defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* binding */ defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* binding */ getConfig),\n/* harmony export */ getTranslationOverrides: () => (/* binding */ getTranslationOverrides),\n/* harmony export */ processConfig: () => (/* binding */ processConfig),\n/* harmony export */ provide: () => (/* binding */ provide),\n/* harmony export */ registerModuleLoad: () => (/* binding */ registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* binding */ registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* binding */ registerTranslationNamespace)\n/* harmony export */ });\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/equals.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/mergeDeepRight.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/omit.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/clone.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/reduce.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types.js */ \"../../framework/esm-config/dist/types.js\");\n/* harmony import */ var _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validators/type-validators.js */ \"../../framework/esm-config/dist/validators/type-validators.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _state_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/** @module @category Config */ \n\n\n\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ computeModuleConfig(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe((configState)=>computeModuleConfig(configState, _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState()));\n_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe((tempConfigState)=>computeModuleConfig(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), tempConfigState));\ncomputeImplementerToolsConfig(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe((configState)=>computeImplementerToolsConfig(configState, _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState()));\n_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe((tempConfigState)=>computeImplementerToolsConfig(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), tempConfigState));\ncomputeExtensionSlotConfigs(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe((configState)=>computeExtensionSlotConfigs(configState, _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState()));\n_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe((tempConfigState)=>computeExtensionSlotConfigs(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), tempConfigState));\ncomputeExtensionConfigs(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe((configState)=>{\n computeExtensionConfigs(configState, _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n});\n_state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.subscribe((extensionState)=>{\n computeExtensionConfigs(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), extensionState, _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState());\n});\n_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe((tempConfigState)=>{\n computeExtensionConfigs(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState(), _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState(), tempConfigState);\n});\nfunction computeModuleConfig(state, tempState) {\n for (let moduleName of Object.keys(state.schemas)){\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n const moduleStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n if (state.moduleLoaded[moduleName]) {\n const config = getConfigForModule(moduleName, state, tempState);\n moduleStore.setState({\n translationOverridesLoaded: true,\n loaded: true,\n config\n });\n } else {\n const config = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n moduleStore.setState({\n translationOverridesLoaded: true,\n loaded: false,\n config\n });\n }\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n const slotConfigs = getExtensionSlotConfigs(state, tempState);\n const newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(([slotName, config])=>[\n slotName,\n {\n loaded: true,\n config\n }\n ]));\n const slotStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionSlotsConfigStore)();\n const oldState = slotStore.getState();\n const newState = {\n slots: {\n ...oldState.slots,\n ...newSlotStoreEntries\n }\n };\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState, newState)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n const config = getImplementerToolsConfig(state, tempConfigState);\n _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.setState({\n config\n });\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n const configs = {};\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for (let extension of extensionState.mountedExtensions){\n const config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n configs[extension.slotName] = {\n ...configs[extension.slotName],\n [extension.extensionId]: {\n config,\n loaded: true\n }\n };\n }\n (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionsConfigStore)().setState({\n configs\n });\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: enhancedSchema\n },\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: implicitConfigSchema\n }\n }));\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [namespace]: translationOverridesSchema\n }\n }));\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries being returned\n * by `setupOpenMRS`.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n const state = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(`Config schema for extension ${extensionName} already exists. If there are multiple extensions with this same name, one will probably crash.`);\n }\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [extensionName]: enhancedSchema\n }\n }));\n}\nfunction provide(config, sourceName = 'provided') {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n providedConfigs: [\n ...state.providedConfigs,\n {\n source: sourceName,\n config\n }\n ]\n }));\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise((resolve)=>{\n const store = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.loaded && state.config) {\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_6__[\"default\"])([\n 'Display conditions',\n 'Translation overrides'\n ], state.config);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n/** @internal */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n const promises = [\n new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionConfig)(slotName, extensionId);\n function update(state) {\n if (state.loaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-deparated string which helps the user figure out where\n * the provided config came from\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n const extensionName = getExtensionNameFromId(extensionId);\n const extensionConfigSchema = configState.schemas[extensionName];\n const nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n const providedConfigs = getProvidedConfigs(configState, tempConfigState);\n const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n const configOverride = slotModuleConfig?.extensionSlots?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n const combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n const schema = extensionConfigSchema ?? configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n const config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n let result = getSchemaWithValuesAndSources((0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(configState.schemas));\n const configsAndSources = [\n ...configState.providedConfigs.map((c)=>[\n c.config,\n c.source\n ]),\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ];\n for (let [config, source] of configsAndSources){\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return {\n ...schema,\n _value: schema._default,\n _source: 'default'\n };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key)=>{\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key)=>{\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n const allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n const slotConfigPerModule = Object.keys(allConfigs).reduce((obj, key)=>{\n if (allConfigs[key]?.extensionSlots) {\n obj[key] = allConfigs[key]?.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n const slotConfigs = Object.keys(slotConfigPerModule).reduce((obj, key)=>{\n obj = {\n ...obj,\n ...slotConfigPerModule[key]\n };\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n for (let [moduleName, configBySlotName] of Object.entries(slotConfigPerModule)){\n for (let [slotName, config] of Object.entries(configBySlotName)){\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n const keyPath = `${moduleName}.extensionSlots.${slotName}`;\n const errorPrefix = `Extension slot config '${keyPath}'`;\n const invalidKeys = Object.keys(config).filter((k)=>![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k));\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`);\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.add' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.remove' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.order' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + `.configure' is invalid. Must be an object with extension IDs for keys`);\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return [\n ...configState.providedConfigs.map((c)=>c.config),\n tempConfigState.config\n ];\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema, keyPath = '') {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n for (const key of Object.keys(schema).filter((k)=>!k.startsWith('_'))){\n const thisKeyPath = keyPath + (keyPath && '.') + key;\n const schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(`${moduleName} declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ${updateMessage}`);\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(`${moduleName} declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ${updateMessage}`);\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`);\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators){\n if (typeof validator !== 'function') {\n console.error(`${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: validators must be functions that return either ` + `undefined or an error string. Received ${validator}.`);\n }\n }\n }\n const valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).includes(valueType)) {\n console.error(`${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).join(', ')}. ` + `Received '${valueType}'`);\n }\n if (Object.keys(schemaPart).every((k)=>[\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k)) && !keyPath.includes('._elements')) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: all config elements must have a default. ` + `Received ${JSON.stringify(schemaPart)}`);\n }\n if (elements && valueType && ![\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object\n ].includes(valueType)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` + `Received ${JSON.stringify(valueType)}`);\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n const schema = configState.schemas[moduleName];\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n const config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n const allConfigsForModule = allConfigs.map(({ [moduleName]: c })=>c).filter((c)=>!!c);\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n const mergeDeepAll = (0,ramda__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n return mergeDeepAll({}, configs);\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config, keyPath = '') {\n // validate each constituent element\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, `Unknown config key '${thisKeyPath}' provided. Ignoring.`);\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n for (const key of Object.keys(config)){\n const value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n const validatedAsArray = checkType(keyPath, _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(let i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n for(let i = 0; i < value.length; i++){\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config, keyPath = '') {\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (schema._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(let i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], `${keyPath}[${i}]`);\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n const validator = {\n Array: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isArray,\n Boolean: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean,\n ConceptUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n Number: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isNumber,\n Object: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isObject,\n String: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isString,\n UUID: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid\n };\n return runValidators(keyPath, [\n validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n let returnValue = true;\n if (validators) {\n try {\n for (let validator of validators){\n const validatorResult = validator(value);\n if (typeof validatorResult === 'string') {\n const message = typeof value === 'object' ? `Invalid configuration for ${keyPath}: ${validatorResult}` : `Invalid configuration value ${value} for ${keyPath}: ${validatorResult}`;\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\". Encountered error\\n\\t${e}`);\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (schema, inputConfig)=>{\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(inputConfig);\n if (!schema) {\n return config;\n }\n for (const key of Object.keys(schema)){\n const configPart = config[key];\n const schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array && Array.isArray(configPart)) {\n const configWithDefaults = configPart.map((conf)=>setDefaults(elements, conf));\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n for (let objectKey of Object.keys(configPart)){\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = configPart ?? {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter((e)=>![\n '_default',\n '_validators'\n ].includes(e)).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ let displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n const key = `${keyPath}:::${message}`;\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach((key)=>{\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ const translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator)((o)=>Object.keys(o).every((k)=>/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k)), (o)=>{\n const badKeys = Object.keys(o).filter((k)=>!/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k));\n return `The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: ${badKeys.join(', ')}.`;\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ const implicitConfigSchema = {\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _default: []\n }\n },\n ...translationOverridesSchema\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZCQUE2QixHQUF1RTtBQUNqRTtBQUN5RTtBQUNyRDtBQUMrSjtBQUN0Tjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1CQyxHQUFHcUIsb0JBQW9CUiwwREFBbUJBLENBQUNTLFFBQVEsSUFBSUgsMkRBQW9CQSxDQUFDRyxRQUFRO0FBQ3JGVCwwREFBbUJBLENBQUNVLFNBQVMsQ0FBQyxDQUFDQyxjQUFjSCxvQkFBb0JHLGFBQWFMLDJEQUFvQkEsQ0FBQ0csUUFBUTtBQUMzR0gsMkRBQW9CQSxDQUFDSSxTQUFTLENBQUMsQ0FBQ0Usa0JBQWtCSixvQkFBb0JSLDBEQUFtQkEsQ0FBQ1MsUUFBUSxJQUFJRztBQUN0R0MsOEJBQThCYiwwREFBbUJBLENBQUNTLFFBQVEsSUFBSUgsMkRBQW9CQSxDQUFDRyxRQUFRO0FBQzNGVCwwREFBbUJBLENBQUNVLFNBQVMsQ0FBQyxDQUFDQyxjQUFjRSw4QkFBOEJGLGFBQWFMLDJEQUFvQkEsQ0FBQ0csUUFBUTtBQUNySEgsMkRBQW9CQSxDQUFDSSxTQUFTLENBQUMsQ0FBQ0Usa0JBQWtCQyw4QkFBOEJiLDBEQUFtQkEsQ0FBQ1MsUUFBUSxJQUFJRztBQUNoSEUsNEJBQTRCZCwwREFBbUJBLENBQUNTLFFBQVEsSUFBSUgsMkRBQW9CQSxDQUFDRyxRQUFRO0FBQ3pGVCwwREFBbUJBLENBQUNVLFNBQVMsQ0FBQyxDQUFDQyxjQUFjRyw0QkFBNEJILGFBQWFMLDJEQUFvQkEsQ0FBQ0csUUFBUTtBQUNuSEgsMkRBQW9CQSxDQUFDSSxTQUFTLENBQUMsQ0FBQ0Usa0JBQWtCRSw0QkFBNEJkLDBEQUFtQkEsQ0FBQ1MsUUFBUSxJQUFJRztBQUM5R0csd0JBQXdCZiwwREFBbUJBLENBQUNTLFFBQVEsSUFBSVIsMkRBQW9CQSxDQUFDUSxRQUFRLElBQUlILDJEQUFv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bEJxRixVQUFVLENBQUM7UUFDWGdDLGFBQWE7WUFDVDFJLG1FQUFTQSxDQUFDLENBQUN3TCxJQUFJbkssT0FBT0MsSUFBSSxDQUFDa0ssR0FBR3pELEtBQUssQ0FBQyxDQUFDUCxJQUFJLDZCQUE2QmlFLElBQUksQ0FBQ2pFLEtBQUssQ0FBQ2dFO2dCQUM3RSxNQUFNRSxVQUFVckssT0FBT0MsSUFBSSxDQUFDa0ssR0FBR2pFLE1BQU0sQ0FBQyxDQUFDQyxJQUFJLENBQUMsNkJBQTZCaUUsSUFBSSxDQUFDakU7Z0JBQzlFLE9BQU8sQ0FBQyw2UEFBNlAsRUFBRWtFLFFBQVE5RCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaFM7U0FDSDtJQUNMO0FBQ0o7QUFDQTs7Q0FFQyxHQUFHLE1BQU1yRSx1QkFBdUI7SUFDN0Isc0JBQXNCO1FBQ2xCb0ksWUFBWTtZQUNSSixjQUFjO1lBQ2QzQyxPQUFPbkosMkNBQUlBLENBQUNxSSxLQUFLO1lBQ2pCcEIsVUFBVSxFQUFFO1FBQ2hCO0lBQ0o7SUFDQSxHQUFHOUMsMEJBQTBCO0FBQ2pDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcz84ZGZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBDb25maWcgKi8gaW1wb3J0IHsgY2xvbmUsIHJlZHVjZSwgbWVyZ2VEZWVwUmlnaHQsIGVxdWFscywgb21pdCB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNCb29sZWFuLCBpc1V1aWQsIGlzTnVtYmVyLCBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdmFsaWRhdG9ycy90eXBlLXZhbGlkYXRvcnMuanNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3ZhbGlkYXRvci5qc1wiO1xuaW1wb3J0IHsgY29uZmlnSW50ZXJuYWxTdG9yZSwgY29uZmlnRXh0ZW5zaW9uU3RvcmUsIGdldENvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25Db25maWcsIGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSwgaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSB9IGZyb20gXCIuL3N0YXRlLmpzXCI7XG4vKipcbiAqIFN0b3JlIHNldHVwXG4gKlxuICpcbiAqIFNldCB1cCBzdG9yZXMgYW5kIHN1YnNjcmlwdGlvbnMgc28gdGhhdCBpbnB1dHMgZ2V0IHByb2Nlc3NlZCBhcHByb3ByaWF0ZWx5LlxuICpcbiAqIFRoZXJlIGFyZSAqaW5wdXQqIHN0b3JlcyBhbmQgKm91dHB1dCogc3RvcmVzLiBUaGUgKmlucHV0KiBzdG9yZXNcbiAqIGFyZSBjb25maWdJbnRlcm5hbFN0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSwgYW5kIGNvbmZpZ0V4dGVuc2lvblN0b3JlLiBUaGVcbiAqIG91dHB1dCBzdG9yZXMgYXJlIHNldCBpbiB0aGUgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucy4gVGhleSBhcmUgdGhlIG1vZHVsZVxuICogY29uZmlnIHN0b3JlcywgdGhlIGV4dGVuc2lvbiBzbG90IGNvbmZpZyBzdG9yZXMgKGJ5IG1vZHVsZSksIHRoZSBleHRlbnNpb25cbiAqIGNvbmZpZyBzdG9yZXMsIGFuZCB0aGUgaW1wbGVtZW50ZXIgdG9vbHMgY29uZmlnIHN0b3JlLlxuICpcbiAqIFRoaXMgY29kZSBzZXRzIHVwIHRoZSBzdWJzY3JpcHRpb25zIHNvIHRoYXQgd2hlbiBhbiBpbnB1dCBzdG9yZSBjaGFuZ2VzLFxuICogdGhlIGNvcnJlY3Qgc2V0IG9mIG91dHB1dCBzdG9yZXMgYXJlIHVwZGF0ZWQuXG4gKlxuICogQWxsIGBjb21wdXRlLi4uYCBmdW5jdGlvbnMgZXhjZXB0IGBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnc2AgYXJlIHB1cmVcbiAqIChvciBhcmUgc3VwcG9zZWQgdG8gYmUpLCBvdGhlciB0aGFuIHRoZSBmYWN0IHRoYXQgdGhleSBhbGwgYHNldFN0YXRlYFxuICogc3RvcmUgdmFsdWVzIGF0IHRoZSBlbmQuIGBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnc2AgY2FsbHMgYGdldEdsb2JhbFN0b3JlYCxcbiAqIHdoaWNoIGNyZWF0ZXMgc3RvcmVzLlxuICovIGNvbXB1dGVNb2R1bGVDb25maWcoY29uZmlnSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpKTtcbmNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKChjb25maWdTdGF0ZSk9PmNvbXB1dGVNb2R1bGVDb25maWcoY29uZmlnU3RhdGUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpKTtcbnRlbXBvcmFyeUNvbmZpZ1N0b3JlLnN1YnNjcmliZSgodGVtcENvbmZpZ1N0YXRlKT0+Y29tcHV0ZU1vZHVsZUNvbmZpZyhjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCksIHRlbXBDb25maWdTdGF0ZSkpO1xuY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpKTtcbmNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKChjb25maWdTdGF0ZSk9PmNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKGNvbmZpZ1N0YXRlLCB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpKSk7XG50ZW1wb3JhcnlDb25maWdTdG9yZS5zdWJzY3JpYmUoKHRlbXBDb25maWdTdGF0ZSk9PmNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgdGVtcENvbmZpZ1N0YXRlKSk7XG5jb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpKTtcbmNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKChjb25maWdTdGF0ZSk9PmNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKSkpO1xudGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKCh0ZW1wQ29uZmlnU3RhdGUpPT5jb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbmNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgY29uZmlnRXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG5jb25maWdJbnRlcm5hbFN0b3JlLnN1YnNjcmliZSgoY29uZmlnU3RhdGUpPT57XG4gICAgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCksIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5jb25maWdFeHRlbnNpb25TdG9yZS5zdWJzY3JpYmUoKGV4dGVuc2lvblN0YXRlKT0+e1xuICAgIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgZXh0ZW5zaW9uU3RhdGUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xufSk7XG50ZW1wb3JhcnlDb25maWdTdG9yZS5zdWJzY3JpYmUoKHRlbXBDb25maWdTdGF0ZSk9PntcbiAgICBjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyhjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCksIGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCksIHRlbXBDb25maWdTdGF0ZSk7XG59KTtcbmZ1bmN0aW9uIGNvbXB1dGVNb2R1bGVDb25maWcoc3RhdGUsIHRlbXBTdGF0ZSkge1xuICAgIGZvciAobGV0IG1vZHVsZU5hbWUgb2YgT2JqZWN0LmtleXMoc3RhdGUuc2NoZW1hcykpe1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzY2hlbWEgY291bGQgYmUgZWl0aGVyIGp1c3QgdGhlIGltcGxpY2l0IHNjaGVtYSBvciB0aGUgYWN0dWFsbHlcbiAgICAgICAgLy8gZGVmaW5lZCBzY2hlbWEuIFdlIHJ1biB3aXRoIGp1c3QgdGhlIGltcGxpY2l0IHNjaGVtYSBiZWNhdXNlIHdlIHdhbnQgdG8gcG9wdWxhdGVcbiAgICAgICAgLy8gdGhlIGNvbmZpZyBzdG9yZSB3aXRoIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXMgc29vbiBhcyBwb3NzaWJsZS4gSW4gZmFjdCwgdGhlXG4gICAgICAgIC8vIHRyYW5zbGF0aW9uIHN5c3RlbSB3aWxsIHRocm93IGZvciBTdXNwZW5zZSB1bnRpbCB0aGUgdHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFyZVxuICAgICAgICAvLyBhdmFpbGFibGUsIHdoaWNoIGFzIG9mIHRoaXMgd3JpdGluZyBibG9ja3MgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGZyb20gb2NjdXJyaW5nXG4gICAgICAgIC8vIGZvciBtb2R1bGVzIGxvYWRlZCBiYXNlZCBvbiB0aGVpciBleHRlbnNpb25zLlxuICAgICAgICBjb25zdCBtb2R1bGVTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICBpZiAoc3RhdGUubW9kdWxlTG9hZGVkW21vZHVsZU5hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgICAgICAgICBtb2R1bGVTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGb3JNb2R1bGVJbXBsaWNpdFNjaGVtYShtb2R1bGVOYW1lLCBzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICAgICAgICAgIG1vZHVsZVN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc3RhdGUsIHRlbXBTdGF0ZSkge1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3Moc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgY29uc3QgbmV3U2xvdFN0b3JlRW50cmllcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzbG90Q29uZmlncykubWFwKChbc2xvdE5hbWUsIGNvbmZpZ10pPT5bXG4gICAgICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pKTtcbiAgICBjb25zdCBzbG90U3RvcmUgPSBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlKCk7XG4gICAgY29uc3Qgb2xkU3RhdGUgPSBzbG90U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgIC4uLm9sZFN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgLi4ubmV3U2xvdFN0b3JlRW50cmllc1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWVxdWFscyhvbGRTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgY29uZmlnXG4gICAgfSk7XG59XG5mdW5jdGlvbiBjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyhjb25maWdTdGF0ZSwgZXh0ZW5zaW9uU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGNvbmZpZ3MgPSB7fTtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgbW9kdWxlIHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQsIHNpbmNlIHRoZSBleHRlbnNpb25cbiAgICAvLyBpdCBjb250YWlucyBpcyBtb3VudGVkLlxuICAgIGZvciAobGV0IGV4dGVuc2lvbiBvZiBleHRlbnNpb25TdGF0ZS5tb3VudGVkRXh0ZW5zaW9ucyl7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbXB1dGVFeHRlbnNpb25Db25maWcoZXh0ZW5zaW9uLnNsb3RNb2R1bGVOYW1lLCBleHRlbnNpb24uZXh0ZW5zaW9uTW9kdWxlTmFtZSwgZXh0ZW5zaW9uLnNsb3ROYW1lLCBleHRlbnNpb24uZXh0ZW5zaW9uSWQsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7XG4gICAgICAgICAgICAuLi5jb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0sXG4gICAgICAgICAgICBbZXh0ZW5zaW9uLmV4dGVuc2lvbklkXToge1xuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlKCkuc2V0U3RhdGUoe1xuICAgICAgICBjb25maWdzXG4gICAgfSk7XG59XG4vKlxuICogQVBJXG4gKlxuICovIC8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGEgbW9kdWxlLiBUaGUgc2NoZW1hIHRlbGxzIHRoZVxuICogY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuIEl0IHNwZWNpZmllc1xuICogd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuIEdlbmVyYWxseVxuICogICBzaG91bGQgYmUgdGhlIG9uZSBpbiB3aGljaCB0aGUgYGRlZmluZUNvbmZpZ1NjaGVtYWAgY2FsbCB0YWtlcyBwbGFjZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBtb2R1bGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSaWdodChzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zY2hlbWFzLFxuICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXTogZW5oYW5jZWRTY2hlbWFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb2R1bGVMb2FkZWQ6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5tb2R1bGVMb2FkZWQsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgZXhpc3RzLiBUaGlzIGFsbG93cyBjb25maWcgdG8gYmVcbiAqIHByb2Nlc3NlZCwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGV4dGVuc2lvbiBzeXN0ZW0gdG8ga25vdyB3aGV0aGVyIHRoZSBtb2R1bGUgaGFzXG4gKiBhY3R1YWxseSBoYWQgaXRzIGZyb250IGJ1bmRsZSBleGVjdXRlZCB5ZXQuXG4gKlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIGVzbS1hcHAtc2hlbGwuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gbW9kdWxlTmFtZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0obW9kdWxlTmFtZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBpbXBsaWNpdENvbmZpZ1NjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFRoaXMgYWxlcnRzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB0aGF0IGEgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlTG9hZChtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBtb2R1bGVMb2FkZWQ6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5tb2R1bGVMb2FkZWQsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGxvd3MgdGhlIGNvbmZpZyBzeXN0ZW0gdG8gc3VwcG9ydCB0cmFuc2xhdGlvbiBvdmVycmlkZXMgZm9yIG5hbWVzcGFjZXMgdGhhdFxuICogZG8gbm90IGNvcnJlc3BvbmQgdG8gbW9kdWxlcy5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBuYW1lc3BhY2VcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUcmFuc2xhdGlvbk5hbWVzcGFjZShuYW1lc3BhY2UpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zY2hlbWFzLFxuICAgICAgICAgICAgICAgIFtuYW1lc3BhY2VdOiB0cmFuc2xhdGlvbk92ZXJyaWRlc1NjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFRoaXMgZGVmaW5lcyBhIGNvbmZpZ3VyYXRpb24gc2NoZW1hIGZvciBhbiBleHRlbnNpb24uIFdoZW4gYSBzY2hlbWEgaXMgZGVmaW5lZFxuICogZm9yIGFuIGV4dGVuc2lvbiwgdGhhdCBleHRlbnNpb24gd2lsbCByZWNlaXZlIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmdcbiAqIHRvIHRoYXQgc2NoZW1hLCByYXRoZXIgdGhhbiB0aGUgY29uZmlndXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb2R1bGVcbiAqIGluIHdoaWNoIGl0IGlzIGRlZmluZWQuXG4gKlxuICogVGhlIHNjaGVtYSB0ZWxscyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuXG4gKiBJdCBzcGVjaWZpZXMgd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgTmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuXG4gKiAgIFNob3VsZCBtYXRjaCB0aGUgYG5hbWVgIG9mIG9uZSBvZiB0aGUgYGV4dGVuc2lvbnNgIGVudHJpZXMgYmVpbmcgcmV0dXJuZWRcbiAqICAgYnkgYHNldHVwT3Blbk1SU2AuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmlnaHQoc2NoZW1hLCBpbXBsaWNpdENvbmZpZ1NjaGVtYSk7XG4gICAgY29uc3Qgc3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgaWYgKHN0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ29uZmlnIHNjaGVtYSBmb3IgZXh0ZW5zaW9uICR7ZXh0ZW5zaW9uTmFtZX0gYWxyZWFkeSBleGlzdHMuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBleHRlbnNpb25zIHdpdGggdGhpcyBzYW1lIG5hbWUsIG9uZSB3aWxsIHByb2JhYmx5IGNyYXNoLmApO1xuICAgIH1cbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zY2hlbWFzLFxuICAgICAgICAgICAgICAgIFtleHRlbnNpb25OYW1lXTogZW5oYW5jZWRTY2hlbWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGUoY29uZmlnLCBzb3VyY2VOYW1lID0gJ3Byb3ZpZGVkJykge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgcHJvdmlkZWRDb25maWdzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucHJvdmlkZWRDb25maWdzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogQSBwcm9taXNlLWJhc2VkIHdheSB0byBhY2Nlc3MgdGhlIGNvbmZpZyBhcyBzb29uIGFzIGl0IGlzIGZ1bGx5IGxvYWRlZC5cbiAqIElmIGl0IGlzIGFscmVhZHkgbG9hZGVkLCByZXNvbHZlcyB0aGUgY29uZmlnIGluIGl0cyBwcmVzZW50IHN0YXRlLlxuICpcbiAqIFRoaXMgaXMgYSB1c2VmdWwgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZ2V0IHRoZSBjb25maWcgaW4gdGhlIGNvdXJzZVxuICogb2YgdGhlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZm9yIHdoaWNoIHRvIGxvb2sgdXAgdGhlIGNvbmZpZ1xuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcobW9kdWxlTmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PntcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUubG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IG9taXQoW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdLCBzdGF0ZS5jb25maWcpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMobW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+e1xuICAgICAgICAgICAgY29uc3QgY29uZmlnU3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS50cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSlcbiAgICBdO1xuICAgIGlmIChzbG90TmFtZSAmJiBleHRlbnNpb25JZCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlKT0+e1xuICAgICAgICAgICAgY29uc3QgY29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25Db25maWcoc2xvdE5hbWUsIGV4dGVuc2lvbklkKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sb2FkZWQgJiYgc3RhdGUuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uT3ZlcnJpZGVzID0gc3RhdGUuY29uZmlnWydUcmFuc2xhdGlvbiBvdmVycmlkZXMnXSA/PyB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cmFuc2xhdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZShjb25maWdTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gY29uZmlnU3RvcmUuc3Vic2NyaWJlKHVwZGF0ZSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cbi8qKlxuICogVmFsaWRhdGUgYW5kIGludGVycG9sYXRlIGRlZmF1bHRzIGZvciBgcHJvdmlkZWRDb25maWdgIGFjY29yZGluZyB0byBgc2NoZW1hYFxuICpcbiAqIEBwYXJhbSBzY2hlbWEgIGEgY29uZmlndXJhdGlvbiBzY2hlbWFcbiAqIEBwYXJhbSBwcm92aWRlZENvbmZpZyAgYW4gb2JqZWN0IG9mIGNvbmZpZyB2YWx1ZXMgKHdpdGhvdXQgdGhlIHRvcC1sZXZlbCBtb2R1bGUgbmFtZSlcbiAqIEBwYXJhbSBrZXlQYXRoQ29udGV4dCAgYSBkb3QtZGVwYXJhdGVkIHN0cmluZyB3aGljaCBoZWxwcyB0aGUgdXNlciBmaWd1cmUgb3V0IHdoZXJlXG4gKiAgICAgdGhlIHByb3ZpZGVkIGNvbmZpZyBjYW1lIGZyb21cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZShjb25maWdTdGF0ZS5zY2hlbWFzKSk7XG4gICAgY29uc3QgY29uZmlnc0FuZFNvdXJjZXMgPSBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5bXG4gICAgICAgICAgICAgICAgYy5jb25maWcsXG4gICAgICAgICAgICAgICAgYy5zb3VyY2VcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBbXG4gICAgICAgICAgICB0ZW1wQ29uZmlnU3RhdGUuY29uZmlnLFxuICAgICAgICAgICAgJ3RlbXBvcmFyeSBjb25maWcnXG4gICAgICAgIF1cbiAgICBdO1xuICAgIGZvciAobGV0IFtjb25maWcsIHNvdXJjZV0gb2YgY29uZmlnc0FuZFNvdXJjZXMpe1xuICAgICAgICByZXN1bHQgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnLCBzb3VyY2UpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgX3ZhbHVlOiBzY2hlbWEuX2RlZmF1bHQsXG4gICAgICAgICAgICBfc291cmNlOiAnZGVmYXVsdCdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhzY2hlbWFba2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgdGhlIHNjaGVtYSBpcyBiYWQgYW5kIGFuIGVycm9yIHdpbGwgaGF2ZSBiZWVuIGxvZ2dlZCBkdXJpbmcgc2NoZW1hIHZhbGlkYXRpb25cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKSB7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWdba2V5XSwgc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3ZhbHVlOiBjb25maWcsXG4gICAgICAgICAgICBfc291cmNlOiBzb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgYWxsQ29uZmlncyA9IG1lcmdlQ29uZmlncyhnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkpO1xuICAgIGNvbnN0IHNsb3RDb25maWdQZXJNb2R1bGUgPSBPYmplY3Qua2V5cyhhbGxDb25maWdzKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBpZiAoYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBhbGxDb25maWdzW2tleV0/LmV4dGVuc2lvblNsb3RzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSk7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBPYmplY3Qua2V5cyhzbG90Q29uZmlnUGVyTW9kdWxlKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBvYmogPSB7XG4gICAgICAgICAgICAuLi5vYmosXG4gICAgICAgICAgICAuLi5zbG90Q29uZmlnUGVyTW9kdWxlW2tleV1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHNsb3RDb25maWdzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBbGxFeHRlbnNpb25TbG90Q29uZmlncyhzbG90Q29uZmlnUGVyTW9kdWxlKSB7XG4gICAgZm9yIChsZXQgW21vZHVsZU5hbWUsIGNvbmZpZ0J5U2xvdE5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdQZXJNb2R1bGUpKXtcbiAgICAgICAgZm9yIChsZXQgW3Nsb3ROYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ0J5U2xvdE5hbWUpKXtcbiAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKSB7XG4gICAgY29uc3Qga2V5UGF0aCA9IGAke21vZHVsZU5hbWV9LmV4dGVuc2lvblNsb3RzLiR7c2xvdE5hbWV9YDtcbiAgICBjb25zdCBlcnJvclByZWZpeCA9IGBFeHRlbnNpb24gc2xvdCBjb25maWcgJyR7a2V5UGF0aH0nYDtcbiAgICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZykuZmlsdGVyKChrKT0+IVtcbiAgICAgICAgICAgICdhZGQnLFxuICAgICAgICAgICAgJ3JlbW92ZScsXG4gICAgICAgICAgICAnb3JkZXInLFxuICAgICAgICAgICAgJ2NvbmZpZ3VyZSdcbiAgICAgICAgXS5pbmNsdWRlcyhrKSk7XG4gICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCkge1xuICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAnIGNvbnRhaW5zIGludmFsaWQga2V5cyAnJHtpbnZhbGlkS2V5cy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGlmIChjb25maWcuYWRkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuYWRkKSB8fCAhY29uZmlnLmFkZC5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5hZGQnIGlzIGludmFsaWQuIE11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZXh0ZW5zaW9uIElEcylgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlbW92ZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnJlbW92ZSkgfHwgIWNvbmZpZy5yZW1vdmUuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAucmVtb3ZlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5vcmRlcikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLm9yZGVyKSB8fCAhY29uZmlnLm9yZGVyLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLm9yZGVyJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jb25maWd1cmUpIHtcbiAgICAgICAgaWYgKCFpc09yZGluYXJ5T2JqZWN0KGNvbmZpZy5jb25maWd1cmUpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuY29uZmlndXJlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIG9iamVjdCB3aXRoIGV4dGVuc2lvbiBJRHMgZm9yIGtleXNgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uY29uZmlnU3RhdGUucHJvdmlkZWRDb25maWdzLm1hcCgoYyk9PmMuY29uZmlnKSxcbiAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZ1xuICAgIF07XG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgY29uZmlnIHNjaGVtYSBmb3IgYSBtb2R1bGUuIFNpbmNlIHByb2JsZW1zIGlkZW50aWZpZWQgaGVyZSBhcmUgcHJvZ3JhbW1pbmcgZXJyb3JzXG4gKiB0aGF0IGhvcGVmdWxseSB3aWxsIGJlIGNhdWdodCBkdXJpbmcgZGV2ZWxvcG1lbnQsIHRoaXMgZnVuY3Rpb24gbG9ncyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgZGlyZWN0bHk7XG4gKiBpdCdzIGZpbmUgaWYgd2Ugc3BhbSB0aGUgdXNlciB3aXRoIHRoZXNlIGVycm9ycy5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWEsIGtleVBhdGggPSAnJykge1xuICAgIGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSBgUGxlYXNlIHZlcmlmeSB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kLCBpZiBzbywgYWxlcnQgdGhlIG1haW50YWluZXIuYDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoayk9PiFrLnN0YXJ0c1dpdGgoJ18nKSkpe1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAoa2V5UGF0aCAmJiAnLicpICsga2V5O1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ0Rpc3BsYXkgY29uZGl0aW9ucycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJEaXNwbGF5IGNvbmRpdGlvbnNcIjsgdGhlIFwiRGlzcGxheSBjb25kaXRpb25zXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJUcmFuc2xhdGlvbiBvdmVycmlkZXNcIjsgdGhlIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChzY2hlbWFQYXJ0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBmb3IgbmVzdGVkIGNvbmZpZyBrZXlzXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWFQYXJ0LCB0aGlzS2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzY2hlbWFQYXJ0Ll9lbGVtZW50cztcbiAgICAgICAgaWYgKGhhc09iamVjdFNjaGVtYShlbGVtZW50cykpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIGVsZW1lbnRzLCB0aGlzS2V5UGF0aCArICcuX2VsZW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3ZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHZhbGlkYXRvciBvZiBzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKXtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBpbnZhbGlkIHZhbGlkYXRvciBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdmFsaWRhdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBlaXRoZXIgYCArIGB1bmRlZmluZWQgb3IgYW4gZXJyb3Igc3RyaW5nLiBSZWNlaXZlZCAke3ZhbGlkYXRvcn0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHNjaGVtYVBhcnQuX3R5cGU7XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgJiYgIU9iamVjdC52YWx1ZXMoVHlwZSkuaW5jbHVkZXModmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB0eXBlIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9JyAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgYWxsb3dlZCB0eXBlcyBhcmUgJHtPYmplY3QudmFsdWVzKFR5cGUpLmpvaW4oJywgJyl9LiBgICsgYFJlY2VpdmVkICcke3ZhbHVlVHlwZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYVBhcnQpLmV2ZXJ5KChrKT0+W1xuICAgICAgICAgICAgICAgICdfZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICdfdmFsaWRhdG9ycycsXG4gICAgICAgICAgICAgICAgJ19lbGVtZW50cycsXG4gICAgICAgICAgICAgICAgJ190eXBlJ1xuICAgICAgICAgICAgXS5pbmNsdWRlcyhrKSkgJiYgIWtleVBhdGguaW5jbHVkZXMoJy5fZWxlbWVudHMnKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IGFsbCBjb25maWcgZWxlbWVudHMgbXVzdCBoYXZlIGEgZGVmYXVsdC4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHNjaGVtYVBhcnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50cyAmJiB2YWx1ZVR5cGUgJiYgIVtcbiAgICAgICAgICAgIFR5cGUuQXJyYXksXG4gICAgICAgICAgICBUeXBlLk9iamVjdFxuICAgICAgICBdLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgJ2VsZW1lbnRzJyBrZXkgb25seSB3b3JrcyB3aXRoICdfdHlwZScgZXF1YWwgdG8gJ0FycmF5JyBvciAnT2JqZWN0Jy4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHZhbHVlVHlwZSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbbW9kdWxlTmFtZV07XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGlucHV0Q29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBkZWxldGUgY29uZmlnLmV4dGVuc2lvblNsb3RzO1xuICAgIHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGVJbXBsaWNpdFNjaGVtYShtb2R1bGVOYW1lLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhpbXBsaWNpdENvbmZpZ1NjaGVtYSwgaW5wdXRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoaW1wbGljaXRDb25maWdTY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGFsbENvbmZpZ3MpIHtcbiAgICBjb25zdCBhbGxDb25maWdzRm9yTW9kdWxlID0gYWxsQ29uZmlncy5tYXAoKHsgW21vZHVsZU5hbWVdOiBjIH0pPT5jKS5maWx0ZXIoKGMpPT4hIWMpO1xuICAgIHJldHVybiBtZXJnZUNvbmZpZ3MoYWxsQ29uZmlnc0Zvck1vZHVsZSk7XG59XG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3MoY29uZmlncykge1xuICAgIGNvbnN0IG1lcmdlRGVlcEFsbCA9IHJlZHVjZShtZXJnZURlZXBSaWdodCk7XG4gICAgcmV0dXJuIG1lcmdlRGVlcEFsbCh7fSwgY29uZmlncyk7XG59XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWcgdHJlZSB0byBtYWtlIHN1cmUgdGhhdCBhbGxcbiAqIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGV4aXN0IGluIHRoZSBzY2hlbWEsIGFuZCB0aGF0IHR5cGVzIGFyZVxuICogY29ycmVjdC4gRG9lcyBub3QgcnVuIHZhbGlkYXRvcnMgeWV0LCBzaW5jZSB0aG9zZSB3aWxsIGJlIHJ1biBvblxuICogdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0cyBmaWxsZWQgaW4uXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb25maWcsIGtleVBhdGggPSAnJykge1xuICAgIC8vIHZhbGlkYXRlIGVhY2ggY29uc3RpdHVlbnQgZWxlbWVudFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhcnQgPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKCFzY2hlbWEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5ID09PSAnZXh0ZW5zaW9uU2xvdHMnICYmIGtleVBhdGggIT09ICcnKSkge1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKHRoaXNLZXlQYXRoLCBgVW5rbm93biBjb25maWcga2V5ICcke3RoaXNLZXlQYXRofScgcHJvdmlkZWQuIElnbm9yaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNoZWNrVHlwZShrZXlQYXRoLCBzY2hlbWFQYXJ0Ll90eXBlLCB2YWx1ZSk7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLk9iamVjdCkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgZnJlZWZvcm0gb2JqZWN0XG4gICAgICAgICAgICB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICghKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX3R5cGUnKSkpIHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGFzIG5vcm1hbCBuZXN0ZWQgY29uZmlnXG4gICAgICAgICAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2NoZW1hUGFydC5fdHlwZSA9PT0gVHlwZS5BcnJheSkge1xuICAgICAgICAgICAgdmFsaWRhdGVBcnJheVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLCBjb25maWcsIGtleVBhdGgpIHtcbiAgICBpZiAoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLl9lbGVtZW50cywgdmFsdWUsIGAke2tleVBhdGh9LiR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVBcnJheVN0cnVjdHVyZShhcnJheVNjaGVtYSwgdmFsdWUsIGtleVBhdGgpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWRBc0FycmF5ID0gY2hlY2tUeXBlKGtleVBhdGgsIFR5cGUuQXJyYXksIHZhbHVlKTtcbiAgICBpZiAoIXZhbGlkYXRlZEFzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBhcnJheSBlbGVtZW50IG9iamVjdCBzY2hlbWEsIHZlcmlmeSB0aGF0IGVsZW1lbnRzIG1hdGNoIGl0XG4gICAgaWYgKGhhc09iamVjdFNjaGVtYShhcnJheVNjaGVtYS5fZWxlbWVudHMpKSB7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShhcnJheVNjaGVtYS5fZWxlbWVudHMsIHZhbHVlW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNoZWNrVHlwZShgJHtrZXlQYXRofVske2l9XWAsIGFycmF5U2NoZW1hLl9lbGVtZW50cz8uX3R5cGUsIHZhbHVlW2ldKTtcbiAgICB9XG59XG4vKipcbiAqIFJ1biBhbGwgdGhlIHZhbGlkYXRvcnMgaW4gdGhlIGNvbmZpZyB0cmVlLiBUaGlzIHNob3VsZCBiZSBydW5cbiAqIG9uIHRoZSBjb25maWcgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGZpbGxlZCBpbiB3aXRoIGFsbCB0aGUgZGVmYXVsdHMsIHNpbmNlXG4gKiBoaWdoZXItbGV2ZWwgdmFsaWRhdG9ycyBtYXkgcmVmZXIgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gKi8gZnVuY3Rpb24gcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gSWYgYCFzY2hlbWFgLCB0aGVyZSBzaG91bGQgaGF2ZSBiZWVuIGEgc3RydWN0dXJhbCB2YWxpZGF0aW9uIGVycm9yIHByaW50ZWQgYWxyZWFkeS5cbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IHNjaGVtYS5fZGVmYXVsdCkge1xuICAgICAgICAgICAgcnVuVmFsaWRhdG9ycyhrZXlQYXRoLCBzY2hlbWEuX3ZhbGlkYXRvcnMsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuX3R5cGUgPT09IFR5cGUuT2JqZWN0ICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25maWcpICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLl9lbGVtZW50cywgY29uZmlnW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSdW4gdHlwZSB2YWxpZGF0aW9uIGZvciB0aGUgdmFsdWUsIGxvZ2dpbmcgYW55IGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZXMsIGZhbHNlIG90aGVyd2lzZVxuICovIGZ1bmN0aW9uIGNoZWNrVHlwZShrZXlQYXRoLCBfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoX3R5cGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB7XG4gICAgICAgICAgICBBcnJheTogaXNBcnJheSxcbiAgICAgICAgICAgIEJvb2xlYW46IGlzQm9vbGVhbixcbiAgICAgICAgICAgIENvbmNlcHRVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBOdW1iZXI6IGlzTnVtYmVyLFxuICAgICAgICAgICAgT2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgICAgIFN0cmluZzogaXNTdHJpbmcsXG4gICAgICAgICAgICBVVUlEOiBpc1V1aWQsXG4gICAgICAgICAgICBQZXJzb25BdHRyaWJ1dGVUeXBlVXVpZDogaXNVdWlkLFxuICAgICAgICAgICAgUGF0aWVudElkZW50aWZpZXJUeXBlVXVpZDogaXNVdWlkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIFtcbiAgICAgICAgICAgIHZhbGlkYXRvcltfdHlwZV1cbiAgICAgICAgXSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogUnVucyB2YWxpZGF0b3JzLCBsb2dnaW5nIGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG5mdW5jdGlvbiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHZhbGlkYXRvcnMsIHZhbHVlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICBpZiAodmFsaWRhdG9ycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3JSZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gYEludmFsaWQgY29uZmlndXJhdGlvbiBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YCA6IGBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmFsdWUgJHt2YWx1ZX0gZm9yICR7a2V5UGF0aH06ICR7dmFsaWRhdG9yUmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU2tpcHBpbmcgaW52YWxpZCB2YWxpZGF0b3IgYXQgXCIke2tleVBhdGh9XCIuIEVuY291bnRlcmVkIGVycm9yXFxuXFx0JHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbi8vIFJlY3Vyc2l2ZWx5IGZpbGwgaW4gdGhlIGNvbmZpZyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEuXG5jb25zdCBzZXREZWZhdWx0cyA9IChzY2hlbWEsIGlucHV0Q29uZmlnKT0+e1xuICAgIGNvbnN0IGNvbmZpZyA9IGNsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ29waWVkIG92ZXIgZnJvbSBlc20tZXh0ZW5zaW9ucy4gSXQgcmlnaHRseSBiZWxvbmdzIHRvIHRoYXQgbW9kdWxlLCBidXQgZXNtLWNvbmZpZ1xuICogY2Fubm90IGRlcGVuZCBvbiBlc20tZXh0ZW5zaW9ucy5cbiAqLyBmdW5jdGlvbiBnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgW2V4dGVuc2lvbk5hbWVdID0gZXh0ZW5zaW9uSWQuc3BsaXQoJyMnKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uTmFtZTtcbn1cbi8qKlxuICogVGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBzY2hlbWEgaXMgdXNlZCBpbiB0aGUgaW1wbGljaXQgc2NoZW1hIGdpdmVuIHRvIGV2ZXJ5IG1vZHVsZTtcbiAqIHBsdXMgYW55IGFkZGl0aW9uYWwgdHJhbnNsYXRpb24gbmFtZXNwYWNlcyAoYXQgdGltZSBvZiB3cml0aW5nLCB0aGlzIGlzIGp1c3QgJ2NvcmUnKS5cbiAqLyBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlc1NjaGVtYSA9IHtcbiAgICAnVHJhbnNsYXRpb24gb3ZlcnJpZGVzJzoge1xuICAgICAgICBfZGVzY3JpcHRpb246ICdQZXItbGFuZ3VhZ2Ugb3ZlcnJpZGVzIGZvciBmcm9udGVuZCB0cmFuc2xhdGlvbnMgc2hvdWxkIGJlIGtleWVkIGJ5IGxhbmd1YWdlIGNvZGUgYW5kIGVhY2ggbGFuZ3VhZ2UgZGljdGlvbmFyeSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24ga2V5IGFuZCB0aGUgZGlzcGxheSB2YWx1ZScsXG4gICAgICAgIF90eXBlOiBUeXBlLk9iamVjdCxcbiAgICAgICAgX2RlZmF1bHQ6IHt9LFxuICAgICAgICBfdmFsaWRhdG9yczogW1xuICAgICAgICAgICAgdmFsaWRhdG9yKChvKT0+T2JqZWN0LmtleXMobykuZXZlcnkoKGspPT4vXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpLCAobyk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBiYWRLZXlzID0gT2JqZWN0LmtleXMobykuZmlsdGVyKChrKT0+IS9eW2Etel17MiwzfSgtW0EtWl17MiwzfSk/JC8udGVzdChrKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBUaGUgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcycgb2JqZWN0IHNob3VsZCBoYXZlIGxhbmd1YWdlIGNvZGVzIGZvciBrZXlzLiBMYW5ndWFnZSBjb2RlcyBtdXN0IGJlIGluIHRoZSBmb3JtIG9mIGEgdHdvLXRvLXRocmVlIGxldHRlciBsYW5ndWFnZSBjb2RlIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBoeXBoZW4gYW5kIGEgdHdvLXRvLXRocmVlIGxldHRlciBjb3VudHJ5IGNvZGUuIFRoZSBmb2xsb3dpbmcga2V5cyBkbyBub3QgY29uZm9ybTogJHtiYWRLZXlzLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxufTtcbi8qKlxuICogVGhlIGltcGxpY2l0Q29uZmlnU2NoZW1hIGlzIGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gZXZlcnkgY29uZmlndXJhdGlvbiBzY2hlbWFcbiAqLyBjb25zdCBpbXBsaWNpdENvbmZpZ1NjaGVtYSA9IHtcbiAgICAnRGlzcGxheSBjb25kaXRpb25zJzoge1xuICAgICAgICBwcml2aWxlZ2VzOiB7XG4gICAgICAgICAgICBfZGVzY3JpcHRpb246ICdUaGUgcHJpdmlsZWdlKHMpIHRoZSB1c2VyIG11c3QgaGF2ZSB0byB1c2UgdGhpcyBleHRlbnNpb24nLFxuICAgICAgICAgICAgX3R5cGU6IFR5cGUuQXJyYXksXG4gICAgICAgICAgICBfZGVmYXVsdDogW11cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmUiLCJyZWR1Y2UiLCJtZXJnZURlZXBSaWdodCIsImVxdWFscyIsIm9taXQiLCJUeXBlIiwiaXNBcnJheSIsImlzQm9vbGVhbiIsImlzVXVpZCIsImlzTnVtYmVyIiwiaXNPYmplY3QiLCJpc1N0cmluZyIsInZhbGlkYXRvciIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsImdldENvbmZpZ1N0b3JlIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnIiwiZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwiaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlIiwidGVtcG9yYXJ5Q29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwiY29tcHV0ZU1vZHVsZUNvbmZpZyIsImdldFN0YXRlIiwic3Vic2NyaWJlIiwiY29uZmlnU3RhdGUiLCJ0ZW1wQ29uZmlnU3RhdGUiLCJjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyIsImNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyIsImNvbXB1dGVFeHRlbnNpb25Db25maWdzIiwiZXh0ZW5zaW9uU3RhdGUiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIm1vZHVsZU5hbWUiLCJPYmplY3QiLCJrZXlzIiwic2NoZW1hcyIsIm1vZHVsZVN0b3JlIiwibW9kdWxlTG9hZGVkIiwiY29uZmlnIiwiZ2V0Q29uZmlnRm9yTW9kdWxlIiwic2V0U3RhdGUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCIsImxvYWRlZCIsImdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hIiwic2xvdENvbmZpZ3MiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlncyIsIm5ld1Nsb3RTdG9yZUVudHJpZXMiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJzbG90TmFtZSIsInNsb3RTdG9yZSIsIm9sZFN0YXRlIiwibmV3U3RhdGUiLCJzbG90cyIsImdldEltcGxlbWVudGVyVG9vbHNDb25maWciLCJjb25maWdzIiwiZXh0ZW5zaW9uIiwibW91bnRlZEV4dGVuc2lvbnMiLCJjb21wdXRlRXh0ZW5zaW9uQ29uZmlnIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiZXh0ZW5zaW9uSWQiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsImVycm9yIiwicHJvdmlkZSIsInNvdXJjZU5hbWUiLCJwcm92aWRlZENvbmZpZ3MiLCJzb3VyY2UiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInN0b3JlIiwidXBkYXRlIiwidW5zdWJzY3JpYmUiLCJnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyIsInByb21pc2VzIiwiY29uZmlnU3RvcmUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlcyIsInB1c2giLCJhbGwiLCJwcm9jZXNzQ29uZmlnIiwicHJvdmlkZWRDb25maWciLCJrZXlQYXRoQ29udGV4dCIsInZhbGlkYXRlU3RydWN0dXJlIiwic2V0RGVmYXVsdHMiLCJydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsIm5hbWVPZlNjaGVtYVNvdXJjZSIsImdldFByb3ZpZGVkQ29uZmlncyIsInNsb3RNb2R1bGVDb25maWciLCJtZXJnZUNvbmZpZ3NGb3IiLCJjb25maWdPdmVycmlkZSIsImV4dGVuc2lvblNsb3RzIiwiY29uZmlndXJlIiwiZXh0ZW5zaW9uQ29uZmlnIiwiY29tYmluZWRDb25maWciLCJtZXJnZUNvbmZpZ3MiLCJyZXN1bHQiLCJnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyIsImNvbmZpZ3NBbmRTb3VyY2VzIiwiYyIsImNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlIiwiaGFzT3duUHJvcGVydHkiLCJfdmFsdWUiLCJfZGVmYXVsdCIsIl9zb3VyY2UiLCJpc09yZGluYXJ5T2JqZWN0Iiwib2JqIiwia2V5IiwiYWxsQ29uZmlncyIsInNsb3RDb25maWdQZXJNb2R1bGUiLCJ2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzIiwiY29uZmlnQnlTbG90TmFtZSIsInZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyIsImtleVBhdGgiLCJlcnJvclByZWZpeCIsImludmFsaWRLZXlzIiwiZmlsdGVyIiwiayIsImluY2x1ZGVzIiwibGVuZ3RoIiwibG9nRXJyb3IiLCJqb2luIiwiYWRkIiwiQXJyYXkiLCJldmVyeSIsIm4iLCJyZW1vdmUiLCJvcmRlciIsInVwZGF0ZU1lc3NhZ2UiLCJzdGFydHNXaXRoIiwidGhpc0tleVBhdGgiLCJzY2hlbWFQYXJ0IiwiZWxlbWVudHMiLCJfZWxlbWVudHMiLCJoYXNPYmplY3RTY2hlbWEiLCJfdmFsaWRhdG9ycyIsInZhbHVlVHlwZSIsIl90eXBlIiwidmFsdWVzIiwiSlNPTiIsInN0cmluZ2lmeSIsImlucHV0Q29uZmlnIiwiYWxsQ29uZmlnc0Zvck1vZHVsZSIsIm1lcmdlRGVlcEFsbCIsInZhbHVlIiwidmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUiLCJjaGVja1R5cGUiLCJ2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlIiwidmFsaWRhdGVBcnJheVN0cnVjdHVyZSIsImZyZWVmb3JtT2JqZWN0U2NoZW1hIiwiYXJyYXlTY2hlbWEiLCJ2YWxpZGF0ZWRBc0FycmF5IiwiaSIsInJ1blZhbGlkYXRvcnMiLCJCb29sZWFuIiwiQ29uY2VwdFV1aWQiLCJOdW1iZXIiLCJTdHJpbmciLCJVVUlEIiwiUGVyc29uQXR0cmlidXRlVHlwZVV1aWQiLCJQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkIiwidmFsaWRhdG9ycyIsInJldHVyblZhbHVlIiwidmFsaWRhdG9yUmVzdWx0IiwibWVzc2FnZSIsImUiLCJjb25maWdQYXJ0IiwiY29uZmlnV2l0aERlZmF1bHRzIiwiY29uZiIsIm9iamVjdEtleSIsInNlbGVjdGVkQ29uZmlnUGFydCIsImVsZW1lbnRzU2NoZW1hIiwiZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzIiwiU2V0IiwiaGFzIiwiY2xlYXJDb25maWdFcnJvcnMiLCJmb3JFYWNoIiwiZGVsZXRlIiwiY2xlYXIiLCJzcGxpdCIsIl9kZXNjcmlwdGlvbiIsIm8iLCJ0ZXN0IiwiYmFkS2V5cyIsInByaXZpbGVnZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n");
158
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearConfigErrors: () => (/* binding */ clearConfigErrors),\n/* harmony export */ defineConfigSchema: () => (/* binding */ defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* binding */ defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* binding */ getConfig),\n/* harmony export */ getTranslationOverrides: () => (/* binding */ getTranslationOverrides),\n/* harmony export */ processConfig: () => (/* binding */ processConfig),\n/* harmony export */ provide: () => (/* binding */ provide),\n/* harmony export */ registerModuleLoad: () => (/* binding */ registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* binding */ registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* binding */ registerTranslationNamespace),\n/* harmony export */ resetConfigSystem: () => (/* binding */ resetConfigSystem)\n/* harmony export */ });\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/equals.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/mergeDeepRight.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/omit.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/clone.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/reduce.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types.js */ \"../../framework/esm-config/dist/types.js\");\n/* harmony import */ var _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validators/type-validators.js */ \"../../framework/esm-config/dist/validators/type-validators.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _state_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/** @module @category Config */ \n\n\n\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ // Store unsubscribe functions to allow cleanup (e.g., in tests or hot module reloading)\nconst configSubscriptions = [];\n/**\n * Recomputes all configuration derived stores based on current state of input stores.\n * Called whenever any input store (configInternalStore, temporaryConfigStore, configExtensionStore) changes.\n */ function recomputeAllConfigs() {\n const configState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n const tempConfigState = _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState();\n const extensionState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState();\n computeModuleConfig(configState, tempConfigState);\n computeImplementerToolsConfig(configState, tempConfigState);\n computeExtensionSlotConfigs(configState, tempConfigState);\n computeExtensionConfigs(configState, extensionState, tempConfigState);\n}\nfunction setupConfigSubscriptions() {\n // Initial computation\n recomputeAllConfigs();\n // Subscribe to all input stores with a single handler\n // This ensures we only recompute once even if multiple stores change simultaneously\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n for (let moduleName of Object.keys(state.schemas)){\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n const moduleStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n let newState;\n if (state.moduleLoaded[moduleName]) {\n const config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config\n };\n } else {\n const config = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config\n };\n }\n moduleStore.setState(newState);\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n const slotConfigs = getExtensionSlotConfigs(state, tempState);\n const newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(([slotName, config])=>[\n slotName,\n {\n loaded: true,\n config\n }\n ]));\n const slotStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionSlotsConfigStore)();\n const oldState = slotStore.getState();\n const newState = {\n slots: {\n ...oldState.slots,\n ...newSlotStoreEntries\n }\n };\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n const oldState = _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.getState();\n const config = getImplementerToolsConfig(state, tempConfigState);\n const newState = {\n config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.config, newState.config)) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n const configs = {};\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for (let extension of extensionState.mountedExtensions){\n const config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n if (!configs[extension.slotName]) {\n configs[extension.slotName] = {};\n }\n configs[extension.slotName][extension.extensionId] = {\n config,\n loaded: true\n };\n }\n const extensionsConfigStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionsConfigStore)();\n const oldState = extensionsConfigStore.getState();\n const newState = {\n configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.configs, newState.configs)) {\n extensionsConfigStore.setState(newState);\n }\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: enhancedSchema\n },\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: implicitConfigSchema\n }\n }));\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [namespace]: translationOverridesSchema\n }\n }));\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries being returned\n * by `setupOpenMRS`.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n const state = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(`Config schema for extension ${extensionName} already exists. If there are multiple extensions with this same name, one will probably crash.`);\n }\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [extensionName]: enhancedSchema\n }\n }));\n}\nfunction provide(config, sourceName = 'provided') {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n providedConfigs: [\n ...state.providedConfigs,\n {\n source: sourceName,\n config\n }\n ]\n }));\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise((resolve)=>{\n const store = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.loaded && state.config) {\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_6__[\"default\"])([\n 'Display conditions',\n 'Translation overrides'\n ], state.config);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n/** @internal */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n const promises = [\n new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionConfig)(slotName, extensionId);\n function update(state) {\n if (state.loaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-deparated string which helps the user figure out where\n * the provided config came from\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n const extensionName = getExtensionNameFromId(extensionId);\n const extensionConfigSchema = configState.schemas[extensionName];\n const nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n const providedConfigs = getProvidedConfigs(configState, tempConfigState);\n const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n const configOverride = slotModuleConfig?.extensionSlots?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n const combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n const schema = extensionConfigSchema ?? configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n const config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n let result = getSchemaWithValuesAndSources((0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(configState.schemas));\n const configsAndSources = [\n ...configState.providedConfigs.map((c)=>[\n c.config,\n c.source\n ]),\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ];\n for (let [config, source] of configsAndSources){\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return {\n ...schema,\n _value: schema._default,\n _source: 'default'\n };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key)=>{\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key)=>{\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n const allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n const slotConfigPerModule = Object.keys(allConfigs).reduce((obj, key)=>{\n if (allConfigs[key]?.extensionSlots) {\n obj[key] = allConfigs[key]?.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n const slotConfigs = Object.keys(slotConfigPerModule).reduce((obj, key)=>{\n obj = {\n ...obj,\n ...slotConfigPerModule[key]\n };\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n for (let [moduleName, configBySlotName] of Object.entries(slotConfigPerModule)){\n for (let [slotName, config] of Object.entries(configBySlotName)){\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n const keyPath = `${moduleName}.extensionSlots.${slotName}`;\n const errorPrefix = `Extension slot config '${keyPath}'`;\n const invalidKeys = Object.keys(config).filter((k)=>![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k));\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`);\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.add' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.remove' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.order' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + `.configure' is invalid. Must be an object with extension IDs for keys`);\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return [\n ...configState.providedConfigs.map((c)=>c.config),\n tempConfigState.config\n ];\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema, keyPath = '') {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n for (const key of Object.keys(schema).filter((k)=>!k.startsWith('_'))){\n const thisKeyPath = keyPath + (keyPath && '.') + key;\n const schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(`${moduleName} declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ${updateMessage}`);\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(`${moduleName} declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ${updateMessage}`);\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`);\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators){\n if (typeof validator !== 'function') {\n console.error(`${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: validators must be functions that return either ` + `undefined or an error string. Received ${validator}.`);\n }\n }\n }\n const valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).includes(valueType)) {\n console.error(`${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).join(', ')}. ` + `Received '${valueType}'`);\n }\n if (Object.keys(schemaPart).every((k)=>[\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k)) && !keyPath.includes('._elements')) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: all config elements must have a default. ` + `Received ${JSON.stringify(schemaPart)}`);\n }\n if (elements && valueType && ![\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object\n ].includes(valueType)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` + `Received ${JSON.stringify(valueType)}`);\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n const schema = configState.schemas[moduleName];\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n const config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n const allConfigsForModule = allConfigs.map(({ [moduleName]: c })=>c).filter((c)=>!!c);\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n const mergeDeepAll = (0,ramda__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n return mergeDeepAll({}, configs);\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config, keyPath = '') {\n // validate each constituent element\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, `Unknown config key '${thisKeyPath}' provided. Ignoring.`);\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n for (const key of Object.keys(config)){\n const value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n const validatedAsArray = checkType(keyPath, _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(let i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n for(let i = 0; i < value.length; i++){\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config, keyPath = '') {\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (schema._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(let i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], `${keyPath}[${i}]`);\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n const validator = {\n Array: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isArray,\n Boolean: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean,\n ConceptUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n Number: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isNumber,\n Object: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isObject,\n String: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isString,\n UUID: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid\n };\n return runValidators(keyPath, [\n validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n let returnValue = true;\n if (validators) {\n try {\n for (let validator of validators){\n const validatorResult = validator(value);\n if (typeof validatorResult === 'string') {\n const message = typeof value === 'object' ? `Invalid configuration for ${keyPath}: ${validatorResult}` : `Invalid configuration value ${value} for ${keyPath}: ${validatorResult}`;\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\". Encountered error\\n\\t${e}`);\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (schema, inputConfig)=>{\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(inputConfig);\n if (!schema) {\n return config;\n }\n for (const key of Object.keys(schema)){\n const configPart = config[key];\n const schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array && Array.isArray(configPart)) {\n const configWithDefaults = configPart.map((conf)=>setDefaults(elements, conf));\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n for (let objectKey of Object.keys(configPart)){\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = configPart ?? {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter((e)=>![\n '_default',\n '_validators'\n ].includes(e)).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ let displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n const key = `${keyPath}:::${message}`;\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach((key)=>{\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Cleans up all config store subscriptions and re-establishes them. This is primarily\n * useful for testing, where subscriptions set up at module load time need to be cleared\n * between tests to prevent infinite update loops. After clearing, subscriptions are\n * re-established so the config system continues to work normally.\n *\n * @internal\n */ function resetConfigSystem() {\n configSubscriptions.forEach((unsubscribe)=>unsubscribe());\n configSubscriptions.length = 0;\n setupConfigSubscriptions();\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ const translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator)((o)=>Object.keys(o).every((k)=>/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k)), (o)=>{\n const badKeys = Object.keys(o).filter((k)=>!/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k));\n return `The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: ${badKeys.join(', ')}.`;\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ const implicitConfigSchema = {\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.String,\n _default: undefined\n }\n },\n ...translationOverridesSchema\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBNkIsR0FBdUU7QUFDakU7QUFDeUU7QUFDckQ7QUFDK0o7QUFDdE47Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FBRyx3RkFBd0Y7QUFDNUYsTUFBTXFCLHNCQUFzQixFQUFFO0FBQzlCOzs7Q0FHQyxHQUFHLFNBQVNDO0lBQ1QsTUFBTUMsY0FBY1QsMERBQW1CQSxDQUFDVSxRQUFRO0lBQ2hELE1BQU1DLGtCQUFrQkwsMkRBQW9CQSxDQUFDSSxRQUFRO0lBQ3JELE1BQU1FLGlCQUFpQmIsMkRBQW9CQSxDQUFDVyxRQUFRO0lBQ3BERyxvQkFBb0JKLGFBQWFFO0lBQ2pDRyw4QkFBOEJMLGFBQWFFO0lBQzNDSSw0QkFBNEJOLGFBQWFFO0lBQ3pDSyx3QkFBd0JQLGFBQWFHLGdCQUFnQkQ7QUFDekQ7QUFDQSxTQUFTTTtJQUNMLHNCQUFzQjtJQUN0QlQ7SUFDQSxzREFBc0Q7SUFDdEQsb0ZBQW9GO0lBQ3BGRCxvQkFBb0JXLElBQUksQ0FBQ2xCLDBEQUFtQkEsQ0FBQ21CLFNBQVMsQ0FBQ1g7SUFDdkRELG9CQUFvQlcsSUFBSSxDQUFDWiwyREFBb0JBLENBQUNhLFNBQVMsQ0FBQ1g7SUFDeERELG9CQUFvQlcsSUFBSSxDQUFDbkIsMkRBQW9CQSxDQUFDb0IsU0FBUyxDQUFDWDtBQUM1RDtBQUNBLDJDQUEyQztBQUMzQ1M7QUFDQSxTQUFTSixvQkFBb0JPLEtBQUssRUFBRUMsU0FBUztJQUN6QyxLQUFLLElBQUlDLGNBQWNDLE9BQU9DLElBQUksQ0FBQ0osTUFBTUssT0FBTyxFQUFFO1FBQzlDLG9GQUFvRjtRQUNwRixtRkFBbUY7UUFDbkYsb0ZBQW9GO1FBQ3BGLGlGQUFpRjtRQUNqRixrRkFBa0Y7UUFDbEYsZ0RBQWdEO1FBQ2hELE1BQU1DLGNBQWN6Qix5REFBY0EsQ0FB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QUFTQSxDQUFDLENBQUM2TCxJQUFJcEssT0FBT0MsSUFBSSxDQUFDbUssR0FBRzFELEtBQUssQ0FBQyxDQUFDUCxJQUFJLDZCQUE2QmtFLElBQUksQ0FBQ2xFLEtBQUssQ0FBQ2lFO2dCQUM3RSxNQUFNRSxVQUFVdEssT0FBT0MsSUFBSSxDQUFDbUssR0FBR2xFLE1BQU0sQ0FBQyxDQUFDQyxJQUFJLENBQUMsNkJBQTZCa0UsSUFBSSxDQUFDbEU7Z0JBQzlFLE9BQU8sQ0FBQyw2UEFBNlAsRUFBRW1FLFFBQVEvRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaFM7U0FDSDtJQUNMO0FBQ0o7QUFDQTs7Q0FFQyxHQUFHLE1BQU1wRSx1QkFBdUI7SUFDN0Isc0JBQXNCO1FBQ2xCb0ksWUFBWTtZQUNSSixjQUFjO1lBQ2Q1QyxPQUFPdkosMkNBQUlBLENBQUN5SSxLQUFLO1lBQ2pCcEIsVUFBVSxFQUFFO1FBQ2hCO1FBQ0FtRixZQUFZO1lBQ1JMLGNBQWM7WUFDZDVDLE9BQU92SiwyQ0FBSUEsQ0FBQzJLLE1BQU07WUFDbEJ0RCxVQUFVb0Y7UUFDZDtJQUNKO0lBQ0EsR0FBR2pJLDBCQUEwQjtBQUNqQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/OGRmZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lLCBlcXVhbHMsIHJlZHVjZSwgbWVyZ2VEZWVwUmlnaHQsIG9taXQgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzQm9vbGVhbiwgaXNVdWlkLCBpc051bWJlciwgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdHlwZS12YWxpZGF0b3JzLmpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi4vdmFsaWRhdG9ycy92YWxpZGF0b3IuanNcIjtcbmltcG9ydCB7IGNvbmZpZ0V4dGVuc2lvblN0b3JlLCBjb25maWdJbnRlcm5hbFN0b3JlLCBnZXRDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uQ29uZmlnLCBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUsIGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUgfSBmcm9tIFwiLi9zdGF0ZS5qc1wiO1xuLyoqXG4gKiBTdG9yZSBzZXR1cFxuICpcbiAqXG4gKiBTZXQgdXAgc3RvcmVzIGFuZCBzdWJzY3JpcHRpb25zIHNvIHRoYXQgaW5wdXRzIGdldCBwcm9jZXNzZWQgYXBwcm9wcmlhdGVseS5cbiAqXG4gKiBUaGVyZSBhcmUgKmlucHV0KiBzdG9yZXMgYW5kICpvdXRwdXQqIHN0b3Jlcy4gVGhlICppbnB1dCogc3RvcmVzXG4gKiBhcmUgY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGFuZCBjb25maWdFeHRlbnNpb25TdG9yZS4gVGhlXG4gKiBvdXRwdXQgc3RvcmVzIGFyZSBzZXQgaW4gdGhlIGBjb21wdXRlLi4uYCBmdW5jdGlvbnMuIFRoZXkgYXJlIHRoZSBtb2R1bGVcbiAqIGNvbmZpZyBzdG9yZXMsIHRoZSBleHRlbnNpb24gc2xvdCBjb25maWcgc3RvcmVzIChieSBtb2R1bGUpLCB0aGUgZXh0ZW5zaW9uXG4gKiBjb25maWcgc3RvcmVzLCBhbmQgdGhlIGltcGxlbWVudGVyIHRvb2xzIGNvbmZpZyBzdG9yZS5cbiAqXG4gKiBUaGlzIGNvZGUgc2V0cyB1cCB0aGUgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IHdoZW4gYW4gaW5wdXQgc3RvcmUgY2hhbmdlcyxcbiAqIHRoZSBjb3JyZWN0IHNldCBvZiBvdXRwdXQgc3RvcmVzIGFyZSB1cGRhdGVkLlxuICpcbiAqIEFsbCBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zIGV4Y2VwdCBgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3NgIGFyZSBwdXJlXG4gKiAob3IgYXJlIHN1cHBvc2VkIHRvIGJlKSwgb3RoZXIgdGhhbiB0aGUgZmFjdCB0aGF0IHRoZXkgYWxsIGBzZXRTdGF0ZWBcbiAqIHN0b3JlIHZhbHVlcyBhdCB0aGUgZW5kLiBgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3NgIGNhbGxzIGBnZXRHbG9iYWxTdG9yZWAsXG4gKiB3aGljaCBjcmVhdGVzIHN0b3Jlcy5cbiAqLyAvLyBTdG9yZSB1bnN1YnNjcmliZSBmdW5jdGlvbnMgdG8gYWxsb3cgY2xlYW51cCAoZS5nLiwgaW4gdGVzdHMgb3IgaG90IG1vZHVsZSByZWxvYWRpbmcpXG5jb25zdCBjb25maWdTdWJzY3JpcHRpb25zID0gW107XG4vKipcbiAqIFJlY29tcHV0ZXMgYWxsIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBzdG9yZXMgYmFzZWQgb24gY3VycmVudCBzdGF0ZSBvZiBpbnB1dCBzdG9yZXMuXG4gKiBDYWxsZWQgd2hlbmV2ZXIgYW55IGlucHV0IHN0b3JlIChjb25maWdJbnRlcm5hbFN0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSwgY29uZmlnRXh0ZW5zaW9uU3RvcmUpIGNoYW5nZXMuXG4gKi8gZnVuY3Rpb24gcmVjb21wdXRlQWxsQ29uZmlncygpIHtcbiAgICBjb25zdCBjb25maWdTdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB0ZW1wQ29uZmlnU3RhdGUgPSB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGV4dGVuc2lvblN0YXRlID0gY29uZmlnRXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb21wdXRlTW9kdWxlQ29uZmlnKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyhjb25maWdTdGF0ZSwgZXh0ZW5zaW9uU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG59XG5mdW5jdGlvbiBzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMoKSB7XG4gICAgLy8gSW5pdGlhbCBjb21wdXRhdGlvblxuICAgIHJlY29tcHV0ZUFsbENvbmZpZ3MoKTtcbiAgICAvLyBTdWJzY3JpYmUgdG8gYWxsIGlucHV0IHN0b3JlcyB3aXRoIGEgc2luZ2xlIGhhbmRsZXJcbiAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugb25seSByZWNvbXB1dGUgb25jZSBldmVuIGlmIG11bHRpcGxlIHN0b3JlcyBjaGFuZ2Ugc2ltdWx0YW5lb3VzbHlcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnSW50ZXJuYWxTdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaCh0ZW1wb3JhcnlDb25maWdTdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaChjb25maWdFeHRlbnNpb25TdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xufVxuLy8gU2V0IHVwIHN1YnNjcmlwdGlvbnMgYXQgbW9kdWxlIGxvYWQgdGltZVxuc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG5mdW5jdGlvbiBjb21wdXRlTW9kdWxlQ29uZmlnKHN0YXRlLCB0ZW1wU3RhdGUpIHtcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIG9mIE9iamVjdC5rZXlzKHN0YXRlLnNjaGVtYXMpKXtcbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc2NoZW1hIGNvdWxkIGJlIGVpdGhlciBqdXN0IHRoZSBpbXBsaWNpdCBzY2hlbWEgb3IgdGhlIGFjdHVhbGx5XG4gICAgICAgIC8vIGRlZmluZWQgc2NoZW1hLiBXZSBydW4gd2l0aCBqdXN0IHRoZSBpbXBsaWNpdCBzY2hlbWEgYmVjYXVzZSB3ZSB3YW50IHRvIHBvcHVsYXRlXG4gICAgICAgIC8vIHRoZSBjb25maWcgc3RvcmUgd2l0aCB0aGUgdHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFzIHNvb24gYXMgcG9zc2libGUuIEluIGZhY3QsIHRoZVxuICAgICAgICAvLyB0cmFuc2xhdGlvbiBzeXN0ZW0gd2lsbCB0aHJvdyBmb3IgU3VzcGVuc2UgdW50aWwgdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcmVcbiAgICAgICAgLy8gYXZhaWxhYmxlLCB3aGljaCBhcyBvZiB0aGlzIHdyaXRpbmcgYmxvY2tzIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIG9jY3VycmluZ1xuICAgICAgICAvLyBmb3IgbW9kdWxlcyBsb2FkZWQgYmFzZWQgb24gdGhlaXIgZXh0ZW5zaW9ucy5cbiAgICAgICAgY29uc3QgbW9kdWxlU3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgbGV0IG5ld1N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUubW9kdWxlTG9hZGVkW21vZHVsZU5hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBtb2R1bGVTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzKHN0YXRlLCB0ZW1wU3RhdGUpIHtcbiAgICBjb25zdCBzbG90Q29uZmlncyA9IGdldEV4dGVuc2lvblNsb3RDb25maWdzKHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgIGNvbnN0IG5ld1Nsb3RTdG9yZUVudHJpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2xvdENvbmZpZ3MpLm1hcCgoW3Nsb3ROYW1lLCBjb25maWddKT0+W1xuICAgICAgICAgICAgc2xvdE5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfVxuICAgICAgICBdKSk7XG4gICAgY29uc3Qgc2xvdFN0b3JlID0gZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IG9sZFN0YXRlID0gc2xvdFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAuLi5vbGRTdGF0ZS5zbG90cyxcbiAgICAgICAgICAgIC4uLm5ld1Nsb3RTdG9yZUVudHJpZXNcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFlcXVhbHMob2xkU3RhdGUuc2xvdHMsIG5ld1N0YXRlLnNsb3RzKSkge1xuICAgICAgICBzbG90U3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKHN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIGNvbmZpZ1xuICAgIH07XG4gICAgLy8gVXNlIGRlZXAgZXF1YWxpdHkgb24gdGhlIGFjdHVhbCBjb25maWcgY29udGVudCwgbm90IHRoZSB3cmFwcGVyIG9iamVjdFxuICAgIGlmICghZXF1YWxzKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWVxdWFscyhvbGRTdGF0ZS5jb25maWdzLCBuZXdTdGF0ZS5jb25maWdzKSkge1xuICAgICAgICBleHRlbnNpb25zQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbi8qXG4gKiBBUElcbiAqXG4gKi8gLyoqXG4gKiBUaGlzIGRlZmluZXMgYSBjb25maWd1cmF0aW9uIHNjaGVtYSBmb3IgYSBtb2R1bGUuIFRoZSBzY2hlbWEgdGVsbHMgdGhlXG4gKiBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC4gSXQgc3BlY2lmaWVzXG4gKiB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBOYW1lIG9mIHRoZSBtb2R1bGUgdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci4gR2VuZXJhbGx5XG4gKiAgIHNob3VsZCBiZSB0aGUgb25lIGluIHdoaWNoIHRoZSBgZGVmaW5lQ29uZmlnU2NoZW1hYCBjYWxsIHRha2VzIHBsYWNlLlxuICogQHBhcmFtIHNjaGVtYSBUaGUgY29uZmlnIHNjaGVtYSBmb3IgdGhlIG1vZHVsZVxuICovIGV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hKSB7XG4gICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hKTtcbiAgICBjb25zdCBlbmhhbmNlZFNjaGVtYSA9IG1lcmdlRGVlcFJpZ2h0KHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBiZWluZyByZXR1cm5lZFxuICogICBieSBgc2V0dXBPcGVuTVJTYC5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBleHRlbnNpb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uQ29uZmlnU2NoZW1hKGV4dGVuc2lvbk5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKGV4dGVuc2lvbk5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSaWdodChzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZShjb25maWcsIHNvdXJjZU5hbWUgPSAncHJvdmlkZWQnKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBwcm92aWRlZENvbmZpZ3M6IFtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5wcm92aWRlZENvbmZpZ3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBBIHByb21pc2UtYmFzZWQgd2F5IHRvIGFjY2VzcyB0aGUgY29uZmlnIGFzIHNvb24gYXMgaXQgaXMgZnVsbHkgbG9hZGVkLlxuICogSWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQsIHJlc29sdmVzIHRoZSBjb25maWcgaW4gaXRzIHByZXNlbnQgc3RhdGUuXG4gKlxuICogVGhpcyBpcyBhIHVzZWZ1bCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBnZXQgdGhlIGNvbmZpZyBpbiB0aGUgY291cnNlXG4gKiBvZiB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBmb3Igd2hpY2ggdG8gbG9vayB1cCB0aGUgY29uZmlnXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZyhtb2R1bGVOYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+e1xuICAgICAgICBjb25zdCBzdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoc3RhdGUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sb2FkZWQgJiYgc3RhdGUuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gb21pdChbXG4gICAgICAgICAgICAgICAgICAgICdEaXNwbGF5IGNvbmRpdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAnVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ1xuICAgICAgICAgICAgICAgIF0sIHN0YXRlLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUoc3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHVwZGF0ZSk7XG4gICAgfSk7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1kZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NDb25maWcoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpIHtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIHByb3ZpZGVkQ29uZmlnLCBrZXlQYXRoQ29udGV4dCk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoc2NoZW1hLCBwcm92aWRlZENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIHJldHVybiBjb25maWc7XG59XG4vKlxuICogSGVscGVyIGZ1bmN0aW9uc1xuICpcbiAqLyAvKipcbiAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGV4dGVuc2lvbi4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmljXG4gKiB0byB0aGUgc2xvdCBpbiB3aGljaCBpdCBpcyBtb3VudGVkLCBhbmQgaXRzIElEIHdpdGhpbiB0aGF0IHNsb3QuXG4gKlxuICogVGhlIHNjaGVtYSBmb3IgdGhhdCBjb25maWd1cmF0aW9uIGlzIHRoZSBleHRlbnNpb24gc2NoZW1hLiBJZiBubyBleHRlbnNpb25cbiAqIHNjaGVtYSBoYXMgYmVlbiBwcm92aWRlZCwgdGhlIHNjaGVtYSB1c2VkIGlzIHRoZSBzY2hlbWEgb2YgdGhlIG1vZHVsZSBpblxuICogd2hpY2ggdGhlIGV4dGVuc2lvbiBpcyBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBzbG90TW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdoaWNoIGRlZmluZXMgdGhlIGV4dGVuc2lvbiBzbG90XG4gKiBAcGFyYW0gZXh0ZW5zaW9uTW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdoaWNoIGRlZmluZXMgdGhlIGV4dGVuc2lvbiAoYW5kIHRoZXJlZm9yZSB0aGUgY29uZmlnIHNjaGVtYSlcbiAqIEBwYXJhbSBzbG90TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHNsb3Qgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyBtb3VudGVkXG4gKiBAcGFyYW0gZXh0ZW5zaW9uSWQgVGhlIElEIG9mIHRoZSBleHRlbnNpb24gaW4gaXRzIHNsb3RcbiAqLyBmdW5jdGlvbiBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnKHNsb3RNb2R1bGVOYW1lLCBleHRlbnNpb25Nb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBleHRlbnNpb25OYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCk7XG4gICAgY29uc3QgZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID0gY29uZmlnU3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXTtcbiAgICBjb25zdCBuYW1lT2ZTY2hlbWFTb3VyY2UgPSBleHRlbnNpb25Db25maWdTY2hlbWEgPyBleHRlbnNpb25OYW1lIDogZXh0ZW5zaW9uTW9kdWxlTmFtZTtcbiAgICBjb25zdCBwcm92aWRlZENvbmZpZ3MgPSBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29uc3Qgc2xvdE1vZHVsZUNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihzbG90TW9kdWxlTmFtZSwgcHJvdmlkZWRDb25maWdzKTtcbiAgICBjb25zdCBjb25maWdPdmVycmlkZSA9IHNsb3RNb2R1bGVDb25maWc/LmV4dGVuc2lvblNsb3RzPy5bc2xvdE5hbWVdPy5jb25maWd1cmU/LltleHRlbnNpb25JZF0gPz8ge307XG4gICAgY29uc3QgZXh0ZW5zaW9uQ29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG5hbWVPZlNjaGVtYVNvdXJjZSwgcHJvdmlkZWRDb25maWdzKTtcbiAgICBjb25zdCBjb21iaW5lZENvbmZpZyA9IG1lcmdlQ29uZmlncyhbXG4gICAgICAgIGV4dGVuc2lvbkNvbmZpZyxcbiAgICAgICAgY29uZmlnT3ZlcnJpZGVcbiAgICBdKTtcbiAgICBjb25zdCBzY2hlbWEgPSBleHRlbnNpb25Db25maWdTY2hlbWEgPz8gY29uZmlnU3RhdGUuc2NoZW1hc1tleHRlbnNpb25Nb2R1bGVOYW1lXTtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbWJpbmVkQ29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgY29tYmluZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIG5hbWVPZlNjaGVtYVNvdXJjZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKGNsb25lKGNvbmZpZ1N0YXRlLnNjaGVtYXMpKTtcbiAgICBjb25zdCBjb25maWdzQW5kU291cmNlcyA9IFtcbiAgICAgICAgLi4uY29uZmlnU3RhdGUucHJvdmlkZWRDb25maWdzLm1hcCgoYyk9PltcbiAgICAgICAgICAgICAgICBjLmNvbmZpZyxcbiAgICAgICAgICAgICAgICBjLnNvdXJjZVxuICAgICAgICAgICAgXSksXG4gICAgICAgIFtcbiAgICAgICAgICAgIHRlbXBDb25maWdTdGF0ZS5jb25maWcsXG4gICAgICAgICAgICAndGVtcG9yYXJ5IGNvbmZpZydcbiAgICAgICAgXVxuICAgIF07XG4gICAgZm9yIChsZXQgW2NvbmZpZywgc291cmNlXSBvZiBjb25maWdzQW5kU291cmNlcyl7XG4gICAgICAgIHJlc3VsdCA9IG1lcmdlQ29uZmlncyhbXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWcsIHNvdXJjZSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhzY2hlbWEpIHtcbiAgICBpZiAoc2NoZW1hLmhhc093blByb3BlcnR5KCdfZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICBfdmFsdWU6IHNjaGVtYS5fZGVmYXVsdCxcbiAgICAgICAgICAgIF9zb3VyY2U6ICdkZWZhdWx0J1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNPcmRpbmFyeU9iamVjdChzY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLnJlZHVjZSgob2JqLCBrZXkpPT57XG4gICAgICAgICAgICBvYmpba2V5XSA9IGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKHNjaGVtYVtrZXldKTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGUgc2NoZW1hIGlzIGJhZCBhbmQgYW4gZXJyb3Igd2lsbCBoYXZlIGJlZW4gbG9nZ2VkIGR1cmluZyBzY2hlbWEgdmFsaWRhdGlvblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnLCBzb3VyY2UpIHtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnJlZHVjZSgob2JqLCBrZXkpPT57XG4gICAgICAgICAgICBvYmpba2V5XSA9IGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZ1trZXldLCBzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfdmFsdWU6IGNvbmZpZyxcbiAgICAgICAgICAgIF9zb3VyY2U6IHNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBhbGxDb25maWdzID0gbWVyZ2VDb25maWdzKGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgY29uc3Qgc2xvdENvbmZpZ1Blck1vZHVsZSA9IE9iamVjdC5rZXlzKGFsbENvbmZpZ3MpLnJlZHVjZSgob2JqLCBrZXkpPT57XG4gICAgICAgIGlmIChhbGxDb25maWdzW2tleV0/LmV4dGVuc2lvblNsb3RzKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IGFsbENvbmZpZ3Nba2V5XT8uZXh0ZW5zaW9uU2xvdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG4gICAgdmFsaWRhdGVBbGxFeHRlbnNpb25TbG90Q29uZmlncyhzbG90Q29uZmlnUGVyTW9kdWxlKTtcbiAgICBjb25zdCBzbG90Q29uZmlncyA9IE9iamVjdC5rZXlzKHNsb3RDb25maWdQZXJNb2R1bGUpLnJlZHVjZSgob2JqLCBrZXkpPT57XG4gICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgIC4uLm9iaixcbiAgICAgICAgICAgIC4uLnNsb3RDb25maWdQZXJNb2R1bGVba2V5XVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gc2xvdENvbmZpZ3M7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzKHNsb3RDb25maWdQZXJNb2R1bGUpIHtcbiAgICBmb3IgKGxldCBbbW9kdWxlTmFtZSwgY29uZmlnQnlTbG90TmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoc2xvdENvbmZpZ1Blck1vZHVsZSkpe1xuICAgICAgICBmb3IgKGxldCBbc2xvdE5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnQnlTbG90TmFtZSkpe1xuICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpb25TbG90Q29uZmlnKGNvbmZpZywgbW9kdWxlTmFtZSwgc2xvdE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25TbG90Q29uZmlnKGNvbmZpZywgbW9kdWxlTmFtZSwgc2xvdE5hbWUpIHtcbiAgICBjb25zdCBrZXlQYXRoID0gYCR7bW9kdWxlTmFtZX0uZXh0ZW5zaW9uU2xvdHMuJHtzbG90TmFtZX1gO1xuICAgIGNvbnN0IGVycm9yUHJlZml4ID0gYEV4dGVuc2lvbiBzbG90IGNvbmZpZyAnJHtrZXlQYXRofSdgO1xuICAgIGNvbnN0IGludmFsaWRLZXlzID0gT2JqZWN0LmtleXMoY29uZmlnKS5maWx0ZXIoKGspPT4hW1xuICAgICAgICAgICAgJ2FkZCcsXG4gICAgICAgICAgICAncmVtb3ZlJyxcbiAgICAgICAgICAgICdvcmRlcicsXG4gICAgICAgICAgICAnY29uZmlndXJlJ1xuICAgICAgICBdLmluY2x1ZGVzKGspKTtcbiAgICBpZiAoaW52YWxpZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYCcgY29udGFpbnMgaW52YWxpZCBrZXlzICcke2ludmFsaWRLZXlzLmpvaW4oXCInLCAnXCIpfSdgKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5hZGQpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5hZGQpIHx8ICFjb25maWcuYWRkLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLmFkZCcgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcucmVtb3ZlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcucmVtb3ZlKSB8fCAhY29uZmlnLnJlbW92ZS5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5yZW1vdmUnIGlzIGludmFsaWQuIE11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZXh0ZW5zaW9uIElEcylgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLm9yZGVyKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcub3JkZXIpIHx8ICFjb25maWcub3JkZXIuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAub3JkZXInIGlzIGludmFsaWQuIE11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZXh0ZW5zaW9uIElEcylgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmNvbmZpZ3VyZSkge1xuICAgICAgICBpZiAoIWlzT3JkaW5hcnlPYmplY3QoY29uZmlnLmNvbmZpZ3VyZSkpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5jb25maWd1cmUnIGlzIGludmFsaWQuIE11c3QgYmUgYW4gb2JqZWN0IHdpdGggZXh0ZW5zaW9uIElEcyBmb3Iga2V5c2ApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5jb25maWdTdGF0ZS5wcm92aWRlZENvbmZpZ3MubWFwKChjKT0+Yy5jb25maWcpLFxuICAgICAgICB0ZW1wQ29uZmlnU3RhdGUuY29uZmlnXG4gICAgXTtcbn1cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBjb25maWcgc2NoZW1hIGZvciBhIG1vZHVsZS4gU2luY2UgcHJvYmxlbXMgaWRlbnRpZmllZCBoZXJlIGFyZSBwcm9ncmFtbWluZyBlcnJvcnNcbiAqIHRoYXQgaG9wZWZ1bGx5IHdpbGwgYmUgY2F1Z2h0IGR1cmluZyBkZXZlbG9wbWVudCwgdGhpcyBmdW5jdGlvbiBsb2dzIGVycm9ycyB0byB0aGUgY29uc29sZSBkaXJlY3RseTtcbiAqIGl0J3MgZmluZSBpZiB3ZSBzcGFtIHRoZSB1c2VyIHdpdGggdGhlc2UgZXJyb3JzLlxuICovIGZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSwga2V5UGF0aCA9ICcnKSB7XG4gICAgY29uc3QgdXBkYXRlTWVzc2FnZSA9IGBQbGVhc2UgdmVyaWZ5IHRoYXQgeW91IGFyZSBydW5uaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQsIGlmIHNvLCBhbGVydCB0aGUgbWFpbnRhaW5lci5gO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKChrKT0+IWsuc3RhcnRzV2l0aCgnXycpKSl7XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArIChrZXlQYXRoICYmICcuJykgKyBrZXk7XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhcnQgPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKHRoaXNLZXlQYXRoID09PSAnRGlzcGxheSBjb25kaXRpb25zJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBkZWNsYXJlcyBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGNhbGxlZCBcIkRpc3BsYXkgY29uZGl0aW9uc1wiOyB0aGUgXCJEaXNwbGF5IGNvbmRpdGlvbnNcIiBvcHRpb24gaXMgYSByZXNlcnZlZCBuYW1lLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNLZXlQYXRoID09PSAnVHJhbnNsYXRpb24gb3ZlcnJpZGVzJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBkZWNsYXJlcyBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGNhbGxlZCBcIlRyYW5zbGF0aW9uIG92ZXJyaWRlc1wiOyB0aGUgXCJUcmFuc2xhdGlvbiBvdmVycmlkZXNcIiBvcHRpb24gaXMgYSByZXNlcnZlZCBuYW1lLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfZGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAvLyByZWN1cnNlIGZvciBuZXN0ZWQgY29uZmlnIGtleXNcbiAgICAgICAgICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYVBhcnQsIHRoaXNLZXlQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgZWxlbWVudHMsIHRoaXNLZXlQYXRoICsgJy5fZWxlbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hUGFydC5fdmFsaWRhdG9ycykge1xuICAgICAgICAgICAgZm9yIChsZXQgdmFsaWRhdG9yIG9mIHNjaGVtYVBhcnQuX3ZhbGlkYXRvcnMpe1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGludmFsaWQgdmFsaWRhdG9yIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9JyAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB2YWxpZGF0b3JzIG11c3QgYmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGVpdGhlciBgICsgYHVuZGVmaW5lZCBvciBhbiBlcnJvciBzdHJpbmcuIFJlY2VpdmVkICR7dmFsaWRhdG9yfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gc2NoZW1hUGFydC5fdHlwZTtcbiAgICAgICAgaWYgKHZhbHVlVHlwZSAmJiAhT2JqZWN0LnZhbHVlcyhUeXBlKS5pbmNsdWRlcyh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHRoZSBhbGxvd2VkIHR5cGVzIGFyZSAke09iamVjdC52YWx1ZXMoVHlwZSkuam9pbignLCAnKX0uIGAgKyBgUmVjZWl2ZWQgJyR7dmFsdWVUeXBlfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hUGFydCkuZXZlcnkoKGspPT5bXG4gICAgICAgICAgICAgICAgJ19kZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgJ192YWxpZGF0b3JzJyxcbiAgICAgICAgICAgICAgICAnX2VsZW1lbnRzJyxcbiAgICAgICAgICAgICAgICAnX3R5cGUnXG4gICAgICAgICAgICBdLmluY2x1ZGVzKGspKSAmJiAha2V5UGF0aC5pbmNsdWRlcygnLl9lbGVtZW50cycpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogYWxsIGNvbmZpZyBlbGVtZW50cyBtdXN0IGhhdmUgYSBkZWZhdWx0LiBgICsgYFJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoc2NoZW1hUGFydCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnRzICYmIHZhbHVlVHlwZSAmJiAhW1xuICAgICAgICAgICAgVHlwZS5BcnJheSxcbiAgICAgICAgICAgIFR5cGUuT2JqZWN0XG4gICAgICAgIF0uaW5jbHVkZXModmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHRoZSAnZWxlbWVudHMnIGtleSBvbmx5IHdvcmtzIHdpdGggJ190eXBlJyBlcXVhbCB0byAnQXJyYXknIG9yICdPYmplY3QnLiBgICsgYFJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodmFsdWVUeXBlKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldENvbmZpZ0Zvck1vZHVsZShtb2R1bGVOYW1lLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gY29uZmlnU3RhdGUuc2NoZW1hc1ttb2R1bGVOYW1lXTtcbiAgICBjb25zdCBpbnB1dENvbmZpZyA9IG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkpO1xuICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYSwgaW5wdXRDb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgaW5wdXRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hKG1vZHVsZU5hbWUsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBpbnB1dENvbmZpZyA9IG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKGltcGxpY2l0Q29uZmlnU2NoZW1hLCBpbnB1dENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShpbXBsaWNpdENvbmZpZ1NjaGVtYSwgY29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBkZWxldGUgY29uZmlnLmV4dGVuc2lvblNsb3RzO1xuICAgIHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgYWxsQ29uZmlncykge1xuICAgIGNvbnN0IGFsbENvbmZpZ3NGb3JNb2R1bGUgPSBhbGxDb25maWdzLm1hcCgoeyBbbW9kdWxlTmFtZV06IGMgfSk9PmMpLmZpbHRlcigoYyk9PiEhYyk7XG4gICAgcmV0dXJuIG1lcmdlQ29uZmlncyhhbGxDb25maWdzRm9yTW9kdWxlKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlncyhjb25maWdzKSB7XG4gICAgY29uc3QgbWVyZ2VEZWVwQWxsID0gcmVkdWNlKG1lcmdlRGVlcFJpZ2h0KTtcbiAgICByZXR1cm4gbWVyZ2VEZWVwQWxsKHt9LCBjb25maWdzKTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZyB0cmVlIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbFxuICogb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIHNjaGVtYSwgYW5kIHRoYXQgdHlwZXMgYXJlXG4gKiBjb3JyZWN0LiBEb2VzIG5vdCBydW4gdmFsaWRhdG9ycyB5ZXQsIHNpbmNlIHRob3NlIHdpbGwgYmUgcnVuIG9uXG4gKiB0aGUgY29uZmlnIHdpdGggdGhlIGRlZmF1bHRzIGZpbGxlZCBpbi5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gdmFsaWRhdGUgZWFjaCBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAoIXNjaGVtYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgPT09ICdleHRlbnNpb25TbG90cycgJiYga2V5UGF0aCAhPT0gJycpKSB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IodGhpc0tleVBhdGgsIGBVbmtub3duIGNvbmZpZyBrZXkgJyR7dGhpc0tleVBhdGh9JyBwcm92aWRlZC4gSWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKSB7XG4gICAgY2hlY2tUeXBlKGtleVBhdGgsIHNjaGVtYVBhcnQuX3R5cGUsIHZhbHVlKTtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhcyBmcmVlZm9ybSBvYmplY3RcbiAgICAgICAgICAgIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIGtleVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfdHlwZScpKSkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgbm9ybWFsIG5lc3RlZCBjb25maWdcbiAgICAgICAgICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEsIGNvbmZpZywga2V5UGF0aCkge1xuICAgIGlmIChmcmVlZm9ybU9iamVjdFNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgYCR7a2V5UGF0aH0uJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKGFycmF5U2NoZW1hLCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNvbnN0IHZhbGlkYXRlZEFzQXJyYXkgPSBjaGVja1R5cGUoa2V5UGF0aCwgVHlwZS5BcnJheSwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGVkQXNBcnJheSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQgb2JqZWN0IHNjaGVtYSwgdmVyaWZ5IHRoYXQgZWxlbWVudHMgbWF0Y2ggaXRcbiAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGFycmF5U2NoZW1hLl9lbGVtZW50cykpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGFycmF5U2NoZW1hLl9lbGVtZW50cywgdmFsdWVbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY2hlY2tUeXBlKGAke2tleVBhdGh9WyR7aX1dYCwgYXJyYXlTY2hlbWEuX2VsZW1lbnRzPy5fdHlwZSwgdmFsdWVbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgY29uZmlnIHRyZWUuIFRoaXMgc2hvdWxkIGJlIHJ1blxuICogb24gdGhlIGNvbmZpZyBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkIGluIHdpdGggYWxsIHRoZSBkZWZhdWx0cywgc2luY2VcbiAqIGhpZ2hlci1sZXZlbCB2YWxpZGF0b3JzIG1heSByZWZlciB0byBkZWZhdWx0IHZhbHVlcy5cbiAqLyBmdW5jdGlvbiBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBrZXlQYXRoID0gJycpIHtcbiAgICAvLyBJZiBgIXNjaGVtYWAsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZXJyb3IgcHJpbnRlZCBhbHJlYWR5LlxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gc2NoZW1hLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHNjaGVtYS5fdmFsaWRhdG9ycywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5fdHlwZSA9PT0gVHlwZS5PYmplY3QgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYS5fZWxlbWVudHMsIHZhbHVlLCB0aGlzS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCBjb25maWdbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJ1biB0eXBlIHZhbGlkYXRpb24gZm9yIHRoZSB2YWx1ZSwgbG9nZ2luZyBhbnkgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi8gZnVuY3Rpb24gY2hlY2tUeXBlKGtleVBhdGgsIF90eXBlLCB2YWx1ZSkge1xuICAgIGlmIChfdHlwZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHtcbiAgICAgICAgICAgIEFycmF5OiBpc0FycmF5LFxuICAgICAgICAgICAgQm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICAgICAgQ29uY2VwdFV1aWQ6IGlzVXVpZCxcbiAgICAgICAgICAgIE51bWJlcjogaXNOdW1iZXIsXG4gICAgICAgICAgICBPYmplY3Q6IGlzT2JqZWN0LFxuICAgICAgICAgICAgU3RyaW5nOiBpc1N0cmluZyxcbiAgICAgICAgICAgIFVVSUQ6IGlzVXVpZCxcbiAgICAgICAgICAgIFBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkOiBpc1V1aWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgW1xuICAgICAgICAgICAgdmFsaWRhdG9yW190eXBlXVxuICAgICAgICBdLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSdW5zIHZhbGlkYXRvcnMsIGxvZ2dpbmcgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmZ1bmN0aW9uIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgdmFsaWRhdG9ycywgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvclJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBgSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAke2tleVBhdGh9OiAke3ZhbGlkYXRvclJlc3VsdH1gIDogYEludmFsaWQgY29uZmlndXJhdGlvbiB2YWx1ZSAke3ZhbHVlfSBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyBpbnZhbGlkIHZhbGlkYXRvciBhdCBcIiR7a2V5UGF0aH1cIi4gRW5jb3VudGVyZWQgZXJyb3JcXG5cXHQke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuLy8gUmVjdXJzaXZlbHkgZmlsbCBpbiB0aGUgY29uZmlnIHdpdGggdmFsdWVzIGZyb20gdGhlIHNjaGVtYS5cbmNvbnN0IHNldERlZmF1bHRzID0gKHNjaGVtYSwgaW5wdXRDb25maWcpPT57XG4gICAgY29uc3QgY29uZmlnID0gY2xvbmUoaW5wdXRDb25maWcpO1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpe1xuICAgICAgICBjb25zdCBjb25maWdQYXJ0ID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhcnQgPSBzY2hlbWFba2V5XTtcbiAgICAgICAgLy8gVGhlIGBzY2hlbWFQYXJ0ICYmYCBjbGF1c2Ugb2YgdGhpcyBgaWZgIHN0YXRlbWVudCB3aWxsIG9ubHkgZmFpbFxuICAgICAgICAvLyBpZiB0aGUgc2NoZW1hIGlzIHZlcnkgaW52YWxpZC4gSXQgaXMgdGhlcmUgdG8gcHJldmVudCB0aGUgYXBwIGZyb21cbiAgICAgICAgLy8gY3Jhc2hpbmcgY29tcGxldGVseSwgdGhvdWdoIGl0IHdpbGwgcHJvZHVjZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZXJlIHNob3VsZCBiZSBsZWdpYmxlIGVycm9ycyBpbiB0aGUgY29uc29sZSBmcm9tXG4gICAgICAgIC8vIHRoZSBzY2hlbWEgdmFsaWRhdG9yLlxuICAgICAgICBpZiAoc2NoZW1hUGFydCAmJiAoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX3R5cGUnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfZGVmYXVsdCcpKSkge1xuICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgc2NoZW1hUGFydCBkZWZpbmVzIGEgY29uZmlnIHZhbHVlLCBzaW5jZSBpdCBoYXNcbiAgICAgICAgICAgIC8vIGEgcHJvcGVydHkgYF90eXBlYCBvciBgX2RlZmF1bHRgLlxuICAgICAgICAgICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gc2NoZW1hUGFydFsnX2RlZmF1bHQnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGFsc28gY2hlY2sgaWYgaXQgaXMgYW4gb2JqZWN0IG9yIGFycmF5IHdpdGggb2JqZWN0IGVsZW1lbnRzLCBpbiB3aGljaCBjYXNlIHdlIHJlY3Vyc2VcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2NoZW1hUGFydC5fZWxlbWVudHM7XG4gICAgICAgICAgICBpZiAoY29uZmlnUGFydCAmJiBoYXNPYmplY3RTY2hlbWEoZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuQXJyYXkgJiYgQXJyYXkuaXNBcnJheShjb25maWdQYXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdXaXRoRGVmYXVsdHMgPSBjb25maWdQYXJ0Lm1hcCgoY29uZik9PnNldERlZmF1bHRzKGVsZW1lbnRzLCBjb25mKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gY29uZmlnV2l0aERlZmF1bHRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hUGFydC5fdHlwZSA9PT0gVHlwZS5PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgb2JqZWN0S2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZ1BhcnQpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1BhcnRbb2JqZWN0S2V5XSA9IHNldERlZmF1bHRzKGVsZW1lbnRzLCBjb25maWdQYXJ0W29iamVjdEtleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hUGFydCkpIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHNjaGVtYVBhcnQgaGFzIG5vIHByb3BlcnR5IFwiX3R5cGVcIiwgaWYgaXQncyBhbiBvcmRpbmFyeSBvYmplY3RcbiAgICAgICAgICAgIC8vICh1bmxpa2UsIGltcG9ydGFudGx5LCB0aGUgdmFsaWRhdG9ycyBhcnJheSksIHdlIGFzc3VtZSBpdCBpcyBhIHBhcmVudCBjb25maWcgcHJvcGVydHkuXG4gICAgICAgICAgICAvLyBXZSByZWN1cnNlIHRvIGNvbmZpZ1trZXldIGFuZCBzY2hlbWFba2V5XS4gRGVmYXVsdCBjb25maWdba2V5XSB0byB7fS5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ29uZmlnUGFydCA9IGNvbmZpZ1BhcnQgPz8ge307XG4gICAgICAgICAgICAvLyBUaGVyZSB3aWxsIGhhdmUgYmVlbiBhIHZhbGlkYXRpb24gZXJyb3IgYWxyZWFkeSBpZiBjb25maWdQYXJ0IGlzIG5vdCBhIHBsYWluIG9iamVjdC5cbiAgICAgICAgICAgIGlmIChpc09yZGluYXJ5T2JqZWN0KHNlbGVjdGVkQ29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNldERlZmF1bHRzKHNjaGVtYVBhcnQsIHNlbGVjdGVkQ29uZmlnUGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn07XG5mdW5jdGlvbiBoYXNPYmplY3RTY2hlbWEoZWxlbWVudHNTY2hlbWEpIHtcbiAgICByZXR1cm4gISFlbGVtZW50c1NjaGVtYSAmJiBPYmplY3Qua2V5cyhlbGVtZW50c1NjaGVtYSkuZmlsdGVyKChlKT0+IVtcbiAgICAgICAgICAgICdfZGVmYXVsdCcsXG4gICAgICAgICAgICAnX3ZhbGlkYXRvcnMnXG4gICAgICAgIF0uaW5jbHVkZXMoZSkpLmxlbmd0aCA+IDA7XG59XG5mdW5jdGlvbiBpc09yZGluYXJ5T2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlICE9PSBudWxsO1xufVxuLyoqIEtlZXAgdHJhY2sgb2Ygd2hpY2ggdmFsaWRhdGlvbiBlcnJvcnMgd2UgaGF2ZSBkaXNwbGF5ZWQuIEVhY2ggb25lIHNob3VsZCBvbmx5IGJlIGRpc3BsYXllZCBvbmNlLiAqLyBsZXQgZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IGtleSA9IGAke2tleVBhdGh9Ojo6JHttZXNzYWdlfWA7XG4gICAgLy8gdGVjaG5pY2FsbHksIHRoaXMgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSwgYnV0IGJlY2F1c2Ugb2YgaG93IHRoaW5ncyB3aW5kLXVwIHRyYW5zcGlsZWQsIHRoaXMgaXNuJ3QgaW1wb3NzaWJsZVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgaWYgKCFkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuaGFzKGtleSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmFkZChrZXkpO1xuICAgIH1cbn1cbi8qKlxuICogTm9ybWFsbHksIGNvbmZpZ3VyYXRpb24gZXJyb3JzIGFyZSBvbmx5IGRpc3BsYXllZCBvbmNlLiBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgbGlzdCBvZlxuICogZGlzcGxheWVkIGVycm9ycywgc28gdGhhdCB0aGV5IHdpbGwgYmUgZGlzcGxheWVkIGFnYWluLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbmZpZ0Vycm9ycyhrZXlQYXRoKSB7XG4gICAgaWYgKGtleVBhdGgpIHtcbiAgICAgICAgZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqXG4gKiBDbGVhbnMgdXAgYWxsIGNvbmZpZyBzdG9yZSBzdWJzY3JpcHRpb25zIGFuZCByZS1lc3RhYmxpc2hlcyB0aGVtLiBUaGlzIGlzIHByaW1hcmlseVxuICogdXNlZnVsIGZvciB0ZXN0aW5nLCB3aGVyZSBzdWJzY3JpcHRpb25zIHNldCB1cCBhdCBtb2R1bGUgbG9hZCB0aW1lIG5lZWQgdG8gYmUgY2xlYXJlZFxuICogYmV0d2VlbiB0ZXN0cyB0byBwcmV2ZW50IGluZmluaXRlIHVwZGF0ZSBsb29wcy4gQWZ0ZXIgY2xlYXJpbmcsIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZS1lc3RhYmxpc2hlZCBzbyB0aGUgY29uZmlnIHN5c3RlbSBjb250aW51ZXMgdG8gd29yayBub3JtYWxseS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVzZXRDb25maWdTeXN0ZW0oKSB7XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSk9PnVuc3Vic2NyaWJlKCkpO1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMubGVuZ3RoID0gMDtcbiAgICBzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMoKTtcbn1cbi8qKlxuICogQ29waWVkIG92ZXIgZnJvbSBlc20tZXh0ZW5zaW9ucy4gSXQgcmlnaHRseSBiZWxvbmdzIHRvIHRoYXQgbW9kdWxlLCBidXQgZXNtLWNvbmZpZ1xuICogY2Fubm90IGRlcGVuZCBvbiBlc20tZXh0ZW5zaW9ucy5cbiAqLyBmdW5jdGlvbiBnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgW2V4dGVuc2lvbk5hbWVdID0gZXh0ZW5zaW9uSWQuc3BsaXQoJyMnKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uTmFtZTtcbn1cbi8qKlxuICogVGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBzY2hlbWEgaXMgdXNlZCBpbiB0aGUgaW1wbGljaXQgc2NoZW1hIGdpdmVuIHRvIGV2ZXJ5IG1vZHVsZTtcbiAqIHBsdXMgYW55IGFkZGl0aW9uYWwgdHJhbnNsYXRpb24gbmFtZXNwYWNlcyAoYXQgdGltZSBvZiB3cml0aW5nLCB0aGlzIGlzIGp1c3QgJ2NvcmUnKS5cbiAqLyBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlc1NjaGVtYSA9IHtcbiAgICAnVHJhbnNsYXRpb24gb3ZlcnJpZGVzJzoge1xuICAgICAgICBfZGVzY3JpcHRpb246ICdQZXItbGFuZ3VhZ2Ugb3ZlcnJpZGVzIGZvciBmcm9udGVuZCB0cmFuc2xhdGlvbnMgc2hvdWxkIGJlIGtleWVkIGJ5IGxhbmd1YWdlIGNvZGUgYW5kIGVhY2ggbGFuZ3VhZ2UgZGljdGlvbmFyeSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24ga2V5IGFuZCB0aGUgZGlzcGxheSB2YWx1ZScsXG4gICAgICAgIF90eXBlOiBUeXBlLk9iamVjdCxcbiAgICAgICAgX2RlZmF1bHQ6IHt9LFxuICAgICAgICBfdmFsaWRhdG9yczogW1xuICAgICAgICAgICAgdmFsaWRhdG9yKChvKT0+T2JqZWN0LmtleXMobykuZXZlcnkoKGspPT4vXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpLCAobyk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBiYWRLZXlzID0gT2JqZWN0LmtleXMobykuZmlsdGVyKChrKT0+IS9eW2Etel17MiwzfSgtW0EtWl17MiwzfSk/JC8udGVzdChrKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBUaGUgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcycgb2JqZWN0IHNob3VsZCBoYXZlIGxhbmd1YWdlIGNvZGVzIGZvciBrZXlzLiBMYW5ndWFnZSBjb2RlcyBtdXN0IGJlIGluIHRoZSBmb3JtIG9mIGEgdHdvLXRvLXRocmVlIGxldHRlciBsYW5ndWFnZSBjb2RlIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBoeXBoZW4gYW5kIGEgdHdvLXRvLXRocmVlIGxldHRlciBjb3VudHJ5IGNvZGUuIFRoZSBmb2xsb3dpbmcga2V5cyBkbyBub3QgY29uZm9ybTogJHtiYWRLZXlzLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxufTtcbi8qKlxuICogVGhlIGltcGxpY2l0Q29uZmlnU2NoZW1hIGlzIGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gZXZlcnkgY29uZmlndXJhdGlvbiBzY2hlbWFcbiAqLyBjb25zdCBpbXBsaWNpdENvbmZpZ1NjaGVtYSA9IHtcbiAgICAnRGlzcGxheSBjb25kaXRpb25zJzoge1xuICAgICAgICBwcml2aWxlZ2VzOiB7XG4gICAgICAgICAgICBfZGVzY3JpcHRpb246ICdUaGUgcHJpdmlsZWdlKHMpIHRoZSB1c2VyIG11c3QgaGF2ZSB0byB1c2UgdGhpcyBleHRlbnNpb24nLFxuICAgICAgICAgICAgX3R5cGU6IFR5cGUuQXJyYXksXG4gICAgICAgICAgICBfZGVmYXVsdDogW11cbiAgICAgICAgfSxcbiAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIGV4cHJlc3Npb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBpcyBkaXNwbGF5ZWQnLFxuICAgICAgICAgICAgX3R5cGU6IFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgX2RlZmF1bHQ6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgfSxcbiAgICAuLi50cmFuc2xhdGlvbk92ZXJyaWRlc1NjaGVtYVxufTtcbiJdLCJuYW1lcyI6WyJjbG9uZSIsImVxdWFscyIsInJlZHVjZSIsIm1lcmdlRGVlcFJpZ2h0Iiwib21pdCIsIlR5cGUiLCJpc0FycmF5IiwiaXNCb29sZWFuIiwiaXNVdWlkIiwiaXNOdW1iZXIiLCJpc09iamVjdCIsImlzU3RyaW5nIiwidmFsaWRhdG9yIiwiY29uZmlnRXh0ZW5zaW9uU3RvcmUiLCJjb25maWdJbnRlcm5hbFN0b3JlIiwiZ2V0Q29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25Db25maWciLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwiZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwiaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlIiwidGVtcG9yYXJ5Q29uZmlnU3RvcmUiLCJjb25maWdTdWJzY3JpcHRpb25zIiwicmVjb21wdXRlQWxsQ29uZmlncyIsImNvbmZpZ1N0YXRlIiwiZ2V0U3RhdGUiLCJ0ZW1wQ29uZmlnU3RhdGUiLCJleHRlbnNpb25TdGF0ZSIsImNvbXB1dGVNb2R1bGVDb25maWciLCJjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyIsImNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyIsImNvbXB1dGVFeHRlbnNpb25Db25maWdzIiwic2V0dXBDb25maWdTdWJzY3JpcHRpb25zIiwicHVzaCIsInN1YnNjcmliZSIsInN0YXRlIiwidGVtcFN0YXRlIiwibW9kdWxlTmFtZSIsIk9iamVjdCIsImtleXMiLCJzY2hlbWFzIiwibW9kdWxlU3RvcmUiLCJuZXdTdGF0ZSIsIm1vZHVsZUxvYWRlZCIsImNvbmZpZyIsImdldENvbmZpZ0Zvck1vZHVsZSIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkIiwibG9hZGVkIiwiZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEiLCJzZXRTdGF0ZSIsInNsb3RDb25maWdzIiwiZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJuZXdTbG90U3RvcmVFbnRyaWVzIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwic2xvdE5hbWUiLCJzbG90U3RvcmUiLCJvbGRTdGF0ZSIsInNsb3RzIiwiZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyIsImNvbmZpZ3MiLCJleHRlbnNpb24iLCJtb3VudGVkRXh0ZW5zaW9ucyIsImNvbXB1dGVFeHRlbnNpb25Db25maWciLCJzbG90TW9kdWxlTmFtZSIsImV4dGVuc2lvbk1vZHVsZU5hbWUiLCJleHRlbnNpb25JZCIsImV4dGVuc2lvbnNDb25maWdTdG9yZSIsImRlZmluZUNvbmZpZ1NjaGVtYSIsInNjaGVtYSIsInZhbGlkYXRlQ29uZmlnU2NoZW1hIiwiZW5oYW5jZWRTY2hlbWEiLCJpbXBsaWNpdENvbmZpZ1NjaGVtYSIsInJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbSIsInJlZ2lzdGVyTW9kdWxlTG9hZCIsInJlZ2lzdGVyVHJhbnNsYXRpb25OYW1lc3BhY2UiLCJuYW1lc3BhY2UiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlc1NjaGVtYSIsImRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsImV4dGVuc2lvbk5hbWUiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm92aWRlIiwic291cmNlTmFtZSIsInByb3ZpZGVkQ29uZmlncyIsInNvdXJjZSIsImdldENvbmZpZyIsIlByb21pc2UiLCJyZXNvbHZlIiwic3RvcmUiLCJ1cGRhdGUiLCJ1bnN1YnNjcmliZSIsImdldFRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwicHJvbWlzZXMiLCJjb25maWdTdG9yZSIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwiYWxsIiwicHJvY2Vzc0NvbmZpZyIsInByb3ZpZGVkQ29uZmlnIiwia2V5UGF0aENvbnRleHQiLCJ2YWxpZGF0ZVN0cnVjdHVyZSIsInNldERlZmF1bHRzIiwicnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZSIsImdldEV4dGVuc2lvbk5hbWVGcm9tSWQiLCJleHRlbnNpb25Db25maWdTY2hlbWEiLCJuYW1lT2ZTY2hlbWFTb3VyY2UiLCJnZXRQcm92aWRlZENvbmZpZ3MiLCJzbG90TW9kdWxlQ29uZmlnIiwibWVyZ2VDb25maWdzRm9yIiwiY29uZmlnT3ZlcnJpZGUiLCJleHRlbnNpb25TbG90cyIsImNvbmZpZ3VyZSIsImV4dGVuc2lvbkNvbmZpZyIsImNvbWJpbmVkQ29uZmlnIiwibWVyZ2VDb25maWdzIiwicmVzdWx0IiwiZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMiLCJjb25maWdzQW5kU291cmNlcyIsImMiLCJjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZSIsImhhc093blByb3BlcnR5IiwiX3ZhbHVlIiwiX2RlZmF1bHQiLCJfc291cmNlIiwiaXNPcmRpbmFyeU9iamVjdCIsIm9iaiIsImtleSIsImFsbENvbmZpZ3MiLCJzbG90Q29uZmlnUGVyTW9kdWxlIiwidmFsaWRhdGVBbGxFeHRlbnNpb25TbG90Q29uZmlncyIsImNvbmZpZ0J5U2xvdE5hbWUiLCJ2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWciLCJrZXlQYXRoIiwiZXJyb3JQcmVmaXgiLCJpbnZhbGlkS2V5cyIsImZpbHRlciIsImsiLCJpbmNsdWRlcyIsImxlbmd0aCIsImxvZ0Vycm9yIiwiam9pbiIsImFkZCIsIkFycmF5IiwiZXZlcnkiLCJuIiwicmVtb3ZlIiwib3JkZXIiLCJ1cGRhdGVNZXNzYWdlIiwic3RhcnRzV2l0aCIsInRoaXNLZXlQYXRoIiwic2NoZW1hUGFydCIsImVsZW1lbnRzIiwiX2VsZW1lbnRzIiwiaGFzT2JqZWN0U2NoZW1hIiwiX3ZhbGlkYXRvcnMiLCJ2YWx1ZVR5cGUiLCJfdHlwZSIsInZhbHVlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbnB1dENvbmZpZyIsImFsbENvbmZpZ3NGb3JNb2R1bGUiLCJtZXJnZURlZXBBbGwiLCJ2YWx1ZSIsInZhbGlkYXRlQnJhbmNoU3RydWN0dXJlIiwiY2hlY2tUeXBlIiwidmFsaWRhdGVGcmVlZm9ybU9iamVjdFN0cnVjdHVyZSIsInZhbGlkYXRlQXJyYXlTdHJ1Y3R1cmUiLCJmcmVlZm9ybU9iamVjdFNjaGVtYSIsImFycmF5U2NoZW1hIiwidmFsaWRhdGVkQXNBcnJheSIsImkiLCJydW5WYWxpZGF0b3JzIiwiQm9vbGVhbiIsIkNvbmNlcHRVdWlkIiwiTnVtYmVyIiwiU3RyaW5nIiwiVVVJRCIsIlBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkIiwiUGF0aWVudElkZW50aWZpZXJUeXBlVXVpZCIsInZhbGlkYXRvcnMiLCJyZXR1cm5WYWx1ZSIsInZhbGlkYXRvclJlc3VsdCIsIm1lc3NhZ2UiLCJlIiwiY29uZmlnUGFydCIsImNvbmZpZ1dpdGhEZWZhdWx0cyIsImNvbmYiLCJvYmplY3RLZXkiLCJzZWxlY3RlZENvbmZpZ1BhcnQiLCJlbGVtZW50c1NjaGVtYSIsImRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyIsIlNldCIsImhhcyIsImNsZWFyQ29uZmlnRXJyb3JzIiwiZm9yRWFjaCIsImRlbGV0ZSIsImNsZWFyIiwicmVzZXRDb25maWdTeXN0ZW0iLCJzcGxpdCIsIl9kZXNjcmlwdGlvbiIsIm8iLCJ0ZXN0IiwiYmFkS2V5cyIsInByaXZpbGVnZXMiLCJleHByZXNzaW9uIiwidW5kZWZpbmVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n");
159
159
 
160
160
  /***/ }),
161
161
 
@@ -165,7 +165,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
165
165
  \**************************************************************/
166
166
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
167
167
 
168
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ configExtensionStore: () => (/* binding */ configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* binding */ configInternalStore),\n/* harmony export */ getConfigStore: () => (/* binding */ getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* binding */ getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* binding */ getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* binding */ getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* binding */ getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* binding */ getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* binding */ getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* binding */ getExtensionsConfigStore),\n/* harmony export */ implementerToolsConfigStore: () => (/* binding */ implementerToolsConfigStore),\n/* harmony export */ temporaryConfigStore: () => (/* binding */ temporaryConfigStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n moduleLoaded: {}\n};\n/**\n * @internal\n */ const configInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-internal', configInternalStoreInitialValue);\n/** @internal */ const temporaryConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('temporary-config', {\n config: getTemporaryConfig()\n});\ntemporaryConfigStore.subscribe((state)=>{\n setTemporaryConfig(state.config);\n});\nfunction setTemporaryConfig(value) {\n localStorage.setItem('openmrs:temporaryConfig', JSON.stringify(value));\n}\nfunction getTemporaryConfig() {\n try {\n return JSON.parse(localStorage.getItem('openmrs:temporaryConfig') || '{}');\n } catch (e) {\n return {};\n }\n}\n/** @internal */ const configExtensionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-store-of-extension-state', {\n mountedExtensions: []\n});\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n translationOverridesLoaded: false\n };\n}\n/** @internal */ function getConfigStore(moduleName) {\n // We use a store for each module's config, named `config-${moduleName}`\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-module-${moduleName}`, initializeConfigStore());\n}\n/** @internal */ function getExtensionSlotsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extension-slots`, {\n slots: {}\n });\n}\n/** @internal */ function getExtensionSlotConfig(slotName) {\n return getExtensionSlotConfigFromStore(getExtensionSlotsConfigStore().getState(), slotName);\n}\n/** @internal */ function getExtensionSlotConfigFromStore(state, slotName) {\n const slotConfig = state.slots[slotName];\n return slotConfig ?? {\n loaded: false,\n config: {}\n };\n}\n/**\n * One store for all the extensions\n * @internal\n */ function getExtensionsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extensions`, {\n configs: {}\n });\n}\n/** @internal */ function getExtensionConfig(slotName, extensionId) {\n if (typeof slotName !== 'string' || typeof extensionId !== 'string' || slotName === '__proto__' || extensionId === '__proto__' || slotName === 'constructor' || extensionId === 'constructor' || slotName === 'prototype' || extensionId === 'prototype') {\n throw new Error('Attempted to call `getExtensionConfig()` with invalid argument');\n }\n const extensionConfigStore = getExtensionsConfigStore();\n const selector = (configStore)=>configStore.configs[slotName]?.[extensionId];\n return {\n getInitialState () {\n return selector(extensionConfigStore.getInitialState());\n },\n getState () {\n return selector(extensionConfigStore.getState()) ?? {\n loaded: false,\n config: null\n };\n },\n setState (partial, replace = false) {\n extensionConfigStore.setState((state)=>{\n if (!state.configs[slotName]) {\n state.configs[slotName] = {};\n }\n const newState = typeof partial === 'function' ? partial(state.configs.slotName[extensionId]) : partial;\n if (replace) {\n state.configs[slotName][extensionId] = Object.assign({}, newState);\n } else {\n state.configs[slotName][extensionId] = Object.assign({}, state.configs[slotName][extensionId], newState);\n }\n return state;\n });\n },\n subscribe (listener) {\n return extensionConfigStore.subscribe((state, prevState)=>{\n const newState = selector(state);\n const oldState = selector(prevState);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(newState, oldState)) {\n listener(newState, oldState);\n }\n });\n },\n destroy () {\n /* this is a no-op */ }\n };\n}\n/** @internal */ function getExtensionConfigFromStore(state, slotName, extensionId) {\n const extensionConfig = state.configs[slotName]?.[extensionId];\n return extensionConfig ?? {\n loaded: false,\n config: null\n };\n}\n/** @internal */ function getExtensionConfigFromExtensionSlotStore(state, slotName, extensionId) {\n const extensionConfig = state.configure?.[extensionId];\n return extensionConfig ?? null;\n}\n/** @internal */ const implementerToolsConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-implementer-tools', {\n config: {}\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL3N0YXRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3JCO0FBQ2xELE1BQU1HLGtDQUFrQztJQUNwQ0MsaUJBQWlCLEVBQUU7SUFDbkJDLFNBQVMsQ0FBQztJQUNWQyxjQUFjLENBQUM7QUFDbkI7QUFDQTs7Q0FFQyxHQUFVLE1BQU1DLHNCQUFzQlAscUVBQWlCQSxDQUFDLG1CQUFtQkcsaUNBQWlDO0FBQzdHLGNBQWMsR0FBVSxNQUFNSyx1QkFBdUJSLHFFQUFpQkEsQ0FBQyxvQkFBb0I7SUFDdkZTLFFBQVFDO0FBQ1osR0FBRztBQUNIRixxQkFBcUJHLFNBQVMsQ0FBQyxDQUFDQztJQUM1QkMsbUJBQW1CRCxNQUFNSCxNQUFNO0FBQ25DO0FBQ0EsU0FBU0ksbUJBQW1CQyxLQUFLO0lBQzdCQyxhQUFhQyxPQUFPLENBQUMsMkJBQTJCQyxLQUFLQyxTQUFTLENBQUNKO0FBQ25FO0FBQ0EsU0FBU0o7SUFDTCxJQUFJO1FBQ0EsT0FBT08sS0FBS0UsS0FBSyxDQUFDSixhQUFhSyxPQUFPLENBQUMsOEJBQThCO0lBQ3pFLEVBQUUsT0FBT0MsR0FBRztRQUNSLE9BQU8sQ0FBQztJQUNaO0FBQ0o7QUFDQSxjQUFjLEdBQVUsTUFBTUMsdUJBQXVCdEIscUVBQWlCQSxDQUFDLG1DQUFtQztJQUN0R3VCLG1CQUFtQixFQUFFO0FBQ3pCLEdBQUc7QUFDSCxTQUFTQztJQUNMLE9BQU87UUFDSGYsUUFBUTtRQUNSZ0IsUUFBUTtRQUNSQyw0QkFBNEI7SUFDaEM7QUFDSjtBQUNBLGNBQWMsR0FBVSxTQUFTQyxlQUFlQyxVQUFVO0lBQ3RELHdFQUF3RTtJQUN4RSxPQUFPM0Isa0VBQWNBLENBQUMsQ0FBQyxjQUFjLEVBQUUyQixZQUFZLEVBQUVKO0FBQ3pEO0FBQ0EsY0FBYyxHQUFVLFNBQVNLO0lBQzdCLE9BQU81QixrRUFBY0EsQ0FBQyxDQUFDLHNCQUFzQixDQUFD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QUNBLGNBQWMsR0FBVSxNQUFNRyw4QkFBOEIzRCxxRUFBaUJBLENBQUMsNEJBQTRCO0lBQ3RHUyxRQUFRLENBQUM7QUFDYixHQUFHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvc3RhdGUuanM/ZTkwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVHbG9iYWxTdG9yZSwgZ2V0R2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG5pbXBvcnQgeyBzaGFsbG93RXF1YWwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXV0aWxzXCI7XG5jb25zdCBjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlID0ge1xuICAgIHByb3ZpZGVkQ29uZmlnczogW10sXG4gICAgc2NoZW1hczoge30sXG4gICAgbW9kdWxlTG9hZGVkOiB7fVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGNvbnN0IGNvbmZpZ0ludGVybmFsU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWludGVybmFsJywgY29uZmlnSW50ZXJuYWxTdG9yZUluaXRpYWxWYWx1ZSk7XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCB0ZW1wb3JhcnlDb25maWdTdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCd0ZW1wb3JhcnktY29uZmlnJywge1xuICAgIGNvbmZpZzogZ2V0VGVtcG9yYXJ5Q29uZmlnKClcbn0pO1xudGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICBzZXRUZW1wb3JhcnlDb25maWcoc3RhdGUuY29uZmlnKTtcbn0pO1xuZnVuY3Rpb24gc2V0VGVtcG9yYXJ5Q29uZmlnKHZhbHVlKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ29wZW5tcnM6dGVtcG9yYXJ5Q29uZmlnJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGdldFRlbXBvcmFyeUNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnb3Blbm1yczp0ZW1wb3JhcnlDb25maWcnKSB8fCAne30nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBjb25maWdFeHRlbnNpb25TdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCdjb25maWctc3RvcmUtb2YtZXh0ZW5zaW9uLXN0YXRlJywge1xuICAgIG1vdW50ZWRFeHRlbnNpb25zOiBbXVxufSk7XG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogZmFsc2VcbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSkge1xuICAgIC8vIFdlIHVzZSBhIHN0b3JlIGZvciBlYWNoIG1vZHVsZSdzIGNvbmZpZywgbmFtZWQgYGNvbmZpZy0ke21vZHVsZU5hbWV9YFxuICAgIHJldHVybiBnZXRHbG9iYWxTdG9yZShgY29uZmlnLW1vZHVsZS0ke21vZHVsZU5hbWV9YCwgaW5pdGlhbGl6ZUNvbmZpZ1N0b3JlKCkpO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSgpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsU3RvcmUoYGNvbmZpZy1leHRlbnNpb24tc2xvdHNgLCB7XG4gICAgICAgIHNsb3RzOiB7fVxuICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZyhzbG90TmFtZSkge1xuICAgIHJldHVybiBnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlKGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKS5nZXRTdGF0ZSgpLCBzbG90TmFtZSk7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlKHN0YXRlLCBzbG90TmFtZSkge1xuICAgIGNvbnN0IHNsb3RDb25maWcgPSBzdGF0ZS5zbG90c1tzbG90TmFtZV07XG4gICAgcmV0dXJuIHNsb3RDb25maWcgPz8ge1xuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBjb25maWc6IHt9XG4gICAgfTtcbn1cbi8qKlxuICogT25lIHN0b3JlIGZvciBhbGwgdGhlIGV4dGVuc2lvbnNcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFN0b3JlKGBjb25maWctZXh0ZW5zaW9uc2AsIHtcbiAgICAgICAgY29uZmlnczoge31cbiAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBpZiAodHlwZW9mIHNsb3ROYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXh0ZW5zaW9uSWQgIT09ICdzdHJpbmcnIHx8IHNsb3ROYW1lID09PSAnX19wcm90b19fJyB8fCBleHRlbnNpb25JZCA9PT0gJ19fcHJvdG9fXycgfHwgc2xvdE5hbWUgPT09ICdjb25zdHJ1Y3RvcicgfHwgZXh0ZW5zaW9uSWQgPT09ICdjb25zdHJ1Y3RvcicgfHwgc2xvdE5hbWUgPT09ICdwcm90b3R5cGUnIHx8IGV4dGVuc2lvbklkID09PSAncHJvdG90eXBlJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjYWxsIGBnZXRFeHRlbnNpb25Db25maWcoKWAgd2l0aCBpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1N0b3JlID0gZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlKCk7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSAoY29uZmlnU3RvcmUpPT5jb25maWdTdG9yZS5jb25maWdzW3Nsb3ROYW1lXT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXRJbml0aWFsU3RhdGUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yKGV4dGVuc2lvbkNvbmZpZ1N0b3JlLmdldEluaXRpYWxTdGF0ZSgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U3RhdGUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yKGV4dGVuc2lvbkNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpID8/IHtcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdGUgKHBhcnRpYWwsIHJlcGxhY2UgPSBmYWxzZSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uQ29uZmlnU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+e1xuICAgICAgICAgICAgICAgIGlmICghc3RhdGUuY29uZmlnc1tzbG90TmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29uZmlnc1tzbG90TmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0eXBlb2YgcGFydGlhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcnRpYWwoc3RhdGUuY29uZmlncy5zbG90TmFtZVtleHRlbnNpb25JZF0pIDogcGFydGlhbDtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jb25maWdzW3Nsb3ROYW1lXVtleHRlbnNpb25JZF0gPSBPYmplY3QuYXNzaWduKHt9LCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29uZmlnc1tzbG90TmFtZV1bZXh0ZW5zaW9uSWRdID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY29uZmlnc1tzbG90TmFtZV1bZXh0ZW5zaW9uSWRdLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzdWJzY3JpYmUgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSwgcHJldlN0YXRlKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFN0YXRlID0gc2VsZWN0b3IocHJldlN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYWxsb3dFcXVhbChuZXdTdGF0ZSwgb2xkU3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKG5ld1N0YXRlLCBvbGRTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICAvKiB0aGlzIGlzIGEgbm8tb3AgKi8gfVxuICAgIH07XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUoc3RhdGUsIHNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdPy5bZXh0ZW5zaW9uSWRdO1xuICAgIHJldHVybiBleHRlbnNpb25Db25maWcgPz8ge1xuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBjb25maWc6IG51bGxcbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZShzdGF0ZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uQ29uZmlnID0gc3RhdGUuY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdO1xuICAgIHJldHVybiBleHRlbnNpb25Db25maWcgPz8gbnVsbDtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGNvbnN0IGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCdjb25maWctaW1wbGVtZW50ZXItdG9vbHMnLCB7XG4gICAgY29uZmlnOiB7fVxufSk7XG4iXSwibmFtZXMiOlsiY3JlYXRlR2xvYmFsU3RvcmUiLCJnZXRHbG9iYWxTdG9yZSIsInNoYWxsb3dFcXVhbCIsImNvbmZpZ0ludGVybmFsU3RvcmVJbml0aWFsVmFsdWUiLCJwcm92aWRlZENvbmZpZ3MiLCJzY2hlbWFzIiwibW9kdWxlTG9hZGVkIiwiY29uZmlnSW50ZXJuYWxTdG9yZSIsInRlbXBvcmFyeUNvbmZpZ1N0b3JlIiwiY29uZmlnIiwiZ2V0VGVtcG9yYXJ5Q29uZmlnIiwic3Vic2NyaWJlIiwic3RhdGUiLCJzZXRUZW1wb3JhcnlDb25maWciLCJ2YWx1ZSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJKU09OIiwic3RyaW5naWZ5IiwicGFyc2UiLCJnZXRJdGVtIiwiZSIsImNvbmZpZ0V4dGVuc2lvblN0b3JlIiwibW91bnRlZEV4dGVuc2lvbnMiLCJpbml0aWFsaXplQ29uZmlnU3RvcmUiLCJsb2FkZWQiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCIsImdldENvbmZpZ1N0b3JlIiwibW9kdWxlTmFtZSIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJzbG90cyIsImdldEV4dGVuc2lvblNsb3RDb25maWciLCJzbG90TmFtZSIsImdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUiLCJnZXRTdGF0ZSIsInNsb3RDb25maWciLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJjb25maWdzIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uSWQiLCJFcnJvciIsImV4dGVuc2lvbkNvbmZpZ1N0b3JlIiwic2VsZWN0b3IiLCJjb25maWdTdG9yZSIsImdldEluaXRpYWxTdGF0ZSIsInNldFN0YXRlIiwicGFydGlhbCIsInJlcGxhY2UiLCJuZXdTdGF0ZSIsIk9iamVjdCIsImFzc2lnbiIsImxpc3RlbmVyIiwicHJldlN0YXRlIiwib2xkU3RhdGUiLCJkZXN0cm95IiwiZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlIiwiZXh0ZW5zaW9uQ29uZmlnIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSIsImNvbmZpZ3VyZSIsImltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/state.js\n");
168
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ configExtensionStore: () => (/* binding */ configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* binding */ configInternalStore),\n/* harmony export */ getConfigStore: () => (/* binding */ getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* binding */ getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* binding */ getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* binding */ getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* binding */ getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* binding */ getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* binding */ getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* binding */ getExtensionsConfigStore),\n/* harmony export */ implementerToolsConfigStore: () => (/* binding */ implementerToolsConfigStore),\n/* harmony export */ temporaryConfigStore: () => (/* binding */ temporaryConfigStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n moduleLoaded: {}\n};\n/**\n * @internal\n */ const configInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-internal', configInternalStoreInitialValue);\n/** @internal */ const temporaryConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('temporary-config', {\n config: getTemporaryConfig()\n});\ntemporaryConfigStore.subscribe((state)=>{\n setTemporaryConfig(state.config);\n});\nfunction setTemporaryConfig(value) {\n localStorage.setItem('openmrs:temporaryConfig', JSON.stringify(value));\n}\nfunction getTemporaryConfig() {\n try {\n return JSON.parse(localStorage.getItem('openmrs:temporaryConfig') || '{}');\n } catch (e) {\n return {};\n }\n}\n/** @internal */ const configExtensionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-store-of-extension-state', {\n mountedExtensions: []\n});\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n translationOverridesLoaded: false\n };\n}\n/** @internal */ function getConfigStore(moduleName) {\n // We use a store for each module's config, named `config-module-${moduleName}`\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-module-${moduleName}`, initializeConfigStore());\n}\n/** @internal */ function getExtensionSlotsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extension-slots`, {\n slots: {}\n });\n}\n/** @internal */ function getExtensionSlotConfig(slotName) {\n return getExtensionSlotConfigFromStore(getExtensionSlotsConfigStore().getState(), slotName);\n}\n/** @internal */ function getExtensionSlotConfigFromStore(state, slotName) {\n const slotConfig = state.slots[slotName];\n return slotConfig ?? {\n loaded: false,\n config: {}\n };\n}\n/**\n * One store for all the extensions\n * @internal\n */ function getExtensionsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extensions`, {\n configs: {}\n });\n}\n/** @internal */ function getExtensionConfig(slotName, extensionId) {\n if (typeof slotName !== 'string' || typeof extensionId !== 'string' || slotName === '__proto__' || extensionId === '__proto__' || slotName === 'constructor' || extensionId === 'constructor' || slotName === 'prototype' || extensionId === 'prototype') {\n throw new Error('Attempted to call `getExtensionConfig()` with invalid argument');\n }\n const extensionConfigStore = getExtensionsConfigStore();\n const selector = (configStore)=>configStore.configs[slotName]?.[extensionId];\n return {\n getInitialState () {\n return selector(extensionConfigStore.getInitialState());\n },\n getState () {\n return selector(extensionConfigStore.getState()) ?? {\n loaded: false,\n config: null\n };\n },\n setState (partial, replace = false) {\n extensionConfigStore.setState((state)=>{\n if (!state.configs[slotName]) {\n state.configs[slotName] = {};\n }\n const newState = typeof partial === 'function' ? partial(state.configs.slotName[extensionId]) : partial;\n if (replace) {\n state.configs[slotName][extensionId] = Object.assign({}, newState);\n } else {\n state.configs[slotName][extensionId] = Object.assign({}, state.configs[slotName][extensionId], newState);\n }\n return state;\n });\n },\n subscribe (listener) {\n return extensionConfigStore.subscribe((state, prevState)=>{\n const newState = selector(state);\n const oldState = selector(prevState);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(newState, oldState)) {\n listener(newState, oldState);\n }\n });\n },\n destroy () {\n /* this is a no-op */ }\n };\n}\n/** @internal */ function getExtensionConfigFromStore(state, slotName, extensionId) {\n const extensionConfig = state.configs[slotName]?.[extensionId];\n return extensionConfig ?? {\n loaded: false,\n config: null\n };\n}\n/** @internal */ function getExtensionConfigFromExtensionSlotStore(state, slotName, extensionId) {\n const extensionConfig = state.configure?.[extensionId];\n return extensionConfig ?? null;\n}\n/** @internal */ const implementerToolsConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-implementer-tools', {\n config: {}\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL3N0YXRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3JCO0FBQ2xELE1BQU1HLGtDQUFrQztJQUNwQ0MsaUJBQWlCLEVBQUU7SUFDbkJDLFNBQVMsQ0FBQztJQUNWQyxjQUFjLENBQUM7QUFDbkI7QUFDQTs7Q0FFQyxHQUFVLE1BQU1DLHNCQUFzQlAscUVBQWlCQSxDQUFDLG1CQUFtQkcsaUNBQWlDO0FBQzdHLGNBQWMsR0FBVSxNQUFNSyx1QkFBdUJSLHFFQUFpQkEsQ0FBQyxvQkFBb0I7SUFDdkZTLFFBQVFDO0FBQ1osR0FBRztBQUNIRixxQkFBcUJHLFNBQVMsQ0FBQyxDQUFDQztJQUM1QkMsbUJBQW1CRCxNQUFNSCxNQUFNO0FBQ25DO0FBQ0EsU0FBU0ksbUJBQW1CQyxLQUFLO0lBQzdCQyxhQUFhQyxPQUFPLENBQUMsMkJBQTJCQyxLQUFLQyxTQUFTLENBQUNKO0FBQ25FO0FBQ0EsU0FBU0o7SUFDTCxJQUFJO1FBQ0EsT0FBT08sS0FBS0UsS0FBSyxDQUFDSixhQUFhSyxPQUFPLENBQUMsOEJBQThCO0lBQ3pFLEVBQUUsT0FBT0MsR0FBRztRQUNSLE9BQU8sQ0FBQztJQUNaO0FBQ0o7QUFDQSxjQUFjLEdBQVUsTUFBTUMsdUJBQXVCdEIscUVBQWlCQSxDQUFDLG1DQUFtQztJQUN0R3VCLG1CQUFtQixFQUFFO0FBQ3pCLEdBQUc7QUFDSCxTQUFTQztJQUNMLE9BQU87UUFDSGYsUUFBUTtRQUNSZ0IsUUFBUTtRQUNSQyw0QkFBNEI7SUFDaEM7QUFDSjtBQUNBLGNBQWMsR0FBVSxTQUFTQyxlQUFlQyxVQUFVO0lBQ3RELCtFQUErRTtJQUMvRSxPQUFPM0Isa0VBQWNBLENBQUMsQ0FBQyxjQUFjLEVBQUUyQixZQUFZLEVBQUVKO0FBQ3pEO0FBQ0EsY0FBYyxHQUFVLFNBQVNLO0lBQzdCLE9BQU81QixrRUFBY0EsQ0FBQyxDQUFDLHNCQUFzQixDQUFD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QUNBLGNBQWMsR0FBVSxNQUFNRyw4QkFBOEIzRCxxRUFBaUJBLENBQUMsNEJBQTRCO0lBQ3RHUyxRQUFRLENBQUM7QUFDYixHQUFHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvc3RhdGUuanM/ZTkwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVHbG9iYWxTdG9yZSwgZ2V0R2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG5pbXBvcnQgeyBzaGFsbG93RXF1YWwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXV0aWxzXCI7XG5jb25zdCBjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlID0ge1xuICAgIHByb3ZpZGVkQ29uZmlnczogW10sXG4gICAgc2NoZW1hczoge30sXG4gICAgbW9kdWxlTG9hZGVkOiB7fVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGNvbnN0IGNvbmZpZ0ludGVybmFsU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWludGVybmFsJywgY29uZmlnSW50ZXJuYWxTdG9yZUluaXRpYWxWYWx1ZSk7XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCB0ZW1wb3JhcnlDb25maWdTdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCd0ZW1wb3JhcnktY29uZmlnJywge1xuICAgIGNvbmZpZzogZ2V0VGVtcG9yYXJ5Q29uZmlnKClcbn0pO1xudGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICBzZXRUZW1wb3JhcnlDb25maWcoc3RhdGUuY29uZmlnKTtcbn0pO1xuZnVuY3Rpb24gc2V0VGVtcG9yYXJ5Q29uZmlnKHZhbHVlKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ29wZW5tcnM6dGVtcG9yYXJ5Q29uZmlnJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGdldFRlbXBvcmFyeUNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnb3Blbm1yczp0ZW1wb3JhcnlDb25maWcnKSB8fCAne30nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBjb25maWdFeHRlbnNpb25TdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCdjb25maWctc3RvcmUtb2YtZXh0ZW5zaW9uLXN0YXRlJywge1xuICAgIG1vdW50ZWRFeHRlbnNpb25zOiBbXVxufSk7XG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogZmFsc2VcbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSkge1xuICAgIC8vIFdlIHVzZSBhIHN0b3JlIGZvciBlYWNoIG1vZHVsZSdzIGNvbmZpZywgbmFtZWQgYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWBcbiAgICByZXR1cm4gZ2V0R2xvYmFsU3RvcmUoYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWAsIGluaXRpYWxpemVDb25maWdTdG9yZSgpKTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFN0b3JlKGBjb25maWctZXh0ZW5zaW9uLXNsb3RzYCwge1xuICAgICAgICBzbG90czoge31cbiAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RDb25maWcoc2xvdE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlKCkuZ2V0U3RhdGUoKSwgc2xvdE5hbWUpO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShzdGF0ZSwgc2xvdE5hbWUpIHtcbiAgICBjb25zdCBzbG90Q29uZmlnID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdO1xuICAgIHJldHVybiBzbG90Q29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiB7fVxuICAgIH07XG59XG4vKipcbiAqIE9uZSBzdG9yZSBmb3IgYWxsIHRoZSBleHRlbnNpb25zXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlKCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxTdG9yZShgY29uZmlnLWV4dGVuc2lvbnNgLCB7XG4gICAgICAgIGNvbmZpZ3M6IHt9XG4gICAgfSk7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25Db25maWcoc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgaWYgKHR5cGVvZiBzbG90TmFtZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4dGVuc2lvbklkICE9PSAnc3RyaW5nJyB8fCBzbG90TmFtZSA9PT0gJ19fcHJvdG9fXycgfHwgZXh0ZW5zaW9uSWQgPT09ICdfX3Byb3RvX18nIHx8IHNsb3ROYW1lID09PSAnY29uc3RydWN0b3InIHx8IGV4dGVuc2lvbklkID09PSAnY29uc3RydWN0b3InIHx8IHNsb3ROYW1lID09PSAncHJvdG90eXBlJyB8fCBleHRlbnNpb25JZCA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgZ2V0RXh0ZW5zaW9uQ29uZmlnKClgIHdpdGggaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25Db25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gKGNvbmZpZ1N0b3JlKT0+Y29uZmlnU3RvcmUuY29uZmlnc1tzbG90TmFtZV0/LltleHRlbnNpb25JZF07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0SW5pdGlhbFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRJbml0aWFsU3RhdGUoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRTdGF0ZSgpKSA/PyB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXRlIChwYXJ0aWFsLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09ICdmdW5jdGlvbicgPyBwYXJ0aWFsKHN0YXRlLmNvbmZpZ3Muc2xvdE5hbWVbZXh0ZW5zaW9uSWRdKSA6IHBhcnRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29uZmlnc1tzbG90TmFtZV1bZXh0ZW5zaW9uSWRdID0gT2JqZWN0LmFzc2lnbih7fSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc3Vic2NyaWJlIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnN1YnNjcmliZSgoc3RhdGUsIHByZXZTdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTdGF0ZSA9IHNlbGVjdG9yKHByZXZTdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwobmV3U3RhdGUsIG9sZFN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdTdGF0ZSwgb2xkU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95ICgpIHtcbiAgICAgICAgLyogdGhpcyBpcyBhIG5vLW9wICovIH1cbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlKHN0YXRlLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBleHRlbnNpb25Db25maWcgPSBzdGF0ZS5jb25maWdzW3Nsb3ROYW1lXT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiBudWxsXG4gICAgfTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUoc3RhdGUsIHNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IHN0YXRlLmNvbmZpZ3VyZT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IG51bGw7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWltcGxlbWVudGVyLXRvb2xzJywge1xuICAgIGNvbmZpZzoge31cbn0pO1xuIl0sIm5hbWVzIjpbImNyZWF0ZUdsb2JhbFN0b3JlIiwiZ2V0R2xvYmFsU3RvcmUiLCJzaGFsbG93RXF1YWwiLCJjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlIiwicHJvdmlkZWRDb25maWdzIiwic2NoZW1hcyIsIm1vZHVsZUxvYWRlZCIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsImNvbmZpZyIsImdldFRlbXBvcmFyeUNvbmZpZyIsInN1YnNjcmliZSIsInN0YXRlIiwic2V0VGVtcG9yYXJ5Q29uZmlnIiwidmFsdWUiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiZ2V0SXRlbSIsImUiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsIm1vdW50ZWRFeHRlbnNpb25zIiwiaW5pdGlhbGl6ZUNvbmZpZ1N0b3JlIiwibG9hZGVkIiwidHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQiLCJnZXRDb25maWdTdG9yZSIsIm1vZHVsZU5hbWUiLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwic2xvdHMiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwic2xvdE5hbWUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlIiwiZ2V0U3RhdGUiLCJzbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwiY29uZmlncyIsImdldEV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbklkIiwiRXJyb3IiLCJleHRlbnNpb25Db25maWdTdG9yZSIsInNlbGVjdG9yIiwiY29uZmlnU3RvcmUiLCJnZXRJbml0aWFsU3RhdGUiLCJzZXRTdGF0ZSIsInBhcnRpYWwiLCJyZXBsYWNlIiwibmV3U3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJsaXN0ZW5lciIsInByZXZTdGF0ZSIsIm9sZFN0YXRlIiwiZGVzdHJveSIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21TdG9yZSIsImV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUiLCJjb25maWd1cmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/state.js\n");
169
169
 
170
170
  /***/ }),
171
171
 
@@ -395,7 +395,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
395
395
  \******************************************************************/
396
396
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
397
397
 
398
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ compile: () => (/* binding */ compile),\n/* harmony export */ evaluate: () => (/* binding */ evaluate),\n/* harmony export */ evaluateAsBoolean: () => (/* binding */ evaluateAsBoolean),\n/* harmony export */ evaluateAsBooleanAsync: () => (/* binding */ evaluateAsBooleanAsync),\n/* harmony export */ evaluateAsNumber: () => (/* binding */ evaluateAsNumber),\n/* harmony export */ evaluateAsNumberAsync: () => (/* binding */ evaluateAsNumberAsync),\n/* harmony export */ evaluateAsType: () => (/* binding */ evaluateAsType),\n/* harmony export */ evaluateAsTypeAsync: () => (/* binding */ evaluateAsTypeAsync),\n/* harmony export */ evaluateAsync: () => (/* binding */ evaluateAsync),\n/* harmony export */ jsep: () => (/* reexport safe */ jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var jsep__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jsep */ \"../../../node_modules/jsep/dist/jsep.js\");\n/* harmony import */ var _jsep_plugin_arrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jsep-plugin/arrow */ \"../../../node_modules/@jsep-plugin/arrow/dist/index.js\");\n/* harmony import */ var _jsep_plugin_new__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jsep-plugin/new */ \"../../../node_modules/@jsep-plugin/new/dist/index.js\");\n/* harmony import */ var _jsep_plugin_numbers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jsep-plugin/numbers */ \"../../../node_modules/@jsep-plugin/numbers/dist/index.js\");\n/* harmony import */ var _jsep_plugin_regex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jsep-plugin/regex */ \"../../../node_modules/@jsep-plugin/regex/dist/index.js\");\n/* harmony import */ var _jsep_plugin_ternary__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @jsep-plugin/ternary */ \"../../../node_modules/@jsep-plugin/ternary/dist/index.js\");\n/* harmony import */ var _jsep_plugin_template__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @jsep-plugin/template */ \"../../../node_modules/@jsep-plugin/template/dist/index.js\");\n/* harmony import */ var _globals_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./globals.js */ \"../../framework/esm-expression-evaluator/dist/globals.js\");\n/** @category Utility */ \n\n\n\n\n\n\n\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_arrow__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_new__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_numbers__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_regex__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_ternary__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_template__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n// see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence\n// for the order defined here\n// 7 is jsep's internal for \"relational operators\"\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addBinaryOp('in', 7);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addBinaryOp('??', 1);\n\n/**\n * `evaluate()` implements a relatively safe version of `eval()` that is limited to evaluating synchronous\n * Javascript expressions. This allows us to safely add features that depend on user-supplied code without\n * polluting the global namespace or needing to support `eval()` and the like.\n *\n * By default it supports any expression that evalutes to a string, number, boolean, Date, null, or undefined.\n * Other values will result in an error.\n *\n * @example\n * ```ts\n * // shouldDisplayOptionalData will be false\n * const shouldDisplayOptionalData = evaluate('!isEmpty(array)', {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * })\n * ```\n *\n * Since this only implements the expression lanaguage part of Javascript, there is no support for assigning\n * values, creating functions, or creating objects, so the following will throw an error:\n *\n * @example\n * ```ts\n * evaluate('var a = 1; a');\n * ```\n *\n * In addition to string expressions, `evaluate()` can use an existing `jsep.Expression`, such as that returned\n * from the `compile()` function. The goal here is to support cases where the same expression will be evaluated\n * multiple times, possibly with different variables, e.g.,\n *\n * @example\n * ```ts\n * const expr = compile('isEmpty(array)');\n *\n * // then we use it like\n * evaluate(expr, {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n *\n * evaluate(expr, {\n * array: ['value'],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n * ```\n *\n * This saves the overhead of parsing the expression everytime and simply allows us to evaluate it.\n *\n * The `variables` parameter should be used to supply any variables or functions that should be in-scope for\n * the evaluation. A very limited number of global objects, like NaN and Infinity are always available, but\n * any non-global values will need to be passed as a variable. Note that expressions do not have any access to\n * the variables in the scope in which they were defined unless they are supplied here.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluate(expression, variables = {}) {\n return evaluateAsType(expression, variables, defaultTypePredicate);\n}\n/**\n * `evaluateAsync()` implements a relatively safe version of `eval()` that can evaluate Javascript expressions\n * that use Promises. This allows us to safely add features that depend on user-supplied code without\n * polluting the global namespace or needing to support `eval()` and the like.\n *\n * By default it supports any expression that evalutes to a string, number, boolean, Date, null, or undefined.\n * Other values will result in an error.\n *\n * @example\n * ```ts\n * // shouldDisplayOptionalData will be false\n * const shouldDisplayOptionalData = await evaluateAsync('Promise.resolve(!isEmpty(array))', {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * })\n * ```\n *\n * Since this only implements the expression lanaguage part of Javascript, there is no support for assigning\n * values, creating functions, or creating objects, so the following will throw an error:\n *\n * @example\n * ```ts\n * evaluateAsync('var a = 1; a');\n * ```\n *\n * In addition to string expressions, `evaluate()` can use an existing `jsep.Expression`, such as that returned\n * from the `compile()` function. The goal here is to support cases where the same expression will be evaluated\n * multiple times, possibly with different variables, e.g.,\n *\n * @example\n * ```ts\n * const expr = compile('Promise.resolve(isEmpty(array))');\n *\n * // then we use it like\n * evaluateAsync(expr, {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n *\n * evaluateAsync(expr, {\n * array: ['value'],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n * ```\n *\n * This saves the overhead of parsing the expression everytime and simply allows us to evaluate it.\n *\n * The `variables` parameter should be used to supply any variables or functions that should be in-scope for\n * the evaluation. A very limited number of global objects, like NaN and Infinity are always available, but\n * any non-global values will need to be passed as a variable. Note that expressions do not have any access to\n * the variables in the scope in which they were defined unless they are supplied here.\n *\n * **Note:** `evaluateAsync()` currently only supports Promise-based asynchronous flows and does not support\n * the `await` keyword.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ async function evaluateAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, defaultTypePredicate);\n}\n/**\n * `evaluateAsBoolean()` is a variant of {@link evaluate()} which only supports boolean results. Useful\n * if valid expression must return boolean values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsBoolean(expression, variables = {}) {\n return evaluateAsType(expression, variables, booleanTypePredicate);\n}\n/**\n * `evaluateAsBooleanAsync()` is a variant of {@link evaluateAsync()} which only supports boolean results. Useful\n * if valid expression must return boolean values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsBooleanAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, booleanTypePredicate);\n}\n/**\n * `evaluateAsNumber()` is a variant of {@link evaluate()} which only supports number results. Useful\n * if valid expression must return numeric values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsNumber(expression, variables = {}) {\n return evaluateAsType(expression, variables, numberTypePredicate);\n}\n/**\n * `evaluateAsNumberAsync()` is a variant of {@link evaluateAsync()} which only supports number results. Useful\n * if valid expression must return numeric values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsNumberAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, numberTypePredicate);\n}\n/**\n * `evaluateAsType()` is a type-safe version of {@link evaluate()} which returns a result if the result\n * passes a custom type predicate. The main use-case for this is to narrow the return types allowed based on\n * context, e.g., if the expected result should be a number or boolean, you can supply a custom type-guard\n * to ensure that only number or boolean results are returned.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @param typePredicate A [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)\n * which asserts that the result value matches one of the expected results.\n * @returns The result of evaluating the expression\n */ function evaluateAsType(expression, variables = {}, typePredicate) {\n if (typeof expression !== 'string' && (typeof expression !== 'object' || !expression || !('type' in expression))) {\n throw `Unknown expression type ${expression}. Expressions must either be a string or pre-compiled string.`;\n }\n if (typeof variables === 'undefined' || variables === null) {\n variables = {};\n }\n const context = createSynchronousContext(variables);\n const result = visitExpression(typeof expression === 'string' ? (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression) : expression, context);\n if (typePredicate(result)) {\n return result;\n } else {\n throw {\n type: 'Invalid result',\n message: typeof expression === 'string' ? `The expression ${expression} did not produce a valid result` : 'The expression did not produce a valid result'\n };\n }\n}\n/**\n * `evaluateAsTypeAsync()` is a type-safe version of {@link evaluateAsync()} which returns a result if the result\n * passes a custom type predicate. The main use-case for this is to narrow the return types allowed based on\n * context, e.g., if the expected result should be a number or boolean, you can supply a custom type-guard\n * to ensure that only number or boolean results are returned.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @param typePredicate A [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)\n * which asserts that the result value matches one of the expected results.\n * @returns The result of evaluating the expression\n */ async function evaluateAsTypeAsync(expression, variables = {}, typePredicate) {\n if (typeof expression !== 'string' && (typeof expression !== 'object' || !expression || !('type' in expression))) {\n return Promise.reject(`Unknown expression type ${expression}. Expressions must either be a string or pre-compiled string.`);\n }\n if (typeof variables === 'undefined' || variables === null) {\n variables = {};\n }\n const context = createAsynchronousContext(variables);\n return Promise.resolve(visitExpression(typeof expression === 'string' ? (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression) : expression, context)).then((result)=>{\n if (typePredicate(result)) {\n return result;\n } else {\n throw {\n type: 'Invalid result',\n message: typeof expression === 'string' ? `The expression ${expression} did not produce a valid result` : 'The expression did not produce a valid result'\n };\n }\n });\n}\n/**\n * `compile()` is a companion function for use with {@link evaluate()} and the various `evaluateAs*()` functions.\n * It processes an expression string into the resulting AST that is executed by those functions. This is useful if\n * you have an expression that will need to be evaluated mulitple times, potentially with different values, as the\n * lexing and parsing steps can be skipped by using the AST object returned from this.\n *\n * The returned AST is intended to be opaque to client applications, but, of course, it is possible to manipulate\n * the AST before passing it back to {@link evaluate()}, if desired. This might be useful if, for example, certain\n * values are known to be constant.\n *\n * @param expression The expression to be parsed\n * @returns An executable AST representation of the expression\n */ function compile(expression) {\n return (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression);\n}\n// Pre-defined type guards\nfunction defaultTypePredicate(result) {\n return typeof result === 'string' || typeof result === 'number' || typeof result === 'boolean' || typeof result === 'undefined' || result === null || result instanceof Date;\n}\nfunction booleanTypePredicate(result) {\n return typeof result === 'boolean';\n}\nfunction numberTypePredicate(result) {\n return typeof result === 'number';\n}\n// Implementation\n// This is the core of the implementation; it takes an expression, the variables and the current object\n// each expression is dispatched to an appropriate handler.\nfunction visitExpression(expression, context) {\n switch(expression.type){\n case 'UnaryExpression':\n return visitUnaryExpression(expression, context);\n case 'BinaryExpression':\n return visitBinaryExpression(expression, context);\n case 'ConditionalExpression':\n return visitConditionalExpression(expression, context);\n case 'CallExpression':\n return visitCallExpression(expression, context);\n case 'ArrowFunctionExpression':\n return visitArrowFunctionExpression(expression, context);\n case 'MemberExpression':\n return visitMemberExpression(expression, context);\n case 'ArrayExpression':\n return visitArrayExpression(expression, context);\n case 'SequenceExpression':\n return visitSequenceExpression(expression, context);\n case 'NewExpression':\n return visitNewExpression(expression, context);\n case 'Literal':\n return visitLiteral(expression, context);\n case 'Identifier':\n return visitIdentifier(expression, context);\n case 'TemplateLiteral':\n return visitTemplateLiteral(expression, context);\n case 'TemplateElement':\n return visitTemplateElement(expression, context);\n default:\n throw `Expression evaluator does not support expression of type '${expression.type}'`;\n }\n}\nfunction visitExpressionName(expression, context) {\n switch(expression.type){\n case 'Literal':\n return expression.value;\n case 'Identifier':\n return expression.name;\n case 'MemberExpression':\n return visitExpressionName(expression.property, context);\n default:\n throw `VisitExpressionName does not support expression of type '${expression.type}'`;\n }\n}\nfunction visitUnaryExpression(expression, context) {\n const value = visitExpression(expression.argument, context);\n switch(expression.operator){\n case '+':\n return +value;\n case '-':\n return -value;\n case '~':\n return ~value;\n case '!':\n return !value;\n default:\n throw `Expression evaluator does not support operator '${expression.operator}''`;\n }\n}\nfunction visitBinaryExpression(expression, context) {\n let left = visitExpression(expression.left, context);\n let right = visitExpression(expression.right, context);\n switch(expression.operator){\n case '+':\n return left + right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n case '**':\n return left ** right;\n case '==':\n return left == right;\n case '===':\n return left === right;\n case '!=':\n return left != right;\n case '!==':\n return left !== right;\n case '>':\n return left > right;\n case '>=':\n return left >= right;\n case '<':\n return left < right;\n case '<=':\n return left <= right;\n case 'in':\n return left in right;\n case '&&':\n return left && right;\n case '||':\n return left || right;\n case '??':\n return left ?? right;\n default:\n throw `Expression evaluator does not support operator '${expression.operator}' operator`;\n }\n}\nfunction visitConditionalExpression(expression, context) {\n const test = visitExpression(expression.test, context);\n return test ? visitExpression(expression.consequent, context) : visitExpression(expression.alternate, context);\n}\nfunction visitCallExpression(expression, context) {\n let args = expression.arguments?.map(handleNullableExpression(context));\n let callee = visitExpression(expression.callee, context);\n if (!callee) {\n throw `No function named ${getCallTargetName(expression.callee)} is defined in this context`;\n } else if (!(typeof callee === 'function')) {\n throw `${getCallTargetName(expression.callee)} is not a function`;\n }\n return callee(...args);\n}\nfunction visitArrowFunctionExpression(expression, context) {\n const params = expression.params?.map((p)=>{\n switch(p.type){\n case 'Identifier':\n return p.name;\n default:\n throw `Cannot handle parameter of type ${p.type}`;\n }\n }) ?? [];\n return (function(...rest) {\n if (rest.length < params.length) {\n throw `Required argument(s) ${params.slice(rest.length, -1).join(', ')} were not provided`;\n }\n const vars = Object.fromEntries(params.reduce((acc, p, idx)=>{\n const val = rest[idx];\n if (isValidVariableType(val)) {\n acc.push([\n p,\n val\n ]);\n }\n return acc;\n }, []));\n return visitExpression(expression.body, context.addVariables(vars));\n }).bind(context.thisObj ?? null);\n}\nfunction visitMemberExpression(expression, context) {\n let obj = visitExpression(expression.object, context);\n if (obj === undefined) {\n switch(expression.object.type){\n case 'Identifier':\n {\n let objectName = visitExpressionName(expression.object, context);\n throw ReferenceError(`ReferenceError: ${objectName} is not defined`);\n }\n case 'MemberExpression':\n {\n let propertyName = visitExpressionName(expression.property, context);\n throw TypeError(`TypeError: cannot read properties of undefined (reading '${propertyName}')`);\n }\n default:\n throw `VisitMemberExpression does not support operator '${expression.object.type}' type`;\n }\n }\n let newObj = obj;\n if (typeof obj === 'string') {\n newObj = String.prototype;\n } else if (typeof obj === 'number') {\n newObj = Number.prototype;\n } else if (typeof obj === 'function') {\n // no-op\n } else if (typeof obj !== 'object') {\n throw `VisitMemberExpression does not support member access on type ${typeof obj}`;\n }\n context.thisObj = newObj;\n let result;\n switch(expression.property.type){\n case 'Identifier':\n case 'MemberExpression':\n result = visitExpression(expression.property, context);\n break;\n default:\n {\n const property = visitExpression(expression.property, context);\n if (typeof property === 'undefined') {\n throw {\n type: 'Illegal property access',\n message: 'No property was supplied to the property access'\n };\n }\n validatePropertyName(property);\n result = obj[property];\n }\n }\n if (typeof result === 'function') {\n return result.bind(obj);\n }\n return result;\n}\nfunction visitArrayExpression(expression, context) {\n return expression.elements?.map(handleNullableExpression(context));\n}\nfunction visitSequenceExpression(expression, context) {\n const result = expression.expressions.map(handleNullableExpression(context));\n return result[result.length - 1];\n}\nfunction visitNewExpression(expression, context) {\n if (expression.callee && expression.callee.type === 'Identifier') {\n let args = expression.arguments?.map(handleNullableExpression(context));\n switch(expression.callee.name){\n case 'Date':\n {\n /** @ts-ignore because we can use the spread operator here */ return new Date(...args);\n }\n case 'RegExp':\n /** @ts-ignore because we can use the spread operator here */ return new RegExp(...args);\n default:\n throw `Cannot instantiate object of type ${expression.callee.name}`;\n }\n } else {\n if (!expression.callee) {\n throw `Could not handle \"new\" without a specified class`;\n } else {\n throw 'new must be called with either Date or RegExp';\n }\n }\n}\nfunction visitTemplateLiteral(expression, context) {\n const expressions = expression.expressions?.map(handleNullableExpression(context)) ?? [];\n const quasis = expression.quasis?.map(handleNullableExpression(context)) ?? [];\n return quasis.filter((q)=>!q.tail).map((q)=>q.value).join('') + expressions.join('') + quasis.filter((q)=>q.tail).map((q)=>q.value).join('');\n}\nfunction visitTemplateElement(expression, context) {\n return {\n value: expression.cooked,\n tail: expression.tail\n };\n}\nfunction visitIdentifier(expression, context) {\n validatePropertyName(expression.name);\n // we support both `object` and `function` in the same way as technically property access on functions\n // is possible; the use-case here is to support JS's \"static\" functions like `Number.isInteger()`, which\n // is technically reading a property on a function\n const thisObj = context.thisObj;\n if (thisObj && (typeof thisObj === 'object' || typeof thisObj === 'function') && expression.name in thisObj) {\n const result = thisObj[expression.name];\n validatePropertyName(result);\n return result;\n } else if (context.variables && expression.name in context.variables) {\n const result = context.variables[expression.name];\n validatePropertyName(result);\n return result;\n } else if (expression.name in context.globals) {\n return context.globals[expression.name];\n } else {\n return undefined;\n }\n}\nfunction visitLiteral(expression, context) {\n validatePropertyName(expression.value);\n return expression.value;\n}\nfunction createSynchronousContext(variables) {\n return createContextInternal(variables, _globals_js__WEBPACK_IMPORTED_MODULE_7__.globals);\n}\nfunction createAsynchronousContext(variables) {\n return createContextInternal(variables, _globals_js__WEBPACK_IMPORTED_MODULE_7__.globalsAsync);\n}\nfunction createContextInternal(variables, globals_) {\n const context = {\n thisObj: undefined,\n variables: {\n ...variables\n },\n globals: {\n ...globals_\n },\n addVariables (vars) {\n this.variables = {\n ...this.variables,\n ...vars\n };\n return this;\n }\n };\n context.addVariables.bind(context);\n return context;\n}\n// helper useful for handling arrays of expressions, since `null` expressions should not be\n// dispatched to `visitExpression()`\nfunction handleNullableExpression(context) {\n return function handleNullableExpressionInner(expression) {\n if (expression === null) {\n return null;\n }\n return visitExpression(expression, context);\n };\n}\nfunction validatePropertyName(name) {\n if (name === '__proto__' || name === 'prototype' || name === 'constructor') {\n throw {\n type: 'Illegal property access',\n message: `Cannot access the ${name} property of objects`\n };\n }\n}\nfunction isValidVariableType(val) {\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || typeof val === 'function' || val === null || val instanceof RegExp) {\n return true;\n }\n if (typeof val === 'object') {\n for (const key of Object.keys(val)){\n if (!isValidVariableType(val[key])) {\n return false;\n }\n }\n return true;\n }\n if (Array.isArray(val)) {\n for (const item of val){\n if (!isValidVariableType(item)) {\n return false;\n }\n }\n }\n return false;\n}\nfunction getCallTargetName(expression) {\n if (!expression) {\n return null;\n }\n if (expression.type === 'MemberExpression') {\n return expression.property?.name;\n }\n // identifier expression\n return expression.name;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHByZXNzaW9uLWV2YWx1YXRvci9kaXN0L2V2YWx1YXRvci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQkFBc0IsR0FBMkI7QUFDTjtBQUNKO0FBQ1E7QUFDSjtBQUNJO0FBQ0U7QUFDSTtBQUNyREEsNENBQUlBLENBQUNTLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDVCwwREFBU0E7QUFDL0JELDRDQUFJQSxDQUFDUyxPQUFPLENBQUNDLFFBQVEsQ0FBQ1Isd0RBQU9BO0FBQzdCRiw0Q0FBSUEsQ0FBQ1MsT0FBTyxDQUFDQyxRQUFRLENBQUNQLDREQUFXQTtBQUNqQ0gsNENBQUlBLENBQUNTLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDTiwwREFBU0E7QUFDL0JKLDRDQUFJQSxDQUFDUyxPQUFPLENBQUNDLFFBQVEsQ0FBQ0wsNERBQVdBO0FBQ2pDTCw0Q0FBSUEsQ0FBQ1MsT0FBTyxDQUFDQyxRQUFRLENBQUNKLDZEQUFZQTtBQUNsQyx1R0FBdUc7QUFDdkcsNkJBQTZCO0FBQzdCLGtEQUFrRDtBQUNsRE4sNENBQUlBLENBQUNXLFdBQVcsQ0FBQyxNQUFNO0FBQ3ZCWCw0Q0FBSUEsQ0FBQ1csV0FBVyxDQUFDLE1BQU07QUFDUDtBQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4REMsR0FBVSxTQUFTQyxTQUFTQyxVQUFVLEVBQUVDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELE9BQU9DLGVBQWVGLFlBQVlDLFdBQVdFO0FBQ2pEO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUVDLEdBQVUsZUFBZUMsY0FBY0osVUFBVSxFQUFFQyxZQUFZLENBQUMsQ0FBQztJQUM5RCxPQUFPSSxvQkFBb0JMLFlBQVlDLFdBQVdFO0FBQ3REO0FBQ0E7Ozs7Ozs7O0NBUUMs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OEIsSUFBSSxHQUFHO2dCQUNoQyxPQUFPO1lBQ1g7UUFDSjtRQUNBLE9BQU87SUFDWDtJQUNBLElBQUlFLE1BQU1DLE9BQU8sQ0FBQ2pDLE1BQU07UUFDcEIsS0FBSyxNQUFNa0MsUUFBUWxDLElBQUk7WUFDbkIsSUFBSSxDQUFDQyxvQkFBb0JpQyxPQUFPO2dCQUM1QixPQUFPO1lBQ1g7UUFDSjtJQUNKO0lBQ0EsT0FBTztBQUNYO0FBQ0EsU0FBUy9DLGtCQUFrQnZELFVBQVU7SUFDakMsSUFBSSxDQUFDQSxZQUFZO1FBQ2IsT0FBTztJQUNYO0lBQ0EsSUFBSUEsV0FBV2lCLElBQUksS0FBSyxvQkFBb0I7UUFDeEMsT0FBT2pCLFdBQVcwQyxRQUFRLEVBQUVEO0lBQ2hDO0lBQ0Esd0JBQXdCO0lBQ3hCLE9BQU96QyxXQUFXeUMsSUFBSTtBQUMxQiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHByZXNzaW9uLWV2YWx1YXRvci9kaXN0L2V2YWx1YXRvci5qcz85MmZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAY2F0ZWdvcnkgVXRpbGl0eSAqLyBpbXBvcnQganNlcCBmcm9tIFwianNlcFwiO1xuaW1wb3J0IGpzZXBBcnJvdyBmcm9tIFwiQGpzZXAtcGx1Z2luL2Fycm93XCI7XG5pbXBvcnQganNlcE5ldyBmcm9tIFwiQGpzZXAtcGx1Z2luL25ld1wiO1xuaW1wb3J0IGpzZXBOdW1iZXJzIGZyb20gXCJAanNlcC1wbHVnaW4vbnVtYmVyc1wiO1xuaW1wb3J0IGpzZXBSZWdleCBmcm9tIFwiQGpzZXAtcGx1Z2luL3JlZ2V4XCI7XG5pbXBvcnQganNlcFRlcm5hcnkgZnJvbSBcIkBqc2VwLXBsdWdpbi90ZXJuYXJ5XCI7XG5pbXBvcnQganNlcFRlbXBsYXRlIGZyb20gXCJAanNlcC1wbHVnaW4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IGdsb2JhbHMsIGdsb2JhbHNBc3luYyB9IGZyb20gXCIuL2dsb2JhbHMuanNcIjtcbmpzZXAucGx1Z2lucy5yZWdpc3Rlcihqc2VwQXJyb3cpO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBOZXcpO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBOdW1iZXJzKTtcbmpzZXAucGx1Z2lucy5yZWdpc3Rlcihqc2VwUmVnZXgpO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBUZXJuYXJ5KTtcbmpzZXAucGx1Z2lucy5yZWdpc3Rlcihqc2VwVGVtcGxhdGUpO1xuLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvT3BlcmF0b3JfcHJlY2VkZW5jZVxuLy8gZm9yIHRoZSBvcmRlciBkZWZpbmVkIGhlcmVcbi8vIDcgaXMganNlcCdzIGludGVybmFsIGZvciBcInJlbGF0aW9uYWwgb3BlcmF0b3JzXCJcbmpzZXAuYWRkQmluYXJ5T3AoJ2luJywgNyk7XG5qc2VwLmFkZEJpbmFyeU9wKCc/PycsIDEpO1xuZXhwb3J0IHsganNlcCB9O1xuLyoqXG4gKiBgZXZhbHVhdGUoKWAgaW1wbGVtZW50cyBhIHJlbGF0aXZlbHkgc2FmZSB2ZXJzaW9uIG9mIGBldmFsKClgIHRoYXQgaXMgbGltaXRlZCB0byBldmFsdWF0aW5nIHN5bmNocm9ub3VzXG4gKiBKYXZhc2NyaXB0IGV4cHJlc3Npb25zLiBUaGlzIGFsbG93cyB1cyB0byBzYWZlbHkgYWRkIGZlYXR1cmVzIHRoYXQgZGVwZW5kIG9uIHVzZXItc3VwcGxpZWQgY29kZSB3aXRob3V0XG4gKiBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2Ugb3IgbmVlZGluZyB0byBzdXBwb3J0IGBldmFsKClgIGFuZCB0aGUgbGlrZS5cbiAqXG4gKiBCeSBkZWZhdWx0IGl0IHN1cHBvcnRzIGFueSBleHByZXNzaW9uIHRoYXQgZXZhbHV0ZXMgdG8gYSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgRGF0ZSwgbnVsbCwgb3IgdW5kZWZpbmVkLlxuICogT3RoZXIgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gc2hvdWxkRGlzcGxheU9wdGlvbmFsRGF0YSB3aWxsIGJlIGZhbHNlXG4gKiBjb25zdCBzaG91bGREaXNwbGF5T3B0aW9uYWxEYXRhID0gZXZhbHVhdGUoJyFpc0VtcHR5KGFycmF5KScsIHtcbiAqICBhcnJheTogW10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBTaW5jZSB0aGlzIG9ubHkgaW1wbGVtZW50cyB0aGUgZXhwcmVzc2lvbiBsYW5hZ3VhZ2UgcGFydCBvZiBKYXZhc2NyaXB0LCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHZhbHVlcywgY3JlYXRpbmcgZnVuY3Rpb25zLCBvciBjcmVhdGluZyBvYmplY3RzLCBzbyB0aGUgZm9sbG93aW5nIHdpbGwgdGhyb3cgYW4gZXJyb3I6XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBldmFsdWF0ZSgndmFyIGEgPSAxOyBhJyk7XG4gKiBgYGBcbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBzdHJpbmcgZXhwcmVzc2lvbnMsIGBldmFsdWF0ZSgpYCBjYW4gdXNlIGFuIGV4aXN0aW5nIGBqc2VwLkV4cHJlc3Npb25gLCBzdWNoIGFzIHRoYXQgcmV0dXJuZWRcbiAqIGZyb20gdGhlIGBjb21waWxlKClgIGZ1bmN0aW9uLiBUaGUgZ29hbCBoZXJlIGlzIHRvIHN1cHBvcnQgY2FzZXMgd2hlcmUgdGhlIHNhbWUgZXhwcmVzc2lvbiB3aWxsIGJlIGV2YWx1YXRlZFxuICogbXVsdGlwbGUgdGltZXMsIHBvc3NpYmx5IHdpdGggZGlmZmVyZW50IHZhcmlhYmxlcywgZS5nLixcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGV4cHIgPSBjb21waWxlKCdpc0VtcHR5KGFycmF5KScpO1xuICpcbiAqIC8vIHRoZW4gd2UgdXNlIGl0IGxpa2VcbiAqIGV2YWx1YXRlKGV4cHIsIHtcbiAqICBhcnJheTogW10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqICkpO1xuICpcbiAqIGV2YWx1YXRlKGV4cHIsIHtcbiAqICBhcnJheTogWyd2YWx1ZSddLFxuICogIGlzRW1wdHkoYXJyOiB1bmtub3duKSB7XG4gKiAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA9PT0gMDtcbiAqICB9XG4gKiApKTtcbiAqIGBgYFxuICpcbiAqIFRoaXMgc2F2ZXMgdGhlIG92ZXJoZWFkIG9mIHBhcnNpbmcgdGhlIGV4cHJlc3Npb24gZXZlcnl0aW1lIGFuZCBzaW1wbHkgYWxsb3dzIHVzIHRvIGV2YWx1YXRlIGl0LlxuICpcbiAqIFRoZSBgdmFyaWFibGVzYCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IGFueSB2YXJpYWJsZXMgb3IgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGluLXNjb3BlIGZvclxuICogdGhlIGV2YWx1YXRpb24uIEEgdmVyeSBsaW1pdGVkIG51bWJlciBvZiBnbG9iYWwgb2JqZWN0cywgbGlrZSBOYU4gYW5kIEluZmluaXR5IGFyZSBhbHdheXMgYXZhaWxhYmxlLCBidXRcbiAqIGFueSBub24tZ2xvYmFsIHZhbHVlcyB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIGFzIGEgdmFyaWFibGUuIE5vdGUgdGhhdCBleHByZXNzaW9ucyBkbyBub3QgaGF2ZSBhbnkgYWNjZXNzIHRvXG4gKiB0aGUgdmFyaWFibGVzIGluIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZCB1bmxlc3MgdGhleSBhcmUgc3VwcGxpZWQgaGVyZS5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIHByZS1wYXJzZWQgZXhwcmVzc2lvblxuICogQHBhcmFtIHZhcmlhYmxlcyBPcHRpb25hbCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMuIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAqICB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZShleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSkge1xuICAgIHJldHVybiBldmFsdWF0ZUFzVHlwZShleHByZXNzaW9uLCB2YXJpYWJsZXMsIGRlZmF1bHRUeXBlUHJlZGljYXRlKTtcbn1cbi8qKlxuICogYGV2YWx1YXRlQXN5bmMoKWAgaW1wbGVtZW50cyBhIHJlbGF0aXZlbHkgc2FmZSB2ZXJzaW9uIG9mIGBldmFsKClgIHRoYXQgY2FuIGV2YWx1YXRlIEphdmFzY3JpcHQgZXhwcmVzc2lvbnNcbiAqIHRoYXQgdXNlIFByb21pc2VzLiBUaGlzIGFsbG93cyB1cyB0byBzYWZlbHkgYWRkIGZlYXR1cmVzIHRoYXQgZGVwZW5kIG9uIHVzZXItc3VwcGxpZWQgY29kZSB3aXRob3V0XG4gKiBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2Ugb3IgbmVlZGluZyB0byBzdXBwb3J0IGBldmFsKClgIGFuZCB0aGUgbGlrZS5cbiAqXG4gKiBCeSBkZWZhdWx0IGl0IHN1cHBvcnRzIGFueSBleHByZXNzaW9uIHRoYXQgZXZhbHV0ZXMgdG8gYSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgRGF0ZSwgbnVsbCwgb3IgdW5kZWZpbmVkLlxuICogT3RoZXIgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gc2hvdWxkRGlzcGxheU9wdGlvbmFsRGF0YSB3aWxsIGJlIGZhbHNlXG4gKiBjb25zdCBzaG91bGREaXNwbGF5T3B0aW9uYWxEYXRhID0gYXdhaXQgZXZhbHVhdGVBc3luYygnUHJvbWlzZS5yZXNvbHZlKCFpc0VtcHR5KGFycmF5KSknLCB7XG4gKiAgYXJyYXk6IFtdLFxuICogIGlzRW1wdHkoYXJyOiB1bmtub3duKSB7XG4gKiAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA9PT0gMDtcbiAqICB9XG4gKiB9KVxuICogYGBgXG4gKlxuICogU2luY2UgdGhpcyBvbmx5IGltcGxlbWVudHMgdGhlIGV4cHJlc3Npb24gbGFuYWd1YWdlIHBhcnQgb2YgSmF2YXNjcmlwdCwgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiB2YWx1ZXMsIGNyZWF0aW5nIGZ1bmN0aW9ucywgb3IgY3JlYXRpbmcgb2JqZWN0cywgc28gdGhlIGZvbGxvd2luZyB3aWxsIHRocm93IGFuIGVycm9yOlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZXZhbHVhdGVBc3luYygndmFyIGEgPSAxOyBhJyk7XG4gKiBgYGBcbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBzdHJpbmcgZXhwcmVzc2lvbnMsIGBldmFsdWF0ZSgpYCBjYW4gdXNlIGFuIGV4aXN0aW5nIGBqc2VwLkV4cHJlc3Npb25gLCBzdWNoIGFzIHRoYXQgcmV0dXJuZWRcbiAqIGZyb20gdGhlIGBjb21waWxlKClgIGZ1bmN0aW9uLiBUaGUgZ29hbCBoZXJlIGlzIHRvIHN1cHBvcnQgY2FzZXMgd2hlcmUgdGhlIHNhbWUgZXhwcmVzc2lvbiB3aWxsIGJlIGV2YWx1YXRlZFxuICogbXVsdGlwbGUgdGltZXMsIHBvc3NpYmx5IHdpdGggZGlmZmVyZW50IHZhcmlhYmxlcywgZS5nLixcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGV4cHIgPSBjb21waWxlKCdQcm9taXNlLnJlc29sdmUoaXNFbXB0eShhcnJheSkpJyk7XG4gKlxuICogLy8gdGhlbiB3ZSB1c2UgaXQgbGlrZVxuICogZXZhbHVhdGVBc3luYyhleHByLCB7XG4gKiAgYXJyYXk6IFtdLFxuICogIGlzRW1wdHkoYXJyOiB1bmtub3duKSB7XG4gKiAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA9PT0gMDtcbiAqICB9XG4gKiApKTtcbiAqXG4gKiBldmFsdWF0ZUFzeW5jKGV4cHIsIHtcbiAqICBhcnJheTogWyd2YWx1ZSddLFxuICogIGlzRW1wdHkoYXJyOiB1bmtub3duKSB7XG4gKiAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA9PT0gMDtcbiAqICB9XG4gKiApKTtcbiAqIGBgYFxuICpcbiAqIFRoaXMgc2F2ZXMgdGhlIG92ZXJoZWFkIG9mIHBhcnNpbmcgdGhlIGV4cHJlc3Npb24gZXZlcnl0aW1lIGFuZCBzaW1wbHkgYWxsb3dzIHVzIHRvIGV2YWx1YXRlIGl0LlxuICpcbiAqIFRoZSBgdmFyaWFibGVzYCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IGFueSB2YXJpYWJsZXMgb3IgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGluLXNjb3BlIGZvclxuICogdGhlIGV2YWx1YXRpb24uIEEgdmVyeSBsaW1pdGVkIG51bWJlciBvZiBnbG9iYWwgb2JqZWN0cywgbGlrZSBOYU4gYW5kIEluZmluaXR5IGFyZSBhbHdheXMgYXZhaWxhYmxlLCBidXRcbiAqIGFueSBub24tZ2xvYmFsIHZhbHVlcyB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIGFzIGEgdmFyaWFibGUuIE5vdGUgdGhhdCBleHByZXNzaW9ucyBkbyBub3QgaGF2ZSBhbnkgYWNjZXNzIHRvXG4gKiB0aGUgdmFyaWFibGVzIGluIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZCB1bmxlc3MgdGhleSBhcmUgc3VwcGxpZWQgaGVyZS5cbiAqXG4gKiAqKk5vdGU6KiogYGV2YWx1YXRlQXN5bmMoKWAgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgUHJvbWlzZS1iYXNlZCBhc3luY2hyb25vdXMgZmxvd3MgYW5kIGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgYXdhaXRgIGtleXdvcmQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGVpdGhlciBhcyBhIHN0cmluZyBvciBwcmUtcGFyc2VkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2YXJpYWJsZXMgT3B0aW9uYWwgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gKiAgdGhlIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbHVhdGVBc3luYyhleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSkge1xuICAgIHJldHVybiBldmFsdWF0ZUFzVHlwZUFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcywgZGVmYXVsdFR5cGVQcmVkaWNhdGUpO1xufVxuLyoqXG4gKiBgZXZhbHVhdGVBc0Jvb2xlYW4oKWAgaXMgYSB2YXJpYW50IG9mIHtAbGluayBldmFsdWF0ZSgpfSB3aGljaCBvbmx5IHN1cHBvcnRzIGJvb2xlYW4gcmVzdWx0cy4gVXNlZnVsXG4gKiBpZiB2YWxpZCBleHByZXNzaW9uIG11c3QgcmV0dXJuIGJvb2xlYW4gdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXNCb29sZWFuKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlQXNUeXBlKGV4cHJlc3Npb24sIHZhcmlhYmxlcywgYm9vbGVhblR5cGVQcmVkaWNhdGUpO1xufVxuLyoqXG4gKiBgZXZhbHVhdGVBc0Jvb2xlYW5Bc3luYygpYCBpcyBhIHZhcmlhbnQgb2Yge0BsaW5rIGV2YWx1YXRlQXN5bmMoKX0gd2hpY2ggb25seSBzdXBwb3J0cyBib29sZWFuIHJlc3VsdHMuIFVzZWZ1bFxuICogaWYgdmFsaWQgZXhwcmVzc2lvbiBtdXN0IHJldHVybiBib29sZWFuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIHByZS1wYXJzZWQgZXhwcmVzc2lvblxuICogQHBhcmFtIHZhcmlhYmxlcyBPcHRpb25hbCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMuIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAqICB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUFzQm9vbGVhbkFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlQXNUeXBlQXN5bmMoZXhwcmVzc2lvbiwgdmFyaWFibGVzLCBib29sZWFuVHlwZVByZWRpY2F0ZSk7XG59XG4vKipcbiAqIGBldmFsdWF0ZUFzTnVtYmVyKClgIGlzIGEgdmFyaWFudCBvZiB7QGxpbmsgZXZhbHVhdGUoKX0gd2hpY2ggb25seSBzdXBwb3J0cyBudW1iZXIgcmVzdWx0cy4gVXNlZnVsXG4gKiBpZiB2YWxpZCBleHByZXNzaW9uIG11c3QgcmV0dXJuIG51bWVyaWMgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXNOdW1iZXIoZXhwcmVzc2lvbiwgdmFyaWFibGVzID0ge30pIHtcbiAgICByZXR1cm4gZXZhbHVhdGVBc1R5cGUoZXhwcmVzc2lvbiwgdmFyaWFibGVzLCBudW1iZXJUeXBlUHJlZGljYXRlKTtcbn1cbi8qKlxuICogYGV2YWx1YXRlQXNOdW1iZXJBc3luYygpYCBpcyBhIHZhcmlhbnQgb2Yge0BsaW5rIGV2YWx1YXRlQXN5bmMoKX0gd2hpY2ggb25seSBzdXBwb3J0cyBudW1iZXIgcmVzdWx0cy4gVXNlZnVsXG4gKiBpZiB2YWxpZCBleHByZXNzaW9uIG11c3QgcmV0dXJuIG51bWVyaWMgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXNOdW1iZXJBc3luYyhleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSkge1xuICAgIHJldHVybiBldmFsdWF0ZUFzVHlwZUFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcywgbnVtYmVyVHlwZVByZWRpY2F0ZSk7XG59XG4vKipcbiAqIGBldmFsdWF0ZUFzVHlwZSgpYCBpcyBhIHR5cGUtc2FmZSB2ZXJzaW9uIG9mIHtAbGluayBldmFsdWF0ZSgpfSB3aGljaCByZXR1cm5zIGEgcmVzdWx0IGlmIHRoZSByZXN1bHRcbiAqIHBhc3NlcyBhIGN1c3RvbSB0eXBlIHByZWRpY2F0ZS4gVGhlIG1haW4gdXNlLWNhc2UgZm9yIHRoaXMgaXMgdG8gbmFycm93IHRoZSByZXR1cm4gdHlwZXMgYWxsb3dlZCBiYXNlZCBvblxuICogY29udGV4dCwgZS5nLiwgaWYgdGhlIGV4cGVjdGVkIHJlc3VsdCBzaG91bGQgYmUgYSBudW1iZXIgb3IgYm9vbGVhbiwgeW91IGNhbiBzdXBwbHkgYSBjdXN0b20gdHlwZS1ndWFyZFxuICogdG8gZW5zdXJlIHRoYXQgb25seSBudW1iZXIgb3IgYm9vbGVhbiByZXN1bHRzIGFyZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIHByZS1wYXJzZWQgZXhwcmVzc2lvblxuICogQHBhcmFtIHZhcmlhYmxlcyBPcHRpb25hbCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMuIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAqICB0aGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB0eXBlUHJlZGljYXRlIEEgW3R5cGUgcHJlZGljYXRlXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL25hcnJvd2luZy5odG1sI3VzaW5nLXR5cGUtcHJlZGljYXRlcylcbiAqICB3aGljaCBhc3NlcnRzIHRoYXQgdGhlIHJlc3VsdCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgZXhwZWN0ZWQgcmVzdWx0cy5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUFzVHlwZShleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSwgdHlwZVByZWRpY2F0ZSkge1xuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiAhPT0gJ3N0cmluZycgJiYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnb2JqZWN0JyB8fCAhZXhwcmVzc2lvbiB8fCAhKCd0eXBlJyBpbiBleHByZXNzaW9uKSkpIHtcbiAgICAgICAgdGhyb3cgYFVua25vd24gZXhwcmVzc2lvbiB0eXBlICR7ZXhwcmVzc2lvbn0uIEV4cHJlc3Npb25zIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIG9yIHByZS1jb21waWxlZCBzdHJpbmcuYDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YXJpYWJsZXMgPT09ICd1bmRlZmluZWQnIHx8IHZhcmlhYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICB2YXJpYWJsZXMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZVN5bmNocm9ub3VzQ29udGV4dCh2YXJpYWJsZXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHZpc2l0RXhwcmVzc2lvbih0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgPyBqc2VwKGV4cHJlc3Npb24pIDogZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgaWYgKHR5cGVQcmVkaWNhdGUocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHtcbiAgICAgICAgICAgIHR5cGU6ICdJbnZhbGlkIHJlc3VsdCcsXG4gICAgICAgICAgICBtZXNzYWdlOiB0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgPyBgVGhlIGV4cHJlc3Npb24gJHtleHByZXNzaW9ufSBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCByZXN1bHRgIDogJ1RoZSBleHByZXNzaW9uIGRpZCBub3QgcHJvZHVjZSBhIHZhbGlkIHJlc3VsdCdcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIGBldmFsdWF0ZUFzVHlwZUFzeW5jKClgIGlzIGEgdHlwZS1zYWZlIHZlcnNpb24gb2Yge0BsaW5rIGV2YWx1YXRlQXN5bmMoKX0gd2hpY2ggcmV0dXJucyBhIHJlc3VsdCBpZiB0aGUgcmVzdWx0XG4gKiBwYXNzZXMgYSBjdXN0b20gdHlwZSBwcmVkaWNhdGUuIFRoZSBtYWluIHVzZS1jYXNlIGZvciB0aGlzIGlzIHRvIG5hcnJvdyB0aGUgcmV0dXJuIHR5cGVzIGFsbG93ZWQgYmFzZWQgb25cbiAqIGNvbnRleHQsIGUuZy4sIGlmIHRoZSBleHBlY3RlZCByZXN1bHQgc2hvdWxkIGJlIGEgbnVtYmVyIG9yIGJvb2xlYW4sIHlvdSBjYW4gc3VwcGx5IGEgY3VzdG9tIHR5cGUtZ3VhcmRcbiAqIHRvIGVuc3VyZSB0aGF0IG9ubHkgbnVtYmVyIG9yIGJvb2xlYW4gcmVzdWx0cyBhcmUgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGVpdGhlciBhcyBhIHN0cmluZyBvciBwcmUtcGFyc2VkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2YXJpYWJsZXMgT3B0aW9uYWwgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gKiAgdGhlIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gdHlwZVByZWRpY2F0ZSBBIFt0eXBlIHByZWRpY2F0ZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9uYXJyb3dpbmcuaHRtbCN1c2luZy10eXBlLXByZWRpY2F0ZXMpXG4gKiAgd2hpY2ggYXNzZXJ0cyB0aGF0IHRoZSByZXN1bHQgdmFsdWUgbWF0Y2hlcyBvbmUgb2YgdGhlIGV4cGVjdGVkIHJlc3VsdHMuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbHVhdGVBc1R5cGVBc3luYyhleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSwgdHlwZVByZWRpY2F0ZSkge1xuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiAhPT0gJ3N0cmluZycgJiYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnb2JqZWN0JyB8fCAhZXhwcmVzc2lvbiB8fCAhKCd0eXBlJyBpbiBleHByZXNzaW9uKSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBVbmtub3duIGV4cHJlc3Npb24gdHlwZSAke2V4cHJlc3Npb259LiBFeHByZXNzaW9ucyBtdXN0IGVpdGhlciBiZSBhIHN0cmluZyBvciBwcmUtY29tcGlsZWQgc3RyaW5nLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFyaWFibGVzID09PSBudWxsKSB7XG4gICAgICAgIHZhcmlhYmxlcyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQXN5bmNocm9ub3VzQ29udGV4dCh2YXJpYWJsZXMpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmlzaXRFeHByZXNzaW9uKHR5cGVvZiBleHByZXNzaW9uID09PSAnc3RyaW5nJyA/IGpzZXAoZXhwcmVzc2lvbikgOiBleHByZXNzaW9uLCBjb250ZXh0KSkudGhlbigocmVzdWx0KT0+e1xuICAgICAgICBpZiAodHlwZVByZWRpY2F0ZShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdJbnZhbGlkIHJlc3VsdCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnID8gYFRoZSBleHByZXNzaW9uICR7ZXhwcmVzc2lvbn0gZGlkIG5vdCBwcm9kdWNlIGEgdmFsaWQgcmVzdWx0YCA6ICdUaGUgZXhwcmVzc2lvbiBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCByZXN1bHQnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIGBjb21waWxlKClgIGlzIGEgY29tcGFuaW9uIGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCB7QGxpbmsgZXZhbHVhdGUoKX0gYW5kIHRoZSB2YXJpb3VzIGBldmFsdWF0ZUFzKigpYCBmdW5jdGlvbnMuXG4gKiBJdCBwcm9jZXNzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgaW50byB0aGUgcmVzdWx0aW5nIEFTVCB0aGF0IGlzIGV4ZWN1dGVkIGJ5IHRob3NlIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VmdWwgaWZcbiAqIHlvdSBoYXZlIGFuIGV4cHJlc3Npb24gdGhhdCB3aWxsIG5lZWQgdG8gYmUgZXZhbHVhdGVkIG11bGl0cGxlIHRpbWVzLCBwb3RlbnRpYWxseSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMsIGFzIHRoZVxuICogbGV4aW5nIGFuZCBwYXJzaW5nIHN0ZXBzIGNhbiBiZSBza2lwcGVkIGJ5IHVzaW5nIHRoZSBBU1Qgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcy5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgQVNUIGlzIGludGVuZGVkIHRvIGJlIG9wYXF1ZSB0byBjbGllbnQgYXBwbGljYXRpb25zLCBidXQsIG9mIGNvdXJzZSwgaXQgaXMgcG9zc2libGUgdG8gbWFuaXB1bGF0ZVxuICogdGhlIEFTVCBiZWZvcmUgcGFzc2luZyBpdCBiYWNrIHRvIHtAbGluayBldmFsdWF0ZSgpfSwgaWYgZGVzaXJlZC4gVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYsIGZvciBleGFtcGxlLCBjZXJ0YWluXG4gKiB2YWx1ZXMgYXJlIGtub3duIHRvIGJlIGNvbnN0YW50LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMgQW4gZXhlY3V0YWJsZSBBU1QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gY29tcGlsZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGpzZXAoZXhwcmVzc2lvbik7XG59XG4vLyBQcmUtZGVmaW5lZCB0eXBlIGd1YXJkc1xuZnVuY3Rpb24gZGVmYXVsdFR5cGVQcmVkaWNhdGUocmVzdWx0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiByZXN1bHQgPT09ICdudW1iZXInIHx8IHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJyB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0IGluc3RhbmNlb2YgRGF0ZTtcbn1cbmZ1bmN0aW9uIGJvb2xlYW5UeXBlUHJlZGljYXRlKHJlc3VsdCkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbic7XG59XG5mdW5jdGlvbiBudW1iZXJUeXBlUHJlZGljYXRlKHJlc3VsdCkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJztcbn1cbi8vIEltcGxlbWVudGF0aW9uXG4vLyBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbjsgaXQgdGFrZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHZhcmlhYmxlcyBhbmQgdGhlIGN1cnJlbnQgb2JqZWN0XG4vLyBlYWNoIGV4cHJlc3Npb24gaXMgZGlzcGF0Y2hlZCB0byBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyLlxuZnVuY3Rpb24gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBzd2l0Y2goZXhwcmVzc2lvbi50eXBlKXtcbiAgICAgICAgY2FzZSAnVW5hcnlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdFVuYXJ5RXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRCaW5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdDb25kaXRpb25hbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdDYWxsRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0QXJyb3dGdW5jdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0TWVtYmVyRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdEFycmF5RXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnU2VxdWVuY2VFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdFNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnTmV3RXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXROZXdFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdExpdGVyYWwoZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0SWRlbnRpZmllcihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnVGVtcGxhdGVMaXRlcmFsJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdFRlbXBsYXRlTGl0ZXJhbChleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnVGVtcGxhdGVFbGVtZW50JzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdFRlbXBsYXRlRWxlbWVudChleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IGBFeHByZXNzaW9uIGV2YWx1YXRvciBkb2VzIG5vdCBzdXBwb3J0IGV4cHJlc3Npb24gb2YgdHlwZSAnJHtleHByZXNzaW9uLnR5cGV9J2A7XG4gICAgfVxufVxuZnVuY3Rpb24gdmlzaXRFeHByZXNzaW9uTmFtZShleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgc3dpdGNoKGV4cHJlc3Npb24udHlwZSl7XG4gICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWU7XG4gICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24ubmFtZTtcbiAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRFeHByZXNzaW9uTmFtZShleHByZXNzaW9uLnByb3BlcnR5LCBjb250ZXh0KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IGBWaXNpdEV4cHJlc3Npb25OYW1lIGRvZXMgbm90IHN1cHBvcnQgZXhwcmVzc2lvbiBvZiB0eXBlICcke2V4cHJlc3Npb24udHlwZX0nYDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdFVuYXJ5RXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgY29uc3QgdmFsdWUgPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5hcmd1bWVudCwgY29udGV4dCk7XG4gICAgc3dpdGNoKGV4cHJlc3Npb24ub3BlcmF0b3Ipe1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIHJldHVybiArdmFsdWU7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgcmV0dXJuIC12YWx1ZTtcbiAgICAgICAgY2FzZSAnfic6XG4gICAgICAgICAgICByZXR1cm4gfnZhbHVlO1xuICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBgRXhwcmVzc2lvbiBldmFsdWF0b3IgZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRvciAnJHtleHByZXNzaW9uLm9wZXJhdG9yfScnYDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdEJpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIGxldCBsZWZ0ID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ubGVmdCwgY29udGV4dCk7XG4gICAgbGV0IHJpZ2h0ID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ucmlnaHQsIGNvbnRleHQpO1xuICAgIHN3aXRjaChleHByZXNzaW9uLm9wZXJhdG9yKXtcbiAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0O1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICUgcmlnaHQ7XG4gICAgICAgIGNhc2UgJyoqJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICoqIHJpZ2h0O1xuICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDtcbiAgICAgICAgY2FzZSAnPT09JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAhPT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluIHJpZ2h0O1xuICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAmJiByaWdodDtcbiAgICAgICAgY2FzZSAnfHwnOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7XG4gICAgICAgIGNhc2UgJz8/JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID8/IHJpZ2h0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgYEV4cHJlc3Npb24gZXZhbHVhdG9yIGRvZXMgbm90IHN1cHBvcnQgb3BlcmF0b3IgJyR7ZXhwcmVzc2lvbi5vcGVyYXRvcn0nIG9wZXJhdG9yYDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgY29uc3QgdGVzdCA9IHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnRlc3QsIGNvbnRleHQpO1xuICAgIHJldHVybiB0ZXN0ID8gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24uY29uc2VxdWVudCwgY29udGV4dCkgOiB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5hbHRlcm5hdGUsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gdmlzaXRDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGFyZ3MgPSBleHByZXNzaW9uLmFyZ3VtZW50cz8ubWFwKGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbihjb250ZXh0KSk7XG4gICAgbGV0IGNhbGxlZSA9IHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmNhbGxlZSwgY29udGV4dCk7XG4gICAgaWYgKCFjYWxsZWUpIHtcbiAgICAgICAgdGhyb3cgYE5vIGZ1bmN0aW9uIG5hbWVkICR7Z2V0Q2FsbFRhcmdldE5hbWUoZXhwcmVzc2lvbi5jYWxsZWUpfSBpcyBkZWZpbmVkIGluIHRoaXMgY29udGV4dGA7XG4gICAgfSBlbHNlIGlmICghKHR5cGVvZiBjYWxsZWUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IGAke2dldENhbGxUYXJnZXROYW1lKGV4cHJlc3Npb24uY2FsbGVlKX0gaXMgbm90IGEgZnVuY3Rpb25gO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGVlKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gdmlzaXRBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgY29uc3QgcGFyYW1zID0gZXhwcmVzc2lvbi5wYXJhbXM/Lm1hcCgocCk9PntcbiAgICAgICAgc3dpdGNoKHAudHlwZSl7XG4gICAgICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5uYW1lO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBgQ2Fubm90IGhhbmRsZSBwYXJhbWV0ZXIgb2YgdHlwZSAke3AudHlwZX1gO1xuICAgICAgICB9XG4gICAgfSkgPz8gW107XG4gICAgcmV0dXJuIChmdW5jdGlvbiguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA8IHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IGBSZXF1aXJlZCBhcmd1bWVudChzKSAke3BhcmFtcy5zbGljZShyZXN0Lmxlbmd0aCwgLTEpLmpvaW4oJywgJyl9IHdlcmUgbm90IHByb3ZpZGVkYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKHBhcmFtcy5yZWR1Y2UoKGFjYywgcCwgaWR4KT0+e1xuICAgICAgICAgICAgY29uc3QgdmFsID0gcmVzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRWYXJpYWJsZVR5cGUodmFsKSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgcCxcbiAgICAgICAgICAgICAgICAgICAgdmFsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSkpO1xuICAgICAgICByZXR1cm4gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24uYm9keSwgY29udGV4dC5hZGRWYXJpYWJsZXModmFycykpO1xuICAgIH0pLmJpbmQoY29udGV4dC50aGlzT2JqID8/IG51bGwpO1xufVxuZnVuY3Rpb24gdmlzaXRNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBsZXQgb2JqID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ub2JqZWN0LCBjb250ZXh0KTtcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3dpdGNoKGV4cHJlc3Npb24ub2JqZWN0LnR5cGUpe1xuICAgICAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0TmFtZSA9IHZpc2l0RXhwcmVzc2lvbk5hbWUoZXhwcmVzc2lvbi5vYmplY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSZWZlcmVuY2VFcnJvcihgUmVmZXJlbmNlRXJyb3I6ICR7b2JqZWN0TmFtZX0gaXMgbm90IGRlZmluZWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdNZW1iZXJFeHByZXNzaW9uJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSB2aXNpdEV4cHJlc3Npb25OYW1lKGV4cHJlc3Npb24ucHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFR5cGVFcnJvcjogY2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJyR7cHJvcGVydHlOYW1lfScpYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBgVmlzaXRNZW1iZXJFeHByZXNzaW9uIGRvZXMgbm90IHN1cHBvcnQgb3BlcmF0b3IgJyR7ZXhwcmVzc2lvbi5vYmplY3QudHlwZX0nIHR5cGVgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBuZXdPYmogPSBvYmo7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ld09iaiA9IFN0cmluZy5wcm90b3R5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXdPYmogPSBOdW1iZXIucHJvdG90eXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIG5vLW9wXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBgVmlzaXRNZW1iZXJFeHByZXNzaW9uIGRvZXMgbm90IHN1cHBvcnQgbWVtYmVyIGFjY2VzcyBvbiB0eXBlICR7dHlwZW9mIG9ian1gO1xuICAgIH1cbiAgICBjb250ZXh0LnRoaXNPYmogPSBuZXdPYmo7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBzd2l0Y2goZXhwcmVzc2lvbi5wcm9wZXJ0eS50eXBlKXtcbiAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmVzdWx0ID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ucHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5wcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0lsbGVnYWwgcHJvcGVydHkgYWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBwcm9wZXJ0eSB3YXMgc3VwcGxpZWQgdG8gdGhlIHByb3BlcnR5IGFjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eU5hbWUocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9ialtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuYmluZChvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdmlzaXRBcnJheUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIHJldHVybiBleHByZXNzaW9uLmVsZW1lbnRzPy5tYXAoaGFuZGxlTnVsbGFibGVFeHByZXNzaW9uKGNvbnRleHQpKTtcbn1cbmZ1bmN0aW9uIHZpc2l0U2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmV4cHJlc3Npb25zLm1hcChoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkpO1xuICAgIHJldHVybiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xufVxuZnVuY3Rpb24gdmlzaXROZXdFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5jYWxsZWUgJiYgZXhwcmVzc2lvbi5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIGxldCBhcmdzID0gZXhwcmVzc2lvbi5hcmd1bWVudHM/Lm1hcChoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkpO1xuICAgICAgICBzd2l0Y2goZXhwcmVzc2lvbi5jYWxsZWUubmFtZSl7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8qKiBAdHMtaWdub3JlIGJlY2F1c2Ugd2UgY2FuIHVzZSB0aGUgc3ByZWFkIG9wZXJhdG9yIGhlcmUgKi8gcmV0dXJuIG5ldyBEYXRlKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICAgICAgLyoqIEB0cy1pZ25vcmUgYmVjYXVzZSB3ZSBjYW4gdXNlIHRoZSBzcHJlYWQgb3BlcmF0b3IgaGVyZSAqLyByZXR1cm4gbmV3IFJlZ0V4cCguLi5hcmdzKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgYENhbm5vdCBpbnN0YW50aWF0ZSBvYmplY3Qgb2YgdHlwZSAke2V4cHJlc3Npb24uY2FsbGVlLm5hbWV9YDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbi5jYWxsZWUpIHtcbiAgICAgICAgICAgIHRocm93IGBDb3VsZCBub3QgaGFuZGxlIFwibmV3XCIgd2l0aG91dCBhIHNwZWNpZmllZCBjbGFzc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyAnbmV3IG11c3QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIERhdGUgb3IgUmVnRXhwJztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZpc2l0VGVtcGxhdGVMaXRlcmFsKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBleHByZXNzaW9ucyA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbnM/Lm1hcChoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkpID8/IFtdO1xuICAgIGNvbnN0IHF1YXNpcyA9IGV4cHJlc3Npb24ucXVhc2lzPy5tYXAoaGFuZGxlTnVsbGFibGVFeHByZXNzaW9uKGNvbnRleHQpKSA/PyBbXTtcbiAgICByZXR1cm4gcXVhc2lzLmZpbHRlcigocSk9PiFxLnRhaWwpLm1hcCgocSk9PnEudmFsdWUpLmpvaW4oJycpICsgZXhwcmVzc2lvbnMuam9pbignJykgKyBxdWFzaXMuZmlsdGVyKChxKT0+cS50YWlsKS5tYXAoKHEpPT5xLnZhbHVlKS5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIHZpc2l0VGVtcGxhdGVFbGVtZW50KGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZXhwcmVzc2lvbi5jb29rZWQsXG4gICAgICAgIHRhaWw6IGV4cHJlc3Npb24udGFpbFxuICAgIH07XG59XG5mdW5jdGlvbiB2aXNpdElkZW50aWZpZXIoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIHZhbGlkYXRlUHJvcGVydHlOYW1lKGV4cHJlc3Npb24ubmFtZSk7XG4gICAgLy8gd2Ugc3VwcG9ydCBib3RoIGBvYmplY3RgIGFuZCBgZnVuY3Rpb25gIGluIHRoZSBzYW1lIHdheSBhcyB0ZWNobmljYWxseSBwcm9wZXJ0eSBhY2Nlc3Mgb24gZnVuY3Rpb25zXG4gICAgLy8gaXMgcG9zc2libGU7IHRoZSB1c2UtY2FzZSBoZXJlIGlzIHRvIHN1cHBvcnQgSlMncyBcInN0YXRpY1wiIGZ1bmN0aW9ucyBsaWtlIGBOdW1iZXIuaXNJbnRlZ2VyKClgLCB3aGljaFxuICAgIC8vIGlzIHRlY2huaWNhbGx5IHJlYWRpbmcgYSBwcm9wZXJ0eSBvbiBhIGZ1bmN0aW9uXG4gICAgY29uc3QgdGhpc09iaiA9IGNvbnRleHQudGhpc09iajtcbiAgICBpZiAodGhpc09iaiAmJiAodHlwZW9mIHRoaXNPYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0aGlzT2JqID09PSAnZnVuY3Rpb24nKSAmJiBleHByZXNzaW9uLm5hbWUgaW4gdGhpc09iaikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzT2JqW2V4cHJlc3Npb24ubmFtZV07XG4gICAgICAgIHZhbGlkYXRlUHJvcGVydHlOYW1lKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0LnZhcmlhYmxlcyAmJiBleHByZXNzaW9uLm5hbWUgaW4gY29udGV4dC52YXJpYWJsZXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC52YXJpYWJsZXNbZXhwcmVzc2lvbi5uYW1lXTtcbiAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eU5hbWUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ubmFtZSBpbiBjb250ZXh0Lmdsb2JhbHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2xvYmFsc1tleHByZXNzaW9uLm5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gdmlzaXRMaXRlcmFsKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5TmFtZShleHByZXNzaW9uLnZhbHVlKTtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN5bmNocm9ub3VzQ29udGV4dCh2YXJpYWJsZXMpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dEludGVybmFsKHZhcmlhYmxlcywgZ2xvYmFscyk7XG59XG5mdW5jdGlvbiBjcmVhdGVBc3luY2hyb25vdXNDb250ZXh0KHZhcmlhYmxlcykge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0SW50ZXJuYWwodmFyaWFibGVzLCBnbG9iYWxzQXN5bmMpO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dEludGVybmFsKHZhcmlhYmxlcywgZ2xvYmFsc18pIHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICB0aGlzT2JqOiB1bmRlZmluZWQsXG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgLi4udmFyaWFibGVzXG4gICAgICAgIH0sXG4gICAgICAgIGdsb2JhbHM6IHtcbiAgICAgICAgICAgIC4uLmdsb2JhbHNfXG4gICAgICAgIH0sXG4gICAgICAgIGFkZFZhcmlhYmxlcyAodmFycykge1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy52YXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgLi4udmFyc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb250ZXh0LmFkZFZhcmlhYmxlcy5iaW5kKGNvbnRleHQpO1xuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8gaGVscGVyIHVzZWZ1bCBmb3IgaGFuZGxpbmcgYXJyYXlzIG9mIGV4cHJlc3Npb25zLCBzaW5jZSBgbnVsbGAgZXhwcmVzc2lvbnMgc2hvdWxkIG5vdCBiZVxuLy8gZGlzcGF0Y2hlZCB0byBgdmlzaXRFeHByZXNzaW9uKClgXG5mdW5jdGlvbiBoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb25Jbm5lcihleHByZXNzaW9uKSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgIH07XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5TmFtZShuYW1lKSB7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nIHx8IG5hbWUgPT09ICdwcm90b3R5cGUnIHx8IG5hbWUgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgdHlwZTogJ0lsbGVnYWwgcHJvcGVydHkgYWNjZXNzJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW5ub3QgYWNjZXNzIHRoZSAke25hbWV9IHByb3BlcnR5IG9mIG9iamVjdHNgXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZFZhcmlhYmxlVHlwZSh2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsID09PSBudWxsIHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbCkpe1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkVmFyaWFibGVUeXBlKHZhbFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKXtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZFZhcmlhYmxlVHlwZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRDYWxsVGFyZ2V0TmFtZShleHByZXNzaW9uKSB7XG4gICAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24ucHJvcGVydHk/Lm5hbWU7XG4gICAgfVxuICAgIC8vIGlkZW50aWZpZXIgZXhwcmVzc2lvblxuICAgIHJldHVybiBleHByZXNzaW9uLm5hbWU7XG59XG4iXSwibmFtZXMiOlsianNlcCIsImpzZXBBcnJvdyIsImpzZXBOZXciLCJqc2VwTnVtYmVycyIsImpzZXBSZWdleCIsImpzZXBUZXJuYXJ5IiwianNlcFRlbXBsYXRlIiwiZ2xvYmFscyIsImdsb2JhbHNBc3luYyIsInBsdWdpbnMiLCJyZWdpc3RlciIsImFkZEJpbmFyeU9wIiwiZXZhbHVhdGUiLCJleHByZXNzaW9uIiwidmFyaWFibGVzIiwiZXZhbHVhdGVBc1R5cGUiLCJkZWZhdWx0VHlwZVByZWRpY2F0ZSIsImV2YWx1YXRlQXN5bmMiLCJldmFsdWF0ZUFzVHlwZUFzeW5jIiwiZXZhbHVhdGVBc0Jvb2xlYW4iLCJib29sZWFuVHlwZVByZWRpY2F0ZSIsImV2YWx1YXRlQXNCb29sZWFuQXN5bmMiLCJldmFsdWF0ZUFzTnVtYmVyIiwibnVtYmVyVHlwZVByZWRpY2F0ZSIsImV2YWx1YXRlQXNOdW1iZXJBc3luYyIsInR5cGVQcmVkaWNhdGUiLCJjb250ZXh0IiwiY3JlYXRlU3luY2hyb25vdXNDb250ZXh0IiwicmVzdWx0IiwidmlzaXRFeHByZXNzaW9uIiwidHlwZSIsIm1lc3NhZ2UiLCJQcm9taXNlIiwicmVqZWN0IiwiY3JlYXRlQXN5bmNocm9ub3VzQ29udGV4dCIsInJlc29sdmUiLCJ0aGVuIiwiY29tcGlsZSIsIkRhdGUiLCJ2aXNpdFVuYXJ5RXhwcmVzc2lvbiIsInZpc2l0QmluYXJ5RXhwcmVzc2lvbiIsInZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uIiwidmlzaXRDYWxsRXhwcmVzc2lvbiIsInZpc2l0QXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLCJ2aXNpdE1lbWJlckV4cHJlc3Npb24iLCJ2aXNpdEFycmF5RXhwcmVzc2lvbiIsInZpc2l0U2VxdWVuY2VFeHByZXNzaW9uIiwidmlzaXROZXdFeHByZXNzaW9uIiwidmlzaXRMaXRlcmFsIiwidmlzaXRJZGVudGlmaWVyIiwidmlzaXRUZW1wbGF0ZUxpdGVyYWwiLCJ2aXNpdFRlbXBsYXRlRWxlbWVudCIsInZpc2l0RXhwcmVzc2lvbk5hbWUiLCJ2YWx1ZSIsIm5hbWUiLCJwcm9wZXJ0eSIsImFyZ3VtZW50Iiwib3BlcmF0b3IiLCJsZWZ0IiwicmlnaHQiLCJ0ZXN0IiwiY29uc2VxdWVudCIsImFsdGVybmF0ZSIsImFyZ3MiLCJhcmd1bWVudHMiLCJtYXAiLCJoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24iLCJjYWxsZWUiLCJnZXRDYWxsVGFyZ2V0TmFtZSIsInBhcmFtcyIsInAiLCJyZXN0IiwibGVuZ3RoIiwic2xpY2UiLCJqb2luIiwidmFycyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiaWR4IiwidmFsIiwiaXNWYWxpZFZhcmlhYmxlVHlwZSIsInB1c2giLCJib2R5IiwiYWRkVmFyaWFibGVzIiwiYmluZCIsInRoaXNPYmoiLCJvYmoiLCJvYmplY3QiLCJ1bmRlZmluZWQiLCJvYmplY3ROYW1lIiwiUmVmZXJlbmNlRXJyb3IiLCJwcm9wZXJ0eU5hbWUiLCJUeXBlRXJyb3IiLCJuZXdPYmoiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJOdW1iZXIiLCJ2YWxpZGF0ZVByb3BlcnR5TmFtZSIsImVsZW1lbnRzIiwiZXhwcmVzc2lvbnMiLCJSZWdFeHAiLCJxdWFzaXMiLCJmaWx0ZXIiLCJxIiwidGFpbCIsImNvb2tlZCIsImNyZWF0ZUNvbnRleHRJbnRlcm5hbCIsImdsb2JhbHNfIiwiaGFuZGxlTnVsbGFibGVFeHByZXNzaW9uSW5uZXIiLCJrZXkiLCJrZXlzIiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-expression-evaluator/dist/evaluator.js\n");
398
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ compile: () => (/* binding */ compile),\n/* harmony export */ evaluate: () => (/* binding */ evaluate),\n/* harmony export */ evaluateAsBoolean: () => (/* binding */ evaluateAsBoolean),\n/* harmony export */ evaluateAsBooleanAsync: () => (/* binding */ evaluateAsBooleanAsync),\n/* harmony export */ evaluateAsNumber: () => (/* binding */ evaluateAsNumber),\n/* harmony export */ evaluateAsNumberAsync: () => (/* binding */ evaluateAsNumberAsync),\n/* harmony export */ evaluateAsType: () => (/* binding */ evaluateAsType),\n/* harmony export */ evaluateAsTypeAsync: () => (/* binding */ evaluateAsTypeAsync),\n/* harmony export */ evaluateAsync: () => (/* binding */ evaluateAsync),\n/* harmony export */ jsep: () => (/* reexport safe */ jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var jsep__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jsep */ \"../../../node_modules/jsep/dist/jsep.js\");\n/* harmony import */ var _jsep_plugin_arrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jsep-plugin/arrow */ \"../../../node_modules/@jsep-plugin/arrow/dist/index.js\");\n/* harmony import */ var _jsep_plugin_new__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jsep-plugin/new */ \"../../../node_modules/@jsep-plugin/new/dist/index.js\");\n/* harmony import */ var _jsep_plugin_numbers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jsep-plugin/numbers */ \"../../../node_modules/@jsep-plugin/numbers/dist/index.js\");\n/* harmony import */ var _jsep_plugin_regex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jsep-plugin/regex */ \"../../../node_modules/@jsep-plugin/regex/dist/index.js\");\n/* harmony import */ var _jsep_plugin_ternary__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @jsep-plugin/ternary */ \"../../../node_modules/@jsep-plugin/ternary/dist/index.js\");\n/* harmony import */ var _jsep_plugin_template__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @jsep-plugin/template */ \"../../../node_modules/@jsep-plugin/template/dist/index.js\");\n/* harmony import */ var _globals_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./globals.js */ \"../../framework/esm-expression-evaluator/dist/globals.js\");\n/** @category Utility */ \n\n\n\n\n\n\n\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_arrow__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_new__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_numbers__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_regex__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_ternary__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].plugins.register(_jsep_plugin_template__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n// see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence\n// for the order defined here\n// 7 is jsep's internal for \"relational operators\"\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addBinaryOp('in', 7);\njsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addBinaryOp('??', 1);\n\n/**\n * `evaluate()` implements a relatively safe version of `eval()` that is limited to evaluating synchronous\n * Javascript expressions. This allows us to safely add features that depend on user-supplied code without\n * polluting the global namespace or needing to support `eval()` and the like.\n *\n * By default it supports any expression that evalutes to a string, number, boolean, Date, null, or undefined.\n * Other values will result in an error.\n *\n * @example\n * ```ts\n * // shouldDisplayOptionalData will be false\n * const shouldDisplayOptionalData = evaluate('!isEmpty(array)', {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * })\n * ```\n *\n * Since this only implements the expression lanaguage part of Javascript, there is no support for assigning\n * values, creating functions, or creating objects, so the following will throw an error:\n *\n * @example\n * ```ts\n * evaluate('var a = 1; a');\n * ```\n *\n * In addition to string expressions, `evaluate()` can use an existing `jsep.Expression`, such as that returned\n * from the `compile()` function. The goal here is to support cases where the same expression will be evaluated\n * multiple times, possibly with different variables, e.g.,\n *\n * @example\n * ```ts\n * const expr = compile('isEmpty(array)');\n *\n * // then we use it like\n * evaluate(expr, {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n *\n * evaluate(expr, {\n * array: ['value'],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n * ```\n *\n * This saves the overhead of parsing the expression everytime and simply allows us to evaluate it.\n *\n * The `variables` parameter should be used to supply any variables or functions that should be in-scope for\n * the evaluation. A very limited number of global objects, like NaN and Infinity are always available, but\n * any non-global values will need to be passed as a variable. Note that expressions do not have any access to\n * the variables in the scope in which they were defined unless they are supplied here.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluate(expression, variables = {}) {\n return evaluateAsType(expression, variables, defaultTypePredicate);\n}\n/**\n * `evaluateAsync()` implements a relatively safe version of `eval()` that can evaluate Javascript expressions\n * that use Promises. This allows us to safely add features that depend on user-supplied code without\n * polluting the global namespace or needing to support `eval()` and the like.\n *\n * By default it supports any expression that evalutes to a string, number, boolean, Date, null, or undefined.\n * Other values will result in an error.\n *\n * @example\n * ```ts\n * // shouldDisplayOptionalData will be false\n * const shouldDisplayOptionalData = await evaluateAsync('Promise.resolve(!isEmpty(array))', {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * })\n * ```\n *\n * Since this only implements the expression lanaguage part of Javascript, there is no support for assigning\n * values, creating functions, or creating objects, so the following will throw an error:\n *\n * @example\n * ```ts\n * evaluateAsync('var a = 1; a');\n * ```\n *\n * In addition to string expressions, `evaluate()` can use an existing `jsep.Expression`, such as that returned\n * from the `compile()` function. The goal here is to support cases where the same expression will be evaluated\n * multiple times, possibly with different variables, e.g.,\n *\n * @example\n * ```ts\n * const expr = compile('Promise.resolve(isEmpty(array))');\n *\n * // then we use it like\n * evaluateAsync(expr, {\n * array: [],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n *\n * evaluateAsync(expr, {\n * array: ['value'],\n * isEmpty(arr: unknown) {\n * return Array.isArray(arr) && arr.length === 0;\n * }\n * ));\n * ```\n *\n * This saves the overhead of parsing the expression everytime and simply allows us to evaluate it.\n *\n * The `variables` parameter should be used to supply any variables or functions that should be in-scope for\n * the evaluation. A very limited number of global objects, like NaN and Infinity are always available, but\n * any non-global values will need to be passed as a variable. Note that expressions do not have any access to\n * the variables in the scope in which they were defined unless they are supplied here.\n *\n * **Note:** `evaluateAsync()` currently only supports Promise-based asynchronous flows and does not support\n * the `await` keyword.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ async function evaluateAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, defaultTypePredicate);\n}\n/**\n * `evaluateAsBoolean()` is a variant of {@link evaluate()} which only supports boolean results. Useful\n * if valid expression must return boolean values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsBoolean(expression, variables = {}) {\n return evaluateAsType(expression, variables, booleanTypePredicate);\n}\n/**\n * `evaluateAsBooleanAsync()` is a variant of {@link evaluateAsync()} which only supports boolean results. Useful\n * if valid expression must return boolean values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsBooleanAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, booleanTypePredicate);\n}\n/**\n * `evaluateAsNumber()` is a variant of {@link evaluate()} which only supports number results. Useful\n * if valid expression must return numeric values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsNumber(expression, variables = {}) {\n return evaluateAsType(expression, variables, numberTypePredicate);\n}\n/**\n * `evaluateAsNumberAsync()` is a variant of {@link evaluateAsync()} which only supports number results. Useful\n * if valid expression must return numeric values.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @returns The result of evaluating the expression\n */ function evaluateAsNumberAsync(expression, variables = {}) {\n return evaluateAsTypeAsync(expression, variables, numberTypePredicate);\n}\n/**\n * `evaluateAsType()` is a type-safe version of {@link evaluate()} which returns a result if the result\n * passes a custom type predicate. The main use-case for this is to narrow the return types allowed based on\n * context, e.g., if the expected result should be a number or boolean, you can supply a custom type-guard\n * to ensure that only number or boolean results are returned.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @param typePredicate A [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)\n * which asserts that the result value matches one of the expected results.\n * @returns The result of evaluating the expression\n */ function evaluateAsType(expression, variables = {}, typePredicate) {\n if (typeof expression !== 'string' && (typeof expression !== 'object' || !expression || !('type' in expression))) {\n throw `Unknown expression type ${expression}. Expressions must either be a string or pre-compiled string.`;\n }\n if (typeof expression === 'string' && expression.trim().length === 0) {\n throw {\n type: 'Empty expression',\n message: 'Expression cannot be an empty string'\n };\n }\n if (typeof variables === 'undefined' || variables === null) {\n variables = {};\n }\n const context = createSynchronousContext(variables);\n const result = visitExpression(typeof expression === 'string' ? (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression) : expression, context);\n if (typePredicate(result)) {\n return result;\n } else {\n throw {\n type: 'Invalid result',\n message: typeof expression === 'string' ? `The expression ${expression} did not produce a valid result` : 'The expression did not produce a valid result'\n };\n }\n}\n/**\n * `evaluateAsTypeAsync()` is a type-safe version of {@link evaluateAsync()} which returns a result if the result\n * passes a custom type predicate. The main use-case for this is to narrow the return types allowed based on\n * context, e.g., if the expected result should be a number or boolean, you can supply a custom type-guard\n * to ensure that only number or boolean results are returned.\n *\n * @param expression The expression to evaluate, either as a string or pre-parsed expression\n * @param variables Optional object which contains any variables, functions, etc. that will be available to\n * the expression.\n * @param typePredicate A [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)\n * which asserts that the result value matches one of the expected results.\n * @returns The result of evaluating the expression\n */ async function evaluateAsTypeAsync(expression, variables = {}, typePredicate) {\n if (typeof expression !== 'string' && (typeof expression !== 'object' || !expression || !('type' in expression))) {\n return Promise.reject(`Unknown expression type ${expression}. Expressions must either be a string or pre-compiled string.`);\n }\n if (typeof expression === 'string' && expression.trim().length === 0) {\n throw {\n type: 'Empty expression',\n message: 'Expression cannot be an empty string'\n };\n }\n if (typeof variables === 'undefined' || variables === null) {\n variables = {};\n }\n const context = createAsynchronousContext(variables);\n return Promise.resolve(visitExpression(typeof expression === 'string' ? (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression) : expression, context)).then((result)=>{\n if (typePredicate(result)) {\n return result;\n } else {\n throw {\n type: 'Invalid result',\n message: typeof expression === 'string' ? `The expression ${expression} did not produce a valid result` : 'The expression did not produce a valid result'\n };\n }\n });\n}\n/**\n * `compile()` is a companion function for use with {@link evaluate()} and the various `evaluateAs*()` functions.\n * It processes an expression string into the resulting AST that is executed by those functions. This is useful if\n * you have an expression that will need to be evaluated mulitple times, potentially with different values, as the\n * lexing and parsing steps can be skipped by using the AST object returned from this.\n *\n * The returned AST is intended to be opaque to client applications, but, of course, it is possible to manipulate\n * the AST before passing it back to {@link evaluate()}, if desired. This might be useful if, for example, certain\n * values are known to be constant.\n *\n * @param expression The expression to be parsed\n * @returns An executable AST representation of the expression\n */ function compile(expression) {\n return (0,jsep__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(expression);\n}\n// Pre-defined type guards\nfunction defaultTypePredicate(result) {\n return typeof result === 'string' || typeof result === 'number' || typeof result === 'boolean' || typeof result === 'undefined' || result === null || result instanceof Date;\n}\nfunction booleanTypePredicate(result) {\n return typeof result === 'boolean';\n}\nfunction numberTypePredicate(result) {\n return typeof result === 'number';\n}\n// Implementation\n// This is the core of the implementation; it takes an expression, the variables and the current object\n// each expression is dispatched to an appropriate handler.\nfunction visitExpression(expression, context) {\n switch(expression.type){\n case 'UnaryExpression':\n return visitUnaryExpression(expression, context);\n case 'BinaryExpression':\n return visitBinaryExpression(expression, context);\n case 'ConditionalExpression':\n return visitConditionalExpression(expression, context);\n case 'CallExpression':\n return visitCallExpression(expression, context);\n case 'ArrowFunctionExpression':\n return visitArrowFunctionExpression(expression, context);\n case 'MemberExpression':\n return visitMemberExpression(expression, context);\n case 'ArrayExpression':\n return visitArrayExpression(expression, context);\n case 'SequenceExpression':\n return visitSequenceExpression(expression, context);\n case 'NewExpression':\n return visitNewExpression(expression, context);\n case 'Literal':\n return visitLiteral(expression, context);\n case 'Identifier':\n return visitIdentifier(expression, context);\n case 'TemplateLiteral':\n return visitTemplateLiteral(expression, context);\n case 'TemplateElement':\n return visitTemplateElement(expression, context);\n default:\n throw `Expression evaluator does not support expression of type '${expression.type}'`;\n }\n}\nfunction visitExpressionName(expression, context) {\n switch(expression.type){\n case 'Literal':\n return expression.value;\n case 'Identifier':\n return expression.name;\n case 'MemberExpression':\n return visitExpressionName(expression.property, context);\n default:\n throw `VisitExpressionName does not support expression of type '${expression.type}'`;\n }\n}\nfunction visitUnaryExpression(expression, context) {\n const value = visitExpression(expression.argument, context);\n switch(expression.operator){\n case '+':\n return +value;\n case '-':\n return -value;\n case '~':\n return ~value;\n case '!':\n return !value;\n default:\n throw `Expression evaluator does not support operator '${expression.operator}''`;\n }\n}\nfunction visitBinaryExpression(expression, context) {\n let left = visitExpression(expression.left, context);\n let right = visitExpression(expression.right, context);\n switch(expression.operator){\n case '+':\n return left + right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n case '**':\n return left ** right;\n case '==':\n return left == right;\n case '===':\n return left === right;\n case '!=':\n return left != right;\n case '!==':\n return left !== right;\n case '>':\n return left > right;\n case '>=':\n return left >= right;\n case '<':\n return left < right;\n case '<=':\n return left <= right;\n case 'in':\n return left in right;\n case '&&':\n return left && right;\n case '||':\n return left || right;\n case '??':\n return left ?? right;\n default:\n throw `Expression evaluator does not support operator '${expression.operator}' operator`;\n }\n}\nfunction visitConditionalExpression(expression, context) {\n const test = visitExpression(expression.test, context);\n return test ? visitExpression(expression.consequent, context) : visitExpression(expression.alternate, context);\n}\nfunction visitCallExpression(expression, context) {\n let args = expression.arguments?.map(handleNullableExpression(context));\n let callee = visitExpression(expression.callee, context);\n if (!callee) {\n throw `No function named ${getCallTargetName(expression.callee)} is defined in this context`;\n } else if (!(typeof callee === 'function')) {\n throw `${getCallTargetName(expression.callee)} is not a function`;\n }\n return callee(...args);\n}\nfunction visitArrowFunctionExpression(expression, context) {\n const params = expression.params?.map((p)=>{\n switch(p.type){\n case 'Identifier':\n return p.name;\n default:\n throw `Cannot handle parameter of type ${p.type}`;\n }\n }) ?? [];\n return (function(...rest) {\n if (rest.length < params.length) {\n throw `Required argument(s) ${params.slice(rest.length, -1).join(', ')} were not provided`;\n }\n const vars = Object.fromEntries(params.reduce((acc, p, idx)=>{\n const val = rest[idx];\n if (isValidVariableType(val)) {\n acc.push([\n p,\n val\n ]);\n }\n return acc;\n }, []));\n return visitExpression(expression.body, context.addVariables(vars));\n }).bind(context.thisObj ?? null);\n}\nfunction visitMemberExpression(expression, context) {\n let obj = visitExpression(expression.object, context);\n if (obj === undefined) {\n switch(expression.object.type){\n case 'Identifier':\n {\n let objectName = visitExpressionName(expression.object, context);\n throw ReferenceError(`ReferenceError: ${objectName} is not defined`);\n }\n case 'MemberExpression':\n {\n let propertyName = visitExpressionName(expression.property, context);\n throw TypeError(`TypeError: cannot read properties of undefined (reading '${propertyName}')`);\n }\n default:\n throw `VisitMemberExpression does not support operator '${expression.object.type}' type`;\n }\n }\n let newObj = obj;\n if (typeof obj === 'string') {\n newObj = String.prototype;\n } else if (typeof obj === 'number') {\n newObj = Number.prototype;\n } else if (typeof obj === 'function') {\n // no-op\n } else if (typeof obj !== 'object') {\n throw `VisitMemberExpression does not support member access on type ${typeof obj}`;\n }\n context.thisObj = newObj;\n let result;\n switch(expression.property.type){\n case 'Identifier':\n case 'MemberExpression':\n result = visitExpression(expression.property, context);\n break;\n default:\n {\n const property = visitExpression(expression.property, context);\n if (typeof property === 'undefined') {\n throw {\n type: 'Illegal property access',\n message: 'No property was supplied to the property access'\n };\n }\n validatePropertyName(property);\n result = obj[property];\n }\n }\n if (typeof result === 'function') {\n return result.bind(obj);\n }\n return result;\n}\nfunction visitArrayExpression(expression, context) {\n return expression.elements?.map(handleNullableExpression(context));\n}\nfunction visitSequenceExpression(expression, context) {\n const result = expression.expressions.map(handleNullableExpression(context));\n return result[result.length - 1];\n}\nfunction visitNewExpression(expression, context) {\n if (expression.callee && expression.callee.type === 'Identifier') {\n let args = expression.arguments?.map(handleNullableExpression(context));\n switch(expression.callee.name){\n case 'Date':\n {\n /** @ts-ignore because we can use the spread operator here */ return new Date(...args);\n }\n case 'RegExp':\n /** @ts-ignore because we can use the spread operator here */ return new RegExp(...args);\n default:\n throw `Cannot instantiate object of type ${expression.callee.name}`;\n }\n } else {\n if (!expression.callee) {\n throw `Could not handle \"new\" without a specified class`;\n } else {\n throw 'new must be called with either Date or RegExp';\n }\n }\n}\nfunction visitTemplateLiteral(expression, context) {\n const expressions = expression.expressions?.map(handleNullableExpression(context)) ?? [];\n const quasis = expression.quasis?.map(handleNullableExpression(context)) ?? [];\n return quasis.filter((q)=>!q.tail).map((q)=>q.value).join('') + expressions.join('') + quasis.filter((q)=>q.tail).map((q)=>q.value).join('');\n}\nfunction visitTemplateElement(expression, context) {\n return {\n value: expression.cooked,\n tail: expression.tail\n };\n}\nfunction visitIdentifier(expression, context) {\n validatePropertyName(expression.name);\n // we support both `object` and `function` in the same way as technically property access on functions\n // is possible; the use-case here is to support JS's \"static\" functions like `Number.isInteger()`, which\n // is technically reading a property on a function\n const thisObj = context.thisObj;\n if (thisObj && (typeof thisObj === 'object' || typeof thisObj === 'function') && expression.name in thisObj) {\n const result = thisObj[expression.name];\n validatePropertyName(result);\n return result;\n } else if (context.variables && expression.name in context.variables) {\n const result = context.variables[expression.name];\n validatePropertyName(result);\n return result;\n } else if (expression.name in context.globals) {\n return context.globals[expression.name];\n } else {\n return undefined;\n }\n}\nfunction visitLiteral(expression, context) {\n validatePropertyName(expression.value);\n return expression.value;\n}\nfunction createSynchronousContext(variables) {\n return createContextInternal(variables, _globals_js__WEBPACK_IMPORTED_MODULE_7__.globals);\n}\nfunction createAsynchronousContext(variables) {\n return createContextInternal(variables, _globals_js__WEBPACK_IMPORTED_MODULE_7__.globalsAsync);\n}\nfunction createContextInternal(variables, globals_) {\n const context = {\n thisObj: undefined,\n variables: {\n ...variables\n },\n globals: {\n ...globals_\n },\n addVariables (vars) {\n this.variables = {\n ...this.variables,\n ...vars\n };\n return this;\n }\n };\n context.addVariables.bind(context);\n return context;\n}\n// helper useful for handling arrays of expressions, since `null` expressions should not be\n// dispatched to `visitExpression()`\nfunction handleNullableExpression(context) {\n return function handleNullableExpressionInner(expression) {\n if (expression === null) {\n return null;\n }\n return visitExpression(expression, context);\n };\n}\nfunction validatePropertyName(name) {\n if (name === '__proto__' || name === 'prototype' || name === 'constructor') {\n throw {\n type: 'Illegal property access',\n message: `Cannot access the ${name} property of objects`\n };\n }\n}\nfunction isValidVariableType(val) {\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || typeof val === 'function' || val === null || val instanceof RegExp) {\n return true;\n }\n if (typeof val === 'object') {\n for (const key of Object.keys(val)){\n if (!isValidVariableType(val[key])) {\n return false;\n }\n }\n return true;\n }\n if (Array.isArray(val)) {\n for (const item of val){\n if (!isValidVariableType(item)) {\n return false;\n }\n }\n }\n return false;\n}\nfunction getCallTargetName(expression) {\n if (!expression) {\n return null;\n }\n if (expression.type === 'MemberExpression') {\n return expression.property?.name;\n }\n // identifier expression\n return expression.name;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHByZXNzaW9uLWV2YWx1YXRvci9kaXN0L2V2YWx1YXRvci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQkFBc0IsR0FBMkI7QUFDTjtBQUNKO0FBQ1E7QUFDSjtBQUNJO0FBQ0U7QUFDSTtBQUNyREEsNENBQUlBLENBQUNTLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDVCwwREFBU0E7QUFDL0JELDRDQUFJQSxDQUFDUyxPQUFPLENBQUNDLFFBQVEsQ0FBQ1Isd0RBQU9BO0FBQzdCRiw0Q0FBSUEsQ0FBQ1MsT0FBTyxDQUFDQyxRQUFRLENBQUNQLDREQUFXQTtBQUNqQ0gsNENBQUlBLENBQUNTLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDTiwwREFBU0E7QUFDL0JKLDRDQUFJQSxDQUFDUyxPQUFPLENBQUNDLFFBQVEsQ0FBQ0wsNERBQVdBO0FBQ2pDTCw0Q0FBSUEsQ0FBQ1MsT0FBTyxDQUFDQyxRQUFRLENBQUNKLDZEQUFZQTtBQUNsQyx1R0FBdUc7QUFDdkcsNkJBQTZCO0FBQzdCLGtEQUFrRDtBQUNsRE4sNENBQUlBLENBQUNXLFdBQVcsQ0FBQyxNQUFNO0FBQ3ZCWCw0Q0FBSUEsQ0FBQ1csV0FBVyxDQUFDLE1BQU07QUFDUDtBQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4REMsR0FBVSxTQUFTQyxTQUFTQyxVQUFVLEVBQUVDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELE9BQU9DLGVBQWVGLFlBQVlDLFdBQVdFO0FBQ2pEO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUVDLEdBQVUsZUFBZUMsY0FBY0osVUFBVSxFQUFFQyxZQUFZLENBQUMsQ0FBQztJQUM5RCxPQUFPSSxvQkFBb0JMLFlBQVlDLFdBQVdFO0FBQ3REO0FBQ0E7Ozs7Ozs7O0NBUUMs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Q0o7QUFDQSxTQUFTMkIsb0JBQW9CRCxHQUFHO0lBQzVCLElBQUksT0FBT0EsUUFBUSxZQUFZLE9BQU9BLFFBQVEsWUFBWSxPQUFPQSxRQUFRLGFBQWEsT0FBT0EsUUFBUSxjQUFjQSxRQUFRLFFBQVFBLGVBQWVxQixRQUFRO1FBQ3RKLE9BQU87SUFDWDtJQUNBLElBQUksT0FBT3JCLFFBQVEsVUFBVTtRQUN6QixLQUFLLE1BQU04QixPQUFPbkMsT0FBT29DLElBQUksQ0FBQy9CLEtBQUs7WUFDL0IsSUFBSSxDQUFDQyxvQkFBb0JELEdBQUcsQ0FBQzhCLElBQUksR0FBRztnQkFDaEMsT0FBTztZQUNYO1FBQ0o7UUFDQSxPQUFPO0lBQ1g7SUFDQSxJQUFJRSxNQUFNQyxPQUFPLENBQUNqQyxNQUFNO1FBQ3BCLEtBQUssTUFBTWtDLFFBQVFsQyxJQUFJO1lBQ25CLElBQUksQ0FBQ0Msb0JBQW9CaUMsT0FBTztnQkFDNUIsT0FBTztZQUNYO1FBQ0o7SUFDSjtJQUNBLE9BQU87QUFDWDtBQUNBLFNBQVM5QyxrQkFBa0J6RCxVQUFVO0lBQ2pDLElBQUksQ0FBQ0EsWUFBWTtRQUNiLE9BQU87SUFDWDtJQUNBLElBQUlBLFdBQVdlLElBQUksS0FBSyxvQkFBb0I7UUFDeEMsT0FBT2YsV0FBVzRDLFFBQVEsRUFBRUQ7SUFDaEM7SUFDQSx3QkFBd0I7SUFDeEIsT0FBTzNDLFdBQVcyQyxJQUFJO0FBQzFCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWV4cHJlc3Npb24tZXZhbHVhdG9yL2Rpc3QvZXZhbHVhdG9yLmpzPzkyZmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBjYXRlZ29yeSBVdGlsaXR5ICovIGltcG9ydCBqc2VwIGZyb20gXCJqc2VwXCI7XG5pbXBvcnQganNlcEFycm93IGZyb20gXCJAanNlcC1wbHVnaW4vYXJyb3dcIjtcbmltcG9ydCBqc2VwTmV3IGZyb20gXCJAanNlcC1wbHVnaW4vbmV3XCI7XG5pbXBvcnQganNlcE51bWJlcnMgZnJvbSBcIkBqc2VwLXBsdWdpbi9udW1iZXJzXCI7XG5pbXBvcnQganNlcFJlZ2V4IGZyb20gXCJAanNlcC1wbHVnaW4vcmVnZXhcIjtcbmltcG9ydCBqc2VwVGVybmFyeSBmcm9tIFwiQGpzZXAtcGx1Z2luL3Rlcm5hcnlcIjtcbmltcG9ydCBqc2VwVGVtcGxhdGUgZnJvbSBcIkBqc2VwLXBsdWdpbi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgZ2xvYmFscywgZ2xvYmFsc0FzeW5jIH0gZnJvbSBcIi4vZ2xvYmFscy5qc1wiO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBBcnJvdyk7XG5qc2VwLnBsdWdpbnMucmVnaXN0ZXIoanNlcE5ldyk7XG5qc2VwLnBsdWdpbnMucmVnaXN0ZXIoanNlcE51bWJlcnMpO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBSZWdleCk7XG5qc2VwLnBsdWdpbnMucmVnaXN0ZXIoanNlcFRlcm5hcnkpO1xuanNlcC5wbHVnaW5zLnJlZ2lzdGVyKGpzZXBUZW1wbGF0ZSk7XG4vLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9PcGVyYXRvcl9wcmVjZWRlbmNlXG4vLyBmb3IgdGhlIG9yZGVyIGRlZmluZWQgaGVyZVxuLy8gNyBpcyBqc2VwJ3MgaW50ZXJuYWwgZm9yIFwicmVsYXRpb25hbCBvcGVyYXRvcnNcIlxuanNlcC5hZGRCaW5hcnlPcCgnaW4nLCA3KTtcbmpzZXAuYWRkQmluYXJ5T3AoJz8/JywgMSk7XG5leHBvcnQgeyBqc2VwIH07XG4vKipcbiAqIGBldmFsdWF0ZSgpYCBpbXBsZW1lbnRzIGEgcmVsYXRpdmVseSBzYWZlIHZlcnNpb24gb2YgYGV2YWwoKWAgdGhhdCBpcyBsaW1pdGVkIHRvIGV2YWx1YXRpbmcgc3luY2hyb25vdXNcbiAqIEphdmFzY3JpcHQgZXhwcmVzc2lvbnMuIFRoaXMgYWxsb3dzIHVzIHRvIHNhZmVseSBhZGQgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gdXNlci1zdXBwbGllZCBjb2RlIHdpdGhvdXRcbiAqIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBvciBuZWVkaW5nIHRvIHN1cHBvcnQgYGV2YWwoKWAgYW5kIHRoZSBsaWtlLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgc3VwcG9ydHMgYW55IGV4cHJlc3Npb24gdGhhdCBldmFsdXRlcyB0byBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBEYXRlLCBudWxsLCBvciB1bmRlZmluZWQuXG4gKiBPdGhlciB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBzaG91bGREaXNwbGF5T3B0aW9uYWxEYXRhIHdpbGwgYmUgZmFsc2VcbiAqIGNvbnN0IHNob3VsZERpc3BsYXlPcHRpb25hbERhdGEgPSBldmFsdWF0ZSgnIWlzRW1wdHkoYXJyYXkpJywge1xuICogIGFycmF5OiBbXSxcbiAqICBpc0VtcHR5KGFycjogdW5rbm93bikge1xuICogICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpICYmIGFyci5sZW5ndGggPT09IDA7XG4gKiAgfVxuICogfSlcbiAqIGBgYFxuICpcbiAqIFNpbmNlIHRoaXMgb25seSBpbXBsZW1lbnRzIHRoZSBleHByZXNzaW9uIGxhbmFndWFnZSBwYXJ0IG9mIEphdmFzY3JpcHQsIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogdmFsdWVzLCBjcmVhdGluZyBmdW5jdGlvbnMsIG9yIGNyZWF0aW5nIG9iamVjdHMsIHNvIHRoZSBmb2xsb3dpbmcgd2lsbCB0aHJvdyBhbiBlcnJvcjpcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGV2YWx1YXRlKCd2YXIgYSA9IDE7IGEnKTtcbiAqIGBgYFxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHN0cmluZyBleHByZXNzaW9ucywgYGV2YWx1YXRlKClgIGNhbiB1c2UgYW4gZXhpc3RpbmcgYGpzZXAuRXhwcmVzc2lvbmAsIHN1Y2ggYXMgdGhhdCByZXR1cm5lZFxuICogZnJvbSB0aGUgYGNvbXBpbGUoKWAgZnVuY3Rpb24uIFRoZSBnb2FsIGhlcmUgaXMgdG8gc3VwcG9ydCBjYXNlcyB3aGVyZSB0aGUgc2FtZSBleHByZXNzaW9uIHdpbGwgYmUgZXZhbHVhdGVkXG4gKiBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgd2l0aCBkaWZmZXJlbnQgdmFyaWFibGVzLCBlLmcuLFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZXhwciA9IGNvbXBpbGUoJ2lzRW1wdHkoYXJyYXkpJyk7XG4gKlxuICogLy8gdGhlbiB3ZSB1c2UgaXQgbGlrZVxuICogZXZhbHVhdGUoZXhwciwge1xuICogIGFycmF5OiBbXSxcbiAqICBpc0VtcHR5KGFycjogdW5rbm93bikge1xuICogICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpICYmIGFyci5sZW5ndGggPT09IDA7XG4gKiAgfVxuICogKSk7XG4gKlxuICogZXZhbHVhdGUoZXhwciwge1xuICogIGFycmF5OiBbJ3ZhbHVlJ10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqICkpO1xuICogYGBgXG4gKlxuICogVGhpcyBzYXZlcyB0aGUgb3ZlcmhlYWQgb2YgcGFyc2luZyB0aGUgZXhwcmVzc2lvbiBldmVyeXRpbWUgYW5kIHNpbXBseSBhbGxvd3MgdXMgdG8gZXZhbHVhdGUgaXQuXG4gKlxuICogVGhlIGB2YXJpYWJsZXNgIHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkgYW55IHZhcmlhYmxlcyBvciBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaW4tc2NvcGUgZm9yXG4gKiB0aGUgZXZhbHVhdGlvbi4gQSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mIGdsb2JhbCBvYmplY3RzLCBsaWtlIE5hTiBhbmQgSW5maW5pdHkgYXJlIGFsd2F5cyBhdmFpbGFibGUsIGJ1dFxuICogYW55IG5vbi1nbG9iYWwgdmFsdWVzIHdpbGwgbmVlZCB0byBiZSBwYXNzZWQgYXMgYSB2YXJpYWJsZS4gTm90ZSB0aGF0IGV4cHJlc3Npb25zIGRvIG5vdCBoYXZlIGFueSBhY2Nlc3MgdG9cbiAqIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkIHVubGVzcyB0aGV5IGFyZSBzdXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlQXNUeXBlKGV4cHJlc3Npb24sIHZhcmlhYmxlcywgZGVmYXVsdFR5cGVQcmVkaWNhdGUpO1xufVxuLyoqXG4gKiBgZXZhbHVhdGVBc3luYygpYCBpbXBsZW1lbnRzIGEgcmVsYXRpdmVseSBzYWZlIHZlcnNpb24gb2YgYGV2YWwoKWAgdGhhdCBjYW4gZXZhbHVhdGUgSmF2YXNjcmlwdCBleHByZXNzaW9uc1xuICogdGhhdCB1c2UgUHJvbWlzZXMuIFRoaXMgYWxsb3dzIHVzIHRvIHNhZmVseSBhZGQgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gdXNlci1zdXBwbGllZCBjb2RlIHdpdGhvdXRcbiAqIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBvciBuZWVkaW5nIHRvIHN1cHBvcnQgYGV2YWwoKWAgYW5kIHRoZSBsaWtlLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgc3VwcG9ydHMgYW55IGV4cHJlc3Npb24gdGhhdCBldmFsdXRlcyB0byBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBEYXRlLCBudWxsLCBvciB1bmRlZmluZWQuXG4gKiBPdGhlciB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBzaG91bGREaXNwbGF5T3B0aW9uYWxEYXRhIHdpbGwgYmUgZmFsc2VcbiAqIGNvbnN0IHNob3VsZERpc3BsYXlPcHRpb25hbERhdGEgPSBhd2FpdCBldmFsdWF0ZUFzeW5jKCdQcm9taXNlLnJlc29sdmUoIWlzRW1wdHkoYXJyYXkpKScsIHtcbiAqICBhcnJheTogW10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBTaW5jZSB0aGlzIG9ubHkgaW1wbGVtZW50cyB0aGUgZXhwcmVzc2lvbiBsYW5hZ3VhZ2UgcGFydCBvZiBKYXZhc2NyaXB0LCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHZhbHVlcywgY3JlYXRpbmcgZnVuY3Rpb25zLCBvciBjcmVhdGluZyBvYmplY3RzLCBzbyB0aGUgZm9sbG93aW5nIHdpbGwgdGhyb3cgYW4gZXJyb3I6XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBldmFsdWF0ZUFzeW5jKCd2YXIgYSA9IDE7IGEnKTtcbiAqIGBgYFxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHN0cmluZyBleHByZXNzaW9ucywgYGV2YWx1YXRlKClgIGNhbiB1c2UgYW4gZXhpc3RpbmcgYGpzZXAuRXhwcmVzc2lvbmAsIHN1Y2ggYXMgdGhhdCByZXR1cm5lZFxuICogZnJvbSB0aGUgYGNvbXBpbGUoKWAgZnVuY3Rpb24uIFRoZSBnb2FsIGhlcmUgaXMgdG8gc3VwcG9ydCBjYXNlcyB3aGVyZSB0aGUgc2FtZSBleHByZXNzaW9uIHdpbGwgYmUgZXZhbHVhdGVkXG4gKiBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgd2l0aCBkaWZmZXJlbnQgdmFyaWFibGVzLCBlLmcuLFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZXhwciA9IGNvbXBpbGUoJ1Byb21pc2UucmVzb2x2ZShpc0VtcHR5KGFycmF5KSknKTtcbiAqXG4gKiAvLyB0aGVuIHdlIHVzZSBpdCBsaWtlXG4gKiBldmFsdWF0ZUFzeW5jKGV4cHIsIHtcbiAqICBhcnJheTogW10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqICkpO1xuICpcbiAqIGV2YWx1YXRlQXN5bmMoZXhwciwge1xuICogIGFycmF5OiBbJ3ZhbHVlJ10sXG4gKiAgaXNFbXB0eShhcnI6IHVua25vd24pIHtcbiAqICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwO1xuICogIH1cbiAqICkpO1xuICogYGBgXG4gKlxuICogVGhpcyBzYXZlcyB0aGUgb3ZlcmhlYWQgb2YgcGFyc2luZyB0aGUgZXhwcmVzc2lvbiBldmVyeXRpbWUgYW5kIHNpbXBseSBhbGxvd3MgdXMgdG8gZXZhbHVhdGUgaXQuXG4gKlxuICogVGhlIGB2YXJpYWJsZXNgIHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkgYW55IHZhcmlhYmxlcyBvciBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaW4tc2NvcGUgZm9yXG4gKiB0aGUgZXZhbHVhdGlvbi4gQSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mIGdsb2JhbCBvYmplY3RzLCBsaWtlIE5hTiBhbmQgSW5maW5pdHkgYXJlIGFsd2F5cyBhdmFpbGFibGUsIGJ1dFxuICogYW55IG5vbi1nbG9iYWwgdmFsdWVzIHdpbGwgbmVlZCB0byBiZSBwYXNzZWQgYXMgYSB2YXJpYWJsZS4gTm90ZSB0aGF0IGV4cHJlc3Npb25zIGRvIG5vdCBoYXZlIGFueSBhY2Nlc3MgdG9cbiAqIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkIHVubGVzcyB0aGV5IGFyZSBzdXBwbGllZCBoZXJlLlxuICpcbiAqICoqTm90ZToqKiBgZXZhbHVhdGVBc3luYygpYCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBQcm9taXNlLWJhc2VkIGFzeW5jaHJvbm91cyBmbG93cyBhbmQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBhd2FpdGAga2V5d29yZC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIHByZS1wYXJzZWQgZXhwcmVzc2lvblxuICogQHBhcmFtIHZhcmlhYmxlcyBPcHRpb25hbCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMuIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAqICB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlQXNUeXBlQXN5bmMoZXhwcmVzc2lvbiwgdmFyaWFibGVzLCBkZWZhdWx0VHlwZVByZWRpY2F0ZSk7XG59XG4vKipcbiAqIGBldmFsdWF0ZUFzQm9vbGVhbigpYCBpcyBhIHZhcmlhbnQgb2Yge0BsaW5rIGV2YWx1YXRlKCl9IHdoaWNoIG9ubHkgc3VwcG9ydHMgYm9vbGVhbiByZXN1bHRzLiBVc2VmdWxcbiAqIGlmIHZhbGlkIGV4cHJlc3Npb24gbXVzdCByZXR1cm4gYm9vbGVhbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGVpdGhlciBhcyBhIHN0cmluZyBvciBwcmUtcGFyc2VkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2YXJpYWJsZXMgT3B0aW9uYWwgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gKiAgdGhlIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVBc0Jvb2xlYW4oZXhwcmVzc2lvbiwgdmFyaWFibGVzID0ge30pIHtcbiAgICByZXR1cm4gZXZhbHVhdGVBc1R5cGUoZXhwcmVzc2lvbiwgdmFyaWFibGVzLCBib29sZWFuVHlwZVByZWRpY2F0ZSk7XG59XG4vKipcbiAqIGBldmFsdWF0ZUFzQm9vbGVhbkFzeW5jKClgIGlzIGEgdmFyaWFudCBvZiB7QGxpbmsgZXZhbHVhdGVBc3luYygpfSB3aGljaCBvbmx5IHN1cHBvcnRzIGJvb2xlYW4gcmVzdWx0cy4gVXNlZnVsXG4gKiBpZiB2YWxpZCBleHByZXNzaW9uIG11c3QgcmV0dXJuIGJvb2xlYW4gdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXNCb29sZWFuQXN5bmMoZXhwcmVzc2lvbiwgdmFyaWFibGVzID0ge30pIHtcbiAgICByZXR1cm4gZXZhbHVhdGVBc1R5cGVBc3luYyhleHByZXNzaW9uLCB2YXJpYWJsZXMsIGJvb2xlYW5UeXBlUHJlZGljYXRlKTtcbn1cbi8qKlxuICogYGV2YWx1YXRlQXNOdW1iZXIoKWAgaXMgYSB2YXJpYW50IG9mIHtAbGluayBldmFsdWF0ZSgpfSB3aGljaCBvbmx5IHN1cHBvcnRzIG51bWJlciByZXN1bHRzLiBVc2VmdWxcbiAqIGlmIHZhbGlkIGV4cHJlc3Npb24gbXVzdCByZXR1cm4gbnVtZXJpYyB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGVpdGhlciBhcyBhIHN0cmluZyBvciBwcmUtcGFyc2VkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2YXJpYWJsZXMgT3B0aW9uYWwgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gKiAgdGhlIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVBc051bWJlcihleHByZXNzaW9uLCB2YXJpYWJsZXMgPSB7fSkge1xuICAgIHJldHVybiBldmFsdWF0ZUFzVHlwZShleHByZXNzaW9uLCB2YXJpYWJsZXMsIG51bWJlclR5cGVQcmVkaWNhdGUpO1xufVxuLyoqXG4gKiBgZXZhbHVhdGVBc051bWJlckFzeW5jKClgIGlzIGEgdmFyaWFudCBvZiB7QGxpbmsgZXZhbHVhdGVBc3luYygpfSB3aGljaCBvbmx5IHN1cHBvcnRzIG51bWJlciByZXN1bHRzLiBVc2VmdWxcbiAqIGlmIHZhbGlkIGV4cHJlc3Npb24gbXVzdCByZXR1cm4gbnVtZXJpYyB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGVpdGhlciBhcyBhIHN0cmluZyBvciBwcmUtcGFyc2VkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2YXJpYWJsZXMgT3B0aW9uYWwgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gKiAgdGhlIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVBc051bWJlckFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlQXNUeXBlQXN5bmMoZXhwcmVzc2lvbiwgdmFyaWFibGVzLCBudW1iZXJUeXBlUHJlZGljYXRlKTtcbn1cbi8qKlxuICogYGV2YWx1YXRlQXNUeXBlKClgIGlzIGEgdHlwZS1zYWZlIHZlcnNpb24gb2Yge0BsaW5rIGV2YWx1YXRlKCl9IHdoaWNoIHJldHVybnMgYSByZXN1bHQgaWYgdGhlIHJlc3VsdFxuICogcGFzc2VzIGEgY3VzdG9tIHR5cGUgcHJlZGljYXRlLiBUaGUgbWFpbiB1c2UtY2FzZSBmb3IgdGhpcyBpcyB0byBuYXJyb3cgdGhlIHJldHVybiB0eXBlcyBhbGxvd2VkIGJhc2VkIG9uXG4gKiBjb250ZXh0LCBlLmcuLCBpZiB0aGUgZXhwZWN0ZWQgcmVzdWx0IHNob3VsZCBiZSBhIG51bWJlciBvciBib29sZWFuLCB5b3UgY2FuIHN1cHBseSBhIGN1c3RvbSB0eXBlLWd1YXJkXG4gKiB0byBlbnN1cmUgdGhhdCBvbmx5IG51bWJlciBvciBib29sZWFuIHJlc3VsdHMgYXJlIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgcHJlLXBhcnNlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIG9iamVjdCB3aGljaCBjb250YWlucyBhbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICogIHRoZSBleHByZXNzaW9uLlxuICogQHBhcmFtIHR5cGVQcmVkaWNhdGUgQSBbdHlwZSBwcmVkaWNhdGVdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvbmFycm93aW5nLmh0bWwjdXNpbmctdHlwZS1wcmVkaWNhdGVzKVxuICogIHdoaWNoIGFzc2VydHMgdGhhdCB0aGUgcmVzdWx0IHZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBleHBlY3RlZCByZXN1bHRzLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXNUeXBlKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9LCB0eXBlUHJlZGljYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnc3RyaW5nJyAmJiAodHlwZW9mIGV4cHJlc3Npb24gIT09ICdvYmplY3QnIHx8ICFleHByZXNzaW9uIHx8ICEoJ3R5cGUnIGluIGV4cHJlc3Npb24pKSkge1xuICAgICAgICB0aHJvdyBgVW5rbm93biBleHByZXNzaW9uIHR5cGUgJHtleHByZXNzaW9ufS4gRXhwcmVzc2lvbnMgbXVzdCBlaXRoZXIgYmUgYSBzdHJpbmcgb3IgcHJlLWNvbXBpbGVkIHN0cmluZy5gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnICYmIGV4cHJlc3Npb24udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICB0eXBlOiAnRW1wdHkgZXhwcmVzc2lvbicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRXhwcmVzc2lvbiBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFyaWFibGVzID09PSBudWxsKSB7XG4gICAgICAgIHZhcmlhYmxlcyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlU3luY2hyb25vdXNDb250ZXh0KHZhcmlhYmxlcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdmlzaXRFeHByZXNzaW9uKHR5cGVvZiBleHByZXNzaW9uID09PSAnc3RyaW5nJyA/IGpzZXAoZXhwcmVzc2lvbikgOiBleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICBpZiAodHlwZVByZWRpY2F0ZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgdHlwZTogJ0ludmFsaWQgcmVzdWx0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHR5cGVvZiBleHByZXNzaW9uID09PSAnc3RyaW5nJyA/IGBUaGUgZXhwcmVzc2lvbiAke2V4cHJlc3Npb259IGRpZCBub3QgcHJvZHVjZSBhIHZhbGlkIHJlc3VsdGAgOiAnVGhlIGV4cHJlc3Npb24gZGlkIG5vdCBwcm9kdWNlIGEgdmFsaWQgcmVzdWx0J1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogYGV2YWx1YXRlQXNUeXBlQXN5bmMoKWAgaXMgYSB0eXBlLXNhZmUgdmVyc2lvbiBvZiB7QGxpbmsgZXZhbHVhdGVBc3luYygpfSB3aGljaCByZXR1cm5zIGEgcmVzdWx0IGlmIHRoZSByZXN1bHRcbiAqIHBhc3NlcyBhIGN1c3RvbSB0eXBlIHByZWRpY2F0ZS4gVGhlIG1haW4gdXNlLWNhc2UgZm9yIHRoaXMgaXMgdG8gbmFycm93IHRoZSByZXR1cm4gdHlwZXMgYWxsb3dlZCBiYXNlZCBvblxuICogY29udGV4dCwgZS5nLiwgaWYgdGhlIGV4cGVjdGVkIHJlc3VsdCBzaG91bGQgYmUgYSBudW1iZXIgb3IgYm9vbGVhbiwgeW91IGNhbiBzdXBwbHkgYSBjdXN0b20gdHlwZS1ndWFyZFxuICogdG8gZW5zdXJlIHRoYXQgb25seSBudW1iZXIgb3IgYm9vbGVhbiByZXN1bHRzIGFyZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIHByZS1wYXJzZWQgZXhwcmVzc2lvblxuICogQHBhcmFtIHZhcmlhYmxlcyBPcHRpb25hbCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYW55IHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMuIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAqICB0aGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB0eXBlUHJlZGljYXRlIEEgW3R5cGUgcHJlZGljYXRlXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL25hcnJvd2luZy5odG1sI3VzaW5nLXR5cGUtcHJlZGljYXRlcylcbiAqICB3aGljaCBhc3NlcnRzIHRoYXQgdGhlIHJlc3VsdCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgZXhwZWN0ZWQgcmVzdWx0cy5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZUFzVHlwZUFzeW5jKGV4cHJlc3Npb24sIHZhcmlhYmxlcyA9IHt9LCB0eXBlUHJlZGljYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnc3RyaW5nJyAmJiAodHlwZW9mIGV4cHJlc3Npb24gIT09ICdvYmplY3QnIHx8ICFleHByZXNzaW9uIHx8ICEoJ3R5cGUnIGluIGV4cHJlc3Npb24pKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoYFVua25vd24gZXhwcmVzc2lvbiB0eXBlICR7ZXhwcmVzc2lvbn0uIEV4cHJlc3Npb25zIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIG9yIHByZS1jb21waWxlZCBzdHJpbmcuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgJiYgZXhwcmVzc2lvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IHtcbiAgICAgICAgICAgIHR5cGU6ICdFbXB0eSBleHByZXNzaW9uJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdFeHByZXNzaW9uIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFyaWFibGVzID09PSAndW5kZWZpbmVkJyB8fCB2YXJpYWJsZXMgPT09IG51bGwpIHtcbiAgICAgICAgdmFyaWFibGVzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVBc3luY2hyb25vdXNDb250ZXh0KHZhcmlhYmxlcyk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2aXNpdEV4cHJlc3Npb24odHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnID8ganNlcChleHByZXNzaW9uKSA6IGV4cHJlc3Npb24sIGNvbnRleHQpKS50aGVuKChyZXN1bHQpPT57XG4gICAgICAgIGlmICh0eXBlUHJlZGljYXRlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ludmFsaWQgcmVzdWx0JyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgPyBgVGhlIGV4cHJlc3Npb24gJHtleHByZXNzaW9ufSBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCByZXN1bHRgIDogJ1RoZSBleHByZXNzaW9uIGRpZCBub3QgcHJvZHVjZSBhIHZhbGlkIHJlc3VsdCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogYGNvbXBpbGUoKWAgaXMgYSBjb21wYW5pb24gZnVuY3Rpb24gZm9yIHVzZSB3aXRoIHtAbGluayBldmFsdWF0ZSgpfSBhbmQgdGhlIHZhcmlvdXMgYGV2YWx1YXRlQXMqKClgIGZ1bmN0aW9ucy5cbiAqIEl0IHByb2Nlc3NlcyBhbiBleHByZXNzaW9uIHN0cmluZyBpbnRvIHRoZSByZXN1bHRpbmcgQVNUIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhvc2UgZnVuY3Rpb25zLiBUaGlzIGlzIHVzZWZ1bCBpZlxuICogeW91IGhhdmUgYW4gZXhwcmVzc2lvbiB0aGF0IHdpbGwgbmVlZCB0byBiZSBldmFsdWF0ZWQgbXVsaXRwbGUgdGltZXMsIHBvdGVudGlhbGx5IHdpdGggZGlmZmVyZW50IHZhbHVlcywgYXMgdGhlXG4gKiBsZXhpbmcgYW5kIHBhcnNpbmcgc3RlcHMgY2FuIGJlIHNraXBwZWQgYnkgdXNpbmcgdGhlIEFTVCBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGlzLlxuICpcbiAqIFRoZSByZXR1cm5lZCBBU1QgaXMgaW50ZW5kZWQgdG8gYmUgb3BhcXVlIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMsIGJ1dCwgb2YgY291cnNlLCBpdCBpcyBwb3NzaWJsZSB0byBtYW5pcHVsYXRlXG4gKiB0aGUgQVNUIGJlZm9yZSBwYXNzaW5nIGl0IGJhY2sgdG8ge0BsaW5rIGV2YWx1YXRlKCl9LCBpZiBkZXNpcmVkLiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiwgZm9yIGV4YW1wbGUsIGNlcnRhaW5cbiAqIHZhbHVlcyBhcmUga25vd24gdG8gYmUgY29uc3RhbnQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyBBbiBleGVjdXRhYmxlIEFTVCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvblxuICovIGV4cG9ydCBmdW5jdGlvbiBjb21waWxlKGV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4ganNlcChleHByZXNzaW9uKTtcbn1cbi8vIFByZS1kZWZpbmVkIHR5cGUgZ3VhcmRzXG5mdW5jdGlvbiBkZWZhdWx0VHlwZVByZWRpY2F0ZShyZXN1bHQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgaW5zdGFuY2VvZiBEYXRlO1xufVxuZnVuY3Rpb24gYm9vbGVhblR5cGVQcmVkaWNhdGUocmVzdWx0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJztcbn1cbmZ1bmN0aW9uIG51bWJlclR5cGVQcmVkaWNhdGUocmVzdWx0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09ICdudW1iZXInO1xufVxuLy8gSW1wbGVtZW50YXRpb25cbi8vIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGltcGxlbWVudGF0aW9uOyBpdCB0YWtlcyBhbiBleHByZXNzaW9uLCB0aGUgdmFyaWFibGVzIGFuZCB0aGUgY3VycmVudCBvYmplY3Rcbi8vIGVhY2ggZXhwcmVzc2lvbiBpcyBkaXNwYXRjaGVkIHRvIGFuIGFwcHJvcHJpYXRlIGhhbmRsZXIuXG5mdW5jdGlvbiB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIHN3aXRjaChleHByZXNzaW9uLnR5cGUpe1xuICAgICAgICBjYXNlICdVbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0VW5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdCaW5hcnlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdEJpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0NhbGxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdENhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBcnJheUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0QXJyYXlFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdTZXF1ZW5jZUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0U2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdE5ld0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0TGl0ZXJhbChleHByZXNzaW9uLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRJZGVudGlmaWVyKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdUZW1wbGF0ZUxpdGVyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0VGVtcGxhdGVMaXRlcmFsKGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdUZW1wbGF0ZUVsZW1lbnQnOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0VGVtcGxhdGVFbGVtZW50KGV4cHJlc3Npb24sIGNvbnRleHQpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgYEV4cHJlc3Npb24gZXZhbHVhdG9yIGRvZXMgbm90IHN1cHBvcnQgZXhwcmVzc2lvbiBvZiB0eXBlICcke2V4cHJlc3Npb24udHlwZX0nYDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdEV4cHJlc3Npb25OYW1lKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBzd2l0Y2goZXhwcmVzc2lvbi50eXBlKXtcbiAgICAgICAgY2FzZSAnTGl0ZXJhbCc6XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcbiAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5uYW1lO1xuICAgICAgICBjYXNlICdNZW1iZXJFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb25OYW1lKGV4cHJlc3Npb24ucHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgYFZpc2l0RXhwcmVzc2lvbk5hbWUgZG9lcyBub3Qgc3VwcG9ydCBleHByZXNzaW9uIG9mIHR5cGUgJyR7ZXhwcmVzc2lvbi50eXBlfSdgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZpc2l0VW5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmFyZ3VtZW50LCBjb250ZXh0KTtcbiAgICBzd2l0Y2goZXhwcmVzc2lvbi5vcGVyYXRvcil7XG4gICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gLXZhbHVlO1xuICAgICAgICBjYXNlICd+JzpcbiAgICAgICAgICAgIHJldHVybiB+dmFsdWU7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IGBFeHByZXNzaW9uIGV2YWx1YXRvciBkb2VzIG5vdCBzdXBwb3J0IG9wZXJhdG9yICcke2V4cHJlc3Npb24ub3BlcmF0b3J9JydgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGxlZnQgPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5sZWZ0LCBjb250ZXh0KTtcbiAgICBsZXQgcmlnaHQgPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5yaWdodCwgY29udGV4dCk7XG4gICAgc3dpdGNoKGV4cHJlc3Npb24ub3BlcmF0b3Ipe1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQ7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAqIHJpZ2h0O1xuICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IC8gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgJSByaWdodDtcbiAgICAgICAgY2FzZSAnKionOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgKiogcmlnaHQ7XG4gICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IHJpZ2h0O1xuICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0O1xuICAgICAgICBjYXNlICchPSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAhPSByaWdodDtcbiAgICAgICAgY2FzZSAnIT09JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICE9PSByaWdodDtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA+IHJpZ2h0O1xuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodDtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgaW4gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyYmJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICYmIHJpZ2h0O1xuICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCB8fCByaWdodDtcbiAgICAgICAgY2FzZSAnPz8nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPz8gcmlnaHQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBgRXhwcmVzc2lvbiBldmFsdWF0b3IgZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRvciAnJHtleHByZXNzaW9uLm9wZXJhdG9yfScgb3BlcmF0b3JgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXN0ID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24udGVzdCwgY29udGV4dCk7XG4gICAgcmV0dXJuIHRlc3QgPyB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb25zZXF1ZW50LCBjb250ZXh0KSA6IHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmFsdGVybmF0ZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiB2aXNpdENhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBsZXQgYXJncyA9IGV4cHJlc3Npb24uYXJndW1lbnRzPy5tYXAoaGFuZGxlTnVsbGFibGVFeHByZXNzaW9uKGNvbnRleHQpKTtcbiAgICBsZXQgY2FsbGVlID0gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24uY2FsbGVlLCBjb250ZXh0KTtcbiAgICBpZiAoIWNhbGxlZSkge1xuICAgICAgICB0aHJvdyBgTm8gZnVuY3Rpb24gbmFtZWQgJHtnZXRDYWxsVGFyZ2V0TmFtZShleHByZXNzaW9uLmNhbGxlZSl9IGlzIGRlZmluZWQgaW4gdGhpcyBjb250ZXh0YDtcbiAgICB9IGVsc2UgaWYgKCEodHlwZW9mIGNhbGxlZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgYCR7Z2V0Q2FsbFRhcmdldE5hbWUoZXhwcmVzc2lvbi5jYWxsZWUpfSBpcyBub3QgYSBmdW5jdGlvbmA7XG4gICAgfVxuICAgIHJldHVybiBjYWxsZWUoLi4uYXJncyk7XG59XG5mdW5jdGlvbiB2aXNpdEFycm93RnVuY3Rpb25FeHByZXNzaW9uKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBleHByZXNzaW9uLnBhcmFtcz8ubWFwKChwKT0+e1xuICAgICAgICBzd2l0Y2gocC50eXBlKXtcbiAgICAgICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBwLm5hbWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGBDYW5ub3QgaGFuZGxlIHBhcmFtZXRlciBvZiB0eXBlICR7cC50eXBlfWA7XG4gICAgICAgIH1cbiAgICB9KSA/PyBbXTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoIDwgcGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgYFJlcXVpcmVkIGFyZ3VtZW50KHMpICR7cGFyYW1zLnNsaWNlKHJlc3QubGVuZ3RoLCAtMSkuam9pbignLCAnKX0gd2VyZSBub3QgcHJvdmlkZWRgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhcnMgPSBPYmplY3QuZnJvbUVudHJpZXMocGFyYW1zLnJlZHVjZSgoYWNjLCBwLCBpZHgpPT57XG4gICAgICAgICAgICBjb25zdCB2YWwgPSByZXN0W2lkeF07XG4gICAgICAgICAgICBpZiAoaXNWYWxpZFZhcmlhYmxlVHlwZSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICBwLFxuICAgICAgICAgICAgICAgICAgICB2YWxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKSk7XG4gICAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5ib2R5LCBjb250ZXh0LmFkZFZhcmlhYmxlcyh2YXJzKSk7XG4gICAgfSkuYmluZChjb250ZXh0LnRoaXNPYmogPz8gbnVsbCk7XG59XG5mdW5jdGlvbiB2aXNpdE1lbWJlckV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIGxldCBvYmogPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5vYmplY3QsIGNvbnRleHQpO1xuICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzd2l0Y2goZXhwcmVzc2lvbi5vYmplY3QudHlwZSl7XG4gICAgICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3ROYW1lID0gdmlzaXRFeHByZXNzaW9uTmFtZShleHByZXNzaW9uLm9iamVjdCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IFJlZmVyZW5jZUVycm9yKGBSZWZlcmVuY2VFcnJvcjogJHtvYmplY3ROYW1lfSBpcyBub3QgZGVmaW5lZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHZpc2l0RXhwcmVzc2lvbk5hbWUoZXhwcmVzc2lvbi5wcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgVHlwZUVycm9yOiBjYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnJHtwcm9wZXJ0eU5hbWV9JylgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGBWaXNpdE1lbWJlckV4cHJlc3Npb24gZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRvciAnJHtleHByZXNzaW9uLm9iamVjdC50eXBlfScgdHlwZWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG5ld09iaiA9IG9iajtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmV3T2JqID0gU3RyaW5nLnByb3RvdHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICAgIG5ld09iaiA9IE51bWJlci5wcm90b3R5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm8tb3BcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IGBWaXNpdE1lbWJlckV4cHJlc3Npb24gZG9lcyBub3Qgc3VwcG9ydCBtZW1iZXIgYWNjZXNzIG9uIHR5cGUgJHt0eXBlb2Ygb2JqfWA7XG4gICAgfVxuICAgIGNvbnRleHQudGhpc09iaiA9IG5ld09iajtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHN3aXRjaChleHByZXNzaW9uLnByb3BlcnR5LnR5cGUpe1xuICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXN1bHQgPSB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5wcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnByb3BlcnR5LCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnSWxsZWdhbCBwcm9wZXJ0eSBhY2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05vIHByb3BlcnR5IHdhcyBzdXBwbGllZCB0byB0aGUgcHJvcGVydHkgYWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3BlcnR5TmFtZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5iaW5kKG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB2aXNpdEFycmF5RXhwcmVzc2lvbihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24uZWxlbWVudHM/Lm1hcChoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkpO1xufVxuZnVuY3Rpb24gdmlzaXRTZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubWFwKGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbihjb250ZXh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG59XG5mdW5jdGlvbiB2aXNpdE5ld0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIGlmIChleHByZXNzaW9uLmNhbGxlZSAmJiBleHByZXNzaW9uLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgbGV0IGFyZ3MgPSBleHByZXNzaW9uLmFyZ3VtZW50cz8ubWFwKGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbihjb250ZXh0KSk7XG4gICAgICAgIHN3aXRjaChleHByZXNzaW9uLmNhbGxlZS5uYW1lKXtcbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIEB0cy1pZ25vcmUgYmVjYXVzZSB3ZSBjYW4gdXNlIHRoZSBzcHJlYWQgb3BlcmF0b3IgaGVyZSAqLyByZXR1cm4gbmV3IERhdGUoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgICAgICAgICAgICAvKiogQHRzLWlnbm9yZSBiZWNhdXNlIHdlIGNhbiB1c2UgdGhlIHNwcmVhZCBvcGVyYXRvciBoZXJlICovIHJldHVybiBuZXcgUmVnRXhwKC4uLmFyZ3MpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBgQ2Fubm90IGluc3RhbnRpYXRlIG9iamVjdCBvZiB0eXBlICR7ZXhwcmVzc2lvbi5jYWxsZWUubmFtZX1gO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uLmNhbGxlZSkge1xuICAgICAgICAgICAgdGhyb3cgYENvdWxkIG5vdCBoYW5kbGUgXCJuZXdcIiB3aXRob3V0IGEgc3BlY2lmaWVkIGNsYXNzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93ICduZXcgbXVzdCBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgRGF0ZSBvciBSZWdFeHAnO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmlzaXRUZW1wbGF0ZUxpdGVyYWwoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gZXhwcmVzc2lvbi5leHByZXNzaW9ucz8ubWFwKGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbihjb250ZXh0KSkgPz8gW107XG4gICAgY29uc3QgcXVhc2lzID0gZXhwcmVzc2lvbi5xdWFzaXM/Lm1hcChoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24oY29udGV4dCkpID8/IFtdO1xuICAgIHJldHVybiBxdWFzaXMuZmlsdGVyKChxKT0+IXEudGFpbCkubWFwKChxKT0+cS52YWx1ZSkuam9pbignJykgKyBleHByZXNzaW9ucy5qb2luKCcnKSArIHF1YXNpcy5maWx0ZXIoKHEpPT5xLnRhaWwpLm1hcCgocSk9PnEudmFsdWUpLmpvaW4oJycpO1xufVxuZnVuY3Rpb24gdmlzaXRUZW1wbGF0ZUVsZW1lbnQoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBleHByZXNzaW9uLmNvb2tlZCxcbiAgICAgICAgdGFpbDogZXhwcmVzc2lvbi50YWlsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZpc2l0SWRlbnRpZmllcihleHByZXNzaW9uLCBjb250ZXh0KSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eU5hbWUoZXhwcmVzc2lvbi5uYW1lKTtcbiAgICAvLyB3ZSBzdXBwb3J0IGJvdGggYG9iamVjdGAgYW5kIGBmdW5jdGlvbmAgaW4gdGhlIHNhbWUgd2F5IGFzIHRlY2huaWNhbGx5IHByb3BlcnR5IGFjY2VzcyBvbiBmdW5jdGlvbnNcbiAgICAvLyBpcyBwb3NzaWJsZTsgdGhlIHVzZS1jYXNlIGhlcmUgaXMgdG8gc3VwcG9ydCBKUydzIFwic3RhdGljXCIgZnVuY3Rpb25zIGxpa2UgYE51bWJlci5pc0ludGVnZXIoKWAsIHdoaWNoXG4gICAgLy8gaXMgdGVjaG5pY2FsbHkgcmVhZGluZyBhIHByb3BlcnR5IG9uIGEgZnVuY3Rpb25cbiAgICBjb25zdCB0aGlzT2JqID0gY29udGV4dC50aGlzT2JqO1xuICAgIGlmICh0aGlzT2JqICYmICh0eXBlb2YgdGhpc09iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRoaXNPYmogPT09ICdmdW5jdGlvbicpICYmIGV4cHJlc3Npb24ubmFtZSBpbiB0aGlzT2JqKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNPYmpbZXhwcmVzc2lvbi5uYW1lXTtcbiAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eU5hbWUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQudmFyaWFibGVzICYmIGV4cHJlc3Npb24ubmFtZSBpbiBjb250ZXh0LnZhcmlhYmxlcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnZhcmlhYmxlc1tleHByZXNzaW9uLm5hbWVdO1xuICAgICAgICB2YWxpZGF0ZVByb3BlcnR5TmFtZShyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5uYW1lIGluIGNvbnRleHQuZ2xvYmFscykge1xuICAgICAgICByZXR1cm4gY29udGV4dC5nbG9iYWxzW2V4cHJlc3Npb24ubmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdExpdGVyYWwoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuICAgIHZhbGlkYXRlUHJvcGVydHlOYW1lKGV4cHJlc3Npb24udmFsdWUpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xufVxuZnVuY3Rpb24gY3JlYXRlU3luY2hyb25vdXNDb250ZXh0KHZhcmlhYmxlcykge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0SW50ZXJuYWwodmFyaWFibGVzLCBnbG9iYWxzKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFzeW5jaHJvbm91c0NvbnRleHQodmFyaWFibGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHRJbnRlcm5hbCh2YXJpYWJsZXMsIGdsb2JhbHNBc3luYyk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0SW50ZXJuYWwodmFyaWFibGVzLCBnbG9iYWxzXykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIHRoaXNPYmo6IHVuZGVmaW5lZCxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAuLi52YXJpYWJsZXNcbiAgICAgICAgfSxcbiAgICAgICAgZ2xvYmFsczoge1xuICAgICAgICAgICAgLi4uZ2xvYmFsc19cbiAgICAgICAgfSxcbiAgICAgICAgYWRkVmFyaWFibGVzICh2YXJzKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAuLi52YXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnRleHQuYWRkVmFyaWFibGVzLmJpbmQoY29udGV4dCk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyBoZWxwZXIgdXNlZnVsIGZvciBoYW5kbGluZyBhcnJheXMgb2YgZXhwcmVzc2lvbnMsIHNpbmNlIGBudWxsYCBleHByZXNzaW9ucyBzaG91bGQgbm90IGJlXG4vLyBkaXNwYXRjaGVkIHRvIGB2aXNpdEV4cHJlc3Npb24oKWBcbmZ1bmN0aW9uIGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbihjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZU51bGxhYmxlRXhwcmVzc2lvbklubmVyKGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlOYW1lKG5hbWUpIHtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycgfHwgbmFtZSA9PT0gJ3Byb3RvdHlwZScgfHwgbmFtZSA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICB0eXBlOiAnSWxsZWdhbCBwcm9wZXJ0eSBhY2Nlc3MnLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbm5vdCBhY2Nlc3MgdGhlICR7bmFtZX0gcHJvcGVydHkgb2Ygb2JqZWN0c2BcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkVmFyaWFibGVUeXBlKHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyB8fCB2YWwgPT09IG51bGwgfHwgdmFsIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsKSl7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRWYXJpYWJsZVR5cGUodmFsW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWwpe1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkVmFyaWFibGVUeXBlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldENhbGxUYXJnZXROYW1lKGV4cHJlc3Npb24pIHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5wcm9wZXJ0eT8ubmFtZTtcbiAgICB9XG4gICAgLy8gaWRlbnRpZmllciBleHByZXNzaW9uXG4gICAgcmV0dXJuIGV4cHJlc3Npb24ubmFtZTtcbn1cbiJdLCJuYW1lcyI6WyJqc2VwIiwianNlcEFycm93IiwianNlcE5ldyIsImpzZXBOdW1iZXJzIiwianNlcFJlZ2V4IiwianNlcFRlcm5hcnkiLCJqc2VwVGVtcGxhdGUiLCJnbG9iYWxzIiwiZ2xvYmFsc0FzeW5jIiwicGx1Z2lucyIsInJlZ2lzdGVyIiwiYWRkQmluYXJ5T3AiLCJldmFsdWF0ZSIsImV4cHJlc3Npb24iLCJ2YXJpYWJsZXMiLCJldmFsdWF0ZUFzVHlwZSIsImRlZmF1bHRUeXBlUHJlZGljYXRlIiwiZXZhbHVhdGVBc3luYyIsImV2YWx1YXRlQXNUeXBlQXN5bmMiLCJldmFsdWF0ZUFzQm9vbGVhbiIsImJvb2xlYW5UeXBlUHJlZGljYXRlIiwiZXZhbHVhdGVBc0Jvb2xlYW5Bc3luYyIsImV2YWx1YXRlQXNOdW1iZXIiLCJudW1iZXJUeXBlUHJlZGljYXRlIiwiZXZhbHVhdGVBc051bWJlckFzeW5jIiwidHlwZVByZWRpY2F0ZSIsInRyaW0iLCJsZW5ndGgiLCJ0eXBlIiwibWVzc2FnZSIsImNvbnRleHQiLCJjcmVhdGVTeW5jaHJvbm91c0NvbnRleHQiLCJyZXN1bHQiLCJ2aXNpdEV4cHJlc3Npb24iLCJQcm9taXNlIiwicmVqZWN0IiwiY3JlYXRlQXN5bmNocm9ub3VzQ29udGV4dCIsInJlc29sdmUiLCJ0aGVuIiwiY29tcGlsZSIsIkRhdGUiLCJ2aXNpdFVuYXJ5RXhwcmVzc2lvbiIsInZpc2l0QmluYXJ5RXhwcmVzc2lvbiIsInZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uIiwidmlzaXRDYWxsRXhwcmVzc2lvbiIsInZpc2l0QXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLCJ2aXNpdE1lbWJlckV4cHJlc3Npb24iLCJ2aXNpdEFycmF5RXhwcmVzc2lvbiIsInZpc2l0U2VxdWVuY2VFeHByZXNzaW9uIiwidmlzaXROZXdFeHByZXNzaW9uIiwidmlzaXRMaXRlcmFsIiwidmlzaXRJZGVudGlmaWVyIiwidmlzaXRUZW1wbGF0ZUxpdGVyYWwiLCJ2aXNpdFRlbXBsYXRlRWxlbWVudCIsInZpc2l0RXhwcmVzc2lvbk5hbWUiLCJ2YWx1ZSIsIm5hbWUiLCJwcm9wZXJ0eSIsImFyZ3VtZW50Iiwib3BlcmF0b3IiLCJsZWZ0IiwicmlnaHQiLCJ0ZXN0IiwiY29uc2VxdWVudCIsImFsdGVybmF0ZSIsImFyZ3MiLCJhcmd1bWVudHMiLCJtYXAiLCJoYW5kbGVOdWxsYWJsZUV4cHJlc3Npb24iLCJjYWxsZWUiLCJnZXRDYWxsVGFyZ2V0TmFtZSIsInBhcmFtcyIsInAiLCJyZXN0Iiwic2xpY2UiLCJqb2luIiwidmFycyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiaWR4IiwidmFsIiwiaXNWYWxpZFZhcmlhYmxlVHlwZSIsInB1c2giLCJib2R5IiwiYWRkVmFyaWFibGVzIiwiYmluZCIsInRoaXNPYmoiLCJvYmoiLCJvYmplY3QiLCJ1bmRlZmluZWQiLCJvYmplY3ROYW1lIiwiUmVmZXJlbmNlRXJyb3IiLCJwcm9wZXJ0eU5hbWUiLCJUeXBlRXJyb3IiLCJuZXdPYmoiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJOdW1iZXIiLCJ2YWxpZGF0ZVByb3BlcnR5TmFtZSIsImVsZW1lbnRzIiwiZXhwcmVzc2lvbnMiLCJSZWdFeHAiLCJxdWFzaXMiLCJmaWx0ZXIiLCJxIiwidGFpbCIsImNvb2tlZCIsImNyZWF0ZUNvbnRleHRJbnRlcm5hbCIsImdsb2JhbHNfIiwiaGFuZGxlTnVsbGFibGVFeHByZXNzaW9uSW5uZXIiLCJrZXkiLCJrZXlzIiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-expression-evaluator/dist/evaluator.js\n");
399
399
 
400
400
  /***/ }),
401
401
 
@@ -415,7 +415,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
415
415
  \*********************************************************/
416
416
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
417
417
 
418
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* binding */ attach),\n/* harmony export */ detach: () => (/* binding */ detach),\n/* harmony export */ detachAll: () => (/* binding */ detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* binding */ getAssignedExtensions),\n/* harmony export */ getExtensionNameFromId: () => (/* binding */ getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* binding */ getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* binding */ getExtensionRegistrationFrom),\n/* harmony export */ registerExtension: () => (/* binding */ registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* binding */ registerExtensionSlot),\n/* harmony export */ reset: () => (/* binding */ reset)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @openmrs/esm-expression-evaluator */ \"../../framework/esm-expression-evaluator/dist/evaluator.js\");\n/* harmony import */ var _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-feature-flags */ \"../../framework/esm-feature-flags/dist/index.js\");\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/merge.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/** @module @category Extension */ /*\n * We have the following extension modes:\n *\n * - attached (set via code in form of: attach, detach, ...)\n * - configured (set via configuration in form of: added, removed, ...)\n * - assigned (computed from attached and configured)\n * - connected (computed from assigned using connectivity and online / offline)\n */ \n\n\n\n\n\n\n\n\nconst extensionInternalStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionInternalStore)();\nconst extensionStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionStore)();\nconst slotsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore)();\nconst extensionsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore)();\n// Keep the output store updated\nfunction updateExtensionOutputStore(internalState, extensionSlotConfigs, extensionsConfigStore, featureFlagStore, sessionStore) {\n const slots = {};\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagStore.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n for (let [slotName, slot] of Object.entries(internalState.slots)){\n const { config } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore)(extensionSlotConfigs, slot.name);\n const assignedExtensions = getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionsConfigStore, enabledFeatureFlags, isOnline, sessionStore.session);\n slots[slotName] = {\n moduleName: slot.moduleName,\n assignedExtensions\n };\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(extensionStore.getState().slots, slots)) {\n extensionStore.setState({\n slots\n });\n }\n}\nextensionInternalStore.subscribe((internalStore)=>{\n updateExtensionOutputStore(internalStore, slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nslotsConfigStore.subscribe((slotConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotConfigs, extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nextensionsConfigStore.subscribe((extensionConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionConfigs, _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.subscribe((featureFlagStore)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), featureFlagStore, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.subscribe((session)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), session);\n});\nfunction updateOutputStoreToCurrent() {\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n}\nupdateOutputStoreToCurrent();\n(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__.subscribeConnectivityChanged)(updateOutputStoreToCurrent);\nfunction createNewExtensionSlotInfo(slotName, moduleName) {\n return {\n moduleName,\n name: slotName,\n attachedIds: [],\n config: null\n };\n}\n/**\n * Given an extension ID, which is a string uniquely identifying\n * an instance of an extension within an extension slot, this\n * returns the extension name.\n *\n * @example\n * ```js\n * getExtensionNameFromId(\"foo#bar\")\n * --> \"foo\"\n * getExtensionNameFromId(\"baz\")\n * --> \"baz\"\n * ```\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\nfunction getExtensionRegistrationFrom(state, extensionId) {\n const name = getExtensionNameFromId(extensionId);\n return state.extensions[name];\n}\nfunction getExtensionRegistration(extensionId) {\n const state = extensionInternalStore.getState();\n return getExtensionRegistrationFrom(state, extensionId);\n}\n/**\n * Extensions must be registered in order to be rendered.\n * This is handled by the app shell, when extensions are provided\n * via the `setupOpenMRS` return object.\n * @internal\n */ const registerExtension = (extensionRegistration)=>extensionInternalStore.setState((state)=>{\n state.extensions[extensionRegistration.name] = {\n ...extensionRegistration,\n instances: []\n };\n return state;\n });\n/**\n * Attach an extension to an extension slot.\n *\n * This will cause the extension to be rendered into the specified\n * extension slot, unless it is removed by configuration. Using\n * `attach` is an alternative to specifying the `slot` or `slots`\n * in the extension declaration.\n *\n * It is particularly useful when creating a slot into which\n * you want to render an existing extension. This enables you\n * to do so without modifying the extension's declaration, which\n * may be impractical or inappropriate, for example if you are\n * writing a module for a specific implementation.\n *\n * @param slotName a name uniquely identifying the slot\n * @param extensionId an extension name, with an optional #-suffix\n * to distinguish it from other instances of the same extension\n * attached to the same slot.\n */ function attach(slotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[slotName];\n if (!existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...createNewExtensionSlotInfo(slotName),\n attachedIds: [\n extensionId\n ]\n }\n }\n };\n } else {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...existingSlot,\n attachedIds: [\n ...existingSlot.attachedIds,\n extensionId\n ]\n }\n }\n };\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detach(extensionSlotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot && existingSlot.attachedIds.includes(extensionId)) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: existingSlot.attachedIds.filter((id)=>id !== extensionId)\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detachAll(extensionSlotName) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: []\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * Get an order index for the extension. This will\n * come from either its configured order, its registered order\n * parameter, or the order in which it happened to be attached.\n */ function getOrder(extensionId, configuredOrder, registeredOrderIndex, attachedOrder) {\n const configuredIndex = configuredOrder.indexOf(extensionId);\n if (configuredIndex !== -1) {\n return configuredIndex;\n } else if (registeredOrderIndex !== undefined) {\n // extensions that don't have a configured order should appear after those that do\n return 1000 + registeredOrderIndex;\n } else {\n const assignedIndex = attachedOrder.indexOf(extensionId);\n if (assignedIndex !== -1) {\n // extensions that have neither a configured nor registered order should appear\n // after all others\n return 2000 + assignedIndex;\n } else {\n return -1;\n }\n }\n}\nfunction getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionConfigStoreState, enabledFeatureFlags, isOnline, session) {\n const attachedIds = internalState.slots[slotName].attachedIds;\n const assignedIds = calculateAssignedIds(config, attachedIds);\n const extensions = [];\n for (let id of assignedIds){\n const { config: rawExtensionConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore)(extensionConfigStoreState, slotName, id);\n const rawExtensionSlotExtensionConfig = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore)(config, slotName, id);\n const extensionConfig = (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(rawExtensionConfig, rawExtensionSlotExtensionConfig);\n const name = getExtensionNameFromId(id);\n const extension = internalState.extensions[name];\n // if the extension has not been registered yet, do not include it\n if (extension) {\n const requiredPrivileges = extensionConfig?.['Display conditions']?.privileges ?? extension.privileges ?? [];\n if (requiredPrivileges && (typeof requiredPrivileges === 'string' || Array.isArray(requiredPrivileges) && requiredPrivileges.length > 0)) {\n if (!session?.user) {\n continue;\n }\n if (!(0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.userHasAccess)(requiredPrivileges, session.user)) {\n continue;\n }\n }\n const displayConditionExpression = extensionConfig?.['Display conditions']?.expression ?? null;\n if (displayConditionExpression !== null) {\n try {\n if (!(0,_openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__.evaluateAsBoolean)(displayConditionExpression, {\n session\n })) {\n continue;\n }\n } catch (e) {\n console.error(`Error while evaluating expression ${displayConditionExpression}`, e);\n continue;\n }\n }\n if (extension.featureFlag && !enabledFeatureFlags.includes(extension.featureFlag)) {\n continue;\n }\n if (window.offlineEnabled && !(0,_helpers_js__WEBPACK_IMPORTED_MODULE_4__.checkStatusFor)(isOnline, extension.online, extension.offline)) {\n continue;\n }\n extensions.push({\n id,\n name,\n moduleName: extension.moduleName,\n config: extensionConfig,\n featureFlag: extension.featureFlag,\n meta: extension.meta,\n online: extensionConfig?.['Display conditions']?.online ?? extension.online ?? true,\n offline: extensionConfig?.['Display conditions']?.offline ?? extension.offline ?? false\n });\n }\n }\n return extensions;\n}\n/**\n * Gets the list of extensions assigned to a given slot\n *\n * @param slotName The slot to load the assigned extensions for\n * @returns An array of extensions assigned to the named slot\n */ function getAssignedExtensions(slotName) {\n const internalState = extensionInternalStore.getState();\n const { config: slotConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig)(slotName);\n const extensionStoreState = extensionsConfigStore.getState();\n const featureFlagState = _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState();\n const sessionState = _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState();\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagState.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n return getAssignedExtensionsFromSlotData(slotName, internalState, slotConfig, extensionStoreState, enabledFeatureFlags, isOnline, sessionState.session);\n}\nfunction calculateAssignedIds(config, attachedIds) {\n const addedIds = config.add || [];\n const removedIds = config.remove || [];\n const idOrder = config.order || [];\n const { extensions } = extensionInternalStore.getState();\n return [\n ...attachedIds,\n ...addedIds\n ].filter((id)=>!removedIds.includes(id)).sort((idA, idB)=>{\n const ai = getOrder(idA, idOrder, extensions[getExtensionNameFromId(idA)]?.order, attachedIds);\n const bi = getOrder(idB, idOrder, extensions[getExtensionNameFromId(idB)]?.order, attachedIds);\n if (bi === -1) {\n return -1;\n } else if (ai === -1) {\n return 1;\n } else {\n return ai - bi;\n }\n });\n}\n/**\n * Used by by extension slots at mount time.\n *\n * @param moduleName The name of the module that contains the extension slot\n * @param slotName The extension slot name that is actually used\n * @internal\n */ const registerExtensionSlot = (moduleName, slotName)=>extensionInternalStore.setState((state)=>{\n const existingModuleName = state.slots[slotName]?.moduleName;\n if (existingModuleName && existingModuleName != moduleName) {\n console.warn(`An extension slot with the name '${slotName}' already exists. Refusing to register the same slot name twice (in \"registerExtensionSlot\"). The existing one is from module ${existingModuleName}.`);\n return state;\n }\n if (existingModuleName && existingModuleName == moduleName) {\n // Re-rendering an existing slot\n return state;\n }\n if (state.slots[slotName]) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...state.slots[slotName],\n moduleName\n }\n }\n };\n }\n const slot = createNewExtensionSlotInfo(slotName, moduleName);\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: slot\n }\n };\n });\n/**\n * @internal\n * Just for testing.\n */ const reset = ()=>extensionStore.setState(()=>{\n return {\n slots: {},\n extensions: {}\n };\n });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUFHOzs7Ozs7O0NBT2xDLEdBQWtFO0FBQzBKO0FBQ3ZKO0FBQ1A7QUFDSztBQUNSO0FBQ2pCO0FBQ0c7QUFDMEQ7QUFDeEcsTUFBTW1CLHlCQUF5QkYsb0VBQXlCQTtBQUN4RCxNQUFNRyxpQkFBaUJKLDREQUFpQkE7QUFDeEMsTUFBTUssbUJBQW1CZCxpRkFBNEJBO0FBQ3JELE1BQU1lLHdCQUF3Qm5CLDZFQUF3QkE7QUFDdEQsZ0NBQWdDO0FBQ2hDLFNBQVNvQiwyQkFBMkJDLGFBQWEsRUFBRUMsb0JBQW9CLEVBQUVILHFCQUFxQixFQUFFSSxnQkFBZ0IsRUFBRTFCLFlBQVk7SUFDMUgsTUFBTTJCLFFBQVEsQ0FBQztJQUNmLE1BQU1oQixXQUFXQyw0REFBVUE7SUFDM0IsTUFBTWdCLHNCQUFzQkMsT0FBT0MsT0FBTyxDQUFDSixpQkFBaUJLLEtBQUssRUFBRUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFQyxPQUFPLEVBQUUsQ0FBQyxHQUFHQSxTQUFTQyxHQUFHLENBQUMsQ0FBQyxDQUFDQyxLQUFLLEdBQUdBO0lBQ3BILEtBQUssSUFBSSxDQUFDQyxVQUFVQyxLQUFLLElBQUlSLE9BQU9DLE9BQU8sQ0FBQ04sY0FBY0csS0FBSyxFQUFFO1FBQzdELE1BQU0sRUFBRVcsTUFBTSxFQUFFLEdBQUdoQyxvRkFBK0JBLENBQUNtQixzQkFBc0JZLEtBQUtGLElBQUk7UUFDbEYsTUFBTUkscUJBQXFCQyxrQ0FBa0NKLFVBQVVaLGVBQWVjLFFBQVFoQix1QkFBdUJNLHFCQUFxQmpCLFVBQVVYLGFBQWF5QyxPQUFPO1FBQ3hLZCxLQUFLLENBQUNTLFNBQVMsR0FBRztZQUNkTSxZQUFZTCxLQUFLSyxVQUFVO1lBQzNCSDtRQUNKO0lBQ0o7SUFDQSxJQUFJLENBQUMxQixxREFBT0EsQ0FBQ08s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TUwsT0FBT2EsMkJBQTJCZCxVQUFVTTtRQUNsRCxPQUFPO1lBQ0gsR0FBR2UsS0FBSztZQUNSOUIsT0FBTztnQkFDSCxHQUFHOEIsTUFBTTlCLEtBQUs7Z0JBQ2QsQ0FBQ1MsU0FBUyxFQUFFQztZQUNoQjtRQUNKO0lBQ0osR0FBRztBQUNQOzs7Q0FHQyxHQUFVLE1BQU1xRixRQUFRLElBQUl0RyxlQUFld0IsUUFBUSxDQUFDO1FBQzdDLE9BQU87WUFDSGpCLE9BQU8sQ0FBQztZQUNSK0IsWUFBWSxDQUFDO1FBQ2pCO0lBQ0osR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcz9jMGU3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBFeHRlbnNpb24gKi8gLypcbiAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBleHRlbnNpb24gbW9kZXM6XG4gKlxuICogLSBhdHRhY2hlZCAoc2V0IHZpYSBjb2RlIGluIGZvcm0gb2Y6IGF0dGFjaCwgZGV0YWNoLCAuLi4pXG4gKiAtIGNvbmZpZ3VyZWQgKHNldCB2aWEgY29uZmlndXJhdGlvbiBpbiBmb3JtIG9mOiBhZGRlZCwgcmVtb3ZlZCwgLi4uKVxuICogLSBhc3NpZ25lZCAoY29tcHV0ZWQgZnJvbSBhdHRhY2hlZCBhbmQgY29uZmlndXJlZClcbiAqIC0gY29ubmVjdGVkIChjb21wdXRlZCBmcm9tIGFzc2lnbmVkIHVzaW5nIGNvbm5lY3Rpdml0eSBhbmQgb25saW5lIC8gb2ZmbGluZSlcbiAqLyBpbXBvcnQgeyBzZXNzaW9uU3RvcmUsIHVzZXJIYXNBY2Nlc3MgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUsIGdldEV4dGVuc2lvblNsb3RDb25maWcsIGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUsIGdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUsIGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZXZhbHVhdGVBc0Jvb2xlYW4gfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4cHJlc3Npb24tZXZhbHVhdG9yXCI7XG5pbXBvcnQgeyBmZWF0dXJlRmxhZ3NTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZmVhdHVyZS1mbGFnc1wiO1xuaW1wb3J0IHsgc3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZ2xvYmFsc1wiO1xuaW1wb3J0IHsgaXNPbmxpbmUgYXMgaXNPbmxpbmVGbiB9IGZyb20gXCJAb3Blbm1ycy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGlzRXF1YWwsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY2hlY2tTdGF0dXNGb3IgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb25TdG9yZSwgZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSwgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSB9IGZyb20gXCIuL3N0b3JlLmpzXCI7XG5jb25zdCBleHRlbnNpb25JbnRlcm5hbFN0b3JlID0gZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSgpO1xuY29uc3QgZXh0ZW5zaW9uU3RvcmUgPSBnZXRFeHRlbnNpb25TdG9yZSgpO1xuY29uc3Qgc2xvdHNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbmNvbnN0IGV4dGVuc2lvbnNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuLy8gS2VlcCB0aGUgb3V0cHV0IHN0b3JlIHVwZGF0ZWRcbmZ1bmN0aW9uIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RhdGUsIGV4dGVuc2lvblNsb3RDb25maWdzLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGZlYXR1cmVGbGFnU3RvcmUsIHNlc3Npb25TdG9yZSkge1xuICAgIGNvbnN0IHNsb3RzID0ge307XG4gICAgY29uc3QgaXNPbmxpbmUgPSBpc09ubGluZUZuKCk7XG4gICAgY29uc3QgZW5hYmxlZEZlYXR1cmVGbGFncyA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVGbGFnU3RvcmUuZmxhZ3MpLmZpbHRlcigoWywgeyBlbmFibGVkIH1dKT0+ZW5hYmxlZCkubWFwKChbbmFtZV0pPT5uYW1lKTtcbiAgICBmb3IgKGxldCBbc2xvdE5hbWUsIHNsb3RdIG9mIE9iamVjdC5lbnRyaWVzKGludGVybmFsU3RhdGUuc2xvdHMpKXtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uU2xvdENvbmZpZ3MsIHNsb3QubmFtZSk7XG4gICAgICAgIGNvbnN0IGFzc2lnbmVkRXh0ZW5zaW9ucyA9IGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgY29uZmlnLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uU3RvcmUuc2Vzc2lvbik7XG4gICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6IHNsb3QubW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGFzc2lnbmVkRXh0ZW5zaW9uc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWwoZXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKS5zbG90cywgc2xvdHMpKSB7XG4gICAgICAgIGV4dGVuc2lvblN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNsb3RzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4dGVuc2lvbkludGVybmFsU3RvcmUuc3Vic2NyaWJlKChpbnRlcm5hbFN0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RvcmUsIHNsb3RzQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuc2xvdHNDb25maWdTdG9yZS5zdWJzY3JpYmUoKHNsb3RDb25maWdzKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdENvbmZpZ3MsIGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLCBzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKSk7XG59KTtcbmV4dGVuc2lvbnNDb25maWdTdG9yZS5zdWJzY3JpYmUoKGV4dGVuc2lvbkNvbmZpZ3MpPT57XG4gICAgdXBkYXRlRXh0ZW5zaW9uT3V0cHV0U3RvcmUoZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCBzbG90c0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGV4dGVuc2lvbkNvbmZpZ3MsIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChmZWF0dXJlRmxhZ1N0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdTdG9yZSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5zZXNzaW9uU3RvcmUuc3Vic2NyaWJlKChzZXNzaW9uKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvbik7XG59KTtcbmZ1bmN0aW9uIHVwZGF0ZU91dHB1dFN0b3JlVG9DdXJyZW50KCkge1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufVxudXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQoKTtcbnN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQodXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQpO1xuZnVuY3Rpb24gY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUsIG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICBuYW1lOiBzbG90TmFtZSxcbiAgICAgICAgYXR0YWNoZWRJZHM6IFtdLFxuICAgICAgICBjb25maWc6IG51bGxcbiAgICB9O1xufVxuLyoqXG4gKiBHaXZlbiBhbiBleHRlbnNpb24gSUQsIHdoaWNoIGlzIGEgc3RyaW5nIHVuaXF1ZWx5IGlkZW50aWZ5aW5nXG4gKiBhbiBpbnN0YW5jZSBvZiBhbiBleHRlbnNpb24gd2l0aGluIGFuIGV4dGVuc2lvbiBzbG90LCB0aGlzXG4gKiByZXR1cm5zIHRoZSBleHRlbnNpb24gbmFtZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoXCJmb28jYmFyXCIpXG4gKiAgLS0+IFwiZm9vXCJcbiAqIGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoXCJiYXpcIilcbiAqICAtLT4gXCJiYXpcIlxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBbZXh0ZW5zaW9uTmFtZV0gPSBleHRlbnNpb25JZC5zcGxpdCgnIycpO1xuICAgIHJldHVybiBleHRlbnNpb25OYW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20oc3RhdGUsIGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIHJldHVybiBzdGF0ZS5leHRlbnNpb25zW25hbWVdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbihleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IHN0YXRlID0gZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBnZXRFeHRlbnNpb25SZWdpc3RyYXRpb25Gcm9tKHN0YXRlLCBleHRlbnNpb25JZCk7XG59XG4vKipcbiAqIEV4dGVuc2lvbnMgbXVzdCBiZSByZWdpc3RlcmVkIGluIG9yZGVyIHRvIGJlIHJlbmRlcmVkLlxuICogVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBhcHAgc2hlbGwsIHdoZW4gZXh0ZW5zaW9ucyBhcmUgcHJvdmlkZWRcbiAqIHZpYSB0aGUgYHNldHVwT3Blbk1SU2AgcmV0dXJuIG9iamVjdC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBjb25zdCByZWdpc3RlckV4dGVuc2lvbiA9IChleHRlbnNpb25SZWdpc3RyYXRpb24pPT5leHRlbnNpb25JbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgc3RhdGUuZXh0ZW5zaW9uc1tleHRlbnNpb25SZWdpc3RyYXRpb24ubmFtZV0gPSB7XG4gICAgICAgICAgICAuLi5leHRlbnNpb25SZWdpc3RyYXRpb24sXG4gICAgICAgICAgICBpbnN0YW5jZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcbi8qKlxuICogQXR0YWNoIGFuIGV4dGVuc2lvbiB0byBhbiBleHRlbnNpb24gc2xvdC5cbiAqXG4gKiBUaGlzIHdpbGwgY2F1c2UgdGhlIGV4dGVuc2lvbiB0byBiZSByZW5kZXJlZCBpbnRvIHRoZSBzcGVjaWZpZWRcbiAqIGV4dGVuc2lvbiBzbG90LCB1bmxlc3MgaXQgaXMgcmVtb3ZlZCBieSBjb25maWd1cmF0aW9uLiBVc2luZ1xuICogYGF0dGFjaGAgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgYHNsb3RgIG9yIGBzbG90c2BcbiAqIGluIHRoZSBleHRlbnNpb24gZGVjbGFyYXRpb24uXG4gKlxuICogSXQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGNyZWF0aW5nIGEgc2xvdCBpbnRvIHdoaWNoXG4gKiB5b3Ugd2FudCB0byByZW5kZXIgYW4gZXhpc3RpbmcgZXh0ZW5zaW9uLiBUaGlzIGVuYWJsZXMgeW91XG4gKiB0byBkbyBzbyB3aXRob3V0IG1vZGlmeWluZyB0aGUgZXh0ZW5zaW9uJ3MgZGVjbGFyYXRpb24sIHdoaWNoXG4gKiBtYXkgYmUgaW1wcmFjdGljYWwgb3IgaW5hcHByb3ByaWF0ZSwgZm9yIGV4YW1wbGUgaWYgeW91IGFyZVxuICogd3JpdGluZyBhIG1vZHVsZSBmb3IgYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gc2xvdE5hbWUgYSBuYW1lIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBzbG90XG4gKiBAcGFyYW0gZXh0ZW5zaW9uSWQgYW4gZXh0ZW5zaW9uIG5hbWUsIHdpdGggYW4gb3B0aW9uYWwgIy1zdWZmaXhcbiAqICAgIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGV4dGVuc2lvblxuICogICAgYXR0YWNoZWQgdG8gdGhlIHNhbWUgc2xvdC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gYXR0YWNoKHNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIHVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUoKHN0YXRlKT0+e1xuICAgICAgICBjb25zdCBleGlzdGluZ1Nsb3QgPSBzdGF0ZS5zbG90c1tzbG90TmFtZV07XG4gICAgICAgIGlmICghZXhpc3RpbmdTbG90KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jcmVhdGVOZXdFeHRlbnNpb25TbG90SW5mbyhzbG90TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZElkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1Nsb3QuYXR0YWNoZWRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgQXZvaWQgdXNpbmcgdGhpcy4gRXh0ZW5zaW9uIGF0dGFjaG1lbnRzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlY2xhcmF0aXZlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBkZXRhY2goZXh0ZW5zaW9uU2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSgoc3RhdGUpPT57XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2xvdCA9IHN0YXRlLnNsb3RzW2V4dGVuc2lvblNsb3ROYW1lXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2xvdCAmJiBleGlzdGluZ1Nsb3QuYXR0YWNoZWRJZHMuaW5jbHVkZXMoZXh0ZW5zaW9uSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uU2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1Nsb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZElkczogZXhpc3RpbmdTbG90LmF0dGFjaGVkSWRzLmZpbHRlcigoaWQpPT5pZCAhPT0gZXh0ZW5zaW9uSWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIEF2b2lkIHVzaW5nIHRoaXMuIEV4dGVuc2lvbiBhdHRhY2htZW50cyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZWNsYXJhdGl2ZS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZGV0YWNoQWxsKGV4dGVuc2lvblNsb3ROYW1lKSB7XG4gICAgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSgoc3RhdGUpPT57XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2xvdCA9IHN0YXRlLnNsb3RzW2V4dGVuc2lvblNsb3ROYW1lXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2xvdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvblNsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEdldCBhbiBvcmRlciBpbmRleCBmb3IgdGhlIGV4dGVuc2lvbi4gVGhpcyB3aWxsXG4gKiBjb21lIGZyb20gZWl0aGVyIGl0cyBjb25maWd1cmVkIG9yZGVyLCBpdHMgcmVnaXN0ZXJlZCBvcmRlclxuICogcGFyYW1ldGVyLCBvciB0aGUgb3JkZXIgaW4gd2hpY2ggaXQgaGFwcGVuZWQgdG8gYmUgYXR0YWNoZWQuXG4gKi8gZnVuY3Rpb24gZ2V0T3JkZXIoZXh0ZW5zaW9uSWQsIGNvbmZpZ3VyZWRPcmRlciwgcmVnaXN0ZXJlZE9yZGVySW5kZXgsIGF0dGFjaGVkT3JkZXIpIHtcbiAgICBjb25zdCBjb25maWd1cmVkSW5kZXggPSBjb25maWd1cmVkT3JkZXIuaW5kZXhPZihleHRlbnNpb25JZCk7XG4gICAgaWYgKGNvbmZpZ3VyZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRJbmRleDtcbiAgICB9IGVsc2UgaWYgKHJlZ2lzdGVyZWRPcmRlckluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGRvbid0IGhhdmUgYSBjb25maWd1cmVkIG9yZGVyIHNob3VsZCBhcHBlYXIgYWZ0ZXIgdGhvc2UgdGhhdCBkb1xuICAgICAgICByZXR1cm4gMTAwMCArIHJlZ2lzdGVyZWRPcmRlckluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFzc2lnbmVkSW5kZXggPSBhdHRhY2hlZE9yZGVyLmluZGV4T2YoZXh0ZW5zaW9uSWQpO1xuICAgICAgICBpZiAoYXNzaWduZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGV4dGVuc2lvbnMgdGhhdCBoYXZlIG5laXRoZXIgYSBjb25maWd1cmVkIG5vciByZWdpc3RlcmVkIG9yZGVyIHNob3VsZCBhcHBlYXJcbiAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBvdGhlcnNcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgYXNzaWduZWRJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgY29uZmlnLCBleHRlbnNpb25Db25maWdTdG9yZVN0YXRlLCBlbmFibGVkRmVhdHVyZUZsYWdzLCBpc09ubGluZSwgc2Vzc2lvbikge1xuICAgIGNvbnN0IGF0dGFjaGVkSWRzID0gaW50ZXJuYWxTdGF0ZS5zbG90c1tzbG90TmFtZV0uYXR0YWNoZWRJZHM7XG4gICAgY29uc3QgYXNzaWduZWRJZHMgPSBjYWxjdWxhdGVBc3NpZ25lZElkcyhjb25maWcsIGF0dGFjaGVkSWRzKTtcbiAgICBjb25zdCBleHRlbnNpb25zID0gW107XG4gICAgZm9yIChsZXQgaWQgb2YgYXNzaWduZWRJZHMpe1xuICAgICAgICBjb25zdCB7IGNvbmZpZzogcmF3RXh0ZW5zaW9uQ29uZmlnIH0gPSBnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uQ29uZmlnU3RvcmVTdGF0ZSwgc2xvdE5hbWUsIGlkKTtcbiAgICAgICAgY29uc3QgcmF3RXh0ZW5zaW9uU2xvdEV4dGVuc2lvbkNvbmZpZyA9IGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUoY29uZmlnLCBzbG90TmFtZSwgaWQpO1xuICAgICAgICBjb25zdCBleHRlbnNpb25Db25maWcgPSBtZXJnZShyYXdFeHRlbnNpb25Db25maWcsIHJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWcpO1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChpZCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGludGVybmFsU3RhdGUuZXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgLy8gaWYgdGhlIGV4dGVuc2lvbiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCB5ZXQsIGRvIG5vdCBpbmNsdWRlIGl0XG4gICAgICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkUHJpdmlsZWdlcyA9IGV4dGVuc2lvbkNvbmZpZz8uWydEaXNwbGF5IGNvbmRpdGlvbnMnXT8ucHJpdmlsZWdlcyA/PyBleHRlbnNpb24ucHJpdmlsZWdlcyA/PyBbXTtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZFByaXZpbGVnZXMgJiYgKHR5cGVvZiByZXF1aXJlZFByaXZpbGVnZXMgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkocmVxdWlyZWRQcml2aWxlZ2VzKSAmJiByZXF1aXJlZFByaXZpbGVnZXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24/LnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdXNlckhhc0FjY2VzcyhyZXF1aXJlZFByaXZpbGVnZXMsIHNlc3Npb24udXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24gPSBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/LmV4cHJlc3Npb24gPz8gbnVsbDtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXZhbHVhdGVBc0Jvb2xlYW4oZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBldmFsdWF0aW5nIGV4cHJlc3Npb24gJHtkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbn1gLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5mZWF0dXJlRmxhZyAmJiAhZW5hYmxlZEZlYXR1cmVGbGFncy5pbmNsdWRlcyhleHRlbnNpb24uZmVhdHVyZUZsYWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2luZG93Lm9mZmxpbmVFbmFibGVkICYmICFjaGVja1N0YXR1c0Zvcihpc09ubGluZSwgZXh0ZW5zaW9uLm9ubGluZSwgZXh0ZW5zaW9uLm9mZmxpbmUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHRlbnNpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogZXh0ZW5zaW9uLm1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgICAgY29uZmlnOiBleHRlbnNpb25Db25maWcsXG4gICAgICAgICAgICAgICAgZmVhdHVyZUZsYWc6IGV4dGVuc2lvbi5mZWF0dXJlRmxhZyxcbiAgICAgICAgICAgICAgICBtZXRhOiBleHRlbnNpb24ubWV0YSxcbiAgICAgICAgICAgICAgICBvbmxpbmU6IGV4dGVuc2lvbkNvbmZpZz8uWydEaXNwbGF5IGNvbmRpdGlvbnMnXT8ub25saW5lID8/IGV4dGVuc2lvbi5vbmxpbmUgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZsaW5lOiBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/Lm9mZmxpbmUgPz8gZXh0ZW5zaW9uLm9mZmxpbmUgPz8gZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25zO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgYXNzaWduZWQgdG8gYSBnaXZlbiBzbG90XG4gKlxuICogQHBhcmFtIHNsb3ROYW1lIFRoZSBzbG90IHRvIGxvYWQgdGhlIGFzc2lnbmVkIGV4dGVuc2lvbnMgZm9yXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBleHRlbnNpb25zIGFzc2lnbmVkIHRvIHRoZSBuYW1lZCBzbG90XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEFzc2lnbmVkRXh0ZW5zaW9ucyhzbG90TmFtZSkge1xuICAgIGNvbnN0IGludGVybmFsU3RhdGUgPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgeyBjb25maWc6IHNsb3RDb25maWcgfSA9IGdldEV4dGVuc2lvblNsb3RDb25maWcoc2xvdE5hbWUpO1xuICAgIGNvbnN0IGV4dGVuc2lvblN0b3JlU3RhdGUgPSBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBmZWF0dXJlRmxhZ1N0YXRlID0gZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBpc09ubGluZSA9IGlzT25saW5lRm4oKTtcbiAgICBjb25zdCBlbmFibGVkRmVhdHVyZUZsYWdzID0gT2JqZWN0LmVudHJpZXMoZmVhdHVyZUZsYWdTdGF0ZS5mbGFncykuZmlsdGVyKChbLCB7IGVuYWJsZWQgfV0pPT5lbmFibGVkKS5tYXAoKFtuYW1lXSk9Pm5hbWUpO1xuICAgIHJldHVybiBnZXRBc3NpZ25lZEV4dGVuc2lvbnNGcm9tU2xvdERhdGEoc2xvdE5hbWUsIGludGVybmFsU3RhdGUsIHNsb3RDb25maWcsIGV4dGVuc2lvblN0b3JlU3RhdGUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uU3RhdGUuc2Vzc2lvbik7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVBc3NpZ25lZElkcyhjb25maWcsIGF0dGFjaGVkSWRzKSB7XG4gICAgY29uc3QgYWRkZWRJZHMgPSBjb25maWcuYWRkIHx8IFtdO1xuICAgIGNvbnN0IHJlbW92ZWRJZHMgPSBjb25maWcucmVtb3ZlIHx8IFtdO1xuICAgIGNvbnN0IGlkT3JkZXIgPSBjb25maWcub3JkZXIgfHwgW107XG4gICAgY29uc3QgeyBleHRlbnNpb25zIH0gPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uYXR0YWNoZWRJZHMsXG4gICAgICAgIC4uLmFkZGVkSWRzXG4gICAgXS5maWx0ZXIoKGlkKT0+IXJlbW92ZWRJZHMuaW5jbHVkZXMoaWQpKS5zb3J0KChpZEEsIGlkQik9PntcbiAgICAgICAgY29uc3QgYWkgPSBnZXRPcmRlcihpZEEsIGlkT3JkZXIsIGV4dGVuc2lvbnNbZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChpZEEpXT8ub3JkZXIsIGF0dGFjaGVkSWRzKTtcbiAgICAgICAgY29uc3QgYmkgPSBnZXRPcmRlcihpZEIsIGlkT3JkZXIsIGV4dGVuc2lvbnNbZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChpZEIpXT8ub3JkZXIsIGF0dGFjaGVkSWRzKTtcbiAgICAgICAgaWYgKGJpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGFpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWkgLSBiaTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBVc2VkIGJ5IGJ5IGV4dGVuc2lvbiBzbG90cyBhdCBtb3VudCB0aW1lLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIHNsb3RcbiAqIEBwYXJhbSBzbG90TmFtZSBUaGUgZXh0ZW5zaW9uIHNsb3QgbmFtZSB0aGF0IGlzIGFjdHVhbGx5IHVzZWRcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBjb25zdCByZWdpc3RlckV4dGVuc2lvblNsb3QgPSAobW9kdWxlTmFtZSwgc2xvdE5hbWUpPT5leHRlbnNpb25JbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdNb2R1bGVOYW1lID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdPy5tb2R1bGVOYW1lO1xuICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGVOYW1lICYmIGV4aXN0aW5nTW9kdWxlTmFtZSAhPSBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEFuIGV4dGVuc2lvbiBzbG90IHdpdGggdGhlIG5hbWUgJyR7c2xvdE5hbWV9JyBhbHJlYWR5IGV4aXN0cy4gUmVmdXNpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2xvdCBuYW1lIHR3aWNlIChpbiBcInJlZ2lzdGVyRXh0ZW5zaW9uU2xvdFwiKS4gVGhlIGV4aXN0aW5nIG9uZSBpcyBmcm9tIG1vZHVsZSAke2V4aXN0aW5nTW9kdWxlTmFtZX0uYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4aXN0aW5nTW9kdWxlTmFtZSAmJiBleGlzdGluZ01vZHVsZU5hbWUgPT0gbW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgLy8gUmUtcmVuZGVyaW5nIGFuIGV4aXN0aW5nIHNsb3RcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc2xvdHNbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90c1tzbG90TmFtZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNsb3QgPSBjcmVhdGVOZXdFeHRlbnNpb25TbG90SW5mbyhzbG90TmFtZSwgbW9kdWxlTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgW3Nsb3ROYW1lXTogc2xvdFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEp1c3QgZm9yIHRlc3RpbmcuXG4gKi8gZXhwb3J0IGNvbnN0IHJlc2V0ID0gKCk9PmV4dGVuc2lvblN0b3JlLnNldFN0YXRlKCgpPT57XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzbG90czoge30sXG4gICAgICAgICAgICBleHRlbnNpb25zOiB7fVxuICAgICAgICB9O1xuICAgIH0pO1xuIl0sIm5hbWVzIjpbInNlc3Npb25TdG9yZSIsInVzZXJIYXNBY2Nlc3MiLCJnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSIsImdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUiLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwiZXZhbHVhdGVBc0Jvb2xlYW4iLCJmZWF0dXJlRmxhZ3NTdG9yZSIsInN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQiLCJpc09ubGluZSIsImlzT25saW5lRm4iLCJpc0VxdWFsIiwibWVyZ2UiLCJjaGVja1N0YXR1c0ZvciIsImdldEV4dGVuc2lvblN0b3JlIiwiZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSIsInVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUiLCJleHRlbnNpb25JbnRlcm5hbFN0b3JlIiwiZXh0ZW5zaW9uU3RvcmUiLCJzbG90c0NvbmZpZ1N0b3JlIiwiZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwidXBkYXRlRXh0ZW5zaW9uT3V0cHV0U3RvcmUiLCJpbnRlcm5hbFN0YXRlIiwiZXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJmZWF0dXJlRmxhZ1N0b3JlIiwic2xvdHMiLCJlbmFibGVkRmVhdHVyZUZsYWdzIiwiT2JqZWN0IiwiZW50cmllcyIsImZsYWdzIiwiZmlsdGVyIiwiZW5hYmxlZCIsIm1hcCIsIm5hbWUiLCJzbG90TmFtZSIsInNsb3QiLCJjb25maWciLCJhc3NpZ25lZEV4dGVuc2lvbnMiLCJnZXRBc3NpZ25lZEV4dGVuc2lvbnNGcm9tU2xvdERhdGEiLCJzZXNzaW9uIiwibW9kdWxlTmFtZSIsImdldFN0YXRlIiwic2V0U3RhdGUiLCJzdWJzY3JpYmUiLCJpbnRlcm5hbFN0b3JlIiwic2xvdENvbmZpZ3MiLCJleHRlbnNpb25Db25maWdzIiwidXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQiLCJjcmVhdGVOZXdFeHRlbnNpb25TbG90SW5mbyIsImF0dGFjaGVkSWRzIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbklkIiwiZXh0ZW5zaW9uTmFtZSIsInNwbGl0IiwiZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uRnJvbSIsInN0YXRlIiwiZXh0ZW5zaW9ucyIsImdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyRXh0ZW5zaW9uIiwiZXh0ZW5zaW9uUmVnaXN0cmF0aW9uIiwiaW5zdGFuY2VzIiwiYXR0YWNoIiwiZXhpc3RpbmdTbG90IiwiZGV0YWNoIiwiZXh0ZW5zaW9uU2xvdE5hbWUiLCJpbmNsdWRlcyIsImlkIiwiZGV0YWNoQWxsIiwiZ2V0T3JkZXIiLCJjb25maWd1cmVkT3JkZXIiLCJyZWdpc3RlcmVkT3JkZXJJbmRleCIsImF0dGFjaGVkT3JkZXIiLCJjb25maWd1cmVkSW5kZXgiLCJpbmRleE9mIiwidW5kZWZpbmVkIiwiYXNzaWduZWRJbmRleCIsImV4dGVuc2lvbkNvbmZpZ1N0b3JlU3RhdGUiLCJhc3NpZ25lZElkcyIsImNhbGN1bGF0ZUFzc2lnbmVkSWRzIiwicmF3RXh0ZW5zaW9uQ29uZmlnIiwicmF3RXh0ZW5zaW9uU2xvdEV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbiIsInJlcXVpcmVkUHJpdmlsZWdlcyIsInByaXZpbGVnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1c2VyIiwiZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImZlYXR1cmVGbGFnIiwid2luZG93Iiwib2ZmbGluZUVuYWJsZWQiLCJvbmxpbmUiLCJvZmZsaW5lIiwicHVzaCIsIm1ldGEiLCJnZXRBc3NpZ25lZEV4dGVuc2lvbnMiLCJzbG90Q29uZmlnIiwiZXh0ZW5zaW9uU3RvcmVTdGF0ZSIsImZlYXR1cmVGbGFnU3RhdGUiLCJzZXNzaW9uU3RhdGUiLCJhZGRlZElkcyIsImFkZCIsInJlbW92ZWRJZHMiLCJyZW1vdmUiLCJpZE9yZGVyIiwib3JkZXIiLCJzb3J0IiwiaWRBIiwiaWRCIiwiYWkiLCJiaSIsInJlZ2lzdGVyRXh0ZW5zaW9uU2xvdCIsImV4aXN0aW5nTW9kdWxlTmFtZSIsIndhcm4iLCJyZXNldCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/extensions.js\n");
418
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* binding */ attach),\n/* harmony export */ detach: () => (/* binding */ detach),\n/* harmony export */ detachAll: () => (/* binding */ detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* binding */ getAssignedExtensions),\n/* harmony export */ getExtensionNameFromId: () => (/* binding */ getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* binding */ getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* binding */ getExtensionRegistrationFrom),\n/* harmony export */ registerExtension: () => (/* binding */ registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* binding */ registerExtensionSlot),\n/* harmony export */ reset: () => (/* binding */ reset),\n/* harmony export */ updateExtensionSlotState: () => (/* binding */ updateExtensionSlotState)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @openmrs/esm-expression-evaluator */ \"../../framework/esm-expression-evaluator/dist/evaluator.js\");\n/* harmony import */ var _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-feature-flags */ \"../../framework/esm-feature-flags/dist/index.js\");\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/merge.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/** @module @category Extension */ /*\n * We have the following extension modes:\n *\n * - attached (set via code in form of: attach, detach, ...)\n * - configured (set via configuration in form of: added, removed, ...)\n * - assigned (computed from attached and configured)\n * - connected (computed from assigned using connectivity and online / offline)\n */ \n\n\n\n\n\n\n\n\nconst extensionInternalStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionInternalStore)();\nconst extensionStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionStore)();\nconst slotsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore)();\nconst extensionsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore)();\n// Keep the output store updated\nfunction updateExtensionOutputStore(internalState, extensionSlotConfigs, extensionsConfigStore, featureFlagStore, sessionStore) {\n const slots = {};\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagStore.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n for (let [slotName, slot] of Object.entries(internalState.slots)){\n const { config } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore)(extensionSlotConfigs, slot.name);\n const assignedExtensions = getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionsConfigStore, enabledFeatureFlags, isOnline, sessionStore.session);\n slots[slotName] = {\n moduleName: slot.moduleName,\n assignedExtensions\n };\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(extensionStore.getState().slots, slots)) {\n extensionStore.setState({\n slots\n });\n }\n}\nextensionInternalStore.subscribe((internalStore)=>{\n updateExtensionOutputStore(internalStore, slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nslotsConfigStore.subscribe((slotConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotConfigs, extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nextensionsConfigStore.subscribe((extensionConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionConfigs, _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.subscribe((featureFlagStore)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), featureFlagStore, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.subscribe((session)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), session);\n});\nfunction updateOutputStoreToCurrent() {\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n}\nupdateOutputStoreToCurrent();\n(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__.subscribeConnectivityChanged)(updateOutputStoreToCurrent);\nfunction createNewExtensionSlotInfo(slotName, moduleName, state) {\n return {\n moduleName,\n name: slotName,\n attachedIds: [],\n config: null,\n state\n };\n}\n/**\n * Given an extension ID, which is a string uniquely identifying\n * an instance of an extension within an extension slot, this\n * returns the extension name.\n *\n * @example\n * ```js\n * getExtensionNameFromId(\"foo#bar\")\n * --> \"foo\"\n * getExtensionNameFromId(\"baz\")\n * --> \"baz\"\n * ```\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\nfunction getExtensionRegistrationFrom(state, extensionId) {\n const name = getExtensionNameFromId(extensionId);\n return state.extensions[name];\n}\nfunction getExtensionRegistration(extensionId) {\n const state = extensionInternalStore.getState();\n return getExtensionRegistrationFrom(state, extensionId);\n}\n/**\n * Extensions must be registered in order to be rendered.\n * This is handled by the app shell, when extensions are provided\n * via the `setupOpenMRS` return object.\n * @internal\n */ const registerExtension = (extensionRegistration)=>extensionInternalStore.setState((state)=>{\n state.extensions[extensionRegistration.name] = {\n ...extensionRegistration,\n instances: []\n };\n return state;\n });\n/**\n * Attach an extension to an extension slot.\n *\n * This will cause the extension to be rendered into the specified\n * extension slot, unless it is removed by configuration. Using\n * `attach` is an alternative to specifying the `slot` or `slots`\n * in the extension declaration.\n *\n * It is particularly useful when creating a slot into which\n * you want to render an existing extension. This enables you\n * to do so without modifying the extension's declaration, which\n * may be impractical or inappropriate, for example if you are\n * writing a module for a specific implementation.\n *\n * @param slotName a name uniquely identifying the slot\n * @param extensionId an extension name, with an optional #-suffix\n * to distinguish it from other instances of the same extension\n * attached to the same slot.\n */ function attach(slotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[slotName];\n if (!existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...createNewExtensionSlotInfo(slotName),\n attachedIds: [\n extensionId\n ]\n }\n }\n };\n } else {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...existingSlot,\n attachedIds: [\n ...existingSlot.attachedIds,\n extensionId\n ]\n }\n }\n };\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detach(extensionSlotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot && existingSlot.attachedIds.includes(extensionId)) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: existingSlot.attachedIds.filter((id)=>id !== extensionId)\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detachAll(extensionSlotName) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: []\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * Get an order index for the extension. This will\n * come from either its configured order, its registered order\n * parameter, or the order in which it happened to be attached.\n */ function getOrder(extensionId, configuredOrder, registeredOrderIndex, attachedOrder) {\n const configuredIndex = configuredOrder.indexOf(extensionId);\n if (configuredIndex !== -1) {\n return configuredIndex;\n } else if (registeredOrderIndex !== undefined) {\n // extensions that don't have a configured order should appear after those that do\n return 1000 + registeredOrderIndex;\n } else {\n const assignedIndex = attachedOrder.indexOf(extensionId);\n if (assignedIndex !== -1) {\n // extensions that have neither a configured nor registered order should appear\n // after all others\n return 2000 + assignedIndex;\n } else {\n return -1;\n }\n }\n}\nfunction getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionConfigStoreState, enabledFeatureFlags, isOnline, session) {\n const attachedIds = internalState.slots[slotName].attachedIds;\n const assignedIds = calculateAssignedIds(config, attachedIds);\n const extensions = [];\n // Create context once for all extensions in this slot\n const slotState = internalState.slots[slotName]?.state;\n const expressionContext = slotState && typeof slotState === 'object' ? {\n session,\n ...slotState\n } : {\n session\n };\n for (let id of assignedIds){\n const { config: rawExtensionConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore)(extensionConfigStoreState, slotName, id);\n const rawExtensionSlotExtensionConfig = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore)(config, slotName, id);\n const extensionConfig = (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(rawExtensionConfig, rawExtensionSlotExtensionConfig);\n const name = getExtensionNameFromId(id);\n const extension = internalState.extensions[name];\n // if the extension has not been registered yet, do not include it\n if (extension) {\n const requiredPrivileges = extensionConfig?.['Display conditions']?.privileges ?? extension.privileges ?? [];\n if (requiredPrivileges && (typeof requiredPrivileges === 'string' || Array.isArray(requiredPrivileges) && requiredPrivileges.length > 0)) {\n if (!session?.user) {\n continue;\n }\n if (!(0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.userHasAccess)(requiredPrivileges, session.user)) {\n continue;\n }\n }\n const displayConditionExpression = extensionConfig?.['Display conditions']?.expression || extension.displayExpression;\n if (displayConditionExpression !== undefined && typeof displayConditionExpression === 'string' && displayConditionExpression.trim().length > 0) {\n try {\n if (!(0,_openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__.evaluateAsBoolean)(displayConditionExpression, expressionContext)) {\n continue;\n }\n } catch (e) {\n console.error(`Error while evaluating expression '${displayConditionExpression}' for extension ${name} in slot ${slotName}`, e);\n continue;\n }\n }\n if (extension.featureFlag && !enabledFeatureFlags.includes(extension.featureFlag)) {\n continue;\n }\n if (window.offlineEnabled && !(0,_helpers_js__WEBPACK_IMPORTED_MODULE_4__.checkStatusFor)(isOnline, extension.online, extension.offline)) {\n continue;\n }\n extensions.push({\n id,\n name,\n moduleName: extension.moduleName,\n config: extensionConfig,\n featureFlag: extension.featureFlag,\n meta: extension.meta,\n online: extensionConfig?.['Display conditions']?.online ?? extension.online ?? true,\n offline: extensionConfig?.['Display conditions']?.offline ?? extension.offline ?? false\n });\n }\n }\n return extensions;\n}\n/**\n * Gets the list of extensions assigned to a given slot\n *\n * @param slotName The slot to load the assigned extensions for\n * @returns An array of extensions assigned to the named slot\n */ function getAssignedExtensions(slotName) {\n const internalState = extensionInternalStore.getState();\n const { config: slotConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig)(slotName);\n const extensionStoreState = extensionsConfigStore.getState();\n const featureFlagState = _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState();\n const sessionState = _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState();\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagState.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n return getAssignedExtensionsFromSlotData(slotName, internalState, slotConfig, extensionStoreState, enabledFeatureFlags, isOnline, sessionState.session);\n}\nfunction calculateAssignedIds(config, attachedIds) {\n const addedIds = config.add || [];\n const removedIds = config.remove || [];\n const idOrder = config.order || [];\n const { extensions } = extensionInternalStore.getState();\n return [\n ...attachedIds,\n ...addedIds\n ].filter((id)=>!removedIds.includes(id)).sort((idA, idB)=>{\n const ai = getOrder(idA, idOrder, extensions[getExtensionNameFromId(idA)]?.order, attachedIds);\n const bi = getOrder(idB, idOrder, extensions[getExtensionNameFromId(idB)]?.order, attachedIds);\n if (bi === -1) {\n return -1;\n } else if (ai === -1) {\n return 1;\n } else {\n return ai - bi;\n }\n });\n}\n/**\n * Used by by extension slots at mount time.\n *\n * @param moduleName The name of the module that contains the extension slot\n * @param slotName The extension slot name that is actually used\n * @param state Optional custom state for the slot, which will be stored in the extension store.\n * @internal\n */ const registerExtensionSlot = (moduleName, slotName, state)=>extensionInternalStore.setState((currentState)=>{\n const existingModuleName = currentState.slots[slotName]?.moduleName;\n if (existingModuleName && existingModuleName != moduleName) {\n console.warn(`An extension slot with the name '${slotName}' already exists. Refusing to register the same slot name twice (in \"registerExtensionSlot\"). The existing one is from module ${existingModuleName}.`);\n return currentState;\n }\n if (existingModuleName && existingModuleName == moduleName) {\n // Re-rendering an existing slot\n return currentState;\n }\n if (currentState.slots[slotName]) {\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n moduleName,\n state\n }\n }\n };\n }\n const slot = createNewExtensionSlotInfo(slotName, moduleName, state);\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...slot\n }\n }\n };\n });\n/**\n * Used by extension slots to update the copy of the state for the extension slot\n *\n * @param slotName The name of the slot with state to update\n * @param state A copy of the new state\n * @param partial Whether this should be applied as a partial\n */ function updateExtensionSlotState(slotName, state, partial = false) {\n extensionInternalStore.setState((currentState)=>{\n const newState = partial ? (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(currentState.slots[slotName].state, state) : state;\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n state: newState\n }\n }\n };\n });\n}\n/**\n * @internal\n * Just for testing.\n */ const reset = ()=>extensionStore.setState(()=>{\n return {\n slots: {},\n extensions: {}\n };\n });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQ0FBZ0MsR0FBRzs7Ozs7OztDQU9sQyxHQUFrRTtBQUMwSjtBQUN2SjtBQUNQO0FBQ0s7QUFDUjtBQUNqQjtBQUNHO0FBQzBEO0FBQ3hHLE1BQU1tQix5QkFBeUJILG9FQUF5QkE7QUFDeEQsTUFBTUksaUJBQWlCSCw0REFBaUJBO0FBQ3hDLE1BQU1JLG1CQUFtQmYsaUZBQTRCQTtBQUNyRCxNQUFNZ0Isd0JBQXdCZiw2RUFBd0JBO0FBQ3RELGdDQUFnQztBQUNoQyxTQUFTZ0IsMkJBQTJCQyxhQUFhLEVBQUVDLG9CQUFvQixFQUFFSCxxQkFBcUIsRUFBRUksZ0JBQWdCLEVBQUUxQixZQUFZO0lBQzFILE1BQU0yQixRQUFRLENBQUM7SUFDZixNQUFNaEIsV0FBV0MsNERBQVVBO0lBQzNCLE1BQU1nQixzQkFBc0JDLE9BQU9DLE9BQU8sQ0FBQ0osaUJBQWlCSyxLQUFLLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRUMsT0FBTyxFQUFFLENBQUMsR0FBR0EsU0FBU0MsR0FBRyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxHQUFHQTtJQUNwSCxLQUFLLElBQUksQ0FBQ0MsVUFBVUMsS0FBSyxJQUFJUixPQUFPQyxPQUFPLENBQUNOLGNBQWNHLEtBQUssRUFBRTtRQUM3RCxNQUFNLEVBQUVXLE1BQU0sRUFBRSxHQUFHakMsb0ZBQStCQSxDQUFDb0Isc0JBQXNCWSxLQUFLRixJQUFJO1FBQ2xGLE1BQU1JLHFCQUFxQkMsa0NBQWtDSixVQUFVWixlQUFlYyxRQUFRaEIsdUJBQXVCTSxxQkFBcUJqQixVQUFVWCxhQUFheUMsT0FBTztRQUN4S2QsS0FBSyxDQUFDUyxTQUFTLEdBQUc7WUFDZE0sWUFBWUwsS0FBS0ssVUFBVTtZQUMzQkg7UUFDSjtJQUNKO0lBQ0EsSUFBSSxDQUFDMUIscURBQU9BLENBQUNP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O0lBQ0osR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcz9jMGU3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBFeHRlbnNpb24gKi8gLypcbiAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBleHRlbnNpb24gbW9kZXM6XG4gKlxuICogLSBhdHRhY2hlZCAoc2V0IHZpYSBjb2RlIGluIGZvcm0gb2Y6IGF0dGFjaCwgZGV0YWNoLCAuLi4pXG4gKiAtIGNvbmZpZ3VyZWQgKHNldCB2aWEgY29uZmlndXJhdGlvbiBpbiBmb3JtIG9mOiBhZGRlZCwgcmVtb3ZlZCwgLi4uKVxuICogLSBhc3NpZ25lZCAoY29tcHV0ZWQgZnJvbSBhdHRhY2hlZCBhbmQgY29uZmlndXJlZClcbiAqIC0gY29ubmVjdGVkIChjb21wdXRlZCBmcm9tIGFzc2lnbmVkIHVzaW5nIGNvbm5lY3Rpdml0eSBhbmQgb25saW5lIC8gb2ZmbGluZSlcbiAqLyBpbXBvcnQgeyBzZXNzaW9uU3RvcmUsIHVzZXJIYXNBY2Nlc3MgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSwgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZXZhbHVhdGVBc0Jvb2xlYW4gfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4cHJlc3Npb24tZXZhbHVhdG9yXCI7XG5pbXBvcnQgeyBmZWF0dXJlRmxhZ3NTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZmVhdHVyZS1mbGFnc1wiO1xuaW1wb3J0IHsgc3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZ2xvYmFsc1wiO1xuaW1wb3J0IHsgaXNPbmxpbmUgYXMgaXNPbmxpbmVGbiB9IGZyb20gXCJAb3Blbm1ycy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGlzRXF1YWwsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY2hlY2tTdGF0dXNGb3IgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlLCBnZXRFeHRlbnNpb25TdG9yZSwgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSB9IGZyb20gXCIuL3N0b3JlLmpzXCI7XG5jb25zdCBleHRlbnNpb25JbnRlcm5hbFN0b3JlID0gZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSgpO1xuY29uc3QgZXh0ZW5zaW9uU3RvcmUgPSBnZXRFeHRlbnNpb25TdG9yZSgpO1xuY29uc3Qgc2xvdHNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbmNvbnN0IGV4dGVuc2lvbnNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuLy8gS2VlcCB0aGUgb3V0cHV0IHN0b3JlIHVwZGF0ZWRcbmZ1bmN0aW9uIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RhdGUsIGV4dGVuc2lvblNsb3RDb25maWdzLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGZlYXR1cmVGbGFnU3RvcmUsIHNlc3Npb25TdG9yZSkge1xuICAgIGNvbnN0IHNsb3RzID0ge307XG4gICAgY29uc3QgaXNPbmxpbmUgPSBpc09ubGluZUZuKCk7XG4gICAgY29uc3QgZW5hYmxlZEZlYXR1cmVGbGFncyA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVGbGFnU3RvcmUuZmxhZ3MpLmZpbHRlcigoWywgeyBlbmFibGVkIH1dKT0+ZW5hYmxlZCkubWFwKChbbmFtZV0pPT5uYW1lKTtcbiAgICBmb3IgKGxldCBbc2xvdE5hbWUsIHNsb3RdIG9mIE9iamVjdC5lbnRyaWVzKGludGVybmFsU3RhdGUuc2xvdHMpKXtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uU2xvdENvbmZpZ3MsIHNsb3QubmFtZSk7XG4gICAgICAgIGNvbnN0IGFzc2lnbmVkRXh0ZW5zaW9ucyA9IGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgY29uZmlnLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uU3RvcmUuc2Vzc2lvbik7XG4gICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6IHNsb3QubW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGFzc2lnbmVkRXh0ZW5zaW9uc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWwoZXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKS5zbG90cywgc2xvdHMpKSB7XG4gICAgICAgIGV4dGVuc2lvblN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNsb3RzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4dGVuc2lvbkludGVybmFsU3RvcmUuc3Vic2NyaWJlKChpbnRlcm5hbFN0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RvcmUsIHNsb3RzQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuc2xvdHNDb25maWdTdG9yZS5zdWJzY3JpYmUoKHNsb3RDb25maWdzKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdENvbmZpZ3MsIGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLCBzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKSk7XG59KTtcbmV4dGVuc2lvbnNDb25maWdTdG9yZS5zdWJzY3JpYmUoKGV4dGVuc2lvbkNvbmZpZ3MpPT57XG4gICAgdXBkYXRlRXh0ZW5zaW9uT3V0cHV0U3RvcmUoZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCBzbG90c0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGV4dGVuc2lvbkNvbmZpZ3MsIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChmZWF0dXJlRmxhZ1N0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdTdG9yZSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5zZXNzaW9uU3RvcmUuc3Vic2NyaWJlKChzZXNzaW9uKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvbik7XG59KTtcbmZ1bmN0aW9uIHVwZGF0ZU91dHB1dFN0b3JlVG9DdXJyZW50KCkge1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufVxudXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQoKTtcbnN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQodXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQpO1xuZnVuY3Rpb24gY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUsIG1vZHVsZU5hbWUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbmFtZTogc2xvdE5hbWUsXG4gICAgICAgIGF0dGFjaGVkSWRzOiBbXSxcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBzdGF0ZVxuICAgIH07XG59XG4vKipcbiAqIEdpdmVuIGFuIGV4dGVuc2lvbiBJRCwgd2hpY2ggaXMgYSBzdHJpbmcgdW5pcXVlbHkgaWRlbnRpZnlpbmdcbiAqIGFuIGluc3RhbmNlIG9mIGFuIGV4dGVuc2lvbiB3aXRoaW4gYW4gZXh0ZW5zaW9uIHNsb3QsIHRoaXNcbiAqIHJldHVybnMgdGhlIGV4dGVuc2lvbiBuYW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImZvbyNiYXJcIilcbiAqICAtLT4gXCJmb29cIlxuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImJhelwiKVxuICogIC0tPiBcImJhelwiXG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uRnJvbShzdGF0ZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCk7XG4gICAgcmV0dXJuIHN0YXRlLmV4dGVuc2lvbnNbbmFtZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uKGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20oc3RhdGUsIGV4dGVuc2lvbklkKTtcbn1cbi8qKlxuICogRXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuXG4gKiBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIGFwcCBzaGVsbCwgd2hlbiBleHRlbnNpb25zIGFyZSBwcm92aWRlZFxuICogdmlhIHRoZSBgc2V0dXBPcGVuTVJTYCByZXR1cm4gb2JqZWN0LlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRXh0ZW5zaW9uID0gKGV4dGVuc2lvblJlZ2lzdHJhdGlvbik9PmV4dGVuc2lvbkludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+e1xuICAgICAgICBzdGF0ZS5leHRlbnNpb25zW2V4dGVuc2lvblJlZ2lzdHJhdGlvbi5uYW1lXSA9IHtcbiAgICAgICAgICAgIC4uLmV4dGVuc2lvblJlZ2lzdHJhdGlvbixcbiAgICAgICAgICAgIGluc3RhbmNlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pO1xuLyoqXG4gKiBBdHRhY2ggYW4gZXh0ZW5zaW9uIHRvIGFuIGV4dGVuc2lvbiBzbG90LlxuICpcbiAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgZXh0ZW5zaW9uIHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIHNwZWNpZmllZFxuICogZXh0ZW5zaW9uIHNsb3QsIHVubGVzcyBpdCBpcyByZW1vdmVkIGJ5IGNvbmZpZ3VyYXRpb24uIFVzaW5nXG4gKiBgYXR0YWNoYCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIHRoZSBgc2xvdGAgb3IgYHNsb3RzYFxuICogaW4gdGhlIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi5cbiAqXG4gKiBJdCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gY3JlYXRpbmcgYSBzbG90IGludG8gd2hpY2hcbiAqIHlvdSB3YW50IHRvIHJlbmRlciBhbiBleGlzdGluZyBleHRlbnNpb24uIFRoaXMgZW5hYmxlcyB5b3VcbiAqIHRvIGRvIHNvIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBleHRlbnNpb24ncyBkZWNsYXJhdGlvbiwgd2hpY2hcbiAqIG1heSBiZSBpbXByYWN0aWNhbCBvciBpbmFwcHJvcHJpYXRlLCBmb3IgZXhhbXBsZSBpZiB5b3UgYXJlXG4gKiB3cml0aW5nIGEgbW9kdWxlIGZvciBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBzbG90TmFtZSBhIG5hbWUgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhlIHNsb3RcbiAqIEBwYXJhbSBleHRlbnNpb25JZCBhbiBleHRlbnNpb24gbmFtZSwgd2l0aCBhbiBvcHRpb25hbCAjLXN1ZmZpeFxuICogICAgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZXh0ZW5zaW9uXG4gKiAgICBhdHRhY2hlZCB0byB0aGUgc2FtZSBzbG90LlxuICovIGV4cG9ydCBmdW5jdGlvbiBhdHRhY2goc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSgoc3RhdGUpPT57XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2xvdCA9IHN0YXRlLnNsb3RzW3Nsb3ROYW1lXTtcbiAgICAgICAgaWYgKCFleGlzdGluZ1Nsb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtzbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNyZWF0ZU5ld0V4dGVuc2lvblNsb3RJbmZvKHNsb3ROYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkSWRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1Nsb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZElkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2xvdC5hdHRhY2hlZElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBdm9pZCB1c2luZyB0aGlzLiBFeHRlbnNpb24gYXR0YWNobWVudHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVjbGFyYXRpdmUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRldGFjaChleHRlbnNpb25TbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICB1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTbG90ID0gc3RhdGUuc2xvdHNbZXh0ZW5zaW9uU2xvdE5hbWVdO1xuICAgICAgICBpZiAoZXhpc3RpbmdTbG90ICYmIGV4aXN0aW5nU2xvdC5hdHRhY2hlZElkcy5pbmNsdWRlcyhleHRlbnNpb25JZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25TbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2xvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkSWRzOiBleGlzdGluZ1Nsb3QuYXR0YWNoZWRJZHMuZmlsdGVyKChpZCk9PmlkICE9PSBleHRlbnNpb25JZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgQXZvaWQgdXNpbmcgdGhpcy4gRXh0ZW5zaW9uIGF0dGFjaG1lbnRzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlY2xhcmF0aXZlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBkZXRhY2hBbGwoZXh0ZW5zaW9uU2xvdE5hbWUpIHtcbiAgICB1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTbG90ID0gc3RhdGUuc2xvdHNbZXh0ZW5zaW9uU2xvdE5hbWVdO1xuICAgICAgICBpZiAoZXhpc3RpbmdTbG90KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uU2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1Nsb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZElkczogW11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IGFuIG9yZGVyIGluZGV4IGZvciB0aGUgZXh0ZW5zaW9uLiBUaGlzIHdpbGxcbiAqIGNvbWUgZnJvbSBlaXRoZXIgaXRzIGNvbmZpZ3VyZWQgb3JkZXIsIGl0cyByZWdpc3RlcmVkIG9yZGVyXG4gKiBwYXJhbWV0ZXIsIG9yIHRoZSBvcmRlciBpbiB3aGljaCBpdCBoYXBwZW5lZCB0byBiZSBhdHRhY2hlZC5cbiAqLyBmdW5jdGlvbiBnZXRPcmRlcihleHRlbnNpb25JZCwgY29uZmlndXJlZE9yZGVyLCByZWdpc3RlcmVkT3JkZXJJbmRleCwgYXR0YWNoZWRPcmRlcikge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRJbmRleCA9IGNvbmZpZ3VyZWRPcmRlci5pbmRleE9mKGV4dGVuc2lvbklkKTtcbiAgICBpZiAoY29uZmlndXJlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gY29uZmlndXJlZEluZGV4O1xuICAgIH0gZWxzZSBpZiAocmVnaXN0ZXJlZE9yZGVySW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBleHRlbnNpb25zIHRoYXQgZG9uJ3QgaGF2ZSBhIGNvbmZpZ3VyZWQgb3JkZXIgc2hvdWxkIGFwcGVhciBhZnRlciB0aG9zZSB0aGF0IGRvXG4gICAgICAgIHJldHVybiAxMDAwICsgcmVnaXN0ZXJlZE9yZGVySW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXNzaWduZWRJbmRleCA9IGF0dGFjaGVkT3JkZXIuaW5kZXhPZihleHRlbnNpb25JZCk7XG4gICAgICAgIGlmIChhc3NpZ25lZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGhhdmUgbmVpdGhlciBhIGNvbmZpZ3VyZWQgbm9yIHJlZ2lzdGVyZWQgb3JkZXIgc2hvdWxkIGFwcGVhclxuICAgICAgICAgICAgLy8gYWZ0ZXIgYWxsIG90aGVyc1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyBhc3NpZ25lZEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QXNzaWduZWRFeHRlbnNpb25zRnJvbVNsb3REYXRhKHNsb3ROYW1lLCBpbnRlcm5hbFN0YXRlLCBjb25maWcsIGV4dGVuc2lvbkNvbmZpZ1N0b3JlU3RhdGUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uKSB7XG4gICAgY29uc3QgYXR0YWNoZWRJZHMgPSBpbnRlcm5hbFN0YXRlLnNsb3RzW3Nsb3ROYW1lXS5hdHRhY2hlZElkcztcbiAgICBjb25zdCBhc3NpZ25lZElkcyA9IGNhbGN1bGF0ZUFzc2lnbmVkSWRzKGNvbmZpZywgYXR0YWNoZWRJZHMpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAvLyBDcmVhdGUgY29udGV4dCBvbmNlIGZvciBhbGwgZXh0ZW5zaW9ucyBpbiB0aGlzIHNsb3RcbiAgICBjb25zdCBzbG90U3RhdGUgPSBpbnRlcm5hbFN0YXRlLnNsb3RzW3Nsb3ROYW1lXT8uc3RhdGU7XG4gICAgY29uc3QgZXhwcmVzc2lvbkNvbnRleHQgPSBzbG90U3RhdGUgJiYgdHlwZW9mIHNsb3RTdGF0ZSA9PT0gJ29iamVjdCcgPyB7XG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIC4uLnNsb3RTdGF0ZVxuICAgIH0gOiB7XG4gICAgICAgIHNlc3Npb25cbiAgICB9O1xuICAgIGZvciAobGV0IGlkIG9mIGFzc2lnbmVkSWRzKXtcbiAgICAgICAgY29uc3QgeyBjb25maWc6IHJhd0V4dGVuc2lvbkNvbmZpZyB9ID0gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlKGV4dGVuc2lvbkNvbmZpZ1N0b3JlU3RhdGUsIHNsb3ROYW1lLCBpZCk7XG4gICAgICAgIGNvbnN0IHJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWcgPSBnZXRFeHRlbnNpb25Db25maWdGcm9tRXh0ZW5zaW9uU2xvdFN0b3JlKGNvbmZpZywgc2xvdE5hbWUsIGlkKTtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uQ29uZmlnID0gbWVyZ2UocmF3RXh0ZW5zaW9uQ29uZmlnLCByYXdFeHRlbnNpb25TbG90RXh0ZW5zaW9uQ29uZmlnKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoaWQpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBpbnRlcm5hbFN0YXRlLmV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgIC8vIGlmIHRoZSBleHRlbnNpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0LCBkbyBub3QgaW5jbHVkZSBpdFxuICAgICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZFByaXZpbGVnZXMgPSBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/LnByaXZpbGVnZXMgPz8gZXh0ZW5zaW9uLnByaXZpbGVnZXMgPz8gW107XG4gICAgICAgICAgICBpZiAocmVxdWlyZWRQcml2aWxlZ2VzICYmICh0eXBlb2YgcmVxdWlyZWRQcml2aWxlZ2VzID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KHJlcXVpcmVkUHJpdmlsZWdlcykgJiYgcmVxdWlyZWRQcml2aWxlZ2VzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uPy51c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXVzZXJIYXNBY2Nlc3MocmVxdWlyZWRQcml2aWxlZ2VzLCBzZXNzaW9uLnVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uID0gZXh0ZW5zaW9uQ29uZmlnPy5bJ0Rpc3BsYXkgY29uZGl0aW9ucyddPy5leHByZXNzaW9uIHx8IGV4dGVuc2lvbi5kaXNwbGF5RXhwcmVzc2lvbjtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgJiYgZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV2YWx1YXRlQXNCb29sZWFuKGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uLCBleHByZXNzaW9uQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyR7ZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb259JyBmb3IgZXh0ZW5zaW9uICR7bmFtZX0gaW4gc2xvdCAke3Nsb3ROYW1lfWAsIGUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmZlYXR1cmVGbGFnICYmICFlbmFibGVkRmVhdHVyZUZsYWdzLmluY2x1ZGVzKGV4dGVuc2lvbi5mZWF0dXJlRmxhZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3aW5kb3cub2ZmbGluZUVuYWJsZWQgJiYgIWNoZWNrU3RhdHVzRm9yKGlzT25saW5lLCBleHRlbnNpb24ub25saW5lLCBleHRlbnNpb24ub2ZmbGluZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4dGVuc2lvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb24ubW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IGV4dGVuc2lvbkNvbmZpZyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlRmxhZzogZXh0ZW5zaW9uLmZlYXR1cmVGbGFnLFxuICAgICAgICAgICAgICAgIG1ldGE6IGV4dGVuc2lvbi5tZXRhLFxuICAgICAgICAgICAgICAgIG9ubGluZTogZXh0ZW5zaW9uQ29uZmlnPy5bJ0Rpc3BsYXkgY29uZGl0aW9ucyddPy5vbmxpbmUgPz8gZXh0ZW5zaW9uLm9ubGluZSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgIG9mZmxpbmU6IGV4dGVuc2lvbkNvbmZpZz8uWydEaXNwbGF5IGNvbmRpdGlvbnMnXT8ub2ZmbGluZSA/PyBleHRlbnNpb24ub2ZmbGluZSA/PyBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG4vKipcbiAqIEdldHMgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBhc3NpZ25lZCB0byBhIGdpdmVuIHNsb3RcbiAqXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIHNsb3QgdG8gbG9hZCB0aGUgYXNzaWduZWQgZXh0ZW5zaW9ucyBmb3JcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGV4dGVuc2lvbnMgYXNzaWduZWQgdG8gdGhlIG5hbWVkIHNsb3RcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0QXNzaWduZWRFeHRlbnNpb25zKHNsb3ROYW1lKSB7XG4gICAgY29uc3QgaW50ZXJuYWxTdGF0ZSA9IGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB7IGNvbmZpZzogc2xvdENvbmZpZyB9ID0gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZyhzbG90TmFtZSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uU3RvcmVTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGZlYXR1cmVGbGFnU3RhdGUgPSBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGlzT25saW5lID0gaXNPbmxpbmVGbigpO1xuICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlRmxhZ3MgPSBPYmplY3QuZW50cmllcyhmZWF0dXJlRmxhZ1N0YXRlLmZsYWdzKS5maWx0ZXIoKFssIHsgZW5hYmxlZCB9XSk9PmVuYWJsZWQpLm1hcCgoW25hbWVdKT0+bmFtZSk7XG4gICAgcmV0dXJuIGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgc2xvdENvbmZpZywgZXh0ZW5zaW9uU3RvcmVTdGF0ZSwgZW5hYmxlZEZlYXR1cmVGbGFncywgaXNPbmxpbmUsIHNlc3Npb25TdGF0ZS5zZXNzaW9uKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZUFzc2lnbmVkSWRzKGNvbmZpZywgYXR0YWNoZWRJZHMpIHtcbiAgICBjb25zdCBhZGRlZElkcyA9IGNvbmZpZy5hZGQgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlZElkcyA9IGNvbmZpZy5yZW1vdmUgfHwgW107XG4gICAgY29uc3QgaWRPcmRlciA9IGNvbmZpZy5vcmRlciB8fCBbXTtcbiAgICBjb25zdCB7IGV4dGVuc2lvbnMgfSA9IGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5hdHRhY2hlZElkcyxcbiAgICAgICAgLi4uYWRkZWRJZHNcbiAgICBdLmZpbHRlcigoaWQpPT4hcmVtb3ZlZElkcy5pbmNsdWRlcyhpZCkpLnNvcnQoKGlkQSwgaWRCKT0+e1xuICAgICAgICBjb25zdCBhaSA9IGdldE9yZGVyKGlkQSwgaWRPcmRlciwgZXh0ZW5zaW9uc1tnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGlkQSldPy5vcmRlciwgYXR0YWNoZWRJZHMpO1xuICAgICAgICBjb25zdCBiaSA9IGdldE9yZGVyKGlkQiwgaWRPcmRlciwgZXh0ZW5zaW9uc1tnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGlkQildPy5vcmRlciwgYXR0YWNoZWRJZHMpO1xuICAgICAgICBpZiAoYmkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFVzZWQgYnkgYnkgZXh0ZW5zaW9uIHNsb3RzIGF0IG1vdW50IHRpbWUuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIHNsb3ROYW1lIFRoZSBleHRlbnNpb24gc2xvdCBuYW1lIHRoYXQgaXMgYWN0dWFsbHkgdXNlZFxuICogQHBhcmFtIHN0YXRlIE9wdGlvbmFsIGN1c3RvbSBzdGF0ZSBmb3IgdGhlIHNsb3QsIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBleHRlbnNpb24gc3RvcmUuXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgY29uc3QgcmVnaXN0ZXJFeHRlbnNpb25TbG90ID0gKG1vZHVsZU5hbWUsIHNsb3ROYW1lLCBzdGF0ZSk9PmV4dGVuc2lvbkludGVybmFsU3RvcmUuc2V0U3RhdGUoKGN1cnJlbnRTdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdNb2R1bGVOYW1lID0gY3VycmVudFN0YXRlLnNsb3RzW3Nsb3ROYW1lXT8ubW9kdWxlTmFtZTtcbiAgICAgICAgaWYgKGV4aXN0aW5nTW9kdWxlTmFtZSAmJiBleGlzdGluZ01vZHVsZU5hbWUgIT0gbW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBBbiBleHRlbnNpb24gc2xvdCB3aXRoIHRoZSBuYW1lICcke3Nsb3ROYW1lfScgYWxyZWFkeSBleGlzdHMuIFJlZnVzaW5nIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIHNsb3QgbmFtZSB0d2ljZSAoaW4gXCJyZWdpc3RlckV4dGVuc2lvblNsb3RcIikuIFRoZSBleGlzdGluZyBvbmUgaXMgZnJvbSBtb2R1bGUgJHtleGlzdGluZ01vZHVsZU5hbWV9LmApO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGVOYW1lICYmIGV4aXN0aW5nTW9kdWxlTmFtZSA9PSBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZS1yZW5kZXJpbmcgYW4gZXhpc3Rpbmcgc2xvdFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFN0YXRlLnNsb3RzW3Nsb3ROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNsb3QgPSBjcmVhdGVOZXdFeHRlbnNpb25TbG90SW5mbyhzbG90TmFtZSwgbW9kdWxlTmFtZSwgc3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAuLi5zbG90XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuLyoqXG4gKiBVc2VkIGJ5IGV4dGVuc2lvbiBzbG90cyB0byB1cGRhdGUgdGhlIGNvcHkgb2YgdGhlIHN0YXRlIGZvciB0aGUgZXh0ZW5zaW9uIHNsb3RcbiAqXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIHNsb3Qgd2l0aCBzdGF0ZSB0byB1cGRhdGVcbiAqIEBwYXJhbSBzdGF0ZSBBIGNvcHkgb2YgdGhlIG5ldyBzdGF0ZVxuICogQHBhcmFtIHBhcnRpYWwgV2hldGhlciB0aGlzIHNob3VsZCBiZSBhcHBsaWVkIGFzIGEgcGFydGlhbFxuICovIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFeHRlbnNpb25TbG90U3RhdGUoc2xvdE5hbWUsIHN0YXRlLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICBleHRlbnNpb25JbnRlcm5hbFN0b3JlLnNldFN0YXRlKChjdXJyZW50U3RhdGUpPT57XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gcGFydGlhbCA/IG1lcmdlKGN1cnJlbnRTdGF0ZS5zbG90c1tzbG90TmFtZV0uc3RhdGUsIHN0YXRlKSA6IHN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogbmV3U3RhdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICogSnVzdCBmb3IgdGVzdGluZy5cbiAqLyBleHBvcnQgY29uc3QgcmVzZXQgPSAoKT0+ZXh0ZW5zaW9uU3RvcmUuc2V0U3RhdGUoKCk9PntcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNsb3RzOiB7fSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHt9XG4gICAgICAgIH07XG4gICAgfSk7XG4iXSwibmFtZXMiOlsic2Vzc2lvblN0b3JlIiwidXNlckhhc0FjY2VzcyIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUiLCJnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZSIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJldmFsdWF0ZUFzQm9vbGVhbiIsImZlYXR1cmVGbGFnc1N0b3JlIiwic3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCIsImlzT25saW5lIiwiaXNPbmxpbmVGbiIsImlzRXF1YWwiLCJtZXJnZSIsImNoZWNrU3RhdHVzRm9yIiwiZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSIsImdldEV4dGVuc2lvblN0b3JlIiwidXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSIsImV4dGVuc2lvbkludGVybmFsU3RvcmUiLCJleHRlbnNpb25TdG9yZSIsInNsb3RzQ29uZmlnU3RvcmUiLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJ1cGRhdGVFeHRlbnNpb25PdXRwdXRTdG9yZSIsImludGVybmFsU3RhdGUiLCJleHRlbnNpb25TbG90Q29uZmlncyIsImZlYXR1cmVGbGFnU3RvcmUiLCJzbG90cyIsImVuYWJsZWRGZWF0dXJlRmxhZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmxhZ3MiLCJmaWx0ZXIiLCJlbmFibGVkIiwibWFwIiwibmFtZSIsInNsb3ROYW1lIiwic2xvdCIsImNvbmZpZyIsImFzc2lnbmVkRXh0ZW5zaW9ucyIsImdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YSIsInNlc3Npb24iLCJtb2R1bGVOYW1lIiwiZ2V0U3RhdGUiLCJzZXRTdGF0ZSIsInN1YnNjcmliZSIsImludGVybmFsU3RvcmUiLCJzbG90Q29uZmlncyIsImV4dGVuc2lvbkNvbmZpZ3MiLCJ1cGRhdGVPdXRwdXRTdG9yZVRvQ3VycmVudCIsImNyZWF0ZU5ld0V4dGVuc2lvblNsb3RJbmZvIiwic3RhdGUiLCJhdHRhY2hlZElkcyIsImdldEV4dGVuc2lvbk5hbWVGcm9tSWQiLCJleHRlbnNpb25JZCIsImV4dGVuc2lvbk5hbWUiLCJzcGxpdCIsImdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20iLCJleHRlbnNpb25zIiwiZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJFeHRlbnNpb24iLCJleHRlbnNpb25SZWdpc3RyYXRpb24iLCJpbnN0YW5jZXMiLCJhdHRhY2giLCJleGlzdGluZ1Nsb3QiLCJkZXRhY2giLCJleHRlbnNpb25TbG90TmFtZSIsImluY2x1ZGVzIiwiaWQiLCJkZXRhY2hBbGwiLCJnZXRPcmRlciIsImNvbmZpZ3VyZWRPcmRlciIsInJlZ2lzdGVyZWRPcmRlckluZGV4IiwiYXR0YWNoZWRPcmRlciIsImNvbmZpZ3VyZWRJbmRleCIsImluZGV4T2YiLCJ1bmRlZmluZWQiLCJhc3NpZ25lZEluZGV4IiwiZXh0ZW5zaW9uQ29uZmlnU3RvcmVTdGF0ZSIsImFzc2lnbmVkSWRzIiwiY2FsY3VsYXRlQXNzaWduZWRJZHMiLCJzbG90U3RhdGUiLCJleHByZXNzaW9uQ29udGV4dCIsInJhd0V4dGVuc2lvbkNvbmZpZyIsInJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25Db25maWciLCJleHRlbnNpb24iLCJyZXF1aXJlZFByaXZpbGVnZXMiLCJwcml2aWxlZ2VzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidXNlciIsImRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImRpc3BsYXlFeHByZXNzaW9uIiwidHJpbSIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJmZWF0dXJlRmxhZyIsIndpbmRvdyIsIm9mZmxpbmVFbmFibGVkIiwib25saW5lIiwib2ZmbGluZSIsInB1c2giLCJtZXRhIiwiZ2V0QXNzaWduZWRFeHRlbnNpb25zIiwic2xvdENvbmZpZyIsImV4dGVuc2lvblN0b3JlU3RhdGUiLCJmZWF0dXJlRmxhZ1N0YXRlIiwic2Vzc2lvblN0YXRlIiwiYWRkZWRJZHMiLCJhZGQiLCJyZW1vdmVkSWRzIiwicmVtb3ZlIiwiaWRPcmRlciIsIm9yZGVyIiwic29ydCIsImlkQSIsImlkQiIsImFpIiwiYmkiLCJyZWdpc3RlckV4dGVuc2lvblNsb3QiLCJjdXJyZW50U3RhdGUiLCJleGlzdGluZ01vZHVsZU5hbWUiLCJ3YXJuIiwidXBkYXRlRXh0ZW5zaW9uU2xvdFN0YXRlIiwicGFydGlhbCIsIm5ld1N0YXRlIiwicmVzZXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/extensions.js\n");
419
419
 
420
420
  /***/ }),
421
421
 
@@ -435,7 +435,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
435
435
  \****************************************************/
436
436
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
437
437
 
438
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.attach),\n/* harmony export */ checkStatus: () => (/* reexport safe */ _helpers_js__WEBPACK_IMPORTED_MODULE_1__.checkStatus),\n/* harmony export */ checkStatusFor: () => (/* reexport safe */ _helpers_js__WEBPACK_IMPORTED_MODULE_1__.checkStatusFor),\n/* harmony export */ detach: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.detach),\n/* harmony export */ detachAll: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getAssignedExtensions),\n/* harmony export */ getExtensionInternalStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.getExtensionInternalStore),\n/* harmony export */ getExtensionNameFromId: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionRegistrationFrom),\n/* harmony export */ getExtensionStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.getExtensionStore),\n/* harmony export */ getGroupByWindowName: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getGroupByWindowName),\n/* harmony export */ getModalRegistration: () => (/* reexport safe */ _modals_js__WEBPACK_IMPORTED_MODULE_3__.getModalRegistration),\n/* harmony export */ getOpenedWindowIndexByWorkspace: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getOpenedWindowIndexByWorkspace),\n/* harmony export */ getWindowByWorkspaceName: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getWindowByWorkspaceName),\n/* harmony export */ getWorkspaceGroupRegistration: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.getWorkspaceGroupRegistration),\n/* harmony export */ getWorkspaceRegistration: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.getWorkspaceRegistration),\n/* harmony export */ leftNavStore: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.leftNavStore),\n/* harmony export */ registerExtension: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.registerExtensionSlot),\n/* harmony export */ registerModal: () => (/* reexport safe */ _modals_js__WEBPACK_IMPORTED_MODULE_3__.registerModal),\n/* harmony export */ registerWorkspace: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.registerWorkspace),\n/* harmony export */ registerWorkspaceGroup: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.registerWorkspaceGroup),\n/* harmony export */ registerWorkspaceGroups2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaceGroups2),\n/* harmony export */ registerWorkspaceWindows2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaceWindows2),\n/* harmony export */ registerWorkspaces2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaces2),\n/* harmony export */ renderExtension: () => (/* reexport safe */ _render_js__WEBPACK_IMPORTED_MODULE_6__.renderExtension),\n/* harmony export */ reset: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.reset),\n/* harmony export */ setLeftNav: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.setLeftNav),\n/* harmony export */ unsetLeftNav: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.unsetLeftNav),\n/* harmony export */ updateInternalExtensionStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.updateInternalExtensionStore),\n/* harmony export */ workspace2Store: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.workspace2Store)\n/* harmony export */ });\n/* harmony import */ var _extensions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./extensions.js */ \"../../framework/esm-extensions/dist/extensions.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _left_nav_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./left-nav.js */ \"../../framework/esm-extensions/dist/left-nav.js\");\n/* harmony import */ var _modals_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modals.js */ \"../../framework/esm-extensions/dist/modals.js\");\n/* harmony import */ var _workspaces_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./workspaces.js */ \"../../framework/esm-extensions/dist/workspaces.js\");\n/* harmony import */ var _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./workspaces2.js */ \"../../framework/esm-extensions/dist/workspaces2.js\");\n/* harmony import */ var _render_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./render.js */ \"../../framework/esm-extensions/dist/render.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./types.js */ \"../../framework/esm-extensions/dist/types.js\");\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0M7QUFDSDtBQUNDO0FBQ0Y7QUFDSTtBQUNDO0FBQ0w7QUFDRDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWV4dGVuc2lvbnMvZGlzdC9pbmRleC5qcz85OTM4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2V4dGVuc2lvbnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xlZnQtbmF2LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RhbHMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dvcmtzcGFjZXMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dvcmtzcGFjZXMyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZW5kZXIuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0b3JlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy5qc1wiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/index.js\n");
438
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.attach),\n/* harmony export */ checkStatus: () => (/* reexport safe */ _helpers_js__WEBPACK_IMPORTED_MODULE_1__.checkStatus),\n/* harmony export */ checkStatusFor: () => (/* reexport safe */ _helpers_js__WEBPACK_IMPORTED_MODULE_1__.checkStatusFor),\n/* harmony export */ detach: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.detach),\n/* harmony export */ detachAll: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getAssignedExtensions),\n/* harmony export */ getExtensionInternalStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.getExtensionInternalStore),\n/* harmony export */ getExtensionNameFromId: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.getExtensionRegistrationFrom),\n/* harmony export */ getExtensionStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.getExtensionStore),\n/* harmony export */ getGroupByWindowName: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getGroupByWindowName),\n/* harmony export */ getModalRegistration: () => (/* reexport safe */ _modals_js__WEBPACK_IMPORTED_MODULE_3__.getModalRegistration),\n/* harmony export */ getOpenedWindowIndexByWorkspace: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getOpenedWindowIndexByWorkspace),\n/* harmony export */ getWindowByWorkspaceName: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.getWindowByWorkspaceName),\n/* harmony export */ getWorkspaceGroupRegistration: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.getWorkspaceGroupRegistration),\n/* harmony export */ getWorkspaceRegistration: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.getWorkspaceRegistration),\n/* harmony export */ leftNavStore: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.leftNavStore),\n/* harmony export */ registerExtension: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.registerExtensionSlot),\n/* harmony export */ registerModal: () => (/* reexport safe */ _modals_js__WEBPACK_IMPORTED_MODULE_3__.registerModal),\n/* harmony export */ registerWorkspace: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.registerWorkspace),\n/* harmony export */ registerWorkspaceGroup: () => (/* reexport safe */ _workspaces_js__WEBPACK_IMPORTED_MODULE_4__.registerWorkspaceGroup),\n/* harmony export */ registerWorkspaceGroups2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaceGroups2),\n/* harmony export */ registerWorkspaceWindows2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaceWindows2),\n/* harmony export */ registerWorkspaces2: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.registerWorkspaces2),\n/* harmony export */ renderExtension: () => (/* reexport safe */ _render_js__WEBPACK_IMPORTED_MODULE_6__.renderExtension),\n/* harmony export */ reset: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.reset),\n/* harmony export */ setLeftNav: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.setLeftNav),\n/* harmony export */ unsetLeftNav: () => (/* reexport safe */ _left_nav_js__WEBPACK_IMPORTED_MODULE_2__.unsetLeftNav),\n/* harmony export */ updateExtensionSlotState: () => (/* reexport safe */ _extensions_js__WEBPACK_IMPORTED_MODULE_0__.updateExtensionSlotState),\n/* harmony export */ updateInternalExtensionStore: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.updateInternalExtensionStore),\n/* harmony export */ workspace2Store: () => (/* reexport safe */ _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__.workspace2Store)\n/* harmony export */ });\n/* harmony import */ var _extensions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./extensions.js */ \"../../framework/esm-extensions/dist/extensions.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _left_nav_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./left-nav.js */ \"../../framework/esm-extensions/dist/left-nav.js\");\n/* harmony import */ var _modals_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modals.js */ \"../../framework/esm-extensions/dist/modals.js\");\n/* harmony import */ var _workspaces_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./workspaces.js */ \"../../framework/esm-extensions/dist/workspaces.js\");\n/* harmony import */ var _workspaces2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./workspaces2.js */ \"../../framework/esm-extensions/dist/workspaces2.js\");\n/* harmony import */ var _render_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./render.js */ \"../../framework/esm-extensions/dist/render.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./types.js */ \"../../framework/esm-extensions/dist/types.js\");\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWdDO0FBQ0g7QUFDQztBQUNGO0FBQ0k7QUFDQztBQUNMO0FBQ0Q7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvaW5kZXguanM/OTkzOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9leHRlbnNpb25zLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sZWZ0LW5hdi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kYWxzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93b3Jrc3BhY2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93b3Jrc3BhY2VzMi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVuZGVyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdG9yZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMuanNcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/index.js\n");
439
439
 
440
440
  /***/ }),
441
441
 
@@ -445,7 +445,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
445
445
  \*******************************************************/
446
446
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
447
447
 
448
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ leftNavStore: () => (/* binding */ leftNavStore),\n/* harmony export */ setLeftNav: () => (/* binding */ setLeftNav),\n/* harmony export */ unsetLeftNav: () => (/* binding */ unsetLeftNav)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n\n/** @internal */ const leftNavStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('left-nav', {\n slotName: null,\n basePath: window.spaBase,\n mode: 'normal'\n});\n/**\n * Sets the current left nav context. Must be paired with {@link unsetLeftNav}.\n *\n * @deprecated Please use {@link useLeftNav} instead. This function will be made internal in a future release.\n */ function setLeftNav({ name, basePath, mode, componentContext }) {\n leftNavStore.setState({\n slotName: name,\n basePath,\n mode: mode ?? 'normal',\n componentContext\n });\n}\n/**\n * Unsets the left nav context if the current context is for the supplied name.\n *\n * @deprecated Please use {@link useLeftNav} instead. This function will be made internal in a future release.\n */ function unsetLeftNav(name) {\n if (leftNavStore.getState().slotName === name) {\n leftNavStore.setState(leftNavStore.getInitialState(), true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvbGVmdC1uYXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF1RDtBQUN2RCxjQUFjLEdBQVUsTUFBTUMsZUFBZUQscUVBQWlCQSxDQUFDLFlBQVk7SUFDdkVFLFVBQVU7SUFDVkMsVUFBVUMsT0FBT0MsT0FBTztJQUN4QkMsTUFBTTtBQUNWLEdBQUc7QUFDSDs7OztDQUlDLEdBQVUsU0FBU0MsV0FBVyxFQUFFQyxJQUFJLEVBQUVMLFFBQVEsRUFBRUcsSUFBSSxFQUFFRyxnQkFBZ0IsRUFBRTtJQUNyRVIsYUFBYVMsUUFBUSxDQUFDO1FBQ2xCUixVQUFVTTtRQUNWTDtRQUNBRyxNQUFNQSxRQUFRO1FBQ2RHO0lBQ0o7QUFDSjtBQUNBOzs7O0NBSUMsR0FBVSxTQUFTRSxhQUFhSCxJQUFJO0lBQ2pDLElBQUlQLGFBQWFXLFFBQVEsR0FBR1YsUUFBUSxLQUFLTSxNQUFNO1FBQzNDUCxhQUFhUyxRQUFRLENBQUNULGFBQWFZLGVBQWUsSUFBSTtJQUMxRDtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWV4dGVuc2lvbnMvZGlzdC9sZWZ0LW5hdi5qcz82NjUwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgbGVmdE5hdlN0b3JlID0gY3JlYXRlR2xvYmFsU3RvcmUoJ2xlZnQtbmF2Jywge1xuICAgIHNsb3ROYW1lOiBudWxsLFxuICAgIGJhc2VQYXRoOiB3aW5kb3cuc3BhQmFzZSxcbiAgICBtb2RlOiAnbm9ybWFsJ1xufSk7XG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgbGVmdCBuYXYgY29udGV4dC4gTXVzdCBiZSBwYWlyZWQgd2l0aCB7QGxpbmsgdW5zZXRMZWZ0TmF2fS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayB1c2VMZWZ0TmF2fSBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgbWFkZSBpbnRlcm5hbCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBzZXRMZWZ0TmF2KHsgbmFtZSwgYmFzZVBhdGgsIG1vZGUsIGNvbXBvbmVudENvbnRleHQgfSkge1xuICAgIGxlZnROYXZTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgIHNsb3ROYW1lOiBuYW1lLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgbW9kZTogbW9kZSA/PyAnbm9ybWFsJyxcbiAgICAgICAgY29tcG9uZW50Q29udGV4dFxuICAgIH0pO1xufVxuLyoqXG4gKiBVbnNldHMgdGhlIGxlZnQgbmF2IGNvbnRleHQgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBmb3IgdGhlIHN1cHBsaWVkIG5hbWUuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgdXNlTGVmdE5hdn0gaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIG1hZGUgaW50ZXJuYWwgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gdW5zZXRMZWZ0TmF2KG5hbWUpIHtcbiAgICBpZiAobGVmdE5hdlN0b3JlLmdldFN0YXRlKCkuc2xvdE5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgbGVmdE5hdlN0b3JlLnNldFN0YXRlKGxlZnROYXZTdG9yZS5nZXRJbml0aWFsU3RhdGUoKSwgdHJ1ZSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUdsb2JhbFN0b3JlIiwibGVmdE5hdlN0b3JlIiwic2xvdE5hbWUiLCJiYXNlUGF0aCIsIndpbmRvdyIsInNwYUJhc2UiLCJtb2RlIiwic2V0TGVmdE5hdiIsIm5hbWUiLCJjb21wb25lbnRDb250ZXh0Iiwic2V0U3RhdGUiLCJ1bnNldExlZnROYXYiLCJnZXRTdGF0ZSIsImdldEluaXRpYWxTdGF0ZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/left-nav.js\n");
448
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ leftNavStore: () => (/* binding */ leftNavStore),\n/* harmony export */ setLeftNav: () => (/* binding */ setLeftNav),\n/* harmony export */ unsetLeftNav: () => (/* binding */ unsetLeftNav)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n\n/** @internal */ const leftNavStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('left-nav', {\n slotName: null,\n basePath: window.spaBase,\n mode: 'normal'\n});\n/**\n * Sets the current left nav context. Must be paired with {@link unsetLeftNav}.\n *\n * @deprecated Please use {@link useLeftNav} instead. This function will be made internal in a future release.\n */ function setLeftNav({ name, basePath, mode, componentContext, state }) {\n leftNavStore.setState({\n slotName: name,\n basePath,\n mode: mode ?? 'normal',\n componentContext,\n state\n });\n}\n/**\n * Unsets the left nav context if the current context is for the supplied name.\n *\n * @deprecated Please use {@link useLeftNav} instead. This function will be made internal in a future release.\n */ function unsetLeftNav(name) {\n if (leftNavStore.getState().slotName === name) {\n leftNavStore.setState(leftNavStore.getInitialState(), true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvbGVmdC1uYXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF1RDtBQUN2RCxjQUFjLEdBQVUsTUFBTUMsZUFBZUQscUVBQWlCQSxDQUFDLFlBQVk7SUFDdkVFLFVBQVU7SUFDVkMsVUFBVUMsT0FBT0MsT0FBTztJQUN4QkMsTUFBTTtBQUNWLEdBQUc7QUFDSDs7OztDQUlDLEdBQVUsU0FBU0MsV0FBVyxFQUFFQyxJQUFJLEVBQUVMLFFBQVEsRUFBRUcsSUFBSSxFQUFFRyxnQkFBZ0IsRUFBRUMsS0FBSyxFQUFFO0lBQzVFVCxhQUFhVSxRQUFRLENBQUM7UUFDbEJULFVBQVVNO1FBQ1ZMO1FBQ0FHLE1BQU1BLFFBQVE7UUFDZEc7UUFDQUM7SUFDSjtBQUNKO0FBQ0E7Ozs7Q0FJQyxHQUFVLFNBQVNFLGFBQWFKLElBQUk7SUFDakMsSUFBSVAsYUFBYVksUUFBUSxHQUFHWCxRQUFRLEtBQUtNLE1BQU07UUFDM0NQLGFBQWFVLFFBQVEsQ0FBQ1YsYUFBYWEsZUFBZSxJQUFJO0lBQzFEO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZXh0ZW5zaW9ucy9kaXN0L2xlZnQtbmF2LmpzPzY2NTAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlR2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBsZWZ0TmF2U3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnbGVmdC1uYXYnLCB7XG4gICAgc2xvdE5hbWU6IG51bGwsXG4gICAgYmFzZVBhdGg6IHdpbmRvdy5zcGFCYXNlLFxuICAgIG1vZGU6ICdub3JtYWwnXG59KTtcbi8qKlxuICogU2V0cyB0aGUgY3VycmVudCBsZWZ0IG5hdiBjb250ZXh0LiBNdXN0IGJlIHBhaXJlZCB3aXRoIHtAbGluayB1bnNldExlZnROYXZ9LlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rIHVzZUxlZnROYXZ9IGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBtYWRlIGludGVybmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHNldExlZnROYXYoeyBuYW1lLCBiYXNlUGF0aCwgbW9kZSwgY29tcG9uZW50Q29udGV4dCwgc3RhdGUgfSkge1xuICAgIGxlZnROYXZTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgIHNsb3ROYW1lOiBuYW1lLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgbW9kZTogbW9kZSA/PyAnbm9ybWFsJyxcbiAgICAgICAgY29tcG9uZW50Q29udGV4dCxcbiAgICAgICAgc3RhdGVcbiAgICB9KTtcbn1cbi8qKlxuICogVW5zZXRzIHRoZSBsZWZ0IG5hdiBjb250ZXh0IGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZm9yIHRoZSBzdXBwbGllZCBuYW1lLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rIHVzZUxlZnROYXZ9IGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBtYWRlIGludGVybmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVuc2V0TGVmdE5hdihuYW1lKSB7XG4gICAgaWYgKGxlZnROYXZTdG9yZS5nZXRTdGF0ZSgpLnNsb3ROYW1lID09PSBuYW1lKSB7XG4gICAgICAgIGxlZnROYXZTdG9yZS5zZXRTdGF0ZShsZWZ0TmF2U3RvcmUuZ2V0SW5pdGlhbFN0YXRlKCksIHRydWUpO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVHbG9iYWxTdG9yZSIsImxlZnROYXZTdG9yZSIsInNsb3ROYW1lIiwiYmFzZVBhdGgiLCJ3aW5kb3ciLCJzcGFCYXNlIiwibW9kZSIsInNldExlZnROYXYiLCJuYW1lIiwiY29tcG9uZW50Q29udGV4dCIsInN0YXRlIiwic2V0U3RhdGUiLCJ1bnNldExlZnROYXYiLCJnZXRTdGF0ZSIsImdldEluaXRpYWxTdGF0ZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/left-nav.js\n");
449
449
 
450
450
  /***/ }),
451
451
 
@@ -475,7 +475,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
475
475
  \****************************************************/
476
476
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
477
477
 
478
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getExtensionInternalStore: () => (/* binding */ getExtensionInternalStore),\n/* harmony export */ getExtensionStore: () => (/* binding */ getExtensionStore),\n/* harmony export */ updateInternalExtensionStore: () => (/* binding */ updateInternalExtensionStore)\n/* harmony export */ });\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Extension */ \n\n\nconst extensionInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.createGlobalStore)('extensionsInternal', {\n slots: {},\n extensions: {}\n});\n/**\n * This gets the extension system's internal store. It is subject\n * to change radically and without warning. It should not be used\n * outside esm-core.\n * @internal\n */ const getExtensionInternalStore = ()=>(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('extensionsInternal', {\n slots: {},\n extensions: {}\n });\n/** @internal */ function updateInternalExtensionStore(updater) {\n const state = extensionInternalStore.getState();\n const newState = updater(state);\n if (newState !== state) {\n extensionInternalStore.setState(newState);\n }\n}\n/**\n * This returns a store that modules can use to get information about the\n * state of the extension system.\n */ const getExtensionStore = ()=>(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('extensions', {\n slots: {}\n });\n/**\n * esm-config maintains its own store of the extension information it needs\n * to generate extension configs. We keep it updated based on what's in\n * `extensionStore`.\n */ updateConfigExtensionStore(extensionInternalStore.getState());\nextensionInternalStore.subscribe(updateConfigExtensionStore);\nfunction updateConfigExtensionStore(extensionState) {\n const configExtensionRecords = [];\n for (let extensionInfo of Object.values(extensionState.extensions)){\n for (let instance of extensionInfo.instances){\n configExtensionRecords.push({\n slotModuleName: instance.slotModuleName,\n extensionModuleName: extensionInfo.moduleName,\n slotName: instance.slotName,\n extensionId: instance.id\n });\n }\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__.configExtensionStore.getState().mountedExtensions, configExtensionRecords)) {\n _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__.configExtensionStore.setState({\n mountedExtensions: configExtensionRecords\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3Qvc3RvcmUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDLEdBQXVDO0FBQ1o7QUFDWTtBQUN2RSxNQUFNSSx5QkFBeUJGLHFFQUFpQkEsQ0FBQyxzQkFBc0I7SUFDbkVHLE9BQU8sQ0FBQztJQUNSQyxZQUFZLENBQUM7QUFDakI7QUFDQTs7Ozs7Q0FLQyxHQUFVLE1BQU1DLDRCQUE0QixJQUFJSixrRUFBY0EsQ0FBQyxzQkFBc0I7UUFDOUVFLE9BQU8sQ0FBQztRQUNSQyxZQUFZLENBQUM7SUFDakIsR0FBRztBQUNQLGNBQWMsR0FBVSxTQUFTRSw2QkFBNkJDLE9BQU87SUFDakUsTUFBTUMsUUFBUU4sdUJBQXVCTyxRQUFRO0lBQzdDLE1BQU1DLFdBQVdILFFBQVFDO0lBQ3pCLElBQUlFLGFBQWFGLE9BQU87UUFDcEJOLHVCQUF1QlMsUUFBUSxDQUFDRDtJQUNwQztBQUNKO0FBQ0E7OztDQUdDLEdBQVUsTUFBTUUsb0JBQW9CLElBQUlYLGtFQUFjQSxDQUFDLGNBQWM7UUFDOURFLE9BQU8sQ0FBQztJQUNaLEdBQUc7QUFDUDs7OztDQUlDLEdBQUdVLDJCQUEyQlgsdUJBQXVCTyxRQUFRO0FBQzlEUCx1QkFBdUJZLFNBQVMsQ0FBQ0Q7QUFDakMsU0FBU0EsMkJBQTJCRSxjQUFjO0lBQzlDLE1BQU1DLHlCQUF5QixFQUFFO0lBQ2pDLEtBQUssSUFBSUMsaUJBQWlCQyxPQUFPQyxNQUFNLENBQUNKLGVBQWVYLFVBQVUsRUFBRTtRQUMvRCxLQUFLLElBQUlnQixZQUFZSCxjQUFjSSxTQUFTLENBQUM7WUFDekNMLHVCQUF1Qk0sSUFBSSxDQUFDO2dCQUN4QkMsZ0JBQWdCSCxTQUFTRyxjQUFjO2dCQUN2Q0MscUJBQXFCUCxjQUFjUSxVQUFVO2dCQUM3Q0MsVUFBVU4sU0FBU00sUUFBUTtnQkFDM0JDLGFBQWFQLFNBQVNRLEVBQUU7WUFDNUI7UUFDSjtJQUNKO0lBQ0EsSUFBSSxDQUFDOUIscURBQU9BLENBQUNDLHFFQUFvQkEsQ0FBQ1UsUUFBUSxHQUFHb0IsaUJBQWlCLEVBQUViLHlCQUF5QjtRQUNyRmpCLHFFQUFvQkEsQ0FBQ1ksUUFBUSxDQUFDO1lBQzFCa0IsbUJBQW1CYjtRQUN2QjtJQUNKO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZXh0ZW5zaW9ucy9kaXN0L3N0b3JlLmpzPzZmNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEV4dGVuc2lvbiAqLyBpbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY29uZmlnRXh0ZW5zaW9uU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgY3JlYXRlR2xvYmFsU3RvcmUsIGdldEdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuY29uc3QgZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCdleHRlbnNpb25zSW50ZXJuYWwnLCB7XG4gICAgc2xvdHM6IHt9LFxuICAgIGV4dGVuc2lvbnM6IHt9XG59KTtcbi8qKlxuICogVGhpcyBnZXRzIHRoZSBleHRlbnNpb24gc3lzdGVtJ3MgaW50ZXJuYWwgc3RvcmUuIEl0IGlzIHN1YmplY3RcbiAqIHRvIGNoYW5nZSByYWRpY2FsbHkgYW5kIHdpdGhvdXQgd2FybmluZy4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBvdXRzaWRlIGVzbS1jb3JlLlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGNvbnN0IGdldEV4dGVuc2lvbkludGVybmFsU3RvcmUgPSAoKT0+Z2V0R2xvYmFsU3RvcmUoJ2V4dGVuc2lvbnNJbnRlcm5hbCcsIHtcbiAgICAgICAgc2xvdHM6IHt9LFxuICAgICAgICBleHRlbnNpb25zOiB7fVxuICAgIH0pO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSh1cGRhdGVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB1cGRhdGVyKHN0YXRlKTtcbiAgICBpZiAobmV3U3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgIGV4dGVuc2lvbkludGVybmFsU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbi8qKlxuICogVGhpcyByZXR1cm5zIGEgc3RvcmUgdGhhdCBtb2R1bGVzIGNhbiB1c2UgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZVxuICogc3RhdGUgb2YgdGhlIGV4dGVuc2lvbiBzeXN0ZW0uXG4gKi8gZXhwb3J0IGNvbnN0IGdldEV4dGVuc2lvblN0b3JlID0gKCk9PmdldEdsb2JhbFN0b3JlKCdleHRlbnNpb25zJywge1xuICAgICAgICBzbG90czoge31cbiAgICB9KTtcbi8qKlxuICogZXNtLWNvbmZpZyBtYWludGFpbnMgaXRzIG93biBzdG9yZSBvZiB0aGUgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGl0IG5lZWRzXG4gKiB0byBnZW5lcmF0ZSBleHRlbnNpb24gY29uZmlncy4gV2Uga2VlcCBpdCB1cGRhdGVkIGJhc2VkIG9uIHdoYXQncyBpblxuICogYGV4dGVuc2lvblN0b3JlYC5cbiAqLyB1cGRhdGVDb25maWdFeHRlbnNpb25TdG9yZShleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCkpO1xuZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5zdWJzY3JpYmUodXBkYXRlQ29uZmlnRXh0ZW5zaW9uU3RvcmUpO1xuZnVuY3Rpb24gdXBkYXRlQ29uZmlnRXh0ZW5zaW9uU3RvcmUoZXh0ZW5zaW9uU3RhdGUpIHtcbiAgICBjb25zdCBjb25maWdFeHRlbnNpb25SZWNvcmRzID0gW107XG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uSW5mbyBvZiBPYmplY3QudmFsdWVzKGV4dGVuc2lvblN0YXRlLmV4dGVuc2lvbnMpKXtcbiAgICAgICAgZm9yIChsZXQgaW5zdGFuY2Ugb2YgZXh0ZW5zaW9uSW5mby5pbnN0YW5jZXMpe1xuICAgICAgICAgICAgY29uZmlnRXh0ZW5zaW9uUmVjb3Jkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzbG90TW9kdWxlTmFtZTogaW5zdGFuY2Uuc2xvdE1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uTW9kdWxlTmFtZTogZXh0ZW5zaW9uSW5mby5tb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgIHNsb3ROYW1lOiBpbnN0YW5jZS5zbG90TmFtZSxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25JZDogaW5zdGFuY2UuaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNFcXVhbChjb25maWdFeHRlbnNpb25TdG9yZS5nZXRTdGF0ZSgpLm1vdW50ZWRFeHRlbnNpb25zLCBjb25maWdFeHRlbnNpb25SZWNvcmRzKSkge1xuICAgICAgICBjb25maWdFeHRlbnNpb25TdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtb3VudGVkRXh0ZW5zaW9uczogY29uZmlnRXh0ZW5zaW9uUmVjb3Jkc1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiaXNFcXVhbCIsImNvbmZpZ0V4dGVuc2lvblN0b3JlIiwiY3JlYXRlR2xvYmFsU3RvcmUiLCJnZXRHbG9iYWxTdG9yZSIsImV4dGVuc2lvbkludGVybmFsU3RvcmUiLCJzbG90cyIsImV4dGVuc2lvbnMiLCJnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlIiwidXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSIsInVwZGF0ZXIiLCJzdGF0ZSIsImdldFN0YXRlIiwibmV3U3RhdGUiLCJzZXRTdGF0ZSIsImdldEV4dGVuc2lvblN0b3JlIiwidXBkYXRlQ29uZmlnRXh0ZW5zaW9uU3RvcmUiLCJzdWJzY3JpYmUiLCJleHRlbnNpb25TdGF0ZSIsImNvbmZpZ0V4dGVuc2lvblJlY29yZHMiLCJleHRlbnNpb25JbmZvIiwiT2JqZWN0IiwidmFsdWVzIiwiaW5zdGFuY2UiLCJpbnN0YW5jZXMiLCJwdXNoIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwibW9kdWxlTmFtZSIsInNsb3ROYW1lIiwiZXh0ZW5zaW9uSWQiLCJpZCIsIm1vdW50ZWRFeHRlbnNpb25zIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/store.js\n");
478
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getExtensionInternalStore: () => (/* binding */ getExtensionInternalStore),\n/* harmony export */ getExtensionStore: () => (/* binding */ getExtensionStore),\n/* harmony export */ updateInternalExtensionStore: () => (/* binding */ updateInternalExtensionStore)\n/* harmony export */ });\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Extension */ \n\n\nconst extensionInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.createGlobalStore)('extensionsInternal', {\n slots: {},\n extensions: {}\n});\n/**\n * This gets the extension system's internal store. It is subject\n * to change radically and without warning. It should not be used\n * outside esm-core.\n * @internal\n */ const getExtensionInternalStore = ()=>(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('extensionsInternal', {\n slots: {},\n extensions: {}\n });\n/** @internal */ function updateInternalExtensionStore(updater) {\n // This is a function that updates the internal extension store.\n const state = extensionInternalStore.getState();\n const newState = updater(state);\n if (newState !== state) {\n extensionInternalStore.setState(newState);\n }\n}\n/**\n * This returns a store that modules can use to get information about the\n * state of the extension system.\n */ const getExtensionStore = ()=>(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('extensions', {\n slots: {}\n });\n/**\n * esm-config maintains its own store of the extension information it needs\n * to generate extension configs. We keep it updated based on what's in\n * `extensionStore`.\n */ updateConfigExtensionStore(extensionInternalStore.getState());\nextensionInternalStore.subscribe(updateConfigExtensionStore);\nfunction updateConfigExtensionStore(extensionState) {\n const configExtensionRecords = [];\n for (let extensionInfo of Object.values(extensionState.extensions)){\n for (let instance of extensionInfo.instances){\n configExtensionRecords.push({\n slotModuleName: instance.slotModuleName,\n extensionModuleName: extensionInfo.moduleName,\n slotName: instance.slotName,\n extensionId: instance.id\n });\n }\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__.configExtensionStore.getState().mountedExtensions, configExtensionRecords)) {\n _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_0__.configExtensionStore.setState({\n mountedExtensions: configExtensionRecords\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3Qvc3RvcmUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDLEdBQXVDO0FBQ1o7QUFDWTtBQUN2RSxNQUFNSSx5QkFBeUJGLHFFQUFpQkEsQ0FBQyxzQkFBc0I7SUFDbkVHLE9BQU8sQ0FBQztJQUNSQyxZQUFZLENBQUM7QUFDakI7QUFDQTs7Ozs7Q0FLQyxHQUFVLE1BQU1DLDRCQUE0QixJQUFJSixrRUFBY0EsQ0FBQyxzQkFBc0I7UUFDOUVFLE9BQU8sQ0FBQztRQUNSQyxZQUFZLENBQUM7SUFDakIsR0FBRztBQUNQLGNBQWMsR0FBVSxTQUFTRSw2QkFBNkJDLE9BQU87SUFDakUsZ0VBQWdFO0lBQ2hFLE1BQU1DLFFBQVFOLHVCQUF1Qk8sUUFBUTtJQUM3QyxNQUFNQyxXQUFXSCxRQUFRQztJQUN6QixJQUFJRSxhQUFhRixPQUFPO1FBQ3BCTix1QkFBdUJTLFFBQVEsQ0FBQ0Q7SUFDcEM7QUFDSjtBQUNBOzs7Q0FHQyxHQUFVLE1BQU1FLG9CQUFvQixJQUFJWCxrRUFBY0EsQ0FBQyxjQUFjO1FBQzlERSxPQUFPLENBQUM7SUFDWixHQUFHO0FBQ1A7Ozs7Q0FJQyxHQUFHVSwyQkFBMkJYLHVCQUF1Qk8sUUFBUTtBQUM5RFAsdUJBQXVCWSxTQUFTLENBQUNEO0FBQ2pDLFNBQVNBLDJCQUEyQkUsY0FBYztJQUM5QyxNQUFNQyx5QkFBeUIsRUFBRTtJQUNqQyxLQUFLLElBQUlDLGlCQUFpQkMsT0FBT0MsTUFBTSxDQUFDSixlQUFlWCxVQUFVLEVBQUU7UUFDL0QsS0FBSyxJQUFJZ0IsWUFBWUgsY0FBY0ksU0FBUyxDQUFDO1lBQ3pDTCx1QkFBdUJNLElBQUksQ0FBQztnQkFDeEJDLGdCQUFnQkgsU0FBU0csY0FBYztnQkFDdkNDLHFCQUFxQlAsY0FBY1EsVUFBVTtnQkFDN0NDLFVBQVVOLFNBQVNNLFFBQVE7Z0JBQzNCQyxhQUFhUCxTQUFTUSxFQUFFO1lBQzVCO1FBQ0o7SUFDSjtJQUNBLElBQUksQ0FBQzlCLHFEQUFPQSxDQUFDQyxxRUFBb0JBLENBQUNVLFFBQVEsR0FBR29CLGlCQUFpQixFQUFFYix5QkFBeUI7UUFDckZqQixxRUFBb0JBLENBQUNZLFFBQVEsQ0FBQztZQUMxQmtCLG1CQUFtQmI7UUFDdkI7SUFDSjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWV4dGVuc2lvbnMvZGlzdC9zdG9yZS5qcz82ZjZhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBFeHRlbnNpb24gKi8gaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IGNvbmZpZ0V4dGVuc2lvblN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1jb25maWdcIjtcbmltcG9ydCB7IGNyZWF0ZUdsb2JhbFN0b3JlLCBnZXRHbG9iYWxTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tc3RhdGVcIjtcbmNvbnN0IGV4dGVuc2lvbkludGVybmFsU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnZXh0ZW5zaW9uc0ludGVybmFsJywge1xuICAgIHNsb3RzOiB7fSxcbiAgICBleHRlbnNpb25zOiB7fVxufSk7XG4vKipcbiAqIFRoaXMgZ2V0cyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSdzIGludGVybmFsIHN0b3JlLiBJdCBpcyBzdWJqZWN0XG4gKiB0byBjaGFuZ2UgcmFkaWNhbGx5IGFuZCB3aXRob3V0IHdhcm5pbmcuIEl0IHNob3VsZCBub3QgYmUgdXNlZFxuICogb3V0c2lkZSBlc20tY29yZS5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBjb25zdCBnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlID0gKCk9PmdldEdsb2JhbFN0b3JlKCdleHRlbnNpb25zSW50ZXJuYWwnLCB7XG4gICAgICAgIHNsb3RzOiB7fSxcbiAgICAgICAgZXh0ZW5zaW9uczoge31cbiAgICB9KTtcbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUodXBkYXRlcikge1xuICAgIC8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIGludGVybmFsIGV4dGVuc2lvbiBzdG9yZS5cbiAgICBjb25zdCBzdGF0ZSA9IGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZXIoc3RhdGUpO1xuICAgIGlmIChuZXdTdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIHJldHVybnMgYSBzdG9yZSB0aGF0IG1vZHVsZXMgY2FuIHVzZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG4gKiBzdGF0ZSBvZiB0aGUgZXh0ZW5zaW9uIHN5c3RlbS5cbiAqLyBleHBvcnQgY29uc3QgZ2V0RXh0ZW5zaW9uU3RvcmUgPSAoKT0+Z2V0R2xvYmFsU3RvcmUoJ2V4dGVuc2lvbnMnLCB7XG4gICAgICAgIHNsb3RzOiB7fVxuICAgIH0pO1xuLyoqXG4gKiBlc20tY29uZmlnIG1haW50YWlucyBpdHMgb3duIHN0b3JlIG9mIHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gaXQgbmVlZHNcbiAqIHRvIGdlbmVyYXRlIGV4dGVuc2lvbiBjb25maWdzLiBXZSBrZWVwIGl0IHVwZGF0ZWQgYmFzZWQgb24gd2hhdCdzIGluXG4gKiBgZXh0ZW5zaW9uU3RvcmVgLlxuICovIHVwZGF0ZUNvbmZpZ0V4dGVuc2lvblN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG5leHRlbnNpb25JbnRlcm5hbFN0b3JlLnN1YnNjcmliZSh1cGRhdGVDb25maWdFeHRlbnNpb25TdG9yZSk7XG5mdW5jdGlvbiB1cGRhdGVDb25maWdFeHRlbnNpb25TdG9yZShleHRlbnNpb25TdGF0ZSkge1xuICAgIGNvbnN0IGNvbmZpZ0V4dGVuc2lvblJlY29yZHMgPSBbXTtcbiAgICBmb3IgKGxldCBleHRlbnNpb25JbmZvIG9mIE9iamVjdC52YWx1ZXMoZXh0ZW5zaW9uU3RhdGUuZXh0ZW5zaW9ucykpe1xuICAgICAgICBmb3IgKGxldCBpbnN0YW5jZSBvZiBleHRlbnNpb25JbmZvLmluc3RhbmNlcyl7XG4gICAgICAgICAgICBjb25maWdFeHRlbnNpb25SZWNvcmRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNsb3RNb2R1bGVOYW1lOiBpbnN0YW5jZS5zbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25Nb2R1bGVOYW1lOiBleHRlbnNpb25JbmZvLm1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgICAgc2xvdE5hbWU6IGluc3RhbmNlLnNsb3ROYW1lLFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBpbnN0YW5jZS5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc0VxdWFsKGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCkubW91bnRlZEV4dGVuc2lvbnMsIGNvbmZpZ0V4dGVuc2lvblJlY29yZHMpKSB7XG4gICAgICAgIGNvbmZpZ0V4dGVuc2lvblN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG1vdW50ZWRFeHRlbnNpb25zOiBjb25maWdFeHRlbnNpb25SZWNvcmRzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJpc0VxdWFsIiwiY29uZmlnRXh0ZW5zaW9uU3RvcmUiLCJjcmVhdGVHbG9iYWxTdG9yZSIsImdldEdsb2JhbFN0b3JlIiwiZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSIsInNsb3RzIiwiZXh0ZW5zaW9ucyIsImdldEV4dGVuc2lvbkludGVybmFsU3RvcmUiLCJ1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlIiwidXBkYXRlciIsInN0YXRlIiwiZ2V0U3RhdGUiLCJuZXdTdGF0ZSIsInNldFN0YXRlIiwiZ2V0RXh0ZW5zaW9uU3RvcmUiLCJ1cGRhdGVDb25maWdFeHRlbnNpb25TdG9yZSIsInN1YnNjcmliZSIsImV4dGVuc2lvblN0YXRlIiwiY29uZmlnRXh0ZW5zaW9uUmVjb3JkcyIsImV4dGVuc2lvbkluZm8iLCJPYmplY3QiLCJ2YWx1ZXMiLCJpbnN0YW5jZSIsImluc3RhbmNlcyIsInB1c2giLCJzbG90TW9kdWxlTmFtZSIsImV4dGVuc2lvbk1vZHVsZU5hbWUiLCJtb2R1bGVOYW1lIiwic2xvdE5hbWUiLCJleHRlbnNpb25JZCIsImlkIiwibW91bnRlZEV4dGVuc2lvbnMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/store.js\n");
479
479
 
480
480
  /***/ }),
481
481
 
@@ -765,7 +765,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
765
765
  \*************************************************************/
766
766
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
767
767
 
768
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExtensionSlot: () => (/* binding */ ExtensionSlot)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* harmony import */ var _Extension_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Extension.js */ \"../../framework/esm-react-utils/dist/Extension.js\");\n/* harmony import */ var _useExtensionSlot_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useExtensionSlot.js */ \"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\n/** @module @category Extension */ \n\n\n\nfunction defaultSelect(extensions) {\n return extensions;\n}\n/**\n * An [extension slot](https://o3-docs.openmrs.org/docs/extension-system).\n * A place with a name. Extensions that get connected to that name\n * will be rendered into this.\n *\n * @example\n * Passing a react node as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Foo\">\n * <div style={{ width: 10rem }}>\n * <Extension />\n * </div>\n * </ExtensionSlot>\n * ```\n *\n * @example\n * Passing a function as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Bar\">\n * {(extension) => (\n * <h1>{extension.name}</h1>\n * <div style={{ color: extension.meta.color }}>\n * <Extension />\n * </div>\n * )}\n * </ExtensionSlot>\n * ```\n *\n */ function ExtensionSlot({ name: extensionSlotName, extensionSlotName: legacyExtensionSlotName, select = defaultSelect, children, state, style, ...divProps }) {\n if (children && state) {\n throw new Error('Both children and state have been provided. If children are provided, the state must be passed as a prop to the `Extension` component.');\n }\n const name = extensionSlotName ?? legacyExtensionSlotName;\n const slotRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const { extensions, extensionSlotModuleName } = (0,_useExtensionSlot_js__WEBPACK_IMPORTED_MODULE_3__.useExtensionSlot)(name);\n const extensionsToRender = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>select(extensions), [\n select,\n extensions\n ]);\n const extensionsFromChildrenFunction = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>{\n if (typeof children == 'function' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(children)) {\n return extensionsToRender.map((extension)=>children(extension, state));\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: {\n ...style,\n position: 'relative'\n },\n ...divProps\n }, name && extensionsToRender?.map((extension, i)=>/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_1__.ComponentContext.Provider, {\n key: extension.id,\n value: {\n moduleName: extensionSlotModuleName,\n featureName: '',\n extension: {\n extensionId: extension.id,\n extensionSlotName: name,\n extensionSlotModuleName\n }\n }\n }, extensionsFromChildrenFunction?.[i] ?? (typeof children !== 'function' ? children : null) ?? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Extension_js__WEBPACK_IMPORTED_MODULE_2__.Extension, {\n state: state\n }))));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxnQ0FBZ0MsR0FBa0Q7QUFDekI7QUFDZDtBQUNjO0FBQ3pELFNBQVNNLGNBQWNDLFVBQVU7SUFDN0IsT0FBT0E7QUFDWDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QkMsR0FBVSxTQUFTQyxjQUFjLEVBQUVDLE1BQU1DLGlCQUFpQixFQUFFQSxtQkFBbUJDLHVCQUF1QixFQUFFQyxTQUFTTixhQUFhLEVBQUVPLFFBQVEsRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUUsR0FBR0MsVUFBVTtJQUNsSyxJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLE1BQU1SLE9BQU9DLHFCQUFxQkM7SUFDbEMsTUFBTU8sVUFBVWpCLDZDQUFNQSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRU0sVUFBVSxFQUFFWSx1QkFBdUIsRUFBRSxHQUFHZCxzRUFBZ0JBLENBQUNJO0lBQ2pFLE1BQU1XLHFCQUFxQmxCLDhDQUFPQSxDQUFDLElBQUlVLE9BQU9MLGFBQWE7UUFDdkRLO1FBQ0FMO0tBQ0g7SUFDRCxNQUFNYyxpQ0FBaUNuQiw4Q0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9XLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR2IsaURBQW9CLENBQUNhLFdBQVc7WUFDaEYsT0FBT08sbUJBQW1CRyxHQUFHLENBQUMsQ0FBQ0MsWUFBWVgsU0FBU1csV0FBV1Y7UUFDbkU7SUFDSixHQUFHO1FBQ0NEO1FBQ0FPO0tBQ0g7SUFDRCxPQUFPLFdBQVcsR0FBR3BCLGdEQUFtQixDQUFDLE9BQU87UUFDNUMwQixLQUFLUjtRQUNMLDRCQUE0QlQ7UUFDNUIsbUNBQW1DVTtRQUNuQ0osT0FBTztZQUNILEdBQUdBLEtBQUs7WUFDUlksVUFBVTtRQUNkO1FBQ0EsR0FBR1gsUUFBUTtJQUNmLEdBQUdQLFFBQVFXLG9CQUFvQkcsSUFBSSxDQUFDQyxXQUFXSSxJQUFJLFdBQVcsR0FBRzVCLGdEQUFtQixDQUFDRyxrRUFBZ0JBLENBQUMwQixRQUFRLEVBQUU7WUFDeEdDLEtBQUtOLFVBQVVPLEVBQUU7WUFDakJDLE9BQU87Z0JBQ0hDLFlBQVlkO2dCQUNaZSxhQUFhO2dCQUNiVixXQUFXO29CQUNQVyxhQUFhWCxVQUFVTyxFQUFFO29CQUN6QnJCLG1CQUFtQkQ7b0JBQ25CVTtnQkFDSjtZQUNKO1FBQ0osR0FBR0UsZ0NBQWdDLENBQUNPLEVBQUUsSUFBSyxRQUFPZixhQUFhLGFBQWFBLFdBQVcsSUFBRyxLQUFNLFdBQVcsR0FBR2IsZ0RBQW1CLENBQUNJLG9EQUFTQSxFQUFFO1lBQ3pJVSxPQUFPQTtRQUNYO0FBQ1IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC9FeHRlbnNpb25TbG90LmpzPzliZTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEV4dGVuc2lvbiAqLyBpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIi4vQ29tcG9uZW50Q29udGV4dC5qc1wiO1xuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSBcIi4vRXh0ZW5zaW9uLmpzXCI7XG5pbXBvcnQgeyB1c2VFeHRlbnNpb25TbG90IH0gZnJvbSBcIi4vdXNlRXh0ZW5zaW9uU2xvdC5qc1wiO1xuZnVuY3Rpb24gZGVmYXVsdFNlbGVjdChleHRlbnNpb25zKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG4vKipcbiAqIEFuIFtleHRlbnNpb24gc2xvdF0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvZXh0ZW5zaW9uLXN5c3RlbSkuXG4gKiBBIHBsYWNlIHdpdGggYSBuYW1lLiBFeHRlbnNpb25zIHRoYXQgZ2V0IGNvbm5lY3RlZCB0byB0aGF0IG5hbWVcbiAqIHdpbGwgYmUgcmVuZGVyZWQgaW50byB0aGlzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBQYXNzaW5nIGEgcmVhY3Qgbm9kZSBhcyBjaGlsZHJlblxuICpcbiAqIGBgYHRzeFxuICogPEV4dGVuc2lvblNsb3QgbmFtZT1cIkZvb1wiPlxuICogICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAxMHJlbSB9fT5cbiAqICAgICA8RXh0ZW5zaW9uIC8+XG4gKiAgIDwvZGl2PlxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSBmdW5jdGlvbiBhcyBjaGlsZHJlblxuICpcbiAqIGBgYHRzeFxuICogPEV4dGVuc2lvblNsb3QgbmFtZT1cIkJhclwiPlxuICogICB7KGV4dGVuc2lvbikgPT4gKFxuICogICAgIDxoMT57ZXh0ZW5zaW9uLm5hbWV9PC9oMT5cbiAqICAgICA8ZGl2IHN0eWxlPXt7IGNvbG9yOiBleHRlbnNpb24ubWV0YS5jb2xvciB9fT5cbiAqICAgICAgIDxFeHRlbnNpb24gLz5cbiAqICAgICA8L2Rpdj5cbiAqICAgKX1cbiAqIDwvRXh0ZW5zaW9uU2xvdD5cbiAqIGBgYFxuICpcbiAqLyBleHBvcnQgZnVuY3Rpb24gRXh0ZW5zaW9uU2xvdCh7IG5hbWU6IGV4dGVuc2lvblNsb3ROYW1lLCBleHRlbnNpb25TbG90TmFtZTogbGVnYWN5RXh0ZW5zaW9uU2xvdE5hbWUsIHNlbGVjdCA9IGRlZmF1bHRTZWxlY3QsIGNoaWxkcmVuLCBzdGF0ZSwgc3R5bGUsIC4uLmRpdlByb3BzIH0pIHtcbiAgICBpZiAoY2hpbGRyZW4gJiYgc3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGNoaWxkcmVuIGFuZCBzdGF0ZSBoYXZlIGJlZW4gcHJvdmlkZWQuIElmIGNoaWxkcmVuIGFyZSBwcm92aWRlZCwgdGhlIHN0YXRlIG11c3QgYmUgcGFzc2VkIGFzIGEgcHJvcCB0byB0aGUgYEV4dGVuc2lvbmAgY29tcG9uZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZXh0ZW5zaW9uU2xvdE5hbWUgPz8gbGVnYWN5RXh0ZW5zaW9uU2xvdE5hbWU7XG4gICAgY29uc3Qgc2xvdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCB7IGV4dGVuc2lvbnMsIGV4dGVuc2lvblNsb3RNb2R1bGVOYW1lIH0gPSB1c2VFeHRlbnNpb25TbG90KG5hbWUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnNUb1JlbmRlciA9IHVzZU1lbW8oKCk9PnNlbGVjdChleHRlbnNpb25zKSwgW1xuICAgICAgICBzZWxlY3QsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24gPSB1c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT0gJ2Z1bmN0aW9uJyAmJiAhLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZW5kZXIubWFwKChleHRlbnNpb24pPT5jaGlsZHJlbihleHRlbnNpb24sIHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBleHRlbnNpb25zVG9SZW5kZXJcbiAgICBdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBzbG90UmVmLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbmFtZVwiOiBuYW1lLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbW9kdWxlLW5hbWVcIjogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRpdlByb3BzXG4gICAgfSwgbmFtZSAmJiBleHRlbnNpb25zVG9SZW5kZXI/Lm1hcCgoZXh0ZW5zaW9uLCBpKT0+LyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIGtleTogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb25TbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBleHRlbnNpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TW9kdWxlTmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uPy5baV0gPz8gKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuIDogbnVsbCkgPz8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dGVuc2lvbiwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0pKSkpO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwidXNlUmVmIiwidXNlTWVtbyIsIkNvbXBvbmVudENvbnRleHQiLCJFeHRlbnNpb24iLCJ1c2VFeHRlbnNpb25TbG90IiwiZGVmYXVsdFNlbGVjdCIsImV4dGVuc2lvbnMiLCJFeHRlbnNpb25TbG90IiwibmFtZSIsImV4dGVuc2lvblNsb3ROYW1lIiwibGVnYWN5RXh0ZW5zaW9uU2xvdE5hbWUiLCJzZWxlY3QiLCJjaGlsZHJlbiIsInN0YXRlIiwic3R5bGUiLCJkaXZQcm9wcyIsIkVycm9yIiwic2xvdFJlZiIsImV4dGVuc2lvblNsb3RNb2R1bGVOYW1lIiwiZXh0ZW5zaW9uc1RvUmVuZGVyIiwiZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uIiwiaXNWYWxpZEVsZW1lbnQiLCJtYXAiLCJleHRlbnNpb24iLCJjcmVhdGVFbGVtZW50IiwicmVmIiwicG9zaXRpb24iLCJpIiwiUHJvdmlkZXIiLCJrZXkiLCJpZCIsInZhbHVlIiwibW9kdWxlTmFtZSIsImZlYXR1cmVOYW1lIiwiZXh0ZW5zaW9uSWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n");
768
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExtensionSlot: () => (/* binding */ ExtensionSlot)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* harmony import */ var _Extension_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Extension.js */ \"../../framework/esm-react-utils/dist/Extension.js\");\n/* harmony import */ var _useExtensionSlot_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useExtensionSlot.js */ \"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\n/** @module @category Extension */ \n\n\n\nfunction defaultSelect(extensions) {\n return extensions;\n}\n/**\n * An [extension slot](https://o3-docs.openmrs.org/docs/extension-system).\n * A place with a name. Extensions that get connected to that name\n * will be rendered into this.\n *\n * @example\n * Passing a react node as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Foo\">\n * <div style={{ width: 10rem }}>\n * <Extension />\n * </div>\n * </ExtensionSlot>\n * ```\n *\n * @example\n * Passing a function as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Bar\">\n * {(extension) => (\n * <h1>{extension.name}</h1>\n * <div style={{ color: extension.meta.color }}>\n * <Extension />\n * </div>\n * )}\n * </ExtensionSlot>\n * ```\n *\n */ function ExtensionSlot({ name: extensionSlotName, extensionSlotName: legacyExtensionSlotName, select = defaultSelect, children, state, style, ...divProps }) {\n if (children && state) {\n throw new Error('Both children and state have been provided. If children are provided, the state must be passed as a prop to the `Extension` component.');\n }\n const name = extensionSlotName ?? legacyExtensionSlotName;\n const slotRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const { extensions, extensionSlotModuleName } = (0,_useExtensionSlot_js__WEBPACK_IMPORTED_MODULE_3__.useExtensionSlot)(name, state);\n const extensionsToRender = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>select(extensions), [\n select,\n extensions\n ]);\n const extensionsFromChildrenFunction = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>{\n if (typeof children == 'function' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(children)) {\n return extensionsToRender.map((extension)=>children(extension, state));\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: {\n ...style,\n position: 'relative'\n },\n ...divProps\n }, name && extensionsToRender?.map((extension, i)=>/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_1__.ComponentContext.Provider, {\n key: extension.id,\n value: {\n moduleName: extensionSlotModuleName,\n featureName: '',\n extension: {\n extensionId: extension.id,\n extensionSlotName: name,\n extensionSlotModuleName\n }\n }\n }, extensionsFromChildrenFunction?.[i] ?? (typeof children !== 'function' ? children : null) ?? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Extension_js__WEBPACK_IMPORTED_MODULE_2__.Extension, {\n state: state\n }))));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxnQ0FBZ0MsR0FBa0Q7QUFDekI7QUFDZDtBQUNjO0FBQ3pELFNBQVNNLGNBQWNDLFVBQVU7SUFDN0IsT0FBT0E7QUFDWDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QkMsR0FBVSxTQUFTQyxjQUFjLEVBQUVDLE1BQU1DLGlCQUFpQixFQUFFQSxtQkFBbUJDLHVCQUF1QixFQUFFQyxTQUFTTixhQUFhLEVBQUVPLFFBQVEsRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUUsR0FBR0MsVUFBVTtJQUNsSyxJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLE1BQU1SLE9BQU9DLHFCQUFxQkM7SUFDbEMsTUFBTU8sVUFBVWpCLDZDQUFNQSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRU0sVUFBVSxFQUFFWSx1QkFBdUIsRUFBRSxHQUFHZCxzRUFBZ0JBLENBQUNJLE1BQU1LO0lBQ3ZFLE1BQU1NLHFCQUFxQmxCLDhDQUFPQSxDQUFDLElBQUlVLE9BQU9MLGFBQWE7UUFDdkRLO1FBQ0FMO0tBQ0g7SUFDRCxNQUFNYyxpQ0FBaUNuQiw4Q0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9XLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR2IsaURBQW9CLENBQUNhLFdBQVc7WUFDaEYsT0FBT08sbUJBQW1CRyxHQUFHLENBQUMsQ0FBQ0MsWUFBWVgsU0FBU1csV0FBV1Y7UUFDbkU7SUFDSixHQUFHO1FBQ0NEO1FBQ0FPO0tBQ0g7SUFDRCxPQUFPLFdBQVcsR0FBR3BCLGdEQUFtQixDQUFDLE9BQU87UUFDNUMwQixLQUFLUjtRQUNMLDRCQUE0QlQ7UUFDNUIsbUNBQW1DVTtRQUNuQ0osT0FBTztZQUNILEdBQUdBLEtBQUs7WUFDUlksVUFBVTtRQUNkO1FBQ0EsR0FBR1gsUUFBUTtJQUNmLEdBQUdQLFFBQVFXLG9CQUFvQkcsSUFBSSxDQUFDQyxXQUFXSSxJQUFJLFdBQVcsR0FBRzVCLGdEQUFtQixDQUFDRyxrRUFBZ0JBLENBQUMwQixRQUFRLEVBQUU7WUFDeEdDLEtBQUtOLFVBQVVPLEVBQUU7WUFDakJDLE9BQU87Z0JBQ0hDLFlBQVlkO2dCQUNaZSxhQUFhO2dCQUNiVixXQUFXO29CQUNQVyxhQUFhWCxVQUFVTyxFQUFFO29CQUN6QnJCLG1CQUFtQkQ7b0JBQ25CVTtnQkFDSjtZQUNKO1FBQ0osR0FBR0UsZ0NBQWdDLENBQUNPLEVBQUUsSUFBSyxRQUFPZixhQUFhLGFBQWFBLFdBQVcsSUFBRyxLQUFNLFdBQVcsR0FBR2IsZ0RBQW1CLENBQUNJLG9EQUFTQSxFQUFFO1lBQ3pJVSxPQUFPQTtRQUNYO0FBQ1IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC9FeHRlbnNpb25TbG90LmpzPzliZTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEV4dGVuc2lvbiAqLyBpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIi4vQ29tcG9uZW50Q29udGV4dC5qc1wiO1xuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSBcIi4vRXh0ZW5zaW9uLmpzXCI7XG5pbXBvcnQgeyB1c2VFeHRlbnNpb25TbG90IH0gZnJvbSBcIi4vdXNlRXh0ZW5zaW9uU2xvdC5qc1wiO1xuZnVuY3Rpb24gZGVmYXVsdFNlbGVjdChleHRlbnNpb25zKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG4vKipcbiAqIEFuIFtleHRlbnNpb24gc2xvdF0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvZXh0ZW5zaW9uLXN5c3RlbSkuXG4gKiBBIHBsYWNlIHdpdGggYSBuYW1lLiBFeHRlbnNpb25zIHRoYXQgZ2V0IGNvbm5lY3RlZCB0byB0aGF0IG5hbWVcbiAqIHdpbGwgYmUgcmVuZGVyZWQgaW50byB0aGlzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBQYXNzaW5nIGEgcmVhY3Qgbm9kZSBhcyBjaGlsZHJlblxuICpcbiAqIGBgYHRzeFxuICogPEV4dGVuc2lvblNsb3QgbmFtZT1cIkZvb1wiPlxuICogICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAxMHJlbSB9fT5cbiAqICAgICA8RXh0ZW5zaW9uIC8+XG4gKiAgIDwvZGl2PlxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSBmdW5jdGlvbiBhcyBjaGlsZHJlblxuICpcbiAqIGBgYHRzeFxuICogPEV4dGVuc2lvblNsb3QgbmFtZT1cIkJhclwiPlxuICogICB7KGV4dGVuc2lvbikgPT4gKFxuICogICAgIDxoMT57ZXh0ZW5zaW9uLm5hbWV9PC9oMT5cbiAqICAgICA8ZGl2IHN0eWxlPXt7IGNvbG9yOiBleHRlbnNpb24ubWV0YS5jb2xvciB9fT5cbiAqICAgICAgIDxFeHRlbnNpb24gLz5cbiAqICAgICA8L2Rpdj5cbiAqICAgKX1cbiAqIDwvRXh0ZW5zaW9uU2xvdD5cbiAqIGBgYFxuICpcbiAqLyBleHBvcnQgZnVuY3Rpb24gRXh0ZW5zaW9uU2xvdCh7IG5hbWU6IGV4dGVuc2lvblNsb3ROYW1lLCBleHRlbnNpb25TbG90TmFtZTogbGVnYWN5RXh0ZW5zaW9uU2xvdE5hbWUsIHNlbGVjdCA9IGRlZmF1bHRTZWxlY3QsIGNoaWxkcmVuLCBzdGF0ZSwgc3R5bGUsIC4uLmRpdlByb3BzIH0pIHtcbiAgICBpZiAoY2hpbGRyZW4gJiYgc3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGNoaWxkcmVuIGFuZCBzdGF0ZSBoYXZlIGJlZW4gcHJvdmlkZWQuIElmIGNoaWxkcmVuIGFyZSBwcm92aWRlZCwgdGhlIHN0YXRlIG11c3QgYmUgcGFzc2VkIGFzIGEgcHJvcCB0byB0aGUgYEV4dGVuc2lvbmAgY29tcG9uZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZXh0ZW5zaW9uU2xvdE5hbWUgPz8gbGVnYWN5RXh0ZW5zaW9uU2xvdE5hbWU7XG4gICAgY29uc3Qgc2xvdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCB7IGV4dGVuc2lvbnMsIGV4dGVuc2lvblNsb3RNb2R1bGVOYW1lIH0gPSB1c2VFeHRlbnNpb25TbG90KG5hbWUsIHN0YXRlKTtcbiAgICBjb25zdCBleHRlbnNpb25zVG9SZW5kZXIgPSB1c2VNZW1vKCgpPT5zZWxlY3QoZXh0ZW5zaW9ucyksIFtcbiAgICAgICAgc2VsZWN0LFxuICAgICAgICBleHRlbnNpb25zXG4gICAgXSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uID0gdXNlTWVtbygoKT0+e1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09ICdmdW5jdGlvbicgJiYgIS8qI19fUFVSRV9fKi8gUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmVuZGVyLm1hcCgoZXh0ZW5zaW9uKT0+Y2hpbGRyZW4oZXh0ZW5zaW9uLCBzdGF0ZSkpO1xuICAgICAgICB9XG4gICAgfSwgW1xuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgZXh0ZW5zaW9uc1RvUmVuZGVyXG4gICAgXSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogc2xvdFJlZixcbiAgICAgICAgXCJkYXRhLWV4dGVuc2lvbi1zbG90LW5hbWVcIjogbmFtZSxcbiAgICAgICAgXCJkYXRhLWV4dGVuc2lvbi1zbG90LW1vZHVsZS1uYW1lXCI6IGV4dGVuc2lvblNsb3RNb2R1bGVOYW1lLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9LFxuICAgICAgICAuLi5kaXZQcm9wc1xuICAgIH0sIG5hbWUgJiYgZXh0ZW5zaW9uc1RvUmVuZGVyPy5tYXAoKGV4dGVuc2lvbiwgaSk9Pi8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgICAgICBrZXk6IGV4dGVuc2lvbi5pZCxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgICAgZmVhdHVyZU5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25JZDogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGV4dGVuc2lvbnNGcm9tQ2hpbGRyZW5GdW5jdGlvbj8uW2ldID8/ICh0eXBlb2YgY2hpbGRyZW4gIT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbiA6IG51bGwpID8/IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChFeHRlbnNpb24sIHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVxuICAgICAgICB9KSkpKTtcbn1cbiJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZVJlZiIsInVzZU1lbW8iLCJDb21wb25lbnRDb250ZXh0IiwiRXh0ZW5zaW9uIiwidXNlRXh0ZW5zaW9uU2xvdCIsImRlZmF1bHRTZWxlY3QiLCJleHRlbnNpb25zIiwiRXh0ZW5zaW9uU2xvdCIsIm5hbWUiLCJleHRlbnNpb25TbG90TmFtZSIsImxlZ2FjeUV4dGVuc2lvblNsb3ROYW1lIiwic2VsZWN0IiwiY2hpbGRyZW4iLCJzdGF0ZSIsInN0eWxlIiwiZGl2UHJvcHMiLCJFcnJvciIsInNsb3RSZWYiLCJleHRlbnNpb25TbG90TW9kdWxlTmFtZSIsImV4dGVuc2lvbnNUb1JlbmRlciIsImV4dGVuc2lvbnNGcm9tQ2hpbGRyZW5GdW5jdGlvbiIsImlzVmFsaWRFbGVtZW50IiwibWFwIiwiZXh0ZW5zaW9uIiwiY3JlYXRlRWxlbWVudCIsInJlZiIsInBvc2l0aW9uIiwiaSIsIlByb3ZpZGVyIiwia2V5IiwiaWQiLCJ2YWx1ZSIsIm1vZHVsZU5hbWUiLCJmZWF0dXJlTmFtZSIsImV4dGVuc2lvbklkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n");
769
769
 
770
770
  /***/ }),
771
771
 
@@ -965,7 +965,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
965
965
  \****************************************************************/
966
966
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
967
967
 
968
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useExtensionSlot: () => (/* binding */ useExtensionSlot)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* harmony import */ var _useAssignedExtensions_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useAssignedExtensions.js */ \"../../framework/esm-react-utils/dist/useAssignedExtensions.js\");\n\n\n\n\n/** @internal */ function useExtensionSlot(slotName) {\n const { moduleName } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__.ComponentContext);\n if (!moduleName) {\n throw Error('ComponentContext has not been provided. This should come from @openmrs/esm-react-utils.');\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.registerExtensionSlot)(moduleName, slotName);\n }, []);\n const extensions = (0,_useAssignedExtensions_js__WEBPACK_IMPORTED_MODULE_3__.useAssignedExtensions)(slotName);\n return {\n extensions,\n extensionSlotName: slotName,\n extensionSlotModuleName: moduleName\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUV4dGVuc2lvblNsb3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBOEM7QUFDa0I7QUFDUDtBQUNVO0FBQ25FLGNBQWMsR0FBVSxTQUFTSyxpQkFBaUJDLFFBQVE7SUFDdEQsTUFBTSxFQUFFQyxVQUFVLEVBQUUsR0FBR1AsaURBQVVBLENBQUNHLGtFQUFnQkE7SUFDbEQsSUFBSSxDQUFDSSxZQUFZO1FBQ2IsTUFBTUMsTUFBTTtJQUNoQjtJQUNBUCxnREFBU0EsQ0FBQztRQUNOQyw4RUFBcUJBLENBQUNLLFlBQVlEO0lBQ3RDLEdBQUcsRUFBRTtJQUNMLE1BQU1HLGFBQWFMLGdGQUFxQkEsQ0FBQ0U7SUFDekMsT0FBTztRQUNIRztRQUNBQyxtQkFBbUJKO1FBQ25CSyx5QkFBeUJKO0lBQzdCO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VFeHRlbnNpb25TbG90LmpzP2FlMjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyByZWdpc3RlckV4dGVuc2lvblNsb3QgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG5pbXBvcnQgeyB1c2VBc3NpZ25lZEV4dGVuc2lvbnMgfSBmcm9tIFwiLi91c2VBc3NpZ25lZEV4dGVuc2lvbnMuanNcIjtcbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIHVzZUV4dGVuc2lvblNsb3Qoc2xvdE5hbWUpIHtcbiAgICBjb25zdCB7IG1vZHVsZU5hbWUgfSA9IHVzZUNvbnRleHQoQ29tcG9uZW50Q29udGV4dCk7XG4gICAgaWYgKCFtb2R1bGVOYW1lKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdDb21wb25lbnRDb250ZXh0IGhhcyBub3QgYmVlbiBwcm92aWRlZC4gVGhpcyBzaG91bGQgY29tZSBmcm9tIEBvcGVubXJzL2VzbS1yZWFjdC11dGlscy4nKTtcbiAgICB9XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uU2xvdChtb2R1bGVOYW1lLCBzbG90TmFtZSk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSB1c2VBc3NpZ25lZEV4dGVuc2lvbnMoc2xvdE5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBzbG90TmFtZSxcbiAgICAgICAgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWU6IG1vZHVsZU5hbWVcbiAgICB9O1xufVxuIl0sIm5hbWVzIjpbInVzZUNvbnRleHQiLCJ1c2VFZmZlY3QiLCJyZWdpc3RlckV4dGVuc2lvblNsb3QiLCJDb21wb25lbnRDb250ZXh0IiwidXNlQXNzaWduZWRFeHRlbnNpb25zIiwidXNlRXh0ZW5zaW9uU2xvdCIsInNsb3ROYW1lIiwibW9kdWxlTmFtZSIsIkVycm9yIiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvblNsb3ROYW1lIiwiZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useExtensionSlot.js\n");
968
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useExtensionSlot: () => (/* binding */ useExtensionSlot)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* harmony import */ var _useAssignedExtensions_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useAssignedExtensions.js */ \"../../framework/esm-react-utils/dist/useAssignedExtensions.js\");\n\n\n\n\n/** @internal */ function useExtensionSlot(slotName, state) {\n const { moduleName } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__.ComponentContext);\n const isInitialRender = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(true);\n if (!moduleName) {\n throw Error('ComponentContext has not been provided. This should come from @openmrs/esm-react-utils.');\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.registerExtensionSlot)(moduleName, slotName, state);\n isInitialRender.current = false;\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (!isInitialRender.current) {\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.updateExtensionSlotState)(slotName, state);\n }\n }, [\n slotName,\n state\n ]);\n const extensions = (0,_useAssignedExtensions_js__WEBPACK_IMPORTED_MODULE_3__.useAssignedExtensions)(slotName);\n return {\n extensions,\n extensionSlotName: slotName,\n extensionSlotModuleName: moduleName\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUV4dGVuc2lvblNsb3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBc0Q7QUFDb0M7QUFDakM7QUFDVTtBQUNuRSxjQUFjLEdBQVUsU0FBU08saUJBQWlCQyxRQUFRLEVBQUVDLEtBQUs7SUFDN0QsTUFBTSxFQUFFQyxVQUFVLEVBQUUsR0FBR1YsaURBQVVBLENBQUNLLGtFQUFnQkE7SUFDbEQsTUFBTU0sa0JBQWtCVCw2Q0FBTUEsQ0FBQztJQUMvQixJQUFJLENBQUNRLFlBQVk7UUFDYixNQUFNRSxNQUFNO0lBQ2hCO0lBQ0FYLGdEQUFTQSxDQUFDO1FBQ05FLDhFQUFxQkEsQ0FBQ08sWUFBWUYsVUFBVUM7UUFDNUNFLGdCQUFnQkUsT0FBTyxHQUFHO0lBQzlCLEdBQUcsRUFBRTtJQUNMWixnREFBU0EsQ0FBQztRQUNOLElBQUksQ0FBQ1UsZ0JBQWdCRSxPQUFPLEVBQUU7WUFDMUJULGlGQUF3QkEsQ0FBQ0ksVUFBVUM7UUFDdkM7SUFDSixHQUFHO1FBQ0NEO1FBQ0FDO0tBQ0g7SUFDRCxNQUFNSyxhQUFhUixnRkFBcUJBLENBQUNFO0lBQ3pDLE9BQU87UUFDSE07UUFDQUMsbUJBQW1CUDtRQUNuQlEseUJBQXlCTjtJQUM3QjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlRXh0ZW5zaW9uU2xvdC5qcz9hZTI0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyByZWdpc3RlckV4dGVuc2lvblNsb3QsIHVwZGF0ZUV4dGVuc2lvblNsb3RTdGF0ZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gXCIuL0NvbXBvbmVudENvbnRleHQuanNcIjtcbmltcG9ydCB7IHVzZUFzc2lnbmVkRXh0ZW5zaW9ucyB9IGZyb20gXCIuL3VzZUFzc2lnbmVkRXh0ZW5zaW9ucy5qc1wiO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gdXNlRXh0ZW5zaW9uU2xvdChzbG90TmFtZSwgc3RhdGUpIHtcbiAgICBjb25zdCB7IG1vZHVsZU5hbWUgfSA9IHVzZUNvbnRleHQoQ29tcG9uZW50Q29udGV4dCk7XG4gICAgY29uc3QgaXNJbml0aWFsUmVuZGVyID0gdXNlUmVmKHRydWUpO1xuICAgIGlmICghbW9kdWxlTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignQ29tcG9uZW50Q29udGV4dCBoYXMgbm90IGJlZW4gcHJvdmlkZWQuIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSBAb3Blbm1ycy9lc20tcmVhY3QtdXRpbHMuJyk7XG4gICAgfVxuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICByZWdpc3RlckV4dGVuc2lvblNsb3QobW9kdWxlTmFtZSwgc2xvdE5hbWUsIHN0YXRlKTtcbiAgICAgICAgaXNJbml0aWFsUmVuZGVyLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmICghaXNJbml0aWFsUmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZUV4dGVuc2lvblNsb3RTdGF0ZShzbG90TmFtZSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfSwgW1xuICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgc3RhdGVcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zID0gdXNlQXNzaWduZWRFeHRlbnNpb25zKHNsb3ROYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICBleHRlbnNpb25TbG90TmFtZTogc2xvdE5hbWUsXG4gICAgICAgIGV4dGVuc2lvblNsb3RNb2R1bGVOYW1lOiBtb2R1bGVOYW1lXG4gICAgfTtcbn1cbiJdLCJuYW1lcyI6WyJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlUmVmIiwicmVnaXN0ZXJFeHRlbnNpb25TbG90IiwidXBkYXRlRXh0ZW5zaW9uU2xvdFN0YXRlIiwiQ29tcG9uZW50Q29udGV4dCIsInVzZUFzc2lnbmVkRXh0ZW5zaW9ucyIsInVzZUV4dGVuc2lvblNsb3QiLCJzbG90TmFtZSIsInN0YXRlIiwibW9kdWxlTmFtZSIsImlzSW5pdGlhbFJlbmRlciIsIkVycm9yIiwiY3VycmVudCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb25TbG90TmFtZSIsImV4dGVuc2lvblNsb3RNb2R1bGVOYW1lIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useExtensionSlot.js\n");
969
969
 
970
970
  /***/ }),
971
971
 
@@ -1255,7 +1255,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1255
1255
  \***********************************************/
1256
1256
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1257
1257
 
1258
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createGlobalStore: () => (/* binding */ createGlobalStore),\n/* harmony export */ getGlobalStore: () => (/* binding */ getGlobalStore),\n/* harmony export */ registerGlobalStore: () => (/* binding */ registerGlobalStore),\n/* harmony export */ subscribeTo: () => (/* binding */ subscribeTo)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/** @module @category Store */ \n\nconst availableStores = {};\n// spaEnv isn't available immediately. Wait a bit before making stores available\n// on window in development mode.\nsetTimeout(()=>{\n if (window && window.spaEnv === 'development') {\n window['stores'] = availableStores;\n }\n}, 1000);\n/**\n * Creates a Zustand store.\n *\n * @param name A name by which the store can be looked up later.\n * Must be unique across the entire application.\n * @param initialState An object which will be the initial state of the store.\n * @returns The newly created store.\n */ function createGlobalStore(name, initialState) {\n const available = availableStores[name];\n if (available) {\n if (available.active) {\n console.error(`Attempted to override the existing store ${name}. Make sure that stores are only created once.`);\n } else {\n available.value.setState(initialState, true);\n }\n available.active = true;\n return available.value;\n } else {\n const store = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)()(()=>initialState);\n availableStores[name] = {\n value: store,\n active: true\n };\n return store;\n }\n}\n/**\n * Registers an existing Zustand store.\n *\n * @param name A name by which the store can be looked up later.\n * Must be unique across the entire application.\n * @param store The Zustand store to use for this.\n * @returns The newly registered store.\n */ function registerGlobalStore(name, store) {\n const available = availableStores[name];\n if (available) {\n if (available.active) {\n console.error(`Attempted to override the existing store ${name}. Make sure that stores are only created once.`);\n } else {\n available.value = store;\n }\n available.active = true;\n return available.value;\n } else {\n availableStores[name] = {\n value: store,\n active: true\n };\n return store;\n }\n}\n/**\n * Returns the existing store named `name`,\n * or creates a new store named `name` if none exists.\n *\n * @param name The name of the store to look up.\n * @param fallbackState The initial value of the new store if no store named `name` exists.\n * @returns The found or newly created store.\n */ function getGlobalStore(name, fallbackState) {\n const available = availableStores[name];\n if (!available) {\n const store = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)()(()=>fallbackState ?? {});\n availableStores[name] = {\n value: store,\n active: false\n };\n return store;\n }\n return available.value;\n}\nfunction subscribeTo(...args) {\n const [store, select, handle] = args;\n const handler = typeof handle === 'undefined' ? select : handle;\n const selector = typeof handle === 'undefined' ? (state)=>state : select;\n handler(selector(store.getState()));\n return store.subscribe((state, previous)=>{\n const current = selector(state);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(previous, current)) {\n handler(current);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1zdGF0ZS9kaXN0L3N0YXRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDRCQUE0QixHQUFxRDtBQUNuQztBQUM5QyxNQUFNRSxrQkFBa0IsQ0FBQztBQUN6QixnRkFBZ0Y7QUFDaEYsaUNBQWlDO0FBQ2pDQyxXQUFXO0lBQ1AsSUFBSUMsVUFBVUEsT0FBT0MsTUFBTSxLQUFLLGVBQWU7UUFDM0NELE1BQU0sQ0FBQyxTQUFTLEdBQUdGO0lBQ3ZCO0FBQ0osR0FBRztBQUNIOzs7Ozs7O0NBT0MsR0FBVSxTQUFTSSxrQkFBa0JDLElBQUksRUFBRUMsWUFBWTtJQUNwRCxNQUFNQyxZQUFZUCxlQUFlLENBQUNLLEtBQUs7SUFDdkMsSUFBSUUsV0FBVztRQUNYLElBQUlBLFVBQVVDLE1BQU0sRUFBRTtZQUNsQkMsUUFBUUMsS0FBSyxDQUFDLENBQUMseUNBQXlDLEVBQUVMLEtBQUssOENBQThDLENBQUM7UUFDbEgsT0FBTztZQUNIRSxVQUFVSSxLQUFLLENBQUNDLFFBQVEsQ0FBQ04sY0FBYztRQUMzQztRQUNBQyxVQUFVQyxNQUFNLEdBQUc7UUFDbkIsT0FBT0QsVUFBVUksS0FBSztJQUMxQixPQUFPO1FBQ0gsTUFBTUUsUUFBUWQsNERBQVdBLEdBQUcsSUFBSU87UUFDaENOLGVBQWUsQ0FBQ0ssS0FBSyxHQUFHO1lBQ3BCTSxPQUFPRTtZQUNQTCxRQUFRO1FBQ1o7UUFDQSxPQUFPSztJQUNYO0FBQ0o7QUFDQTs7Ozs7OztDQU9DLEdBQVUsU0FBU0Msb0JBQW9CVCxJQUFJLEVBQUVRLEtBQUs7SUFDL0MsTUFBTU4sWUFBWVAsZUFBZSxDQUFDSyxLQUFLO0lBQ3ZDLElBQUlFLFdBQVc7UUFDWCxJQUFJQSxVQUFVQyxNQUFNLEVBQUU7WUFDbEJDLFFBQVFDLEtBQUssQ0FBQyxDQUFDLHlDQUF5QyxFQUFFTCxLQUFLLDhDQUE4QyxDQUFDO1FBQ2xILE9BQU87WUFDSEUsVUFBVUksS0FBSyxHQUFHRTtRQUN0QjtRQUNBTixVQUFVQyxNQUFNLEdBQUc7UUFDbkIsT0FBT0QsVUFBVUksS0FBSztJQUMxQixPQUFPO1FBQ0hYLGVBQWUsQ0FBQ0ssS0FBSyxHQUFHO1lBQ3BCTSxPQUFPRTtZQUNQTCxRQUFRO1FBQ1o7UUFDQSxPQUFPSztJQUNYO0FBQ0o7QUFDQTs7Ozs7OztDQU9DLEdBQVUsU0FBU0UsZUFBZVYsSUFBSSxFQUFFVyxhQUFhO0lBQ2xELE1BQU1ULFlBQVlQLGVBQWUsQ0FBQ0ssS0FBSztJQUN2QyxJQUFJLENBQUNFLFdBQVc7UUFDWixNQUFNTSxRQUFRZCw0REFBV0EsR0FBRyxJQUFJaUIsaUJBQWlCLENBQUM7UUFDbERoQixlQUFlLENBQUNLLEtBQUssR0FBRztZQUNwQk0sT0FBT0U7WUFDUEwsUUFBUTtRQUNaO1FBQ0EsT0FBT0s7SUFDWDtJQUNBLE9BQU9OLFVBQVVJLEtBQUs7QUFDMUI7QUFDTyxTQUFTTSxZQUFZLEdBQUdDLElBQUk7SUFDL0IsTUFBTSxDQUFDTCxPQUFPTSxRQUFRQyxPQUFPLEdBQUdGO0lBQ2hDLE1BQU1HLFVBQVUsT0FBT0QsV0FBVyxjQUFjRCxTQUFTQztJQUN6RCxNQUFNRSxXQUFXLE9BQU9GLFdBQVcsY0FBYyxDQUFDRyxRQUFRQSxRQUFRSjtJQUNsRUUsUUFBUUMsU0FBU1QsTUFBTVcsUUFBUTtJQUMvQixPQUFPWCxNQUFNWSxTQUFTLENBQUMsQ0FBQ0YsT0FBT0c7UUFDM0IsTUFBTUMsVUFBVUwsU0FBU0M7UUFDekIsSUFBSSxDQUFDekIsZ0VBQVlBLENBQUM0QixVQUFVQyxVQUFVO1lBQ2xDTixRQUFRTTtRQUNaO0lBQ0o7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1zdGF0ZS9kaXN0L3N0YXRlLmpzPzAwZWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IFN0b3JlICovIGltcG9ydCB7IHNoYWxsb3dFcXVhbCB9IGZyb20gXCJAb3Blbm1ycy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSBcInp1c3RhbmQvdmFuaWxsYVwiO1xuY29uc3QgYXZhaWxhYmxlU3RvcmVzID0ge307XG4vLyBzcGFFbnYgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiBXYWl0IGEgYml0IGJlZm9yZSBtYWtpbmcgc3RvcmVzIGF2YWlsYWJsZVxuLy8gb24gd2luZG93IGluIGRldmVsb3BtZW50IG1vZGUuXG5zZXRUaW1lb3V0KCgpPT57XG4gICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuc3BhRW52ID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHdpbmRvd1snc3RvcmVzJ10gPSBhdmFpbGFibGVTdG9yZXM7XG4gICAgfVxufSwgMTAwMCk7XG4vKipcbiAqIENyZWF0ZXMgYSBadXN0YW5kIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBuYW1lIEEgbmFtZSBieSB3aGljaCB0aGUgc3RvcmUgY2FuIGJlIGxvb2tlZCB1cCBsYXRlci5cbiAqICAgIE11c3QgYmUgdW5pcXVlIGFjcm9zcyB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLlxuICogQHBhcmFtIGluaXRpYWxTdGF0ZSBBbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RvcmUuXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCBzdG9yZS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlR2xvYmFsU3RvcmUobmFtZSwgaW5pdGlhbFN0YXRlKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXZhaWxhYmxlU3RvcmVzW25hbWVdO1xuICAgIGlmIChhdmFpbGFibGUpIHtcbiAgICAgICAgaWYgKGF2YWlsYWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEF0dGVtcHRlZCB0byBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgc3RvcmUgJHtuYW1lfS4gTWFrZSBzdXJlIHRoYXQgc3RvcmVzIGFyZSBvbmx5IGNyZWF0ZWQgb25jZS5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF2YWlsYWJsZS52YWx1ZS5zZXRTdGF0ZShpbml0aWFsU3RhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGF2YWlsYWJsZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYXZhaWxhYmxlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUoKSgoKT0+aW5pdGlhbFN0YXRlKTtcbiAgICAgICAgYXZhaWxhYmxlU3RvcmVzW25hbWVdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHN0b3JlLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9XG59XG4vKipcbiAqIFJlZ2lzdGVycyBhbiBleGlzdGluZyBadXN0YW5kIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBuYW1lIEEgbmFtZSBieSB3aGljaCB0aGUgc3RvcmUgY2FuIGJlIGxvb2tlZCB1cCBsYXRlci5cbiAqICAgIE11c3QgYmUgdW5pcXVlIGFjcm9zcyB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLlxuICogQHBhcmFtIHN0b3JlIFRoZSBadXN0YW5kIHN0b3JlIHRvIHVzZSBmb3IgdGhpcy5cbiAqIEByZXR1cm5zIFRoZSBuZXdseSByZWdpc3RlcmVkIHN0b3JlLlxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlckdsb2JhbFN0b3JlKG5hbWUsIHN0b3JlKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXZhaWxhYmxlU3RvcmVzW25hbWVdO1xuICAgIGlmIChhdmFpbGFibGUpIHtcbiAgICAgICAgaWYgKGF2YWlsYWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEF0dGVtcHRlZCB0byBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgc3RvcmUgJHtuYW1lfS4gTWFrZSBzdXJlIHRoYXQgc3RvcmVzIGFyZSBvbmx5IGNyZWF0ZWQgb25jZS5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF2YWlsYWJsZS52YWx1ZSA9IHN0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGF2YWlsYWJsZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYXZhaWxhYmxlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGF2YWlsYWJsZVN0b3Jlc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBzdG9yZSxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyBzdG9yZSBuYW1lZCBgbmFtZWAsXG4gKiBvciBjcmVhdGVzIGEgbmV3IHN0b3JlIG5hbWVkIGBuYW1lYCBpZiBub25lIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RvcmUgdG8gbG9vayB1cC5cbiAqIEBwYXJhbSBmYWxsYmFja1N0YXRlIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBuZXcgc3RvcmUgaWYgbm8gc3RvcmUgbmFtZWQgYG5hbWVgIGV4aXN0cy5cbiAqIEByZXR1cm5zIFRoZSBmb3VuZCBvciBuZXdseSBjcmVhdGVkIHN0b3JlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxTdG9yZShuYW1lLCBmYWxsYmFja1N0YXRlKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXZhaWxhYmxlU3RvcmVzW25hbWVdO1xuICAgIGlmICghYXZhaWxhYmxlKSB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUoKSgoKT0+ZmFsbGJhY2tTdGF0ZSA/PyB7fSk7XG4gICAgICAgIGF2YWlsYWJsZVN0b3Jlc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBzdG9yZSxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH1cbiAgICByZXR1cm4gYXZhaWxhYmxlLnZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZVRvKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBbc3RvcmUsIHNlbGVjdCwgaGFuZGxlXSA9IGFyZ3M7XG4gICAgY29uc3QgaGFuZGxlciA9IHR5cGVvZiBoYW5kbGUgPT09ICd1bmRlZmluZWQnID8gc2VsZWN0IDogaGFuZGxlO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gdHlwZW9mIGhhbmRsZSA9PT0gJ3VuZGVmaW5lZCcgPyAoc3RhdGUpPT5zdGF0ZSA6IHNlbGVjdDtcbiAgICBoYW5kbGVyKHNlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCkpKTtcbiAgICByZXR1cm4gc3RvcmUuc3Vic2NyaWJlKChzdGF0ZSwgcHJldmlvdXMpPT57XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgICAgIGlmICghc2hhbGxvd0VxdWFsKHByZXZpb3VzLCBjdXJyZW50KSkge1xuICAgICAgICAgICAgaGFuZGxlcihjdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbInNoYWxsb3dFcXVhbCIsImNyZWF0ZVN0b3JlIiwiYXZhaWxhYmxlU3RvcmVzIiwic2V0VGltZW91dCIsIndpbmRvdyIsInNwYUVudiIsImNyZWF0ZUdsb2JhbFN0b3JlIiwibmFtZSIsImluaXRpYWxTdGF0ZSIsImF2YWlsYWJsZSIsImFjdGl2ZSIsImNvbnNvbGUiLCJlcnJvciIsInZhbHVlIiwic2V0U3RhdGUiLCJzdG9yZSIsInJlZ2lzdGVyR2xvYmFsU3RvcmUiLCJnZXRHbG9iYWxTdG9yZSIsImZhbGxiYWNrU3RhdGUiLCJzdWJzY3JpYmVUbyIsImFyZ3MiLCJzZWxlY3QiLCJoYW5kbGUiLCJoYW5kbGVyIiwic2VsZWN0b3IiLCJzdGF0ZSIsImdldFN0YXRlIiwic3Vic2NyaWJlIiwicHJldmlvdXMiLCJjdXJyZW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-state/dist/state.js\n");
1258
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createGlobalStore: () => (/* binding */ createGlobalStore),\n/* harmony export */ getGlobalStore: () => (/* binding */ getGlobalStore),\n/* harmony export */ registerGlobalStore: () => (/* binding */ registerGlobalStore),\n/* harmony export */ subscribeTo: () => (/* binding */ subscribeTo)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/** @module @category Store */ \n\nconst availableStores = {};\n// Check if we're in a test environment (Vitest or Jest)\nconst isTestEnvironment = ()=>{\n try {\n return false || typeof process !== 'undefined' && (process.env.VITEST === 'true' || process.env.JEST_WORKER_ID !== undefined) || typeof globalThis !== 'undefined' && ('__vitest_worker__' in globalThis || '__jest__' in globalThis);\n } catch {\n return false;\n }\n};\n// spaEnv isn't available immediately. Wait a bit before making stores available\n// on window in development mode.\nsetTimeout(()=>{\n if (typeof window !== 'undefined' && window.spaEnv === 'development') {\n window['stores'] = availableStores;\n }\n}, 1000);\n/**\n * Creates a Zustand store.\n *\n * @param name A name by which the store can be looked up later.\n * Must be unique across the entire application.\n * @param initialState An object which will be the initial state of the store.\n * @returns The newly created store.\n */ function createGlobalStore(name, initialState) {\n const available = availableStores[name];\n if (available) {\n if (available.active) {\n if (!isTestEnvironment()) {\n console.error(`Attempted to override the existing store ${name}. Make sure that stores are only created once.`);\n }\n } else {\n available.value.setState(initialState, true);\n }\n available.active = true;\n return available.value;\n } else {\n const store = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)()(()=>initialState);\n availableStores[name] = {\n value: store,\n active: true\n };\n return store;\n }\n}\n/**\n * Registers an existing Zustand store.\n *\n * @param name A name by which the store can be looked up later.\n * Must be unique across the entire application.\n * @param store The Zustand store to use for this.\n * @returns The newly registered store.\n */ function registerGlobalStore(name, store) {\n const available = availableStores[name];\n if (available) {\n if (available.active) {\n if (!isTestEnvironment()) {\n console.error(`Attempted to override the existing store ${name}. Make sure that stores are only created once.`);\n }\n } else {\n available.value = store;\n }\n available.active = true;\n return available.value;\n } else {\n availableStores[name] = {\n value: store,\n active: true\n };\n return store;\n }\n}\n/**\n * Returns the existing store named `name`,\n * or creates a new store named `name` if none exists.\n *\n * @param name The name of the store to look up.\n * @param fallbackState The initial value of the new store if no store named `name` exists.\n * @returns The found or newly created store.\n */ function getGlobalStore(name, fallbackState) {\n const available = availableStores[name];\n if (!available) {\n const store = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)()(()=>fallbackState ?? {});\n availableStores[name] = {\n value: store,\n active: false\n };\n return store;\n }\n return available.value;\n}\nfunction subscribeTo(...args) {\n const [store, select, handle] = args;\n const handler = typeof handle === 'undefined' ? select : handle;\n const selector = typeof handle === 'undefined' ? (state)=>state : select;\n handler(selector(store.getState()));\n return store.subscribe((state, previous)=>{\n const current = selector(state);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(previous, current)) {\n handler(current);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxDQUFDRixPQUFPRztRQUMzQixNQUFNQyxVQUFVTCxTQUFTQztRQUN6QixJQUFJLENBQUNqQyxnRUFBWUEsQ0FBQ29DLFVBQVVDLFVBQVU7WUFDbENOLFFBQVFNO1FBQ1o7SUFDSjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXN0YXRlL2Rpc3Qvc3RhdGUuanM/MDBlYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgU3RvcmUgKi8gaW1wb3J0IHsgc2hhbGxvd0VxdWFsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tIFwienVzdGFuZC92YW5pbGxhXCI7XG5jb25zdCBhdmFpbGFibGVTdG9yZXMgPSB7fTtcbi8vIENoZWNrIGlmIHdlJ3JlIGluIGEgdGVzdCBlbnZpcm9ubWVudCAoVml0ZXN0IG9yIEplc3QpXG5jb25zdCBpc1Rlc3RFbnZpcm9ubWVudCA9ICgpPT57XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgfHwgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIChwcm9jZXNzLmVudi5WSVRFU1QgPT09ICd0cnVlJyB8fCBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCAhPT0gdW5kZWZpbmVkKSB8fCB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgKCdfX3ZpdGVzdF93b3JrZXJfXycgaW4gZ2xvYmFsVGhpcyB8fCAnX19qZXN0X18nIGluIGdsb2JhbFRoaXMpO1xuICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4vLyBzcGFFbnYgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiBXYWl0IGEgYml0IGJlZm9yZSBtYWtpbmcgc3RvcmVzIGF2YWlsYWJsZVxuLy8gb24gd2luZG93IGluIGRldmVsb3BtZW50IG1vZGUuXG5zZXRUaW1lb3V0KCgpPT57XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5zcGFFbnYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgd2luZG93WydzdG9yZXMnXSA9IGF2YWlsYWJsZVN0b3JlcztcbiAgICB9XG59LCAxMDAwKTtcbi8qKlxuICogQ3JlYXRlcyBhIFp1c3RhbmQgc3RvcmUuXG4gKlxuICogQHBhcmFtIG5hbWUgQSBuYW1lIGJ5IHdoaWNoIHRoZSBzdG9yZSBjYW4gYmUgbG9va2VkIHVwIGxhdGVyLlxuICogICAgTXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSBlbnRpcmUgYXBwbGljYXRpb24uXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlIEFuIG9iamVjdCB3aGljaCB3aWxsIGJlIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBzdG9yZS5cbiAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIHN0b3JlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHbG9iYWxTdG9yZShuYW1lLCBpbml0aWFsU3RhdGUpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhdmFpbGFibGVTdG9yZXNbbmFtZV07XG4gICAgaWYgKGF2YWlsYWJsZSkge1xuICAgICAgICBpZiAoYXZhaWxhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgICAgaWYgKCFpc1Rlc3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXR0ZW1wdGVkIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBzdG9yZSAke25hbWV9LiBNYWtlIHN1cmUgdGhhdCBzdG9yZXMgYXJlIG9ubHkgY3JlYXRlZCBvbmNlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXZhaWxhYmxlLnZhbHVlLnNldFN0YXRlKGluaXRpYWxTdGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXZhaWxhYmxlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhdmFpbGFibGUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZSgpKCgpPT5pbml0aWFsU3RhdGUpO1xuICAgICAgICBhdmFpbGFibGVTdG9yZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RvcmUsXG4gICAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH1cbn1cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGV4aXN0aW5nIFp1c3RhbmQgc3RvcmUuXG4gKlxuICogQHBhcmFtIG5hbWUgQSBuYW1lIGJ5IHdoaWNoIHRoZSBzdG9yZSBjYW4gYmUgbG9va2VkIHVwIGxhdGVyLlxuICogICAgTXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSBlbnRpcmUgYXBwbGljYXRpb24uXG4gKiBAcGFyYW0gc3RvcmUgVGhlIFp1c3RhbmQgc3RvcmUgdG8gdXNlIGZvciB0aGlzLlxuICogQHJldHVybnMgVGhlIG5ld2x5IHJlZ2lzdGVyZWQgc3RvcmUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFsU3RvcmUobmFtZSwgc3RvcmUpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhdmFpbGFibGVTdG9yZXNbbmFtZV07XG4gICAgaWYgKGF2YWlsYWJsZSkge1xuICAgICAgICBpZiAoYXZhaWxhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgICAgaWYgKCFpc1Rlc3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXR0ZW1wdGVkIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBzdG9yZSAke25hbWV9LiBNYWtlIHN1cmUgdGhhdCBzdG9yZXMgYXJlIG9ubHkgY3JlYXRlZCBvbmNlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXZhaWxhYmxlLnZhbHVlID0gc3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgYXZhaWxhYmxlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhdmFpbGFibGUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXZhaWxhYmxlU3RvcmVzW25hbWVdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHN0b3JlLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGV4aXN0aW5nIHN0b3JlIG5hbWVkIGBuYW1lYCxcbiAqIG9yIGNyZWF0ZXMgYSBuZXcgc3RvcmUgbmFtZWQgYG5hbWVgIGlmIG5vbmUgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBsb29rIHVwLlxuICogQHBhcmFtIGZhbGxiYWNrU3RhdGUgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIG5ldyBzdG9yZSBpZiBubyBzdG9yZSBuYW1lZCBgbmFtZWAgZXhpc3RzLlxuICogQHJldHVybnMgVGhlIGZvdW5kIG9yIG5ld2x5IGNyZWF0ZWQgc3RvcmUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFN0b3JlKG5hbWUsIGZhbGxiYWNrU3RhdGUpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhdmFpbGFibGVTdG9yZXNbbmFtZV07XG4gICAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZSgpKCgpPT5mYWxsYmFja1N0YXRlID8/IHt9KTtcbiAgICAgICAgYXZhaWxhYmxlU3RvcmVzW25hbWVdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHN0b3JlLFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxuICAgIHJldHVybiBhdmFpbGFibGUudmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3Vic2NyaWJlVG8oLi4uYXJncykge1xuICAgIGNvbnN0IFtzdG9yZSwgc2VsZWN0LCBoYW5kbGVdID0gYXJncztcbiAgICBjb25zdCBoYW5kbGVyID0gdHlwZW9mIGhhbmRsZSA9PT0gJ3VuZGVmaW5lZCcgPyBzZWxlY3QgOiBoYW5kbGU7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0eXBlb2YgaGFuZGxlID09PSAndW5kZWZpbmVkJyA/IChzdGF0ZSk9PnN0YXRlIDogc2VsZWN0O1xuICAgIGhhbmRsZXIoc2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSkpO1xuICAgIHJldHVybiBzdG9yZS5zdWJzY3JpYmUoKHN0YXRlLCBwcmV2aW91cyk9PntcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwocHJldmlvdXMsIGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBoYW5kbGVyKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOlsic2hhbGxvd0VxdWFsIiwiY3JlYXRlU3RvcmUiLCJhdmFpbGFibGVTdG9yZXMiLCJpc1Rlc3RFbnZpcm9ubWVudCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIlZJVEVTVCIsIkpFU1RfV09SS0VSX0lEIiwidW5kZWZpbmVkIiwiZ2xvYmFsVGhpcyIsInNldFRpbWVvdXQiLCJ3aW5kb3ciLCJzcGFFbnYiLCJjcmVhdGVHbG9iYWxTdG9yZSIsIm5hbWUiLCJpbml0aWFsU3RhdGUiLCJhdmFpbGFibGUiLCJhY3RpdmUiLCJjb25zb2xlIiwiZXJyb3IiLCJ2YWx1ZSIsInNldFN0YXRlIiwic3RvcmUiLCJyZWdpc3Rlckdsb2JhbFN0b3JlIiwiZ2V0R2xvYmFsU3RvcmUiLCJmYWxsYmFja1N0YXRlIiwic3Vic2NyaWJlVG8iLCJhcmdzIiwic2VsZWN0IiwiaGFuZGxlIiwiaGFuZGxlciIsInNlbGVjdG9yIiwic3RhdGUiLCJnZXRTdGF0ZSIsInN1YnNjcmliZSIsInByZXZpb3VzIiwiY3VycmVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-state/dist/state.js\n");
1259
1259
 
1260
1260
  /***/ }),
1261
1261