@openmrs/esm-app-shell 10.0.1-pre.4973 → 10.0.1-pre.5035

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.
@@ -5580,7 +5580,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
5580
5580
  },
5581
5581
  "../../framework/esm-config/dist/module-config/module-config.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
5582
5582
  "use strict";
5583
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n clearConfigErrors: () => (clearConfigErrors),\n defineConfigSchema: () => (defineConfigSchema),\n defineExtensionConfigSchema: () => (defineExtensionConfigSchema),\n getConfig: () => (getConfig),\n getTranslationOverrides: () => (getTranslationOverrides),\n processConfig: () => (processConfig),\n provide: () => (provide),\n registerModuleLoad: () => (registerModuleLoad),\n registerModuleWithConfigSystem: () => (registerModuleWithConfigSystem),\n registerTranslationNamespace: () => (registerTranslationNamespace),\n resetConfigSystem: () => (resetConfigSystem)\n});\n/* import */ var lodash_es__rspack_import_4 = __webpack_require__(\"../../../node_modules/lodash-es/mergeWith.js\");\n/* import */ var lodash_es__rspack_import_5 = __webpack_require__(\"../../../node_modules/lodash-es/isEqual.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/cloneDeep.js\");\n/* import */ var _types_js__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/types.js\");\n/* import */ var _validators_type_validators_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-config/dist/validators/type-validators.js\");\n/* import */ var _validators_validator_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-config/dist/validators/validator.js\");\n/* import */ var _state_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-config/dist/module-config/state.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_with_holes(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _iterable_to_array_limit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _non_iterable_rest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _sliced_to_array(arr, i) {\n return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _type_of(obj) {\n \"@swc/helpers - typeof\";\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\n/** @module @category Config */ \n\n\n\n\n/**\n * Deep merge two objects, with right-side values taking precedence.\n * Arrays are replaced entirely (not merged by index), matching the\n * behavior of ramda's mergeDeepRight.\n */ function mergeDeepReplace(left, right) {\n return (0,lodash_es__rspack_import_4[\"default\"])({}, left, right, function(_objValue, srcValue) {\n if (Array.isArray(srcValue)) {\n return srcValue;\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)\nvar 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 var configState = _state_js__rspack_import_3.configInternalStore.getState();\n var tempConfigState = _state_js__rspack_import_3.temporaryConfigStore.getState();\n var extensionState = _state_js__rspack_import_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__rspack_import_3.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(state.schemas)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var moduleName = _step.value;\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 var moduleStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n var newState = void 0;\n if (state.moduleLoaded[moduleName]) {\n var config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config: config\n };\n } else {\n var config1 = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config: config1\n };\n }\n moduleStore.setState(newState);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n var slotConfigs = getExtensionSlotConfigs(state, tempState);\n var newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(function(param) {\n var _param = _sliced_to_array(param, 2), slotName = _param[0], config = _param[1];\n return [\n slotName,\n {\n loaded: true,\n config: config\n }\n ];\n }));\n var slotStore = (0,_state_js__rspack_import_3.getExtensionSlotsConfigStore)();\n var oldState = slotStore.getState();\n var newState = {\n slots: _object_spread({}, oldState.slots, newSlotStoreEntries)\n };\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n var oldState = _state_js__rspack_import_3.implementerToolsConfigStore.getState();\n var config = getImplementerToolsConfig(state, tempConfigState);\n var newState = {\n config: config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.config, newState.config)) {\n _state_js__rspack_import_3.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n var configs = {};\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for(var _iterator = extensionState.mountedExtensions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var extension = _step.value;\n var 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: config,\n loaded: true\n };\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n var extensionsConfigStore = (0,_state_js__rspack_import_3.getExtensionsConfigStore)();\n var oldState = extensionsConfigStore.getState();\n var newState = {\n configs: configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,lodash_es__rspack_import_5[\"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 var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, enhancedSchema)),\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, 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 defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n var state = _state_js__rspack_import_3.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(\"Config schema for extension \".concat(extensionName, \" already exists. If there are multiple extensions with this same name, one will probably crash.\"));\n }\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, extensionName, enhancedSchema))\n });\n });\n}\n/**\n * Provides configuration values programmatically. This is an alternative to\n * providing configuration through the config-file. Configuration provided this\n * way will be merged with configuration from other sources.\n *\n * @param config A configuration object to merge into the existing configuration.\n * @param sourceName An optional name to identify the source of this configuration,\n * used for debugging purposes. Defaults to 'provided'.\n */ function provide(config) {\n var sourceName = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'provided';\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n providedConfigs: _to_consumable_array(state.providedConfigs).concat([\n {\n source: sourceName,\n config: config\n }\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(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var config = (0,lodash_es__rspack_import_6[\"default\"])(state.config, [\n 'Display conditions',\n 'Translation overrides'\n ]);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var store = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(store.getState());\n var unsubscribe = store.subscribe(update);\n });\n}\n/**\n * Retrieves translation overrides for an extension, optionally scoped to a specific\n * extension slot. When called with only a module name, retrieves module-level overrides.\n * Translation overrides allow customizing translated strings without modifying the\n * original translation files.\n *\n * @param moduleName The name of the module providing the translation context.\n * @param slotName Optional extension slot name to include slot-specific overrides.\n * @param extensionId Optional extension ID to include extension-specific overrides.\n * @returns A Promise resolving to an array of translation override objects.\n *\n * @internal\n */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n var promises = [\n new Promise(function(resolve) {\n var update = function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getExtensionConfig)(slotName, extensionId);\n update(configStore.getState());\n var 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-separated string which helps the user figure out where\n * the provided config came from\n * @returns The validated and processed configuration object with defaults applied.\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n var 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 var _ref;\n var _slotModuleConfig_extensionSlots_slotName_configure, _slotModuleConfig_extensionSlots_slotName, _slotModuleConfig_extensionSlots;\n var extensionName = getExtensionNameFromId(extensionId);\n var extensionConfigSchema = configState.schemas[extensionName];\n var nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n var providedConfigs = getProvidedConfigs(configState, tempConfigState);\n var slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n var configOverride = (_ref = slotModuleConfig === null || slotModuleConfig === void 0 ? void 0 : (_slotModuleConfig_extensionSlots = slotModuleConfig.extensionSlots) === null || _slotModuleConfig_extensionSlots === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName = _slotModuleConfig_extensionSlots[slotName]) === null || _slotModuleConfig_extensionSlots_slotName === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName_configure = _slotModuleConfig_extensionSlots_slotName.configure) === null || _slotModuleConfig_extensionSlots_slotName_configure === void 0 ? void 0 : _slotModuleConfig_extensionSlots_slotName_configure[extensionId]) !== null && _ref !== void 0 ? _ref : {};\n var extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n var combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n var schema = extensionConfigSchema !== null && extensionConfigSchema !== void 0 ? extensionConfigSchema : configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n var config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n var result = getSchemaWithValuesAndSources((0,lodash_es__rspack_import_7[\"default\"])(configState.schemas));\n var configsAndSources = _to_consumable_array(configState.providedConfigs.map(function(c) {\n return [\n c.config,\n c.source\n ];\n })).concat([\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ]);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = configsAndSources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), config = _step_value[0], source = _step_value[1];\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return _object_spread_props(_object_spread({}, schema), {\n _value: schema._default,\n _source: 'default'\n });\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce(function(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(function(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 var allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n var slotConfigPerModule = Object.keys(allConfigs).reduce(function(obj, key) {\n var _allConfigs_key;\n if ((_allConfigs_key = allConfigs[key]) === null || _allConfigs_key === void 0 ? void 0 : _allConfigs_key.extensionSlots) {\n var _allConfigs_key1;\n obj[key] = (_allConfigs_key1 = allConfigs[key]) === null || _allConfigs_key1 === void 0 ? void 0 : _allConfigs_key1.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n var slotConfigs = Object.keys(slotConfigPerModule).reduce(function(obj, key) {\n obj = _object_spread({}, obj, slotConfigPerModule[key]);\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.entries(slotConfigPerModule)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), moduleName = _step_value[0], configBySlotName = _step_value[1];\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = Object.entries(configBySlotName)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _step_value1 = _sliced_to_array(_step1.value, 2), slotName = _step_value1[0], config = _step_value1[1];\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n var keyPath = \"\".concat(moduleName, \".extensionSlots.\").concat(slotName);\n var errorPrefix = \"Extension slot config '\".concat(keyPath, \"'\");\n var invalidKeys = Object.keys(config).filter(function(k) {\n return ![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k);\n });\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + \"' contains invalid keys '\".concat(invalidKeys.join(\"', '\"), \"'\"));\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every(function(n) {\n return typeof n === 'string';\n })) {\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(function(n) {\n return typeof n === 'string';\n })) {\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(function(n) {\n return typeof n === 'string';\n })) {\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 _to_consumable_array(configState.providedConfigs.map(function(c) {\n return c.config;\n })).concat([\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var updateMessage = \"Please verify that you are running the latest version and, if so, alert the maintainer.\";\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(schema).filter(function(k) {\n return !k.startsWith('_');\n })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var thisKeyPath = keyPath + (keyPath && '.') + key;\n var schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ').concat(updateMessage));\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ').concat(updateMessage));\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage));\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n var elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = schemaPart._validators[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _$validator = _step1.value;\n if (typeof _$validator !== 'function') {\n console.error(\"\".concat(moduleName, \" has invalid validator for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: validators must be functions that return either \" + \"undefined or an error string. Received \".concat(_$validator, \".\"));\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n var valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__rspack_import_0.Type).includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has invalid type for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the allowed types are \".concat(Object.values(_types_js__rspack_import_0.Type).join(', '), \". \") + \"Received '\".concat(valueType, \"'\"));\n }\n if (Object.keys(schemaPart).every(function(k) {\n return [\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k);\n }) && !keyPath.includes('._elements')) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: all config elements must have a default. \" + \"Received \".concat(JSON.stringify(schemaPart)));\n }\n if (elements && valueType && ![\n _types_js__rspack_import_0.Type.Array,\n _types_js__rspack_import_0.Type.Object\n ].includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. \" + \"Received \".concat(JSON.stringify(valueType)));\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n var schema = configState.schemas[moduleName];\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n var config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n var config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n var allConfigsForModule = allConfigs.map(function(param) {\n var c = param[moduleName];\n return c;\n }).filter(function(c) {\n return !!c;\n });\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n return configs.reduce(function(acc, config) {\n return mergeDeepReplace(acc, config);\n }, {});\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // validate each constituent element\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, \"Unknown config key '\".concat(thisKeyPath, \"' provided. Ignoring.\"));\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__rspack_import_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__rspack_import_0.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, \"\".concat(keyPath, \".\").concat(key));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n var validatedAsArray = checkType(keyPath, _types_js__rspack_import_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(var i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n for(var i1 = 0; i1 < value.length; i1++){\n var _arraySchema__elements;\n checkType(\"\".concat(keyPath, \"[\").concat(i1, \"]\"), (_arraySchema__elements = arraySchema._elements) === null || _arraySchema__elements === void 0 ? void 0 : _arraySchema__elements._type, value[i1]);\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\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 var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (schema._type === _types_js__rspack_import_0.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(var i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], \"\".concat(keyPath, \"[\").concat(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 var _$validator = {\n Array: _validators_type_validators_js__rspack_import_1.isArray,\n Boolean: _validators_type_validators_js__rspack_import_1.isBoolean,\n ConceptUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n Number: _validators_type_validators_js__rspack_import_1.isNumber,\n Object: _validators_type_validators_js__rspack_import_1.isObject,\n String: _validators_type_validators_js__rspack_import_1.isString,\n UUID: _validators_type_validators_js__rspack_import_1.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__rspack_import_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 var returnValue = true;\n if (validators) {\n try {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = validators[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _$validator = _step.value;\n var validatorResult = _$validator(value);\n if (typeof validatorResult === 'string') {\n var message = (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' ? \"Invalid configuration for \".concat(keyPath, \": \").concat(validatorResult) : \"Invalid configuration value \".concat(value, \" for \").concat(keyPath, \": \").concat(validatorResult);\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } catch (e) {\n console.error('Skipping invalid validator at \"'.concat(keyPath, '\". Encountered error\\n\t').concat(e));\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nvar setDefaults = function setDefaults1(schema, inputConfig) {\n var config = structuredClone(inputConfig);\n if (!schema) {\n return config;\n }\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n var _loop = function() {\n var key = _step.value;\n var configPart = config[key];\n var 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 var elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array && Array.isArray(configPart)) {\n var configWithDefaults = configPart.map(function(conf) {\n return setDefaults(elements, conf);\n });\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(configPart)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion = (_step1 = _iterator.next()).done); _iteratorNormalCompletion = true){\n var objectKey = _step1.value;\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\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 var selectedConfigPart = configPart !== null && configPart !== void 0 ? 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 for(var _iterator = Object.keys(schema)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter(function(e) {\n return ![\n '_default',\n '_validators'\n ].includes(e);\n }).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return (typeof value === \"undefined\" ? \"undefined\" : _type_of(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. */ var displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n var key = \"\".concat(keyPath, \":::\").concat(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(function(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(function(unsubscribe) {\n return unsubscribe();\n });\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 var _extensionId_split = _sliced_to_array(extensionId.split('#'), 1), extensionName = _extensionId_split[0];\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 */ var 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__rspack_import_0.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__rspack_import_2.validator)(function(o) {\n return Object.keys(o).every(function(k) {\n return /^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n }, function(o) {\n var badKeys = Object.keys(o).filter(function(k) {\n return !/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\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: \".concat(badKeys.join(', '), \".\");\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ var implicitConfigSchema = _object_spread({\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__rspack_import_0.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__rspack_import_0.Type.String,\n _default: undefined\n }\n }\n}, translationOverridesSchema);\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/YzNhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCwgbWVyZ2VXaXRoLCBvbWl0IGFzIGxvZGFzaE9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0Jvb2xlYW4sIGlzVXVpZCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3R5cGUtdmFsaWRhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBjb25maWdFeHRlbnNpb25TdG9yZSwgY29uZmlnSW50ZXJuYWxTdG9yZSwgZ2V0Q29uZmlnU3RvcmUsIGdldEV4dGVuc2lvbkNvbmZpZywgZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbi8qKlxuICogRGVlcCBtZXJnZSB0d28gb2JqZWN0cywgd2l0aCByaWdodC1zaWRlIHZhbHVlcyB0YWtpbmcgcHJlY2VkZW5jZS5cbiAqIEFycmF5cyBhcmUgcmVwbGFjZWQgZW50aXJlbHkgKG5vdCBtZXJnZWQgYnkgaW5kZXgpLCBtYXRjaGluZyB0aGVcbiAqIGJlaGF2aW9yIG9mIHJhbWRhJ3MgbWVyZ2VEZWVwUmlnaHQuXG4gKi8gZnVuY3Rpb24gbWVyZ2VEZWVwUmVwbGFjZShsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBtZXJnZVdpdGgoe30sIGxlZnQsIHJpZ2h0LCAoX29ialZhbHVlLCBzcmNWYWx1ZSk9PntcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RvcmUgc2V0dXBcbiAqXG4gKlxuICogU2V0IHVwIHN0b3JlcyBhbmQgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IGlucHV0cyBnZXQgcHJvY2Vzc2VkIGFwcHJvcHJpYXRlbHkuXG4gKlxuICogVGhlcmUgYXJlICppbnB1dCogc3RvcmVzIGFuZCAqb3V0cHV0KiBzdG9yZXMuIFRoZSAqaW5wdXQqIHN0b3Jlc1xuICogYXJlIGNvbmZpZ0ludGVybmFsU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLCBhbmQgY29uZmlnRXh0ZW5zaW9uU3RvcmUuIFRoZVxuICogb3V0cHV0IHN0b3JlcyBhcmUgc2V0IGluIHRoZSBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zLiBUaGV5IGFyZSB0aGUgbW9kdWxlXG4gKiBjb25maWcgc3RvcmVzLCB0aGUgZXh0ZW5zaW9uIHNsb3QgY29uZmlnIHN0b3JlcyAoYnkgbW9kdWxlKSwgdGhlIGV4dGVuc2lvblxuICogY29uZmlnIHN0b3JlcywgYW5kIHRoZSBpbXBsZW1lbnRlciB0b29scyBjb25maWcgc3RvcmUuXG4gKlxuICogVGhpcyBjb2RlIHNldHMgdXAgdGhlIHN1YnNjcmlwdGlvbnMgc28gdGhhdCB3aGVuIGFuIGlucHV0IHN0b3JlIGNoYW5nZXMsXG4gKiB0aGUgY29ycmVjdCBzZXQgb2Ygb3V0cHV0IHN0b3JlcyBhcmUgdXBkYXRlZC5cbiAqXG4gKiBBbGwgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucyBleGNlcHQgYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBhcmUgcHVyZVxuICogKG9yIGFyZSBzdXBwb3NlZCB0byBiZSksIG90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCB0aGV5IGFsbCBgc2V0U3RhdGVgXG4gKiBzdG9yZSB2YWx1ZXMgYXQgdGhlIGVuZC4gYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBjYWxscyBgZ2V0R2xvYmFsU3RvcmVgLFxuICogd2hpY2ggY3JlYXRlcyBzdG9yZXMuXG4gKi8gLy8gU3RvcmUgdW5zdWJzY3JpYmUgZnVuY3Rpb25zIHRvIGFsbG93IGNsZWFudXAgKGUuZy4sIGluIHRlc3RzIG9yIGhvdCBtb2R1bGUgcmVsb2FkaW5nKVxuY29uc3QgY29uZmlnU3Vic2NyaXB0aW9ucyA9IFtdO1xuLyoqXG4gKiBSZWNvbXB1dGVzIGFsbCBjb25maWd1cmF0aW9uIGRlcml2ZWQgc3RvcmVzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgb2YgaW5wdXQgc3RvcmVzLlxuICogQ2FsbGVkIHdoZW5ldmVyIGFueSBpbnB1dCBzdG9yZSAoY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGNvbmZpZ0V4dGVuc2lvblN0b3JlKSBjaGFuZ2VzLlxuICovIGZ1bmN0aW9uIHJlY29tcHV0ZUFsbENvbmZpZ3MoKSB7XG4gICAgY29uc3QgY29uZmlnU3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgdGVtcENvbmZpZ1N0YXRlID0gdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleHRlbnNpb25TdGF0ZSA9IGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29tcHV0ZU1vZHVsZUNvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGV4dGVuc2lvblN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xufVxuZnVuY3Rpb24gc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vIEluaXRpYWwgY29tcHV0YXRpb25cbiAgICByZWNvbXB1dGVBbGxDb25maWdzKCk7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGFsbCBpbnB1dCBzdG9yZXMgd2l0aCBhIHNpbmdsZSBoYW5kbGVyXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIG9ubHkgcmVjb21wdXRlIG9uY2UgZXZlbiBpZiBtdWx0aXBsZSBzdG9yZXMgY2hhbmdlIHNpbXVsdGFuZW91c2x5XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKGNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2godGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnRXh0ZW5zaW9uU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbn1cbi8vIFNldCB1cCBzdWJzY3JpcHRpb25zIGF0IG1vZHVsZSBsb2FkIHRpbWVcbnNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucygpO1xuZnVuY3Rpb24gY29tcHV0ZU1vZHVsZUNvbmZpZyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhzdGF0ZS5zY2hlbWFzKSl7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNjaGVtYSBjb3VsZCBiZSBlaXRoZXIganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIG9yIHRoZSBhY3R1YWxseVxuICAgICAgICAvLyBkZWZpbmVkIHNjaGVtYS4gV2UgcnVuIHdpdGgganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIGJlY2F1c2Ugd2Ugd2FudCB0byBwb3B1bGF0ZVxuICAgICAgICAvLyB0aGUgY29uZmlnIHN0b3JlIHdpdGggdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcyBzb29uIGFzIHBvc3NpYmxlLiBJbiBmYWN0LCB0aGVcbiAgICAgICAgLy8gdHJhbnNsYXRpb24gc3lzdGVtIHdpbGwgdGhyb3cgZm9yIFN1c3BlbnNlIHVudGlsIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXJlXG4gICAgICAgIC8vIGF2YWlsYWJsZSwgd2hpY2ggYXMgb2YgdGhpcyB3cml0aW5nIGJsb2NrcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZnJvbSBvY2N1cnJpbmdcbiAgICAgICAgLy8gZm9yIG1vZHVsZXMgbG9hZGVkIGJhc2VkIG9uIHRoZWlyIGV4dGVuc2lvbnMuXG4gICAgICAgIGNvbnN0IG1vZHVsZVN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGxldCBuZXdTdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlLm1vZHVsZUxvYWRlZFttb2R1bGVOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbW9kdWxlU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICBjb25zdCBuZXdTbG90U3RvcmVFbnRyaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdzKS5tYXAoKFtzbG90TmFtZSwgY29uZmlnXSk9PltcbiAgICAgICAgICAgIHNsb3ROYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSkpO1xuICAgIGNvbnN0IHNsb3RTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHNsb3RTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgLi4ub2xkU3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAuLi5uZXdTbG90U3RvcmVFbnRyaWVzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNFcXVhbChvbGRTdGF0ZS5zbG90cywgbmV3U3RhdGUuc2xvdHMpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhzdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgY29uZmlnXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSBvbiB0aGUgYWN0dWFsIGNvbmZpZyBjb250ZW50LCBub3QgdGhlIHdyYXBwZXIgb2JqZWN0XG4gICAgaWYgKCFpc0VxdWFsKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWlzRXF1YWwob2xkU3RhdGUuY29uZmlncywgbmV3U3RhdGUuY29uZmlncykpIHtcbiAgICAgICAgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG59XG4vKlxuICogQVBJXG4gKlxuICovIC8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGEgbW9kdWxlLiBUaGUgc2NoZW1hIHRlbGxzIHRoZVxuICogY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuIEl0IHNwZWNpZmllc1xuICogd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuIEdlbmVyYWxseVxuICogICBzaG91bGQgYmUgdGhlIG9uZSBpbiB3aGljaCB0aGUgYGRlZmluZUNvbmZpZ1NjaGVtYWAgY2FsbCB0YWtlcyBwbGFjZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBtb2R1bGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSZXBsYWNlKHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBkZWZpbmVkIGluXG4gKiAgIHRoZSBhcHAncyBgcm91dGVzLmpzb25gIGZpbGUuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmVwbGFjZShzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG9cbiAqIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpZy1maWxlLiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIHRoaXNcbiAqIHdheSB3aWxsIGJlIG1lcmdlZCB3aXRoIGNvbmZpZ3VyYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZU5hbWUgQW4gb3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGUgc291cmNlIG9mIHRoaXMgY29uZmlndXJhdGlvbixcbiAqICAgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEZWZhdWx0cyB0byAncHJvdmlkZWQnLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm92aWRlKGNvbmZpZywgc291cmNlTmFtZSA9ICdwcm92aWRlZCcpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHByb3ZpZGVkQ29uZmlnczogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnByb3ZpZGVkQ29uZmlncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEEgcHJvbWlzZS1iYXNlZCB3YXkgdG8gYWNjZXNzIHRoZSBjb25maWcgYXMgc29vbiBhcyBpdCBpcyBmdWxseSBsb2FkZWQuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGxvYWRlZCwgcmVzb2x2ZXMgdGhlIGNvbmZpZyBpbiBpdHMgcHJlc2VudCBzdGF0ZS5cbiAqXG4gKiBUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgY29uZmlnIGluIHRoZSBjb3Vyc2VcbiAqIG9mIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB3aGljaCB0byBsb29rIHVwIHRoZSBjb25maWdcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBsb2Rhc2hPbWl0KHN0YXRlLmNvbmZpZywgW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgYW4gZXh0ZW5zaW9uLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIHNwZWNpZmljXG4gKiBleHRlbnNpb24gc2xvdC4gV2hlbiBjYWxsZWQgd2l0aCBvbmx5IGEgbW9kdWxlIG5hbWUsIHJldHJpZXZlcyBtb2R1bGUtbGV2ZWwgb3ZlcnJpZGVzLlxuICogVHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFsbG93IGN1c3RvbWl6aW5nIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAqIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSB0cmFuc2xhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHNsb3ROYW1lIE9wdGlvbmFsIGV4dGVuc2lvbiBzbG90IG5hbWUgdG8gaW5jbHVkZSBzbG90LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSBleHRlbnNpb25JZCBPcHRpb25hbCBleHRlbnNpb24gSUQgdG8gaW5jbHVkZSBleHRlbnNpb24tc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbiBvdmVycmlkZSBvYmplY3RzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZURlZXAoY29uZmlnU3RhdGUuc2NoZW1hcykpO1xuICAgIGNvbnN0IGNvbmZpZ3NBbmRTb3VyY2VzID0gW1xuICAgICAgICAuLi5jb25maWdTdGF0ZS5wcm92aWRlZENvbmZpZ3MubWFwKChjKT0+W1xuICAgICAgICAgICAgICAgIGMuY29uZmlnLFxuICAgICAgICAgICAgICAgIGMuc291cmNlXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgW1xuICAgICAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZyxcbiAgICAgICAgICAgICd0ZW1wb3JhcnkgY29uZmlnJ1xuICAgICAgICBdXG4gICAgXTtcbiAgICBmb3IgKGxldCBbY29uZmlnLCBzb3VyY2VdIG9mIGNvbmZpZ3NBbmRTb3VyY2VzKXtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VDb25maWdzKFtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIF92YWx1ZTogc2NoZW1hLl9kZWZhdWx0LFxuICAgICAgICAgICAgX3NvdXJjZTogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjaGVtYSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hW2tleV0pO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZSBzY2hlbWEgaXMgYmFkIGFuZCBhbiBlcnJvciB3aWxsIGhhdmUgYmVlbiBsb2dnZWQgZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWcsIHNvdXJjZSkge1xuICAgIGlmIChpc09yZGluYXJ5T2JqZWN0KGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnW2tleV0sIHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF92YWx1ZTogY29uZmlnLFxuICAgICAgICAgICAgX3NvdXJjZTogc291cmNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGFsbENvbmZpZ3MgPSBtZXJnZUNvbmZpZ3MoZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBzbG90Q29uZmlnUGVyTW9kdWxlID0gT2JqZWN0LmtleXMoYWxsQ29uZmlncykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgaWYgKGFsbENvbmZpZ3Nba2V5XT8uZXh0ZW5zaW9uU2xvdHMpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICB2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzKHNsb3RDb25maWdQZXJNb2R1bGUpO1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gT2JqZWN0LmtleXMoc2xvdENvbmZpZ1Blck1vZHVsZSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgLi4ub2JqLFxuICAgICAgICAgICAgLi4uc2xvdENvbmZpZ1Blck1vZHVsZVtrZXldXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBzbG90Q29uZmlncztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSkge1xuICAgIGZvciAobGV0IFttb2R1bGVOYW1lLCBjb25maWdCeVNsb3ROYW1lXSBvZiBPYmplY3QuZW50cmllcyhzbG90Q29uZmlnUGVyTW9kdWxlKSl7XG4gICAgICAgIGZvciAobGV0IFtzbG90TmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdCeVNsb3ROYW1lKSl7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSkge1xuICAgIGNvbnN0IGtleVBhdGggPSBgJHttb2R1bGVOYW1lfS5leHRlbnNpb25TbG90cy4ke3Nsb3ROYW1lfWA7XG4gICAgY29uc3QgZXJyb3JQcmVmaXggPSBgRXh0ZW5zaW9uIHNsb3QgY29uZmlnICcke2tleVBhdGh9J2A7XG4gICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcigoayk9PiFbXG4gICAgICAgICAgICAnYWRkJyxcbiAgICAgICAgICAgICdyZW1vdmUnLFxuICAgICAgICAgICAgJ29yZGVyJyxcbiAgICAgICAgICAgICdjb25maWd1cmUnXG4gICAgICAgIF0uaW5jbHVkZXMoaykpO1xuICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgJyBjb250YWlucyBpbnZhbGlkIGtleXMgJyR7aW52YWxpZEtleXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmFkZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmFkZCkgfHwgIWNvbmZpZy5hZGQuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuYWRkJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZW1vdmUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5yZW1vdmUpIHx8ICFjb25maWcucmVtb3ZlLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLnJlbW92ZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcub3JkZXIpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5vcmRlcikgfHwgIWNvbmZpZy5vcmRlci5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5vcmRlcicgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcuY29uZmlndXJlKSB7XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChjb25maWcuY29uZmlndXJlKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLmNvbmZpZ3VyZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBleHRlbnNpb24gSURzIGZvciBrZXlzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5jLmNvbmZpZyksXG4gICAgICAgIHRlbXBDb25maWdTdGF0ZS5jb25maWdcbiAgICBdO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNvbmZpZyBzY2hlbWEgZm9yIGEgbW9kdWxlLiBTaW5jZSBwcm9ibGVtcyBpZGVudGlmaWVkIGhlcmUgYXJlIHByb2dyYW1taW5nIGVycm9yc1xuICogdGhhdCBob3BlZnVsbHkgd2lsbCBiZSBjYXVnaHQgZHVyaW5nIGRldmVsb3BtZW50LCB0aGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGRpcmVjdGx5O1xuICogaXQncyBmaW5lIGlmIHdlIHNwYW0gdGhlIHVzZXIgd2l0aCB0aGVzZSBlcnJvcnMuXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hLCBrZXlQYXRoID0gJycpIHtcbiAgICBjb25zdCB1cGRhdGVNZXNzYWdlID0gYFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCwgaWYgc28sIGFsZXJ0IHRoZSBtYWludGFpbmVyLmA7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGspPT4hay5zdGFydHNXaXRoKCdfJykpKXtcbiAgICAgICAgY29uc3QgdGhpc0tleVBhdGggPSBrZXlQYXRoICsgKGtleVBhdGggJiYgJy4nKSArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdEaXNwbGF5IGNvbmRpdGlvbnMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiRGlzcGxheSBjb25kaXRpb25zXCI7IHRoZSBcIkRpc3BsYXkgY29uZGl0aW9uc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCI7IHRoZSBcIlRyYW5zbGF0aW9uIG92ZXJyaWRlc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hUGFydCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2UgZm9yIG5lc3RlZCBjb25maWcga2V5c1xuICAgICAgICAgICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hUGFydCwgdGhpc0tleVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2NoZW1hUGFydC5fZWxlbWVudHM7XG4gICAgICAgIGlmIChoYXNPYmplY3RTY2hlbWEoZWxlbWVudHMpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBlbGVtZW50cywgdGhpc0tleVBhdGggKyAnLl9lbGVtZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2Ygc2NoZW1hUGFydC5fdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB2YWxpZGF0b3IgZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHZhbGlkYXRvcnMgbXVzdCBiZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZWl0aGVyIGAgKyBgdW5kZWZpbmVkIG9yIGFuIGVycm9yIHN0cmluZy4gUmVjZWl2ZWQgJHt2YWxpZGF0b3J9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBzY2hlbWFQYXJ0Ll90eXBlO1xuICAgICAgICBpZiAodmFsdWVUeXBlICYmICFPYmplY3QudmFsdWVzKFR5cGUpLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGludmFsaWQgdHlwZSBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlIGFsbG93ZWQgdHlwZXMgYXJlICR7T2JqZWN0LnZhbHVlcyhUeXBlKS5qb2luKCcsICcpfS4gYCArIGBSZWNlaXZlZCAnJHt2YWx1ZVR5cGV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWFQYXJ0KS5ldmVyeSgoayk9PltcbiAgICAgICAgICAgICAgICAnX2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAnX3ZhbGlkYXRvcnMnLFxuICAgICAgICAgICAgICAgICdfZWxlbWVudHMnLFxuICAgICAgICAgICAgICAgICdfdHlwZSdcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoaykpICYmICFrZXlQYXRoLmluY2x1ZGVzKCcuX2VsZW1lbnRzJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiBhbGwgY29uZmlnIGVsZW1lbnRzIG11c3QgaGF2ZSBhIGRlZmF1bHQuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzY2hlbWFQYXJ0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHMgJiYgdmFsdWVUeXBlICYmICFbXG4gICAgICAgICAgICBUeXBlLkFycmF5LFxuICAgICAgICAgICAgVHlwZS5PYmplY3RcbiAgICAgICAgXS5pbmNsdWRlcyh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlICdlbGVtZW50cycga2V5IG9ubHkgd29ya3Mgd2l0aCAnX3R5cGUnIGVxdWFsIHRvICdBcnJheScgb3IgJ09iamVjdCcuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZVR5cGUpfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBjb25maWdTdGF0ZS5zY2hlbWFzW21vZHVsZU5hbWVdO1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBpbnB1dENvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoc2NoZW1hLCBpbnB1dENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoaW1wbGljaXRDb25maWdTY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKGltcGxpY2l0Q29uZmlnU2NoZW1hLCBjb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBhbGxDb25maWdzKSB7XG4gICAgY29uc3QgYWxsQ29uZmlnc0Zvck1vZHVsZSA9IGFsbENvbmZpZ3MubWFwKCh7IFttb2R1bGVOYW1lXTogYyB9KT0+YykuZmlsdGVyKChjKT0+ISFjKTtcbiAgICByZXR1cm4gbWVyZ2VDb25maWdzKGFsbENvbmZpZ3NGb3JNb2R1bGUpO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzKGNvbmZpZ3MpIHtcbiAgICByZXR1cm4gY29uZmlncy5yZWR1Y2UoKGFjYywgY29uZmlnKT0+bWVyZ2VEZWVwUmVwbGFjZShhY2MsIGNvbmZpZyksIHt9KTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZyB0cmVlIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbFxuICogb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIHNjaGVtYSwgYW5kIHRoYXQgdHlwZXMgYXJlXG4gKiBjb3JyZWN0LiBEb2VzIG5vdCBydW4gdmFsaWRhdG9ycyB5ZXQsIHNpbmNlIHRob3NlIHdpbGwgYmUgcnVuIG9uXG4gKiB0aGUgY29uZmlnIHdpdGggdGhlIGRlZmF1bHRzIGZpbGxlZCBpbi5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gdmFsaWRhdGUgZWFjaCBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAoIXNjaGVtYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgPT09ICdleHRlbnNpb25TbG90cycgJiYga2V5UGF0aCAhPT0gJycpKSB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IodGhpc0tleVBhdGgsIGBVbmtub3duIGNvbmZpZyBrZXkgJyR7dGhpc0tleVBhdGh9JyBwcm92aWRlZC4gSWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKSB7XG4gICAgY2hlY2tUeXBlKGtleVBhdGgsIHNjaGVtYVBhcnQuX3R5cGUsIHZhbHVlKTtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhcyBmcmVlZm9ybSBvYmplY3RcbiAgICAgICAgICAgIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIGtleVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfdHlwZScpKSkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgbm9ybWFsIG5lc3RlZCBjb25maWdcbiAgICAgICAgICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEsIGNvbmZpZywga2V5UGF0aCkge1xuICAgIGlmIChmcmVlZm9ybU9iamVjdFNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgYCR7a2V5UGF0aH0uJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKGFycmF5U2NoZW1hLCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNvbnN0IHZhbGlkYXRlZEFzQXJyYXkgPSBjaGVja1R5cGUoa2V5UGF0aCwgVHlwZS5BcnJheSwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGVkQXNBcnJheSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQgb2JqZWN0IHNjaGVtYSwgdmVyaWZ5IHRoYXQgZWxlbWVudHMgbWF0Y2ggaXRcbiAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGFycmF5U2NoZW1hLl9lbGVtZW50cykpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGFycmF5U2NoZW1hLl9lbGVtZW50cywgdmFsdWVbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY2hlY2tUeXBlKGAke2tleVBhdGh9WyR7aX1dYCwgYXJyYXlTY2hlbWEuX2VsZW1lbnRzPy5fdHlwZSwgdmFsdWVbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgY29uZmlnIHRyZWUuIFRoaXMgc2hvdWxkIGJlIHJ1blxuICogb24gdGhlIGNvbmZpZyBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkIGluIHdpdGggYWxsIHRoZSBkZWZhdWx0cywgc2luY2VcbiAqIGhpZ2hlci1sZXZlbCB2YWxpZGF0b3JzIG1heSByZWZlciB0byBkZWZhdWx0IHZhbHVlcy5cbiAqLyBmdW5jdGlvbiBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBrZXlQYXRoID0gJycpIHtcbiAgICAvLyBJZiBgIXNjaGVtYWAsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZXJyb3IgcHJpbnRlZCBhbHJlYWR5LlxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gc2NoZW1hLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHNjaGVtYS5fdmFsaWRhdG9ycywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5fdHlwZSA9PT0gVHlwZS5PYmplY3QgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYS5fZWxlbWVudHMsIHZhbHVlLCB0aGlzS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCBjb25maWdbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJ1biB0eXBlIHZhbGlkYXRpb24gZm9yIHRoZSB2YWx1ZSwgbG9nZ2luZyBhbnkgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi8gZnVuY3Rpb24gY2hlY2tUeXBlKGtleVBhdGgsIF90eXBlLCB2YWx1ZSkge1xuICAgIGlmIChfdHlwZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHtcbiAgICAgICAgICAgIEFycmF5OiBpc0FycmF5LFxuICAgICAgICAgICAgQm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICAgICAgQ29uY2VwdFV1aWQ6IGlzVXVpZCxcbiAgICAgICAgICAgIE51bWJlcjogaXNOdW1iZXIsXG4gICAgICAgICAgICBPYmplY3Q6IGlzT2JqZWN0LFxuICAgICAgICAgICAgU3RyaW5nOiBpc1N0cmluZyxcbiAgICAgICAgICAgIFVVSUQ6IGlzVXVpZCxcbiAgICAgICAgICAgIFBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkOiBpc1V1aWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgW1xuICAgICAgICAgICAgdmFsaWRhdG9yW190eXBlXVxuICAgICAgICBdLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSdW5zIHZhbGlkYXRvcnMsIGxvZ2dpbmcgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmZ1bmN0aW9uIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgdmFsaWRhdG9ycywgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvclJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBgSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAke2tleVBhdGh9OiAke3ZhbGlkYXRvclJlc3VsdH1gIDogYEludmFsaWQgY29uZmlndXJhdGlvbiB2YWx1ZSAke3ZhbHVlfSBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyBpbnZhbGlkIHZhbGlkYXRvciBhdCBcIiR7a2V5UGF0aH1cIi4gRW5jb3VudGVyZWQgZXJyb3JcXG5cXHQke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuLy8gUmVjdXJzaXZlbHkgZmlsbCBpbiB0aGUgY29uZmlnIHdpdGggdmFsdWVzIGZyb20gdGhlIHNjaGVtYS5cbmNvbnN0IHNldERlZmF1bHRzID0gKHNjaGVtYSwgaW5wdXRDb25maWcpPT57XG4gICAgY29uc3QgY29uZmlnID0gc3RydWN0dXJlZENsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiaXNFcXVhbCIsIm1lcmdlV2l0aCIsIm9taXQiLCJsb2Rhc2hPbWl0IiwiVHlwZSIsImlzQXJyYXkiLCJpc0Jvb2xlYW4iLCJpc1V1aWQiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJ2YWxpZGF0b3IiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJnZXRDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsIm1lcmdlRGVlcFJlcGxhY2UiLCJsZWZ0IiwicmlnaHQiLCJfb2JqVmFsdWUiLCJzcmNWYWx1ZSIsIkFycmF5IiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsInRlbXBDb25maWdTdGF0ZSIsImV4dGVuc2lvblN0YXRlIiwiY29tcHV0ZU1vZHVsZUNvbmZpZyIsImNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzIiwiY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MiLCJzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIl9pdGVyYXRvckVycm9yIiwiT2JqZWN0IiwibW9kdWxlTmFtZSIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJjb25maWcxIiwiZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJnZXRJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29uZmlncyIsImV4dGVuc2lvbiIsImNvbXB1dGVFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsInByb3ZpZGUiLCJzb3VyY2VOYW1lIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ1bnN1YnNjcmliZSIsInN0b3JlIiwiZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMiLCJleHRlbnNpb25JZCIsInByb21pc2VzIiwiX3N0YXRlX2NvbmZpZ19UcmFuc2xhdGlvbm92ZXJyaWRlcyIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwiY29uZmlnU3RvcmUiLCJwcm9jZXNzQ29uZmlnIiwicHJvdmlkZWRDb25maWciLCJrZXlQYXRoQ29udGV4dCIsInZhbGlkYXRlU3RydWN0dXJlIiwic2V0RGVmYXVsdHMiLCJydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiX3Nsb3RNb2R1bGVDb25maWdfZXh0ZW5zaW9uU2xvdHNfc2xvdE5hbWVfY29uZmlndXJlIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsIm5hbWVPZlNjaGVtYVNvdXJjZSIsInByb3ZpZGVkQ29uZmlncyIsImdldFByb3ZpZGVkQ29uZmlncyIsInNsb3RNb2R1bGVDb25maWciLCJtZXJnZUNvbmZpZ3NGb3IiLCJjb25maWdPdmVycmlkZSIsImV4dGVuc2lvbkNvbmZpZyIsImNvbWJpbmVkQ29uZmlnIiwibWVyZ2VDb25maWdzIiwicmVzdWx0IiwiZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMiLCJjb25maWdzQW5kU291cmNlcyIsImMiLCJzb3VyY2UiLCJjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsIl9hbGxDb25maWdzX2tleSIsIl9hbGxDb25maWdzX2tleTEiLCJ2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzIiwiY29uZmlnQnlTbG90TmFtZSIsIl9pdGVyYXRvckVycm9yMSIsInZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyIsImtleVBhdGgiLCJlcnJvclByZWZpeCIsImludmFsaWRLZXlzIiwiayIsImxvZ0Vycm9yIiwibiIsInVwZGF0ZU1lc3NhZ2UiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl8kdmFsaWRhdG9yIiwidmFsdWVUeXBlIiwiSlNPTiIsImlucHV0Q29uZmlnIiwiYWxsQ29uZmlnc0Zvck1vZHVsZSIsImFjYyIsInZhbHVlIiwidmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUiLCJjaGVja1R5cGUiLCJ2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlIiwidmFsaWRhdGVBcnJheVN0cnVjdHVyZSIsImZyZWVmb3JtT2JqZWN0U2NoZW1hIiwiYXJyYXlTY2hlbWEiLCJ2YWxpZGF0ZWRBc0FycmF5IiwiaSIsImkxIiwiX2FycmF5U2NoZW1hX19lbGVtZW50cyIsInJ1blZhbGlkYXRvcnMiLCJfdHlwZSIsInZhbGlkYXRvcnMiLCJyZXR1cm5WYWx1ZSIsInZhbGlkYXRvclJlc3VsdCIsIm1lc3NhZ2UiLCJfdHlwZV9vZiIsImUiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjb25maWdQYXJ0IiwiY29uZmlnV2l0aERlZmF1bHRzIiwiY29uZiIsIm9iamVjdEtleSIsInNlbGVjdGVkQ29uZmlnUGFydCIsImVsZW1lbnRzU2NoZW1hIiwiZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzIiwiU2V0IiwiY2xlYXJDb25maWdFcnJvcnMiLCJyZXNldENvbmZpZ1N5c3RlbSIsIl9leHRlbnNpb25JZF9zcGxpdCIsIm8iLCJiYWRLZXlzIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkJBQTZCLEdBQWlGO0FBQzNFO0FBQ3lFO0FBQ3JEO0FBQytKO0FBQ3ROOzs7O0NBSUMsR0FBRyxTQUFTcUIsaUJBQWlCQyxJQUFJLEVBQUVDLEtBQUs7SUFDckMsT0FBT3JCLHlDQUFTQSxDQUFDLENBQUMsR0FB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\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n\n}");
5583
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n clearConfigErrors: () => (clearConfigErrors),\n defineConfigSchema: () => (defineConfigSchema),\n defineExtensionConfigSchema: () => (defineExtensionConfigSchema),\n getConfig: () => (getConfig),\n getTranslationOverrides: () => (getTranslationOverrides),\n processConfig: () => (processConfig),\n provide: () => (provide),\n registerModuleLoad: () => (registerModuleLoad),\n registerModuleWithConfigSystem: () => (registerModuleWithConfigSystem),\n registerTranslationNamespace: () => (registerTranslationNamespace),\n resetConfigSystem: () => (resetConfigSystem)\n});\n/* import */ var lodash_es__rspack_import_4 = __webpack_require__(\"../../../node_modules/lodash-es/mergeWith.js\");\n/* import */ var lodash_es__rspack_import_5 = __webpack_require__(\"../../../node_modules/lodash-es/isEqual.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/cloneDeep.js\");\n/* import */ var _types_js__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/types.js\");\n/* import */ var _validators_type_validators_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-config/dist/validators/type-validators.js\");\n/* import */ var _validators_validator_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-config/dist/validators/validator.js\");\n/* import */ var _state_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-config/dist/module-config/state.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_with_holes(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _iterable_to_array_limit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _non_iterable_rest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _sliced_to_array(arr, i) {\n return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _type_of(obj) {\n \"@swc/helpers - typeof\";\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\n/** @module @category Config */ \n\n\n\n\n/**\n * Deep merge two objects, with right-side values taking precedence.\n * Arrays are replaced entirely (not merged by index), matching the\n * behavior of ramda's mergeDeepRight.\n */ function mergeDeepReplace(left, right) {\n return (0,lodash_es__rspack_import_4[\"default\"])({}, left, right, function(_objValue, srcValue) {\n if (Array.isArray(srcValue)) {\n return srcValue;\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)\nvar 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 var configState = _state_js__rspack_import_3.configInternalStore.getState();\n var tempConfigState = _state_js__rspack_import_3.temporaryConfigStore.getState();\n var extensionState = _state_js__rspack_import_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__rspack_import_3.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(state.schemas)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var moduleName = _step.value;\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 var moduleStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n var newState = void 0;\n if (state.moduleLoaded[moduleName]) {\n var config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config: config\n };\n } else {\n var config1 = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config: config1\n };\n }\n moduleStore.setState(newState);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n var slotConfigs = getExtensionSlotConfigs(state, tempState);\n var newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(function(param) {\n var _param = _sliced_to_array(param, 2), slotName = _param[0], config = _param[1];\n return [\n slotName,\n {\n loaded: true,\n config: config\n }\n ];\n }));\n var slotStore = (0,_state_js__rspack_import_3.getExtensionSlotsConfigStore)();\n var oldState = slotStore.getState();\n var newState = {\n slots: _object_spread({}, oldState.slots, newSlotStoreEntries)\n };\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n var oldState = _state_js__rspack_import_3.implementerToolsConfigStore.getState();\n var config = getImplementerToolsConfig(state, tempConfigState);\n var newState = {\n config: config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.config, newState.config)) {\n _state_js__rspack_import_3.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n var configs = {};\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for(var _iterator = extensionState.mountedExtensions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var extension = _step.value;\n var 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: config,\n loaded: true\n };\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n var extensionsConfigStore = (0,_state_js__rspack_import_3.getExtensionsConfigStore)();\n var oldState = extensionsConfigStore.getState();\n var newState = {\n configs: configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,lodash_es__rspack_import_5[\"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/en-US/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 var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, enhancedSchema)),\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, 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__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, 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/en-US/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 defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n var state = _state_js__rspack_import_3.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(\"Config schema for extension \".concat(extensionName, \" already exists. If there are multiple extensions with this same name, one will probably crash.\"));\n }\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, extensionName, enhancedSchema))\n });\n });\n}\n/**\n * Provides configuration values programmatically. This is an alternative to\n * providing configuration through the config-file. Configuration provided this\n * way will be merged with configuration from other sources.\n *\n * @param config A configuration object to merge into the existing configuration.\n * @param sourceName An optional name to identify the source of this configuration,\n * used for debugging purposes. Defaults to 'provided'.\n */ function provide(config) {\n var sourceName = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'provided';\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n providedConfigs: _to_consumable_array(state.providedConfigs).concat([\n {\n source: sourceName,\n config: config\n }\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(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var config = (0,lodash_es__rspack_import_6[\"default\"])(state.config, [\n 'Display conditions',\n 'Translation overrides'\n ]);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var store = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(store.getState());\n var unsubscribe = store.subscribe(update);\n });\n}\n/**\n * Retrieves translation overrides for an extension, optionally scoped to a specific\n * extension slot. When called with only a module name, retrieves module-level overrides.\n * Translation overrides allow customizing translated strings without modifying the\n * original translation files.\n *\n * @param moduleName The name of the module providing the translation context.\n * @param slotName Optional extension slot name to include slot-specific overrides.\n * @param extensionId Optional extension ID to include extension-specific overrides.\n * @returns A Promise resolving to an array of translation override objects.\n *\n * @internal\n */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n var promises = [\n new Promise(function(resolve) {\n var update = function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getExtensionConfig)(slotName, extensionId);\n update(configStore.getState());\n var 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-separated string which helps the user figure out where\n * the provided config came from\n * @returns The validated and processed configuration object with defaults applied.\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n var 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 var _ref;\n var _slotModuleConfig_extensionSlots_slotName_configure, _slotModuleConfig_extensionSlots_slotName, _slotModuleConfig_extensionSlots;\n var extensionName = getExtensionNameFromId(extensionId);\n var extensionConfigSchema = configState.schemas[extensionName];\n var nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n var providedConfigs = getProvidedConfigs(configState, tempConfigState);\n var slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n var configOverride = (_ref = slotModuleConfig === null || slotModuleConfig === void 0 ? void 0 : (_slotModuleConfig_extensionSlots = slotModuleConfig.extensionSlots) === null || _slotModuleConfig_extensionSlots === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName = _slotModuleConfig_extensionSlots[slotName]) === null || _slotModuleConfig_extensionSlots_slotName === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName_configure = _slotModuleConfig_extensionSlots_slotName.configure) === null || _slotModuleConfig_extensionSlots_slotName_configure === void 0 ? void 0 : _slotModuleConfig_extensionSlots_slotName_configure[extensionId]) !== null && _ref !== void 0 ? _ref : {};\n var extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n var combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n var schema = extensionConfigSchema !== null && extensionConfigSchema !== void 0 ? extensionConfigSchema : configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n var config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n var result = getSchemaWithValuesAndSources((0,lodash_es__rspack_import_7[\"default\"])(configState.schemas));\n var configsAndSources = _to_consumable_array(configState.providedConfigs.map(function(c) {\n return [\n c.config,\n c.source\n ];\n })).concat([\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ]);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = configsAndSources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), config = _step_value[0], source = _step_value[1];\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return _object_spread_props(_object_spread({}, schema), {\n _value: schema._default,\n _source: 'default'\n });\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce(function(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(function(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 var allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n var slotConfigPerModule = Object.keys(allConfigs).reduce(function(obj, key) {\n var _allConfigs_key;\n if ((_allConfigs_key = allConfigs[key]) === null || _allConfigs_key === void 0 ? void 0 : _allConfigs_key.extensionSlots) {\n var _allConfigs_key1;\n obj[key] = (_allConfigs_key1 = allConfigs[key]) === null || _allConfigs_key1 === void 0 ? void 0 : _allConfigs_key1.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n var slotConfigs = Object.keys(slotConfigPerModule).reduce(function(obj, key) {\n obj = _object_spread({}, obj, slotConfigPerModule[key]);\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.entries(slotConfigPerModule)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), moduleName = _step_value[0], configBySlotName = _step_value[1];\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = Object.entries(configBySlotName)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _step_value1 = _sliced_to_array(_step1.value, 2), slotName = _step_value1[0], config = _step_value1[1];\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n var keyPath = \"\".concat(moduleName, \".extensionSlots.\").concat(slotName);\n var errorPrefix = \"Extension slot config '\".concat(keyPath, \"'\");\n var invalidKeys = Object.keys(config).filter(function(k) {\n return ![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k);\n });\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + \"' contains invalid keys '\".concat(invalidKeys.join(\"', '\"), \"'\"));\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every(function(n) {\n return typeof n === 'string';\n })) {\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(function(n) {\n return typeof n === 'string';\n })) {\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(function(n) {\n return typeof n === 'string';\n })) {\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 _to_consumable_array(configState.providedConfigs.map(function(c) {\n return c.config;\n })).concat([\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var updateMessage = \"Please verify that you are running the latest version and, if so, alert the maintainer.\";\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(schema).filter(function(k) {\n return !k.startsWith('_');\n })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var thisKeyPath = keyPath + (keyPath && '.') + key;\n var schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ').concat(updateMessage));\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ').concat(updateMessage));\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage));\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n var elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = schemaPart._validators[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _$validator = _step1.value;\n if (typeof _$validator !== 'function') {\n console.error(\"\".concat(moduleName, \" has invalid validator for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: validators must be functions that return either \" + \"undefined or an error string. Received \".concat(_$validator, \".\"));\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n var valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__rspack_import_0.Type).includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has invalid type for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the allowed types are \".concat(Object.values(_types_js__rspack_import_0.Type).join(', '), \". \") + \"Received '\".concat(valueType, \"'\"));\n }\n if (Object.keys(schemaPart).every(function(k) {\n return [\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k);\n }) && !keyPath.includes('._elements')) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: all config elements must have a default. \" + \"Received \".concat(JSON.stringify(schemaPart)));\n }\n if (elements && valueType && ![\n _types_js__rspack_import_0.Type.Array,\n _types_js__rspack_import_0.Type.Object\n ].includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. \" + \"Received \".concat(JSON.stringify(valueType)));\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n var schema = configState.schemas[moduleName];\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n var config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n var config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n var allConfigsForModule = allConfigs.map(function(param) {\n var c = param[moduleName];\n return c;\n }).filter(function(c) {\n return !!c;\n });\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n return configs.reduce(function(acc, config) {\n return mergeDeepReplace(acc, config);\n }, {});\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // validate each constituent element\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, \"Unknown config key '\".concat(thisKeyPath, \"' provided. Ignoring.\"));\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__rspack_import_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__rspack_import_0.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, \"\".concat(keyPath, \".\").concat(key));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n var validatedAsArray = checkType(keyPath, _types_js__rspack_import_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(var i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n for(var i1 = 0; i1 < value.length; i1++){\n var _arraySchema__elements;\n checkType(\"\".concat(keyPath, \"[\").concat(i1, \"]\"), (_arraySchema__elements = arraySchema._elements) === null || _arraySchema__elements === void 0 ? void 0 : _arraySchema__elements._type, value[i1]);\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) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\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 var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (schema._type === _types_js__rspack_import_0.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(var i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], \"\".concat(keyPath, \"[\").concat(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 var _$validator = {\n Array: _validators_type_validators_js__rspack_import_1.isArray,\n Boolean: _validators_type_validators_js__rspack_import_1.isBoolean,\n ConceptUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n Number: _validators_type_validators_js__rspack_import_1.isNumber,\n Object: _validators_type_validators_js__rspack_import_1.isObject,\n String: _validators_type_validators_js__rspack_import_1.isString,\n UUID: _validators_type_validators_js__rspack_import_1.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__rspack_import_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 var returnValue = true;\n if (validators) {\n try {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = validators[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _$validator = _step.value;\n var validatorResult = _$validator(value);\n if (typeof validatorResult === 'string') {\n var message = (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' ? \"Invalid configuration for \".concat(keyPath, \": \").concat(validatorResult) : \"Invalid configuration value \".concat(value, \" for \").concat(keyPath, \": \").concat(validatorResult);\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } catch (e) {\n console.error('Skipping invalid validator at \"'.concat(keyPath, '\". Encountered error\\n\t').concat(e));\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nvar setDefaults = function setDefaults1(schema, inputConfig) {\n var config = structuredClone(inputConfig);\n if (!schema) {\n return config;\n }\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n var _loop = function() {\n var key = _step.value;\n var configPart = config[key];\n var 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 var elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array && Array.isArray(configPart)) {\n var configWithDefaults = configPart.map(function(conf) {\n return setDefaults(elements, conf);\n });\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(configPart)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion = (_step1 = _iterator.next()).done); _iteratorNormalCompletion = true){\n var objectKey = _step1.value;\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\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 var selectedConfigPart = configPart !== null && configPart !== void 0 ? 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 for(var _iterator = Object.keys(schema)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter(function(e) {\n return ![\n '_default',\n '_validators'\n ].includes(e);\n }).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return (typeof value === \"undefined\" ? \"undefined\" : _type_of(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. */ var displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n var key = \"\".concat(keyPath, \":::\").concat(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(function(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(function(unsubscribe) {\n return unsubscribe();\n });\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 var _extensionId_split = _sliced_to_array(extensionId.split('#'), 1), extensionName = _extensionId_split[0];\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 */ var 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__rspack_import_0.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__rspack_import_2.validator)(function(o) {\n return Object.keys(o).every(function(k) {\n return /^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n }, function(o) {\n var badKeys = Object.keys(o).filter(function(k) {\n return !/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\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: \".concat(badKeys.join(', '), \".\");\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ var implicitConfigSchema = _object_spread({\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__rspack_import_0.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__rspack_import_0.Type.String,\n _default: undefined\n }\n }\n}, translationOverridesSchema);\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/YzNhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCwgbWVyZ2VXaXRoLCBvbWl0IGFzIGxvZGFzaE9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0Jvb2xlYW4sIGlzVXVpZCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3R5cGUtdmFsaWRhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBjb25maWdFeHRlbnNpb25TdG9yZSwgY29uZmlnSW50ZXJuYWxTdG9yZSwgZ2V0Q29uZmlnU3RvcmUsIGdldEV4dGVuc2lvbkNvbmZpZywgZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbi8qKlxuICogRGVlcCBtZXJnZSB0d28gb2JqZWN0cywgd2l0aCByaWdodC1zaWRlIHZhbHVlcyB0YWtpbmcgcHJlY2VkZW5jZS5cbiAqIEFycmF5cyBhcmUgcmVwbGFjZWQgZW50aXJlbHkgKG5vdCBtZXJnZWQgYnkgaW5kZXgpLCBtYXRjaGluZyB0aGVcbiAqIGJlaGF2aW9yIG9mIHJhbWRhJ3MgbWVyZ2VEZWVwUmlnaHQuXG4gKi8gZnVuY3Rpb24gbWVyZ2VEZWVwUmVwbGFjZShsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBtZXJnZVdpdGgoe30sIGxlZnQsIHJpZ2h0LCAoX29ialZhbHVlLCBzcmNWYWx1ZSk9PntcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RvcmUgc2V0dXBcbiAqXG4gKlxuICogU2V0IHVwIHN0b3JlcyBhbmQgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IGlucHV0cyBnZXQgcHJvY2Vzc2VkIGFwcHJvcHJpYXRlbHkuXG4gKlxuICogVGhlcmUgYXJlICppbnB1dCogc3RvcmVzIGFuZCAqb3V0cHV0KiBzdG9yZXMuIFRoZSAqaW5wdXQqIHN0b3Jlc1xuICogYXJlIGNvbmZpZ0ludGVybmFsU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLCBhbmQgY29uZmlnRXh0ZW5zaW9uU3RvcmUuIFRoZVxuICogb3V0cHV0IHN0b3JlcyBhcmUgc2V0IGluIHRoZSBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zLiBUaGV5IGFyZSB0aGUgbW9kdWxlXG4gKiBjb25maWcgc3RvcmVzLCB0aGUgZXh0ZW5zaW9uIHNsb3QgY29uZmlnIHN0b3JlcyAoYnkgbW9kdWxlKSwgdGhlIGV4dGVuc2lvblxuICogY29uZmlnIHN0b3JlcywgYW5kIHRoZSBpbXBsZW1lbnRlciB0b29scyBjb25maWcgc3RvcmUuXG4gKlxuICogVGhpcyBjb2RlIHNldHMgdXAgdGhlIHN1YnNjcmlwdGlvbnMgc28gdGhhdCB3aGVuIGFuIGlucHV0IHN0b3JlIGNoYW5nZXMsXG4gKiB0aGUgY29ycmVjdCBzZXQgb2Ygb3V0cHV0IHN0b3JlcyBhcmUgdXBkYXRlZC5cbiAqXG4gKiBBbGwgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucyBleGNlcHQgYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBhcmUgcHVyZVxuICogKG9yIGFyZSBzdXBwb3NlZCB0byBiZSksIG90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCB0aGV5IGFsbCBgc2V0U3RhdGVgXG4gKiBzdG9yZSB2YWx1ZXMgYXQgdGhlIGVuZC4gYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBjYWxscyBgZ2V0R2xvYmFsU3RvcmVgLFxuICogd2hpY2ggY3JlYXRlcyBzdG9yZXMuXG4gKi8gLy8gU3RvcmUgdW5zdWJzY3JpYmUgZnVuY3Rpb25zIHRvIGFsbG93IGNsZWFudXAgKGUuZy4sIGluIHRlc3RzIG9yIGhvdCBtb2R1bGUgcmVsb2FkaW5nKVxuY29uc3QgY29uZmlnU3Vic2NyaXB0aW9ucyA9IFtdO1xuLyoqXG4gKiBSZWNvbXB1dGVzIGFsbCBjb25maWd1cmF0aW9uIGRlcml2ZWQgc3RvcmVzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgb2YgaW5wdXQgc3RvcmVzLlxuICogQ2FsbGVkIHdoZW5ldmVyIGFueSBpbnB1dCBzdG9yZSAoY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGNvbmZpZ0V4dGVuc2lvblN0b3JlKSBjaGFuZ2VzLlxuICovIGZ1bmN0aW9uIHJlY29tcHV0ZUFsbENvbmZpZ3MoKSB7XG4gICAgY29uc3QgY29uZmlnU3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgdGVtcENvbmZpZ1N0YXRlID0gdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleHRlbnNpb25TdGF0ZSA9IGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29tcHV0ZU1vZHVsZUNvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGV4dGVuc2lvblN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xufVxuZnVuY3Rpb24gc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vIEluaXRpYWwgY29tcHV0YXRpb25cbiAgICByZWNvbXB1dGVBbGxDb25maWdzKCk7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGFsbCBpbnB1dCBzdG9yZXMgd2l0aCBhIHNpbmdsZSBoYW5kbGVyXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIG9ubHkgcmVjb21wdXRlIG9uY2UgZXZlbiBpZiBtdWx0aXBsZSBzdG9yZXMgY2hhbmdlIHNpbXVsdGFuZW91c2x5XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKGNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2godGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnRXh0ZW5zaW9uU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbn1cbi8vIFNldCB1cCBzdWJzY3JpcHRpb25zIGF0IG1vZHVsZSBsb2FkIHRpbWVcbnNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucygpO1xuZnVuY3Rpb24gY29tcHV0ZU1vZHVsZUNvbmZpZyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhzdGF0ZS5zY2hlbWFzKSl7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNjaGVtYSBjb3VsZCBiZSBlaXRoZXIganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIG9yIHRoZSBhY3R1YWxseVxuICAgICAgICAvLyBkZWZpbmVkIHNjaGVtYS4gV2UgcnVuIHdpdGgganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIGJlY2F1c2Ugd2Ugd2FudCB0byBwb3B1bGF0ZVxuICAgICAgICAvLyB0aGUgY29uZmlnIHN0b3JlIHdpdGggdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcyBzb29uIGFzIHBvc3NpYmxlLiBJbiBmYWN0LCB0aGVcbiAgICAgICAgLy8gdHJhbnNsYXRpb24gc3lzdGVtIHdpbGwgdGhyb3cgZm9yIFN1c3BlbnNlIHVudGlsIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXJlXG4gICAgICAgIC8vIGF2YWlsYWJsZSwgd2hpY2ggYXMgb2YgdGhpcyB3cml0aW5nIGJsb2NrcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZnJvbSBvY2N1cnJpbmdcbiAgICAgICAgLy8gZm9yIG1vZHVsZXMgbG9hZGVkIGJhc2VkIG9uIHRoZWlyIGV4dGVuc2lvbnMuXG4gICAgICAgIGNvbnN0IG1vZHVsZVN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGxldCBuZXdTdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlLm1vZHVsZUxvYWRlZFttb2R1bGVOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbW9kdWxlU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICBjb25zdCBuZXdTbG90U3RvcmVFbnRyaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdzKS5tYXAoKFtzbG90TmFtZSwgY29uZmlnXSk9PltcbiAgICAgICAgICAgIHNsb3ROYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSkpO1xuICAgIGNvbnN0IHNsb3RTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHNsb3RTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgLi4ub2xkU3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAuLi5uZXdTbG90U3RvcmVFbnRyaWVzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNFcXVhbChvbGRTdGF0ZS5zbG90cywgbmV3U3RhdGUuc2xvdHMpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhzdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgY29uZmlnXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSBvbiB0aGUgYWN0dWFsIGNvbmZpZyBjb250ZW50LCBub3QgdGhlIHdyYXBwZXIgb2JqZWN0XG4gICAgaWYgKCFpc0VxdWFsKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWlzRXF1YWwob2xkU3RhdGUuY29uZmlncywgbmV3U3RhdGUuY29uZmlncykpIHtcbiAgICAgICAgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG59XG4vKlxuICogQVBJXG4gKlxuICovIC8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGEgbW9kdWxlLiBUaGUgc2NoZW1hIHRlbGxzIHRoZVxuICogY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuIEl0IHNwZWNpZmllc1xuICogd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2VuLVVTL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuIEdlbmVyYWxseVxuICogICBzaG91bGQgYmUgdGhlIG9uZSBpbiB3aGljaCB0aGUgYGRlZmluZUNvbmZpZ1NjaGVtYWAgY2FsbCB0YWtlcyBwbGFjZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBtb2R1bGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSZXBsYWNlKHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZW4tVVMvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBkZWZpbmVkIGluXG4gKiAgIHRoZSBhcHAncyBgcm91dGVzLmpzb25gIGZpbGUuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmVwbGFjZShzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG9cbiAqIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpZy1maWxlLiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIHRoaXNcbiAqIHdheSB3aWxsIGJlIG1lcmdlZCB3aXRoIGNvbmZpZ3VyYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZU5hbWUgQW4gb3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGUgc291cmNlIG9mIHRoaXMgY29uZmlndXJhdGlvbixcbiAqICAgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEZWZhdWx0cyB0byAncHJvdmlkZWQnLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm92aWRlKGNvbmZpZywgc291cmNlTmFtZSA9ICdwcm92aWRlZCcpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHByb3ZpZGVkQ29uZmlnczogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnByb3ZpZGVkQ29uZmlncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEEgcHJvbWlzZS1iYXNlZCB3YXkgdG8gYWNjZXNzIHRoZSBjb25maWcgYXMgc29vbiBhcyBpdCBpcyBmdWxseSBsb2FkZWQuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGxvYWRlZCwgcmVzb2x2ZXMgdGhlIGNvbmZpZyBpbiBpdHMgcHJlc2VudCBzdGF0ZS5cbiAqXG4gKiBUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgY29uZmlnIGluIHRoZSBjb3Vyc2VcbiAqIG9mIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB3aGljaCB0byBsb29rIHVwIHRoZSBjb25maWdcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBsb2Rhc2hPbWl0KHN0YXRlLmNvbmZpZywgW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgYW4gZXh0ZW5zaW9uLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIHNwZWNpZmljXG4gKiBleHRlbnNpb24gc2xvdC4gV2hlbiBjYWxsZWQgd2l0aCBvbmx5IGEgbW9kdWxlIG5hbWUsIHJldHJpZXZlcyBtb2R1bGUtbGV2ZWwgb3ZlcnJpZGVzLlxuICogVHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFsbG93IGN1c3RvbWl6aW5nIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAqIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSB0cmFuc2xhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHNsb3ROYW1lIE9wdGlvbmFsIGV4dGVuc2lvbiBzbG90IG5hbWUgdG8gaW5jbHVkZSBzbG90LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSBleHRlbnNpb25JZCBPcHRpb25hbCBleHRlbnNpb24gSUQgdG8gaW5jbHVkZSBleHRlbnNpb24tc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbiBvdmVycmlkZSBvYmplY3RzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZURlZXAoY29uZmlnU3RhdGUuc2NoZW1hcykpO1xuICAgIGNvbnN0IGNvbmZpZ3NBbmRTb3VyY2VzID0gW1xuICAgICAgICAuLi5jb25maWdTdGF0ZS5wcm92aWRlZENvbmZpZ3MubWFwKChjKT0+W1xuICAgICAgICAgICAgICAgIGMuY29uZmlnLFxuICAgICAgICAgICAgICAgIGMuc291cmNlXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgW1xuICAgICAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZyxcbiAgICAgICAgICAgICd0ZW1wb3JhcnkgY29uZmlnJ1xuICAgICAgICBdXG4gICAgXTtcbiAgICBmb3IgKGxldCBbY29uZmlnLCBzb3VyY2VdIG9mIGNvbmZpZ3NBbmRTb3VyY2VzKXtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VDb25maWdzKFtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIF92YWx1ZTogc2NoZW1hLl9kZWZhdWx0LFxuICAgICAgICAgICAgX3NvdXJjZTogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjaGVtYSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hW2tleV0pO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZSBzY2hlbWEgaXMgYmFkIGFuZCBhbiBlcnJvciB3aWxsIGhhdmUgYmVlbiBsb2dnZWQgZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWcsIHNvdXJjZSkge1xuICAgIGlmIChpc09yZGluYXJ5T2JqZWN0KGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnW2tleV0sIHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF92YWx1ZTogY29uZmlnLFxuICAgICAgICAgICAgX3NvdXJjZTogc291cmNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGFsbENvbmZpZ3MgPSBtZXJnZUNvbmZpZ3MoZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBzbG90Q29uZmlnUGVyTW9kdWxlID0gT2JqZWN0LmtleXMoYWxsQ29uZmlncykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgaWYgKGFsbENvbmZpZ3Nba2V5XT8uZXh0ZW5zaW9uU2xvdHMpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICB2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzKHNsb3RDb25maWdQZXJNb2R1bGUpO1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gT2JqZWN0LmtleXMoc2xvdENvbmZpZ1Blck1vZHVsZSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgLi4ub2JqLFxuICAgICAgICAgICAgLi4uc2xvdENvbmZpZ1Blck1vZHVsZVtrZXldXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBzbG90Q29uZmlncztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSkge1xuICAgIGZvciAobGV0IFttb2R1bGVOYW1lLCBjb25maWdCeVNsb3ROYW1lXSBvZiBPYmplY3QuZW50cmllcyhzbG90Q29uZmlnUGVyTW9kdWxlKSl7XG4gICAgICAgIGZvciAobGV0IFtzbG90TmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdCeVNsb3ROYW1lKSl7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSkge1xuICAgIGNvbnN0IGtleVBhdGggPSBgJHttb2R1bGVOYW1lfS5leHRlbnNpb25TbG90cy4ke3Nsb3ROYW1lfWA7XG4gICAgY29uc3QgZXJyb3JQcmVmaXggPSBgRXh0ZW5zaW9uIHNsb3QgY29uZmlnICcke2tleVBhdGh9J2A7XG4gICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcigoayk9PiFbXG4gICAgICAgICAgICAnYWRkJyxcbiAgICAgICAgICAgICdyZW1vdmUnLFxuICAgICAgICAgICAgJ29yZGVyJyxcbiAgICAgICAgICAgICdjb25maWd1cmUnXG4gICAgICAgIF0uaW5jbHVkZXMoaykpO1xuICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgJyBjb250YWlucyBpbnZhbGlkIGtleXMgJyR7aW52YWxpZEtleXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmFkZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmFkZCkgfHwgIWNvbmZpZy5hZGQuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuYWRkJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZW1vdmUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5yZW1vdmUpIHx8ICFjb25maWcucmVtb3ZlLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLnJlbW92ZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcub3JkZXIpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5vcmRlcikgfHwgIWNvbmZpZy5vcmRlci5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5vcmRlcicgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcuY29uZmlndXJlKSB7XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChjb25maWcuY29uZmlndXJlKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLmNvbmZpZ3VyZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBleHRlbnNpb24gSURzIGZvciBrZXlzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5jLmNvbmZpZyksXG4gICAgICAgIHRlbXBDb25maWdTdGF0ZS5jb25maWdcbiAgICBdO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNvbmZpZyBzY2hlbWEgZm9yIGEgbW9kdWxlLiBTaW5jZSBwcm9ibGVtcyBpZGVudGlmaWVkIGhlcmUgYXJlIHByb2dyYW1taW5nIGVycm9yc1xuICogdGhhdCBob3BlZnVsbHkgd2lsbCBiZSBjYXVnaHQgZHVyaW5nIGRldmVsb3BtZW50LCB0aGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGRpcmVjdGx5O1xuICogaXQncyBmaW5lIGlmIHdlIHNwYW0gdGhlIHVzZXIgd2l0aCB0aGVzZSBlcnJvcnMuXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hLCBrZXlQYXRoID0gJycpIHtcbiAgICBjb25zdCB1cGRhdGVNZXNzYWdlID0gYFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCwgaWYgc28sIGFsZXJ0IHRoZSBtYWludGFpbmVyLmA7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGspPT4hay5zdGFydHNXaXRoKCdfJykpKXtcbiAgICAgICAgY29uc3QgdGhpc0tleVBhdGggPSBrZXlQYXRoICsgKGtleVBhdGggJiYgJy4nKSArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdEaXNwbGF5IGNvbmRpdGlvbnMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiRGlzcGxheSBjb25kaXRpb25zXCI7IHRoZSBcIkRpc3BsYXkgY29uZGl0aW9uc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCI7IHRoZSBcIlRyYW5zbGF0aW9uIG92ZXJyaWRlc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hUGFydCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2UgZm9yIG5lc3RlZCBjb25maWcga2V5c1xuICAgICAgICAgICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hUGFydCwgdGhpc0tleVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2NoZW1hUGFydC5fZWxlbWVudHM7XG4gICAgICAgIGlmIChoYXNPYmplY3RTY2hlbWEoZWxlbWVudHMpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBlbGVtZW50cywgdGhpc0tleVBhdGggKyAnLl9lbGVtZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2Ygc2NoZW1hUGFydC5fdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB2YWxpZGF0b3IgZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHZhbGlkYXRvcnMgbXVzdCBiZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZWl0aGVyIGAgKyBgdW5kZWZpbmVkIG9yIGFuIGVycm9yIHN0cmluZy4gUmVjZWl2ZWQgJHt2YWxpZGF0b3J9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBzY2hlbWFQYXJ0Ll90eXBlO1xuICAgICAgICBpZiAodmFsdWVUeXBlICYmICFPYmplY3QudmFsdWVzKFR5cGUpLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGludmFsaWQgdHlwZSBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlIGFsbG93ZWQgdHlwZXMgYXJlICR7T2JqZWN0LnZhbHVlcyhUeXBlKS5qb2luKCcsICcpfS4gYCArIGBSZWNlaXZlZCAnJHt2YWx1ZVR5cGV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWFQYXJ0KS5ldmVyeSgoayk9PltcbiAgICAgICAgICAgICAgICAnX2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAnX3ZhbGlkYXRvcnMnLFxuICAgICAgICAgICAgICAgICdfZWxlbWVudHMnLFxuICAgICAgICAgICAgICAgICdfdHlwZSdcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoaykpICYmICFrZXlQYXRoLmluY2x1ZGVzKCcuX2VsZW1lbnRzJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiBhbGwgY29uZmlnIGVsZW1lbnRzIG11c3QgaGF2ZSBhIGRlZmF1bHQuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzY2hlbWFQYXJ0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHMgJiYgdmFsdWVUeXBlICYmICFbXG4gICAgICAgICAgICBUeXBlLkFycmF5LFxuICAgICAgICAgICAgVHlwZS5PYmplY3RcbiAgICAgICAgXS5pbmNsdWRlcyh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlICdlbGVtZW50cycga2V5IG9ubHkgd29ya3Mgd2l0aCAnX3R5cGUnIGVxdWFsIHRvICdBcnJheScgb3IgJ09iamVjdCcuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZVR5cGUpfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBjb25maWdTdGF0ZS5zY2hlbWFzW21vZHVsZU5hbWVdO1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBpbnB1dENvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoc2NoZW1hLCBpbnB1dENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoaW1wbGljaXRDb25maWdTY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKGltcGxpY2l0Q29uZmlnU2NoZW1hLCBjb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBhbGxDb25maWdzKSB7XG4gICAgY29uc3QgYWxsQ29uZmlnc0Zvck1vZHVsZSA9IGFsbENvbmZpZ3MubWFwKCh7IFttb2R1bGVOYW1lXTogYyB9KT0+YykuZmlsdGVyKChjKT0+ISFjKTtcbiAgICByZXR1cm4gbWVyZ2VDb25maWdzKGFsbENvbmZpZ3NGb3JNb2R1bGUpO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzKGNvbmZpZ3MpIHtcbiAgICByZXR1cm4gY29uZmlncy5yZWR1Y2UoKGFjYywgY29uZmlnKT0+bWVyZ2VEZWVwUmVwbGFjZShhY2MsIGNvbmZpZyksIHt9KTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZyB0cmVlIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbFxuICogb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIHNjaGVtYSwgYW5kIHRoYXQgdHlwZXMgYXJlXG4gKiBjb3JyZWN0LiBEb2VzIG5vdCBydW4gdmFsaWRhdG9ycyB5ZXQsIHNpbmNlIHRob3NlIHdpbGwgYmUgcnVuIG9uXG4gKiB0aGUgY29uZmlnIHdpdGggdGhlIGRlZmF1bHRzIGZpbGxlZCBpbi5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gdmFsaWRhdGUgZWFjaCBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAoIXNjaGVtYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgPT09ICdleHRlbnNpb25TbG90cycgJiYga2V5UGF0aCAhPT0gJycpKSB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IodGhpc0tleVBhdGgsIGBVbmtub3duIGNvbmZpZyBrZXkgJyR7dGhpc0tleVBhdGh9JyBwcm92aWRlZC4gSWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKSB7XG4gICAgY2hlY2tUeXBlKGtleVBhdGgsIHNjaGVtYVBhcnQuX3R5cGUsIHZhbHVlKTtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhcyBmcmVlZm9ybSBvYmplY3RcbiAgICAgICAgICAgIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIGtleVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfdHlwZScpKSkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgbm9ybWFsIG5lc3RlZCBjb25maWdcbiAgICAgICAgICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEsIGNvbmZpZywga2V5UGF0aCkge1xuICAgIGlmIChmcmVlZm9ybU9iamVjdFNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgYCR7a2V5UGF0aH0uJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKGFycmF5U2NoZW1hLCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNvbnN0IHZhbGlkYXRlZEFzQXJyYXkgPSBjaGVja1R5cGUoa2V5UGF0aCwgVHlwZS5BcnJheSwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGVkQXNBcnJheSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQgb2JqZWN0IHNjaGVtYSwgdmVyaWZ5IHRoYXQgZWxlbWVudHMgbWF0Y2ggaXRcbiAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGFycmF5U2NoZW1hLl9lbGVtZW50cykpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGFycmF5U2NoZW1hLl9lbGVtZW50cywgdmFsdWVbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY2hlY2tUeXBlKGAke2tleVBhdGh9WyR7aX1dYCwgYXJyYXlTY2hlbWEuX2VsZW1lbnRzPy5fdHlwZSwgdmFsdWVbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgY29uZmlnIHRyZWUuIFRoaXMgc2hvdWxkIGJlIHJ1blxuICogb24gdGhlIGNvbmZpZyBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkIGluIHdpdGggYWxsIHRoZSBkZWZhdWx0cywgc2luY2VcbiAqIGhpZ2hlci1sZXZlbCB2YWxpZGF0b3JzIG1heSByZWZlciB0byBkZWZhdWx0IHZhbHVlcy5cbiAqLyBmdW5jdGlvbiBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBrZXlQYXRoID0gJycpIHtcbiAgICAvLyBJZiBgIXNjaGVtYWAsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZXJyb3IgcHJpbnRlZCBhbHJlYWR5LlxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gc2NoZW1hLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHNjaGVtYS5fdmFsaWRhdG9ycywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5fdHlwZSA9PT0gVHlwZS5PYmplY3QgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYS5fZWxlbWVudHMsIHZhbHVlLCB0aGlzS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCBjb25maWdbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJ1biB0eXBlIHZhbGlkYXRpb24gZm9yIHRoZSB2YWx1ZSwgbG9nZ2luZyBhbnkgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi8gZnVuY3Rpb24gY2hlY2tUeXBlKGtleVBhdGgsIF90eXBlLCB2YWx1ZSkge1xuICAgIGlmIChfdHlwZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHtcbiAgICAgICAgICAgIEFycmF5OiBpc0FycmF5LFxuICAgICAgICAgICAgQm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICAgICAgQ29uY2VwdFV1aWQ6IGlzVXVpZCxcbiAgICAgICAgICAgIE51bWJlcjogaXNOdW1iZXIsXG4gICAgICAgICAgICBPYmplY3Q6IGlzT2JqZWN0LFxuICAgICAgICAgICAgU3RyaW5nOiBpc1N0cmluZyxcbiAgICAgICAgICAgIFVVSUQ6IGlzVXVpZCxcbiAgICAgICAgICAgIFBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkOiBpc1V1aWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgW1xuICAgICAgICAgICAgdmFsaWRhdG9yW190eXBlXVxuICAgICAgICBdLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSdW5zIHZhbGlkYXRvcnMsIGxvZ2dpbmcgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmZ1bmN0aW9uIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgdmFsaWRhdG9ycywgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvclJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBgSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAke2tleVBhdGh9OiAke3ZhbGlkYXRvclJlc3VsdH1gIDogYEludmFsaWQgY29uZmlndXJhdGlvbiB2YWx1ZSAke3ZhbHVlfSBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyBpbnZhbGlkIHZhbGlkYXRvciBhdCBcIiR7a2V5UGF0aH1cIi4gRW5jb3VudGVyZWQgZXJyb3JcXG5cXHQke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuLy8gUmVjdXJzaXZlbHkgZmlsbCBpbiB0aGUgY29uZmlnIHdpdGggdmFsdWVzIGZyb20gdGhlIHNjaGVtYS5cbmNvbnN0IHNldERlZmF1bHRzID0gKHNjaGVtYSwgaW5wdXRDb25maWcpPT57XG4gICAgY29uc3QgY29uZmlnID0gc3RydWN0dXJlZENsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiaXNFcXVhbCIsIm1lcmdlV2l0aCIsIm9taXQiLCJsb2Rhc2hPbWl0IiwiVHlwZSIsImlzQXJyYXkiLCJpc0Jvb2xlYW4iLCJpc1V1aWQiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJ2YWxpZGF0b3IiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJnZXRDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsIm1lcmdlRGVlcFJlcGxhY2UiLCJsZWZ0IiwicmlnaHQiLCJfb2JqVmFsdWUiLCJzcmNWYWx1ZSIsIkFycmF5IiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsInRlbXBDb25maWdTdGF0ZSIsImV4dGVuc2lvblN0YXRlIiwiY29tcHV0ZU1vZHVsZUNvbmZpZyIsImNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzIiwiY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MiLCJzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIl9pdGVyYXRvckVycm9yIiwiT2JqZWN0IiwibW9kdWxlTmFtZSIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJjb25maWcxIiwiZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJnZXRJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29uZmlncyIsImV4dGVuc2lvbiIsImNvbXB1dGVFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsInByb3ZpZGUiLCJzb3VyY2VOYW1lIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ1bnN1YnNjcmliZSIsInN0b3JlIiwiZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMiLCJleHRlbnNpb25JZCIsInByb21pc2VzIiwiX3N0YXRlX2NvbmZpZ19UcmFuc2xhdGlvbm92ZXJyaWRlcyIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwiY29uZmlnU3RvcmUiLCJwcm9jZXNzQ29uZmlnIiwicHJvdmlkZWRDb25maWciLCJrZXlQYXRoQ29udGV4dCIsInZhbGlkYXRlU3RydWN0dXJlIiwic2V0RGVmYXVsdHMiLCJydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiX3Nsb3RNb2R1bGVDb25maWdfZXh0ZW5zaW9uU2xvdHNfc2xvdE5hbWVfY29uZmlndXJlIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsIm5hbWVPZlNjaGVtYVNvdXJjZSIsInByb3ZpZGVkQ29uZmlncyIsImdldFByb3ZpZGVkQ29uZmlncyIsInNsb3RNb2R1bGVDb25maWciLCJtZXJnZUNvbmZpZ3NGb3IiLCJjb25maWdPdmVycmlkZSIsImV4dGVuc2lvbkNvbmZpZyIsImNvbWJpbmVkQ29uZmlnIiwibWVyZ2VDb25maWdzIiwicmVzdWx0IiwiZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMiLCJjb25maWdzQW5kU291cmNlcyIsImMiLCJzb3VyY2UiLCJjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsIl9hbGxDb25maWdzX2tleSIsIl9hbGxDb25maWdzX2tleTEiLCJ2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzIiwiY29uZmlnQnlTbG90TmFtZSIsIl9pdGVyYXRvckVycm9yMSIsInZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyIsImtleVBhdGgiLCJlcnJvclByZWZpeCIsImludmFsaWRLZXlzIiwiayIsImxvZ0Vycm9yIiwibiIsInVwZGF0ZU1lc3NhZ2UiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl8kdmFsaWRhdG9yIiwidmFsdWVUeXBlIiwiSlNPTiIsImlucHV0Q29uZmlnIiwiYWxsQ29uZmlnc0Zvck1vZHVsZSIsImFjYyIsInZhbHVlIiwidmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUiLCJjaGVja1R5cGUiLCJ2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlIiwidmFsaWRhdGVBcnJheVN0cnVjdHVyZSIsImZyZWVmb3JtT2JqZWN0U2NoZW1hIiwiYXJyYXlTY2hlbWEiLCJ2YWxpZGF0ZWRBc0FycmF5IiwiaSIsImkxIiwiX2FycmF5U2NoZW1hX19lbGVtZW50cyIsInJ1blZhbGlkYXRvcnMiLCJfdHlwZSIsInZhbGlkYXRvcnMiLCJyZXR1cm5WYWx1ZSIsInZhbGlkYXRvclJlc3VsdCIsIm1lc3NhZ2UiLCJfdHlwZV9vZiIsImUiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjb25maWdQYXJ0IiwiY29uZmlnV2l0aERlZmF1bHRzIiwiY29uZiIsIm9iamVjdEtleSIsInNlbGVjdGVkQ29uZmlnUGFydCIsImVsZW1lbnRzU2NoZW1hIiwiZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzIiwiU2V0IiwiY2xlYXJDb25maWdFcnJvcnMiLCJyZXNldENvbmZpZ1N5c3RlbSIsIl9leHRlbnNpb25JZF9zcGxpdCIsIm8iLCJiYWRLZXlzIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkJBQTZCLEdBQWlGO0FBQzNFO0FBQ3lFO0FBQ3JEO0FBQytKO0FBQ3ROOzs7O0NBSUMsR0FBRyxTQUFTcUIsaUJBQWlCQyxJQUFJLEVBQUVDLEtBQUs7SUFDckMsT0FBT3JCLHlDQUFTQSxDQUFDLENBQUMsR0FBR29CLE1BQU1DLE9BQU8sU0FBQ0MsV0FBV0M7UUFDMUMsSUFBSUMsTUFBTSxPQUFPLENBQUNELFdBQVc7WUFDekIsT0FBT0E7UUFDWDtJQUNKO0FBQ0o7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1CQyxHQUFHLHdGQUF3RjtBQUM1RixJQUFNRSxzQkFBc0IsRUFBRTtBQUM5Qjs7O0NBR0MsR0FBRyxTQUFTQztJQUNULElBQU1DLGNBQWNmLHVEQUE0QjtJQUNoRCxJQUFNZ0Isa0JBQWtCVix3REFBNkI7SUFDckQsSUFBTVcsaUJBQWlCbEIsd0RBQTZCO0lBQ3BEbUIsb0JBQW9CSCxhQUFhQztJQUNqQ0csOEJBQThCSixhQUFhQztJQUMzQ0ksNEJBQTRCTCxhQUFhQztJQUN6Q0ssd0JBQXdCTixhQUFhRSxnQkFBZ0JEO0FBQ3pEO0FBQ0EsU0FBU007SUFDTCxzQkFBc0I7SUFDdEJSO0lBQ0Esc0RBQXNEO0lBQ3RELG9GQUFvRjtJQUNwRkQsb0JBQW9CLElBQUksQ0FBQ2Isd0RBQTZCLENBQUNjO0lBQ3ZERCxvQkFBb0IsSUFBSSxDQUFDUCx5REFBOEIsQ0FBQ1E7SUFDeERELG9CQUFvQixJQUFJLENBQUNkLHlEQUE4QixDQUFDZTtBQUM1RDtBQUNBLDJDQUEyQztBQUMzQ1E7QUFDQSxTQUFTSixvQkFBb0JLLEtBQUssRUFBRUMsU0FBUztRQUNwQ0Msa0NBQUFBLDJCQUFBQTs7UUFBTCxRQUFLQSxZQUFrQkMsT0FBTyxJQUFJLENBQUNILE1BQU0sT0FBTyxzQkFBM0NFLFNBQUFBLDZCQUFBQSxRQUFBQSx5QkFBQUEsaUNBQTZDO1lBQTdDQSxJQUFJRSxhQUFKRjtZQUNELG9GQUFvRjtZQUNwRixtRkFBbUY7WUFDbkYsb0ZBQW9GO1lBQ3BGLGlGQUFpRjtZQUNqRixrRkFBa0Y7WUFDbEYsZ0RBQWdEO1lBQ2hELElBQU1HLGNBQWMzQiw2Q0FBY0EsQ0FBQzBCO1lBQ25DLElBQUlFLFdBQUFBLEtBQUFBO1lBQ0osSUFBSU4sTUFBTSxZQUFZLENBQUNJLFdBQVcsRUFBRTtnQkFDaEMsSUFBTUcsU0FBU0MsbUJBQW1CSixZQUFZSixPQUFPQztnQkFDckRLLFdBQVc7b0JBQ1AsNEJBQTRCO29CQUM1QixRQUFRO29CQUNSQyxRQUFBQTtnQkFDSjtZQUNKLE9BQU87Z0JBQ0gsSUFBTUUsVUFBU0MsaUNBQWlDTixZQUFZSixPQUFPQztnQkFDbkVLLFdBQVc7b0JBQ1AsNEJBQTRCO29CQUM1QixRQUFRO29CQUNSRyxRQUFBQTtnQkFDSjtZQUNKO1lBQ0FKLFlBQVksUUFBUSxDQUFDQztRQUN6Qjs7UUF6QktKO1FBQUFBOzs7aUJBQUFBLDZCQUFBQTtnQkFBQUE7OztnQkFBQUE7c0JBQUFBOzs7O0FBMEJUO0FBQ0EsU0FBU0wsNEJBQTRCRyxLQUFLLEVBQUVDLFNBQVM7SUFDakQsSUFBTVUsY0FBY0Msd0JBQXdCWixPQUFPQztJQUNuRCxJQUFNWSxzQkFBc0JWLE9BQU8sV0FBVyxDQUFDQSxPQUFPLE9BQU8sQ0FBQ1EsYUFBYSxHQUFHLENBQUM7aURBQUVHLHNCQUFVUDtlQUFVO1lBQzdGTztZQUNBO2dCQUNJLFFBQVE7Z0JBQ1JQLFFBQUFBO1lBQ0o7U0FDSDs7SUFDTCxJQUFNUSxZQUFZbkMsMkRBQTRCQTtJQUM5QyxJQUFNb0MsV0FBV0QsVUFBVSxRQUFRO0lBQ25DLElBQU1ULFdBQVc7UUFDYixPQUFPLG1CQUNBVSxTQUFTLEtBQUssRUFDZEg7SUFFWDtJQUNBLElBQUksQ0FBQ2pELHlDQUFPQSxDQUFDb0QsU0FBUyxLQUFLLEVBQUVWLFNBQVMsS0FBSyxHQUFHO1FBQzFDUyxVQUFVLFFBQVEsQ0FBQ1Q7SUFDdkI7QUFDSjtBQUNBLFNBQVNWLDhCQUE4QkksS0FBSyxFQUFFUCxlQUFlO0lBQ3pELElBQU11QixXQUFXbEMsK0RBQW9DO0lBQ3JELElBQU15QixTQUFTVSwwQkFBMEJqQixPQUFPUDtJQUNoRCxJQUFNYSxXQUFXO1FBQ2JDLFFBQUFBO0lBQ0o7SUFDQSx5RUFBeUU7SUFDekUsSUFBSSxDQUFDM0MseUNBQU9BLENBQUNvRCxTQUFTLE1BQU0sRUFBRVYsU0FBUyxNQUFNLEdBQUc7UUFDNUN4QiwrREFBb0MsQ0FBQ3dCO0lBQ3pDO0FBQ0o7QUFDQSxTQUFTUix3QkFBd0JOLFdBQVcsRUFBRUUsY0FBYyxFQUFFRCxlQUFlO0lBQ3pFLElBQU15QixVQUFVLENBQUM7UUFHWmhCLGtDQUFBQSwyQkFBQUE7O1FBRkwsaUZBQWlGO1FBQ2pGLDBCQUEwQjtRQUMxQixRQUFLQSxZQUFpQlIsZUFBZSxpQkFBaUIscUJBQWpEUSxTQUFBQSw2QkFBQUEsUUFBQUEseUJBQUFBLGlDQUFrRDtZQUFsREEsSUFBSWlCLFlBQUpqQjtZQUNELElBQU1LLFNBQVNhLHVCQUF1QkQsVUFBVSxjQUFjLEVBQUVBLFVBQVUsbUJBQW1CLEVBQUVBLFVBQVUsUUFBUSxFQUFFQSxVQUFVLFdBQVcsRUFBRTNCLGFBQWFDO1lBQ3ZKLElBQUksQ0FBQ3lCLE9BQU8sQ0FBQ0MsVUFBVSxRQUFRLENBQUMsRUFBRTtnQkFDOUJELE9BQU8sQ0FBQ0MsVUFBVSxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ25DO1lBQ0FELE9BQU8sQ0FBQ0MsVUFBVSxRQUFRLENBQUMsQ0FBQ0EsVUFBVSxXQUFXLENBQUMsR0FBRztnQkFDakRaLFFBQUFBO2dCQUNBLFFBQVE7WUFDWjtRQUNKOztRQVRLTDtRQUFBQTs7O2lCQUFBQSw2QkFBQUE7Z0JBQUFBOzs7Z0JBQUFBO3NCQUFBQTs7OztJQVVMLElBQU1tQix3QkFBd0J4Qyx1REFBd0JBO0lBQ3RELElBQU1tQyxXQUFXSyxzQkFBc0IsUUFBUTtJQUMvQyxJQUFNZixXQUFXO1FBQ2JZLFNBQUFBO0lBQ0o7SUFDQSwrREFBK0Q7SUFDL0QsSUFBSSxDQUFDdEQseUNBQU9BLENBQUNvRCxTQUFTLE9BQU8sRUFBRVYsU0FBUyxPQUFPLEdBQUc7UUFDOUNlLHNCQUFzQixRQUFRLENBQUNmO0lBQ25DO0FBQ0o7QUFDQTs7O0NBR0MsR0FBRzs7Ozs7Ozs7Ozs7Q0FXSCxHQUFVLFNBQVNnQixtQkFBbUJsQixVQUFVLEVBQUVtQixNQUFNO0lBQ3JEQyxxQkFBcUJwQixZQUFZbUI7SUFDakMsSUFBTUUsaUJBQWlCekMsaUJBQWlCdUMsUUFBUUc7SUFDaERqRCx1REFBNEIsQ0FBQyxTQUFDdUI7ZUFBUyx3Q0FDNUJBO1lBQ0gsU0FBUyx3Q0FDRkEsTUFBTSxPQUFPLEdBQ2hCLHFCQUFDSSxZQUFhcUI7WUFFbEIsY0FBYyx3Q0FDUHpCLE1BQU0sWUFBWSxHQUNyQixxQkFBQ0ksWUFBYTs7O0FBRzlCO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQVUsU0FBU3VCLCtCQUErQnZCLFVBQVU7SUFDekQzQix1REFBNEIsQ0FBQyxTQUFDdUI7ZUFBUyx3Q0FDNUJBO1lBQ0gsU0FBUyx3Q0FDRkEsTUFBTSxPQUFPLEdBQ2hCLHFCQUFDSSxZQUFhc0I7OztBQUc5QjtBQUNBOzs7Ozs7O0NBT0MsR0FBVSxTQUFTRSxtQkFBbUJ4QixVQUFVO0lBQzdDM0IsdURBQTRCLENBQUMsU0FBQ3VCO2VBQVMsd0NBQzVCQTtZQUNILGNBQWMsd0NBQ1BBLE1BQU0sWUFBWSxHQUNyQixxQkFBQ0ksWUFBYTs7O0FBRzlCO0FBQ0E7Ozs7Ozs7O0NBUUMsR0FBVSxTQUFTeUIsNkJBQTZCQyxTQUFTO0lBQ3REckQsdURBQTRCLENBQUMsU0FBQ3VCO2VBQVMsd0NBQzVCQTtZQUNILFNBQVMsd0NBQ0ZBLE1BQU0sT0FBTyxHQUNoQixxQkFBQzhCLFdBQVlDOzs7QUFHN0I7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQyxHQUFVLFNBQVNDLDRCQUE0QkMsYUFBYSxFQUFFVixNQUFNO0lBQ2pFQyxxQkFBcUJTLGVBQWVWO0lBQ3BDLElBQU1FLGlCQUFpQnpDLGlCQUFpQnVDLFFBQVFHO0lBQ2hELElBQU0xQixRQUFRdkIsdURBQTRCO0lBQzFDLElBQUl1QixNQUFNLE9BQU8sQ0FBQ2lDLGNBQWMsRUFBRTtRQUM5QkMsUUFBUSxLQUFLLENBQUUsK0JBQTRDLE9BQWRELGVBQWM7SUFDL0Q7SUFDQXhELHVEQUE0QixDQUFDLFNBQUN1QjtlQUFTLHdDQUM1QkE7WUFDSCxTQUFTLHdDQUNGQSxNQUFNLE9BQU8sR0FDaEIscUJBQUNpQyxlQUFnQlI7OztBQUdqQztBQUNBOzs7Ozs7OztDQVFDLEdBQVUsU0FBU1UsUUFBUTVCLE1BQU07UUFBRTZCLGFBQUFBLGlFQUFhO0lBQzdDM0QsdURBQTRCLENBQUMsU0FBQ3VCO2VBQVMsd0NBQzVCQTtZQUNILGlCQUNJLHFCQUFHQSxNQUFNLGVBQWUsU0FEWDtnQkFFYjtvQkFDSSxRQUFRb0M7b0JBQ1I3QixRQUFBQTtnQkFDSjthQUNIOzs7QUFFYjtBQUNBOzs7Ozs7OztDQVFDLEdBQVUsU0FBUzhCLFVBQVVqQyxVQUFVO0lBQ3BDLE9BQU8sSUFBSWtDLFFBQVEsU0FBQ0M7WUFFUEMsU0FBVCxTQUFTQSxPQUFPeEMsS0FBSztZQUNqQixJQUFJQSxNQUFNLE1BQU0sSUFBSUEsTUFBTSxNQUFNLEVBQUU7Z0JBQzlCLElBQU1PLFNBQVN4Qyx5Q0FBVUEsQ0FBQ2lDLE1BQU0sTUFBTSxFQUFFO29CQUNwQztvQkFDQTtpQkFDSDtnQkFDRHVDLFFBQVFoQztnQkFDUixJQUFJa0MsYUFBYTtvQkFDYkE7Z0JBQ0o7WUFDSjtRQUNKO1FBWkEsSUFBTUMsUUFBUWhFLDZDQUFjQSxDQUFDMEI7UUFhN0JvQyxPQUFPRSxNQUFNLFFBQVE7UUFDckIsSUFBTUQsY0FBY0MsTUFBTSxTQUFTLENBQUNGO0lBQ3hDO0FBQ0o7QUFDQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FBVSxTQUFTRyx3QkFBd0J2QyxVQUFVLEVBQUVVLFFBQVEsRUFBRThCLFdBQVc7SUFDekUsSUFBTUMsV0FBVztRQUNiLElBQUlQLFFBQVEsU0FBQ0M7Z0JBRUFDLFNBQVQsU0FBU0EsT0FBT3hDLEtBQUs7Z0JBQ2pCLElBQUlBLE1BQU0sMEJBQTBCLElBQUlBLE1BQU0sTUFBTSxFQUFFO3dCQUNyQjhDO29CQUE3QixJQUFNQyx3QkFBdUJELHFDQUFBQSxNQUFNLE1BQU0sQ0FBQyx3QkFBd0IsY0FBckNBLGdEQUFBQSxxQ0FBeUMsQ0FBQztvQkFDdkVQLFFBQVFRO29CQUNSLElBQUlOLGFBQWE7d0JBQ2JBO29CQUNKO2dCQUNKO1lBQ0o7WUFUQSxJQUFNTyxjQUFjdEUsNkNBQWNBLENBQUMwQjtZQVVuQ29DLE9BQU9RLFlBQVksUUFBUTtZQUMzQixJQUFNUCxjQUFjTyxZQUFZLFNBQVMsQ0FBQ1I7UUFDOUM7S0FDSDtJQUNELElBQUkxQixZQUFZOEIsYUFBYTtRQUN6QkMsU0FBUyxJQUFJLENBQUMsSUFBSVAsUUFBUSxTQUFDQztnQkFFZEMsU0FBVCxTQUFTQSxPQUFPeEMsS0FBSztnQkFDakIsSUFBSUEsTUFBTSxNQUFNLElBQUlBLE1BQU0sTUFBTSxFQUFFO3dCQUNEOEM7b0JBQTdCLElBQU1DLHdCQUF1QkQscUNBQUFBLE1BQU0sTUFBTSxDQUFDLHdCQUF3QixjQUFyQ0EsZ0RBQUFBLHFDQUF5QyxDQUFDO29CQUN2RVAsUUFBUVE7b0JBQ1IsSUFBSU4sYUFBYTt3QkFDYkE7b0JBQ0o7Z0JBQ0o7WUFDSjtZQVRBLElBQU1PLGNBQWNyRSxpREFBa0JBLENBQUNtQyxVQUFVOEI7WUFVakRKLE9BQU9RLFlBQVksUUFBUTtZQUMzQixJQUFNUCxjQUFjTyxZQUFZLFNBQVMsQ0FBQ1I7UUFDOUM7SUFDSjtJQUNBLE9BQU9GLFFBQVEsR0FBRyxDQUFDTztBQUN2QjtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUFVLFNBQVNJLGNBQWMxQixNQUFNLEVBQUUyQixjQUFjLEVBQUVDLGNBQWM7SUFDcEVDLGtCQUFrQjdCLFFBQVEyQixnQkFBZ0JDO0lBQzFDLElBQU01QyxTQUFTOEMsWUFBWTlCLFFBQVEyQjtJQUNuQ0ksNkJBQTZCL0IsUUFBUWhCLFFBQVE0QztJQUM3QyxPQUFPNUM7QUFDWDtBQUNBOzs7Q0FHQyxHQUFHOzs7Ozs7Ozs7Ozs7Q0FZSCxHQUFHLFNBQVNhLHVCQUF1Qm1DLGNBQWMsRUFBRUMsbUJBQW1CLEVBQUUxQyxRQUFRLEVBQUU4QixXQUFXLEVBQUVwRCxXQUFXLEVBQUVDLGVBQWU7O1FBTWpHZ0UscURBQUFBLDJDQUFBQTtJQUx2QixJQUFNeEIsZ0JBQWdCeUIsdUJBQXVCZDtJQUM3QyxJQUFNZSx3QkFBd0JuRSxZQUFZLE9BQU8sQ0FBQ3lDLGNBQWM7SUFDaEUsSUFBTTJCLHFCQUFxQkQsd0JBQXdCMUIsZ0JBQWdCdUI7SUFDbkUsSUFBTUssa0JBQWtCQyxtQkFBbUJ0RSxhQUFhQztJQUN4RCxJQUFNc0UsbUJBQW1CQyxnQkFBZ0JULGdCQUFnQk07SUFDekQsSUFBTUkseUJBQWlCUiw2QkFBQUEsd0NBQUFBLG1DQUFBQSxpQkFBa0IsY0FBYyxjQUFoQ0Esd0RBQUFBLDRDQUFBQSxnQ0FBa0MsQ0FBQzNDLFNBQVMsY0FBNUMyQyxpRUFBQUEsc0RBQUFBLDBDQUE4QyxTQUFTLGNBQXZEQSwwRUFBQUEsbURBQXlELENBQUNiLFlBQVksdUNBQUksQ0FBQztJQUNsRyxJQUFNc0Isa0JBQWtCRixnQkFBZ0JKLG9CQUFvQkM7SUFDNUQsSUFBTU0saUJBQWlCQyxhQUFhO1FBQ2hDRjtRQUNBRDtLQUNIO0lBQ0QsSUFBTTFDLFNBQVNvQyxrQ0FBQUEsbUNBQUFBLHdCQUF5Qm5FLFlBQVksT0FBTyxDQUFDZ0Usb0JBQW9CO0lBQ2hGSixrQkFBa0I3QixRQUFRNEMsZ0JBQWdCUDtJQUMxQyxJQUFNckQsU0FBUzhDLFlBQVk5QixRQUFRNEM7SUFDbkNiLDZCQUE2Qi9CLFFBQVFoQixRQUFRcUQ7SUFDN0MsT0FBT3JELE9BQU8sY0FBYztJQUM1QixPQUFPQTtBQUNYO0FBQ0EsU0FBU1UsMEJBQTBCekIsV0FBVyxFQUFFQyxlQUFlO0lBQzNELElBQUk0RSxTQUFTQyw4QkFBOEIzRyx5Q0FBU0EsQ0FBQzZCLFlBQVksT0FBTztJQUN4RSxJQUFNK0Usb0JBQ0YscUJBQUcvRSxZQUFZLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBQ2dGO2VBQUk7WUFDaENBLEVBQUUsTUFBTTtZQUNSQSxFQUFFLE1BQU07U0FDWDtlQUppQjtRQUt0QjtZQUNJL0UsZ0JBQWdCLE1BQU07WUFDdEI7U0FDSDtLQUNKO1FBQ0lTLGtDQUFBQSwyQkFBQUE7O1FBQUwsUUFBS0EsWUFBd0JxRSxzQ0FBeEJyRSxTQUFBQSw2QkFBQUEsUUFBQUEseUJBQUFBLGlDQUEwQztZQUExQ0EsbUNBQUFBLGlCQUFLSyx5QkFBUWtFO1lBQ2RKLFNBQVNELGFBQWE7Z0JBQ2xCQztnQkFDQUssMkJBQTJCbkUsUUFBUWtFO2FBQ3RDO1FBQ0w7O1FBTEt2RTtRQUFBQTs7O2lCQUFBQSw2QkFBQUE7Z0JBQUFBOzs7Z0JBQUFBO3NCQUFBQTs7OztJQU1MLE9BQU9tRTtBQUNYO0FBQ0EsU0FBU0MsOEJBQThCL0MsTUFBTTtJQUN6QyxJQUFJQSxPQUFPLGNBQWMsQ0FBQyxhQUFhO1FBQ25DLE9BQU8sd0NBQ0FBO1lBQ0gsUUFBUUEsT0FBTyxRQUFRO1lBQ3ZCLFNBQVM7O0lBRWpCLE9BQU8sSUFBSW9ELGlCQUFpQnBELFNBQVM7UUFDakMsT0FBT3BCLE9BQU8sSUFBSSxDQUFDb0IsUUFBUSxNQUFNLENBQUMsU0FBQ3FELEtBQUtDO1lBQ3BDRCxHQUFHLENBQUNDLElBQUksR0FBR1AsOEJBQThCL0MsTUFBTSxDQUFDc0QsSUFBSTtZQUNwRCxPQUFPRDtRQUNYLEdBQUcsQ0FBQztJQUNSLE9BQU87UUFDSCwrRkFBK0Y7UUFDL0YsT0FBTyxDQUFDO0lBQ1o7QUFDSjtBQUNBLFNBQVNGLDJCQUEyQm5FLE1BQU0sRUFBRWtFLE1BQU07SUFDOUMsSUFBSUUsaUJBQWlCcEUsU0FBUztRQUMxQixPQUFPSixPQUFPLElBQUksQ0FBQ0ksUUFBUSxNQUFNLENBQUMsU0FBQ3FFLEtBQUtDO1lBQ3BDRCxHQUFHLENBQUNDLElBQUksR0FBR0gsMkJBQTJCbkUsTUFBTSxDQUFDc0UsSUFBSSxFQUFFSjtZQUNuRCxPQUFPRztRQUNYLEdBQUcsQ0FBQztJQUNSLE9BQU87UUFDSCxPQUFPO1lBQ0gsUUFBUXJFO1lBQ1IsU0FBU2tFO1FBQ2I7SUFDSjtBQUNKO0FBQ0EsU0FBUzdELHdCQUF3QnBCLFdBQVcsRUFBRUMsZUFBZTtJQUN6RCxJQUFNcUYsYUFBYVYsYUFBYU4sbUJBQW1CdEUsYUFBYUM7SUFDaEUsSUFBTXNGLHNCQUFzQjVFLE9BQU8sSUFBSSxDQUFDMkUsWUFBWSxNQUFNLENBQUMsU0FBQ0YsS0FBS0M7WUFDekRHO1FBQUosS0FBSUEsa0JBQUFBLFVBQVUsQ0FBQ0gsSUFBSSxjQUFmRyxzQ0FBQUEsZ0JBQWlCLGNBQWMsRUFBRTtnQkFDdEJDO1lBQVhMLEdBQUcsQ0FBQ0MsSUFBSSxJQUFHSSxtQkFBQUEsVUFBVSxDQUFDSixJQUFJLGNBQWZJLHVDQUFBQSxpQkFBaUIsY0FBYztRQUM5QztRQUNBLE9BQU9MO0lBQ1gsR0FBRyxDQUFDO0lBQ0pNLGdDQUFnQ0g7SUFDaEMsSUFBTXBFLGNBQWNSLE9BQU8sSUFBSSxDQUFDNEUscUJBQXFCLE1BQU0sQ0FBQyxTQUFDSCxLQUFLQztRQUM5REQsTUFBTSxtQkFDQ0EsS0FDQUcsbUJBQW1CLENBQUNGLElBQUk7UUFFL0IsT0FBT0Q7SUFDWCxHQUFHLENBQUM7SUFDSixPQUFPakU7QUFDWDtBQUNBLFNBQVN1RSxnQ0FBZ0NILG1CQUFtQjtRQUNuRDdFLGtDQUFBQSwyQkFBQUE7O1FBQUwsUUFBS0EsWUFBc0NDLE9BQU8sT0FBTyxDQUFDNEUseUNBQXJEN0UsU0FBQUEsNkJBQUFBLFFBQUFBLHlCQUFBQSxpQ0FBMEU7WUFBMUVBLG1DQUFBQSxpQkFBS0UsNkJBQVkrRTtnQkFDYkMsbUNBQUFBLDRCQUFBQTs7Z0JBQUwsUUFBS0EsYUFBMEJqRixPQUFPLE9BQU8sQ0FBQ2dGLHNDQUF6Q0MsVUFBQUEsOEJBQUFBLFNBQUFBLDBCQUFBQSxrQ0FBMkQ7b0JBQTNEQSxvQ0FBQUEsa0JBQUt0RSw0QkFBVVA7b0JBQ2hCOEUsNEJBQTRCOUUsUUFBUUgsWUFBWVU7Z0JBQ3BEOztnQkFGS3NFO2dCQUFBQTs7O3lCQUFBQSw4QkFBQUE7d0JBQUFBOzs7d0JBQUFBOzhCQUFBQTs7OztRQUdUOztRQUpLbEY7UUFBQUE7OztpQkFBQUEsNkJBQUFBO2dCQUFBQTs7O2dCQUFBQTtzQkFBQUE7Ozs7QUFLVDtBQUNBLFNBQVNtRiw0QkFBNEI5RSxNQUFNLEVBQUVILFVBQVUsRUFBRVUsUUFBUTtJQUM3RCxJQUFNd0UsVUFBVyxHQUErQnhFLE9BQTdCVixZQUFXLG9CQUEyQixPQUFUVTtJQUNoRCxJQUFNeUUsY0FBZSwwQkFBaUMsT0FBUkQsU0FBUTtJQUN0RCxJQUFNRSxjQUFjckYsT0FBTyxJQUFJLENBQUNJLFFBQVEsTUFBTSxDQUFDLFNBQUNrRjtlQUFJLENBQUM7WUFDN0M7WUFDQTtZQUNBO1lBQ0E7U0FDSCxDQUFDLFFBQVEsQ0FBQ0E7O0lBQ2YsSUFBSUQsWUFBWSxNQUFNLEVBQUU7UUFDcEJFLFNBQVNKLFNBQVNDLGNBQWUsNEJBQW9ELE9BQXpCQyxZQUFZLElBQUksQ0FBQyxTQUFRO0lBQ3pGO0lBQ0EsSUFBSWpGLE9BQU8sR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDbEIsTUFBTSxPQUFPLENBQUNrQixPQUFPLEdBQUcsS0FBSyxDQUFDQSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBQ29GO21CQUFJLE9BQU9BLE1BQU07WUFBVztZQUM3RUQsU0FBU0osU0FBU0MsY0FBYztRQUNwQztJQUNKO0lBQ0EsSUFBSWhGLE9BQU8sTUFBTSxFQUFFO1FBQ2YsSUFBSSxDQUFDbEIsTUFBTSxPQUFPLENBQUNrQixPQUFPLE1BQU0sS0FBSyxDQUFDQSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBQ29GO21CQUFJLE9BQU9BLE1BQU07WUFBVztZQUNuRkQsU0FBU0osU0FBU0MsY0FBYztRQUNwQztJQUNKO0lBQ0EsSUFBSWhGLE9BQU8sS0FBSyxFQUFFO1FBQ2QsSUFBSSxDQUFDbEIsTUFBTSxPQUFPLENBQUNrQixPQUFPLEtBQUssS0FBSyxDQUFDQSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBQ29GO21CQUFJLE9BQU9BLE1BQU07WUFBVztZQUNqRkQsU0FBU0osU0FBU0MsY0FBYztRQUNwQztJQUNKO0lBQ0EsSUFBSWhGLE9BQU8sU0FBUyxFQUFFO1FBQ2xCLElBQUksQ0FBQ29FLGlCQUFpQnBFLE9BQU8sU0FBUyxHQUFHO1lBQ3JDbUYsU0FBU0osU0FBU0MsY0FBYztRQUNwQztJQUNKO0FBQ0o7QUFDQSxTQUFTekIsbUJBQW1CdEUsV0FBVyxFQUFFQyxlQUFlO0lBQ3BELE9BQ0kscUJBQUdELFlBQVksZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFDZ0Y7ZUFBSUEsRUFBRSxNQUFNO2VBRDdDO1FBRUgvRSxnQkFBZ0IsTUFBTTtLQUN6QjtBQUNMO0FBQ0E7Ozs7Q0FJQyxHQUFHLFNBQVMrQixxQkFBcUJwQixVQUFVLEVBQUVtQixNQUFNO1FBQUUrRCxVQUFBQSxpRUFBVTtJQUM1RCxJQUFNTSxnQkFBZ0I7UUFDakIxRixrQ0FBQUEsMkJBQUFBOztRQUFMLFFBQUtBLFlBQWFDLE9BQU8sSUFBSSxDQUFDb0IsUUFBUSxNQUFNLENBQUMsU0FBQ2tFO21CQUFJLENBQUNBLEVBQUUsVUFBVSxDQUFDOytCQUEzRHZGLFNBQUFBLDZCQUFBQSxRQUFBQSx5QkFBQUEsaUNBQWlFO1lBQWpFQSxJQUFNMkUsTUFBTjNFO1lBQ0QsSUFBTTJGLGNBQWNQLFVBQVdBLENBQUFBLFdBQVcsR0FBRSxJQUFLVDtZQUNqRCxJQUFNaUIsYUFBYXZFLE1BQU0sQ0FBQ3NELElBQUk7WUFDOUIsSUFBSWdCLGdCQUFnQixzQkFBc0I7Z0JBQ3RDM0QsUUFBUSxLQUFLLENBQUUsR0FBaUkwRCxPQUEvSHhGLFlBQVcsc0hBQWtJLE9BQWR3RjtZQUNwSjtZQUNBLElBQUlDLGdCQUFnQix5QkFBeUI7Z0JBQ3pDM0QsUUFBUSxLQUFLLENBQUUsR0FBdUkwRCxPQUFySXhGLFlBQVcsNEhBQXdJLE9BQWR3RjtZQUMxSjtZQUNBLElBQUksQ0FBQ2pCLGlCQUFpQm1CLGFBQWE7Z0JBQy9CNUQsUUFBUSxLQUFLLENBQUUsR0FBMEQyRCxPQUF4RHpGLFlBQVcsK0NBQThEd0YsT0FBakJDLGFBQVksT0FBbUIsT0FBZEQ7Z0JBQzFGO1lBQ0o7WUFDQSxJQUFJLENBQUNFLFdBQVcsY0FBYyxDQUFDLGFBQWE7Z0JBQ3hDLGlDQUFpQztnQkFDakN0RSxxQkFBcUJwQixZQUFZMEYsWUFBWUQ7WUFDakQ7WUFDQSxJQUFNRSxXQUFXRCxXQUFXLFNBQVM7WUFDckMsSUFBSUUsZ0JBQWdCRCxXQUFXO2dCQUMzQnZFLHFCQUFxQnBCLFlBQVkyRixVQUFVRixjQUFjO1lBQzdEO1lBQ0EsSUFBSUMsV0FBVyxXQUFXLEVBQUU7b0JBQ25CVixtQ0FBQUEsNEJBQUFBOztvQkFBTCxRQUFLQSxhQUFpQlUsV0FBVyxXQUFXLHFCQUF2Q1YsVUFBQUEsOEJBQUFBLFNBQUFBLDBCQUFBQSxrQ0FBd0M7d0JBQXhDQSxJQUFJYSxjQUFKYjt3QkFDRCxJQUFJLE9BQU9hLGdCQUFjLFlBQVk7NEJBQ2pDL0QsUUFBUSxLQUFLLENBQUUsR0FBK0MyRCxPQUE3Q3pGLFlBQVcsb0NBQWtEd0YsT0FBaEJDLGFBQVksTUFBa0IsT0FBZEQsZUFBYyxPQUFLLG1GQUFvRiwwQ0FBbUQsT0FBVkssYUFBVTt3QkFDNU87b0JBQ0o7O29CQUpLYjtvQkFBQUE7Ozs2QkFBQUEsOEJBQUFBOzRCQUFBQTs7OzRCQUFBQTtrQ0FBQUE7Ozs7WUFLVDtZQUNBLElBQU1jLFlBQVlKLFdBQVcsS0FBSztZQUNsQyxJQUFJSSxhQUFhLENBQUMvRixPQUFPLE1BQU0sQ0FBQ25DLCtCQUFJQSxFQUFFLFFBQVEsQ0FBQ2tJLFlBQVk7Z0JBQ3ZEaEUsUUFBUSxLQUFLLENBQUUsR0FBMEMyRCxPQUF4Q3pGLFlBQVcsK0JBQTZDd0YsT0FBaEJDLGFBQVksTUFBa0IsT0FBZEQsZUFBYyxPQUFNLHVEQUFxRixPQUEvQnpGLE9BQU8sTUFBTSxDQUFDbkMsK0JBQUlBLEVBQUUsSUFBSSxDQUFDLE9BQU0sUUFBTyxhQUFzQixPQUFWa0ksV0FBVTtZQUNuTjtZQUNBLElBQUkvRixPQUFPLElBQUksQ0FBQzJGLFlBQVksS0FBSyxDQUFDLFNBQUNMO3VCQUFJO29CQUMvQjtvQkFDQTtvQkFDQTtvQkFDQTtpQkFDSCxDQUFDLFFBQVEsQ0FBQ0E7a0JBQU8sQ0FBQ0gsUUFBUSxRQUFRLENBQUMsZUFBZTtnQkFDbkRwRCxRQUFRLEtBQUssQ0FBRSxHQUEwRDJELE9BQXhEekYsWUFBVywrQ0FBOER3RixPQUFqQkMsYUFBWSxPQUFtQixPQUFkRCxlQUFjLE9BQUssNEVBQTZFLFlBQXNDLE9BQTNCTyxLQUFLLFNBQVMsQ0FBQ0w7WUFDeE47WUFDQSxJQUFJQyxZQUFZRyxhQUFhLENBQUM7Z0JBQzFCbEkscUNBQVU7Z0JBQ1ZBLHNDQUFXO2FBQ2QsQ0FBQyxRQUFRLENBQUNrSSxZQUFZO2dCQUNuQmhFLFFBQVEsS0FBSyxDQUFFLEdBQTBEMkQsT0FBeER6RixZQUFXLCtDQUE4RHdGLE9BQWpCQyxhQUFZLE9BQW1CLE9BQWRELGVBQWMsT0FBSyw0R0FBNkcsWUFBcUMsT0FBMUJPLEtBQUssU0FBUyxDQUFDRDtZQUN4UDtRQUNKOztRQTlDS2hHO1FBQUFBOzs7aUJBQUFBLDZCQUFBQTtnQkFBQUE7OztnQkFBQUE7c0JBQUFBOzs7O0FBK0NUO0FBQ0EsU0FBU00sbUJBQW1CSixVQUFVLEVBQUVaLFdBQVcsRUFBRUMsZUFBZTtJQUNoRSxJQUFNOEIsU0FBUy9CLFlBQVksT0FBTyxDQUFDWSxXQUFXO0lBQzlDLElBQU1nRyxjQUFjcEMsZ0JBQWdCNUQsWUFBWTBELG1CQUFtQnRFLGFBQWFDO0lBQ2hGMkQsa0JBQWtCN0IsUUFBUTZFLGFBQWFoRztJQUN2QyxJQUFNRyxTQUFTOEMsWUFBWTlCLFFBQVE2RTtJQUNuQzlDLDZCQUE2Qi9CLFFBQVFoQixRQUFRSDtJQUM3QyxPQUFPRyxPQUFPLGNBQWM7SUFDNUIsT0FBT0E7QUFDWDtBQUNBLFNBQVNHLGlDQUFpQ04sVUFBVSxFQUFFWixXQUFXLEVBQUVDLGVBQWU7SUFDOUUsSUFBTTJHLGNBQWNwQyxnQkFBZ0I1RCxZQUFZMEQsbUJBQW1CdEUsYUFBYUM7SUFDaEYsSUFBTWMsU0FBUzhDLFlBQVkzQixzQkFBc0IwRTtJQUNqRDlDLDZCQUE2QjVCLHNCQUFzQm5CLFFBQVFIO0lBQzNELE9BQU9HLE9BQU8sY0FBYztJQUM1QixPQUFPQTtBQUNYO0FBQ0EsU0FBU3lELGdCQUFnQjVELFVBQVUsRUFBRTBFLFVBQVU7SUFDM0MsSUFBTXVCLHNCQUFzQnZCLFdBQVcsR0FBRyxDQUFDO1lBQWlCTixVQUFicEU7ZUFBbUJvRTtPQUFHLE1BQU0sQ0FBQyxTQUFDQTtlQUFJLENBQUMsQ0FBQ0E7O0lBQ25GLE9BQU9KLGFBQWFpQztBQUN4QjtBQUNBLFNBQVNqQyxhQUFhbEQsT0FBTztJQUN6QixPQUFPQSxRQUFRLE1BQU0sQ0FBQyxTQUFDb0YsS0FBSy9GO2VBQVN2QixpQkFBaUJzSCxLQUFLL0Y7T0FBUyxDQUFDO0FBQ3pFO0FBQ0E7Ozs7O0NBS0MsR0FBRyxTQUFTNkMsa0JBQWtCN0IsTUFBTSxFQUFFaEIsTUFBTTtRQUFFK0UsVUFBQUEsaUVBQVU7UUFFaERwRixrQ0FBQUEsMkJBQUFBOztRQURMLG9DQUFvQztRQUNwQyxRQUFLQSxZQUFhQyxPQUFPLElBQUksQ0FBQ0ksNEJBQXpCTCxTQUFBQSw2QkFBQUEsUUFBQUEseUJBQUFBLGlDQUFpQztZQUFqQ0EsSUFBTTJFLE1BQU4zRTtZQUNELElBQU1xRyxRQUFRaEcsTUFBTSxDQUFDc0UsSUFBSTtZQUN6QixJQUFNZ0IsY0FBY1AsVUFBVSxNQUFNVDtZQUNwQyxJQUFNaUIsYUFBYXZFLE1BQU0sQ0FBQ3NELElBQUk7WUFDOUIsSUFBSSxDQUFDdEQsT0FBTyxjQUFjLENBQUNzRCxNQUFNO2dCQUM3QixJQUFJLENBQUVBLENBQUFBLFFBQVEsb0JBQW9CUyxZQUFZLEVBQUMsR0FBSTtvQkFDL0NJLFNBQVNHLGFBQWMsdUJBQWtDLE9BQVpBLGFBQVk7Z0JBQzdEO2dCQUNBO1lBQ0o7WUFDQVcsd0JBQXdCVixZQUFZUyxPQUFPVjtRQUMvQzs7UUFYSzNGO1FBQUFBOzs7aUJBQUFBLDZCQUFBQTtnQkFBQUE7OztnQkFBQUE7c0JBQUFBOzs7O0FBWVQ7QUFDQSxTQUFTc0csd0JBQXdCVixVQUFVLEVBQUVTLEtBQUssRUFBRWpCLE9BQU87SUFDdkRtQixVQUFVbkIsU0FBU1EsV0FBVyxLQUFLLEVBQUVTO0lBQ3JDLElBQUk1QixpQkFBaUI0QixRQUFRO1FBQ3pCLElBQUlULFdBQVcsS0FBSyxLQUFLOUgsc0NBQVcsRUFBRTtZQUNsQyw4QkFBOEI7WUFDOUIwSSxnQ0FBZ0NaLFlBQVlTLE9BQU9qQjtRQUN2RCxPQUFPLElBQUksQ0FBRVEsQ0FBQUEsV0FBVyxjQUFjLENBQUMsZUFBZUEsV0FBVyxjQUFjLENBQUMsUUFBTyxHQUFJO1lBQ3ZGLG1DQUFtQztZQUNuQzFDLGtCQUFrQjBDLFlBQVlTLE9BQU9qQjtRQUN6QztJQUNKLE9BQU87UUFDSCxJQUFJUSxXQUFXLEtBQUssS0FBSzlILHFDQUFVLEVBQUU7WUFDakMySSx1QkFBdUJiLFlBQVlTLE9BQU9qQjtRQUM5QztJQUNKO0FBQ0o7QUFDQSxTQUFTb0IsZ0NBQWdDRSxvQkFBb0IsRUFBRXJHLE1BQU0sRUFBRStFLE9BQU87SUFDMUUsSUFBSXNCLHFCQUFxQixTQUFTLEVBQUU7WUFDM0IxRyxrQ0FBQUEsMkJBQUFBOztZQUFMLFFBQUtBLFlBQWFDLE9BQU8sSUFBSSxDQUFDSSw0QkFBekJMLFNBQUFBLDZCQUFBQSxRQUFBQSx5QkFBQUEsaUNBQWlDO2dCQUFqQ0EsSUFBTTJFLE1BQU4zRTtnQkFDRCxJQUFNcUcsUUFBUWhHLE1BQU0sQ0FBQ3NFLElBQUk7Z0JBQ3pCMkIsd0JBQXdCSSxxQkFBcUIsU0FBUyxFQUFFTCxPQUFRLEdBQWExQixPQUFYUyxTQUFRLEtBQU8sT0FBSlQ7WUFDakY7O1lBSEszRTtZQUFBQTs7O3FCQUFBQSw2QkFBQUE7b0JBQUFBOzs7b0JBQUFBOzBCQUFBQTs7OztJQUlUO0FBQ0o7QUFDQSxTQUFTeUcsdUJBQXVCRSxXQUFXLEVBQUVOLEtBQUssRUFBRWpCLE9BQU87SUFDdkQsSUFBTXdCLG1CQUFtQkwsVUFBVW5CLFNBQVN0SCxxQ0FBVSxFQUFFdUk7SUFDeEQsSUFBSSxDQUFDTyxrQkFBa0I7UUFDbkI7SUFDSjtJQUNBLDRFQUE0RTtJQUM1RSxJQUFJZCxnQkFBZ0JhLFlBQVksU0FBUyxHQUFHO1FBQ3hDLElBQUksSUFBSUUsSUFBSSxHQUFHQSxJQUFJUixNQUFNLE1BQU0sRUFBRVEsSUFBSTtZQUNqQ1Asd0JBQXdCSyxZQUFZLFNBQVMsRUFBRU4sS0FBSyxDQUFDUSxFQUFFLEVBQUcsR0FBYUEsT0FBWHpCLFNBQVEsS0FBSyxPQUFGeUIsR0FBRTtRQUM3RTtJQUNKO0lBQ0EsSUFBSSxJQUFJQyxLQUFJLEdBQUdBLEtBQUlULE1BQU0sTUFBTSxFQUFFUyxLQUFJO1lBQ0hDO1FBQTlCUixVQUFXLEdBQWFPLE9BQVgxQixTQUFRLEtBQUssT0FBRjBCLElBQUUsT0FBSUMseUJBQUFBLFlBQVksU0FBUyxjQUFyQkEsNkNBQUFBLHVCQUF1QixLQUFLLEVBQUVWLEtBQUssQ0FBQ1MsR0FBRTtJQUN4RTtBQUNKO0FBQ0E7Ozs7Q0FJQyxHQUFHLFNBQVMxRCw2QkFBNkIvQixNQUFNLEVBQUVoQixNQUFNO1FBQUUrRSxVQUFBQSxpRUFBVTtJQUNoRSxzRkFBc0Y7SUFDdEYsSUFBSS9ELFFBQVE7UUFDUixJQUFJaEIsV0FBV2dCLE9BQU8sUUFBUSxFQUFFO1lBQzVCMkYsY0FBYzVCLFNBQVMvRCxPQUFPLFdBQVcsRUFBRWhCO1FBQy9DO1FBQ0EsSUFBSW9FLGlCQUFpQnBFLFNBQVM7Z0JBQ3JCTCxrQ0FBQUEsMkJBQUFBOztnQkFBTCxRQUFLQSxZQUFhQyxPQUFPLElBQUksQ0FBQ0ksNEJBQXpCTCxTQUFBQSw2QkFBQUEsUUFBQUEseUJBQUFBLGlDQUFpQztvQkFBakNBLElBQU0yRSxNQUFOM0U7b0JBQ0QsSUFBTXFHLFFBQVFoRyxNQUFNLENBQUNzRSxJQUFJO29CQUN6QixJQUFNZ0IsY0FBY1AsVUFBVSxNQUFNVDtvQkFDcEMsSUFBTWlCLGFBQWF2RSxNQUFNLENBQUNzRCxJQUFJO29CQUM5QixJQUFJdEQsT0FBTyxLQUFLLEtBQUt2RCxzQ0FBVyxJQUFJdUQsT0FBTyxTQUFTLEVBQUU7d0JBQ2xEK0IsNkJBQTZCL0IsT0FBTyxTQUFTLEVBQUVnRixPQUFPVjtvQkFDMUQsT0FBTzt3QkFDSHZDLDZCQUE2QndDLFlBQVlTLE9BQU9WO29CQUNwRDtnQkFDSjs7Z0JBVEszRjtnQkFBQUE7Ozt5QkFBQUEsNkJBQUFBO3dCQUFBQTs7O3dCQUFBQTs4QkFBQUE7Ozs7UUFVVCxPQUFPLElBQUliLE1BQU0sT0FBTyxDQUFDa0IsV0FBV2dCLE9BQU8sU0FBUyxFQUFFO1lBQ2xELElBQUksSUFBSXdGLElBQUksR0FBR0EsSUFBSXhHLE9BQU8sTUFBTSxFQUFFd0csSUFBSTtnQkFDbEN6RCw2QkFBNkIvQixPQUFPLFNBQVMsRUFBRWhCLE1BQU0sQ0FBQ3dHLEVBQUUsRUFBRyxHQUFhQSxPQUFYekIsU0FBUSxLQUFLLE9BQUZ5QixHQUFFO1lBQzlFO1FBQ0o7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQUcsU0FBU04sVUFBVW5CLE9BQU8sRUFBRTZCLEtBQUssRUFBRVosS0FBSztJQUN4QyxJQUFJWSxPQUFPO1FBQ1Asc0VBQXNFO1FBQ3RFLElBQU1sQixjQUFZO1lBQ2QsT0FBT2hJLHVEQUFPQTtZQUNkLFNBQVNDLHlEQUFTQTtZQUNsQixhQUFhQyxzREFBTUE7WUFDbkIsUUFBUUMsd0RBQVFBO1lBQ2hCLFFBQVFDLHdEQUFRQTtZQUNoQixRQUFRQyx3REFBUUE7WUFDaEIsTUFBTUgsc0RBQU1BO1lBQ1oseUJBQXlCQSxzREFBTUE7WUFDL0IsMkJBQTJCQSxzREFBTUE7UUFDckM7UUFDQSxPQUFPK0ksY0FBYzVCLFNBQVM7WUFDMUJXLFdBQVMsQ0FBQ2tCLE1BQU07U0FDbkIsRUFBRVo7SUFDUDtJQUNBLE9BQU87QUFDWDtBQUNBOzs7Q0FHQyxHQUFHLHNFQUFzRTtBQUMxRSxTQUFTVyxjQUFjNUIsT0FBTyxFQUFFOEIsVUFBVSxFQUFFYixLQUFLO0lBQzdDLElBQUljLGNBQWM7SUFDbEIsSUFBSUQsWUFBWTtRQUNaLElBQUk7Z0JBQ0tsSCxrQ0FBQUEsMkJBQUFBOztnQkFBTCxRQUFLQSxZQUFpQmtILCtCQUFqQmxILFNBQUFBLDZCQUFBQSxRQUFBQSx5QkFBQUEsaUNBQTRCO29CQUE1QkEsSUFBSStGLGNBQUovRjtvQkFDRCxJQUFNb0gsa0JBQWtCckIsWUFBVU07b0JBQ2xDLElBQUksT0FBT2Usb0JBQW9CLFVBQVU7d0JBQ3JDLElBQU1DLFVBQVVDLENBQUFBLE9BQU9qQixzQ0FBUGlCLFNBQU9qQixNQUFJLE1BQU0sV0FBWSw2QkFBd0NlLE9BQVpoQyxTQUFRLE1BQW9CLE9BQWhCZ0MsbUJBQXFCLCtCQUEyQ2hDLE9BQWJpQixPQUFNLFNBQW1CZSxPQUFaaEMsU0FBUSxNQUFvQixPQUFoQmdDO3dCQUNqSzVCLFNBQVNKLFNBQVNpQzt3QkFDbEJGLGNBQWM7b0JBQ2xCO2dCQUNKOztnQkFQS25IO2dCQUFBQTs7O3lCQUFBQSw2QkFBQUE7d0JBQUFBOzs7d0JBQUFBOzhCQUFBQTs7OztRQVFULEVBQUUsT0FBT3VILEdBQUc7WUFDUnZGLFFBQVEsS0FBSyxDQUFFLGtDQUFtRXVGLE9BQWxDbkMsU0FBUSwyQkFBNEIsT0FBRm1DO1FBQ3RGO0lBQ0o7SUFDQSxPQUFPSjtBQUNYO0FBQ0EsOERBQThEO0FBQzlELElBQU1oRSxjQUFjLHNCQUFDOUIsUUFBUTZFO0lBQ3pCLElBQU03RixTQUFTbUgsZ0JBQWdCdEI7SUFDL0IsSUFBSSxDQUFDN0UsUUFBUTtRQUNULE9BQU9oQjtJQUNYO1FBQ0tMLGtDQUFBQSwyQkFBQUE7OztZQUFBQSxJQUFNMkUsTUFBTjNFO1lBQ0QsSUFBTXlILGFBQWFwSCxNQUFNLENBQUNzRSxJQUFJO1lBQzlCLElBQU1pQixhQUFhdkUsTUFBTSxDQUFDc0QsSUFBSTtZQUM5QixtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLG1FQUFtRTtZQUNuRSxzRUFBc0U7WUFDdEUsd0JBQXdCO1lBQ3hCLElBQUlpQixjQUFlQSxDQUFBQSxXQUFXLGNBQWMsQ0FBQyxZQUFZQSxXQUFXLGNBQWMsQ0FBQyxXQUFVLEdBQUk7Z0JBQzdGLGlFQUFpRTtnQkFDakUsb0NBQW9DO2dCQUNwQyxJQUFJLENBQUN2RixPQUFPLGNBQWMsQ0FBQ3NFLE1BQU07b0JBQzdCdEUsTUFBTSxDQUFDc0UsSUFBSSxHQUFHaUIsVUFBVSxDQUFDLFdBQVc7Z0JBQ3hDO2dCQUNBLDJGQUEyRjtnQkFDM0YsSUFBTUMsV0FBV0QsV0FBVyxTQUFTO2dCQUNyQyxJQUFJNkIsY0FBYzNCLGdCQUFnQkQsV0FBVztvQkFDekMsSUFBSUQsV0FBVyxLQUFLLEtBQUs5SCxxQ0FBVSxJQUFJcUIsTUFBTSxPQUFPLENBQUNzSSxhQUFhO3dCQUM5RCxJQUFNQyxxQkFBcUJELFdBQVcsR0FBRyxDQUFDLFNBQUNFO21DQUFPeEUsWUFBWTBDLFVBQVU4Qjs7d0JBQ3hFdEgsTUFBTSxDQUFDc0UsSUFBSSxHQUFHK0M7b0JBQ2xCLE9BQU8sSUFBSTlCLFdBQVcsS0FBSyxLQUFLOUgsc0NBQVcsRUFBRTs0QkFDcENrQyxrQ0FBQUEsMkJBQUFBOzs0QkFBTCxRQUFLQSxZQUFpQkMsT0FBTyxJQUFJLENBQUN3SCxnQ0FBN0J6SCxVQUFBQSw2QkFBQUEsU0FBQUEseUJBQUFBLGlDQUF5QztnQ0FBekNBLElBQUk0SCxZQUFKNUg7Z0NBQ0R5SCxVQUFVLENBQUNHLFVBQVUsR0FBR3pFLFlBQVkwQyxVQUFVNEIsVUFBVSxDQUFDRyxVQUFVOzRCQUN2RTs7NEJBRks1SDs0QkFBQUE7OztxQ0FBQUEsNkJBQUFBO29DQUFBQTs7O29DQUFBQTswQ0FBQUE7Ozs7b0JBR1Q7Z0JBQ0o7WUFDSixPQUFPLElBQUl5RSxpQkFBaUJtQixhQUFhO2dCQUNyQyx1RUFBdUU7Z0JBQ3ZFLHlGQUF5RjtnQkFDekYsd0VBQXdFO2dCQUN4RSxJQUFNaUMscUJBQXFCSix1QkFBQUEsd0JBQUFBLGFBQWMsQ0FBQztnQkFDMUMsdUZBQXVGO2dCQUN2RixJQUFJaEQsaUJBQWlCb0QscUJBQXFCO29CQUN0Q3hILE1BQU0sQ0FBQ3NFLElBQUksR0FBR3hCLFlBQVl5QyxZQUFZaUM7Z0JBQzFDO1lBQ0o7UUFDSjtRQXBDQSxRQUFLN0gsWUFBYUMsT0FBTyxJQUFJLENBQUNvQiw0QkFBekJyQixTQUFBQSw2QkFBQUEsUUFBQUEseUJBQUFBOztRQUFBQTtRQUFBQTs7O2lCQUFBQSw2QkFBQUE7Z0JBQUFBOzs7Z0JBQUFBO3NCQUFBQTs7OztJQXFDTCxPQUFPSztBQUNYO0FBQ0EsU0FBU3lGLGdCQUFnQmdDLGNBQWM7SUFDbkMsT0FBTyxDQUFDLENBQUNBLGtCQUFrQjdILE9BQU8sSUFBSSxDQUFDNkgsZ0JBQWdCLE1BQU0sQ0FBQyxTQUFDUDtlQUFJLENBQUM7WUFDNUQ7WUFDQTtTQUNILENBQUMsUUFBUSxDQUFDQTtPQUFJLE1BQU0sR0FBRztBQUNoQztBQUNBLFNBQVM5QyxpQkFBaUI0QixLQUFLO0lBQzNCLE9BQU9pQixDQUFBQSxPQUFPakIsc0NBQVBpQixTQUFPakIsTUFBSSxNQUFNLFlBQVksQ0FBQ2xILE1BQU0sT0FBTyxDQUFDa0gsVUFBVUEsVUFBVTtBQUMzRTtBQUNBLHFHQUFxRyxHQUFHLElBQUkwQiw4QkFBOEIsSUFBSUM7QUFDOUksU0FBU3hDLFNBQVNKLE9BQU8sRUFBRWlDLE9BQU87SUFDOUIsSUFBTTFDLE1BQU8sR0FBZTBDLE9BQWJqQyxTQUFRLE9BQWEsT0FBUmlDO0lBQzVCLGdIQUFnSDtJQUNoSCxJQUFJLENBQUNVLDZCQUE2QjtRQUM5QkEsOEJBQThCLElBQUlDO0lBQ3RDO0lBQ0EsSUFBSSxDQUFDRCw0QkFBNEIsR0FBRyxDQUFDcEQsTUFBTTtRQUN2QzNDLFFBQVEsS0FBSyxDQUFDcUY7UUFDZFUsNEJBQTRCLEdBQUcsQ0FBQ3BEO0lBQ3BDO0FBQ0o7QUFDQTs7Ozs7Q0FLQyxHQUFVLFNBQVNzRCxrQkFBa0I3QyxPQUFPO0lBQ3pDLElBQUlBLFNBQVM7UUFDVDJDLDRCQUE0QixPQUFPLENBQUMsU0FBQ3BEO1lBQ2pDLElBQUlBLElBQUksVUFBVSxDQUFDUyxVQUFVO2dCQUN6QjJDLDRCQUE0QixNQUFNLENBQUNwRDtZQUN2QztRQUNKO0lBQ0osT0FBTztRQUNIb0QsNEJBQTRCLEtBQUs7SUFDckM7QUFDSjtBQUNBOzs7Ozs7O0NBT0MsR0FBVSxTQUFTRztJQUNoQjlJLG9CQUFvQixPQUFPLENBQUMsU0FBQ21EO2VBQWNBOztJQUMzQ25ELG9CQUFvQixNQUFNLEdBQUc7SUFDN0JTO0FBQ0o7QUFDQTs7O0NBR0MsR0FBRyxTQUFTMkQsdUJBQXVCZCxXQUFXO0lBQzNDLElBQXdCeUYsc0NBQUFBLFlBQVksS0FBSyxDQUFDLFVBQW5DcEcsZ0JBQWlCb0c7SUFDeEIsT0FBT3BHO0FBQ1g7QUFDQTs7O0NBR0MsR0FBRyxJQUFNRiw2QkFBNkI7SUFDbkMseUJBQXlCO1FBQ3JCLGNBQWM7UUFDZCxPQUFPL0Qsc0NBQVc7UUFDbEIsVUFBVSxDQUFDO1FBQ1gsYUFBYTtZQUNUTyx1REFBU0EsQ0FBQyxTQUFDK0o7dUJBQUluSSxPQUFPLElBQUksQ0FBQ21JLEdBQUcsS0FBSyxDQUFDLFNBQUM3QzsyQkFBSSw2QkFBNkIsSUFBSSxDQUFDQTs7ZUFBSyxTQUFDNkM7Z0JBQzdFLElBQU1DLFVBQVVwSSxPQUFPLElBQUksQ0FBQ21JLEdBQUcsTUFBTSxDQUFDLFNBQUM3QzsyQkFBSSxDQUFDLDZCQUE2QixJQUFJLENBQUNBOztnQkFDOUUsT0FBUSxnUUFBa1IsT0FBbkI4QyxRQUFRLElBQUksQ0FBQyxPQUFNO1lBQzlSO1NBQ0g7SUFDTDtBQUNKO0FBQ0E7O0NBRUMsR0FBRyxJQUFNN0csdUJBQXVCO0lBQzdCLHNCQUFzQjtRQUNsQixZQUFZO1lBQ1IsY0FBYztZQUNkLE9BQU8xRCxxQ0FBVTtZQUNqQixVQUFVLEVBQUU7UUFDaEI7UUFDQSxZQUFZO1lBQ1IsY0FBYztZQUNkLE9BQU9BLHNDQUFXO1lBQ2xCLFVBQVV3SztRQUNkO0lBQ0o7R0FDR3pHIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n\n}");
5584
5584
 
5585
5585
  },
5586
5586
  "../../framework/esm-config/dist/module-config/state.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
@@ -5930,7 +5930,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
5930
5930
  },
5931
5931
  "../../framework/esm-react-utils/dist/ExtensionSlot.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
5932
5932
  "use strict";
5933
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n ExtensionSlot: () => (ExtensionSlot)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var _ComponentContext_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* import */ var _Extension_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-react-utils/dist/Extension.js\");\n/* import */ var _useExtensionSlot_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _object_without_properties(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys, key, i;\n if (typeof Reflect !== \"undefined\" && Reflect.ownKeys) {\n sourceKeys = Reflect.ownKeys(Object(source));\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n }\n target = _object_without_properties_loose(source, excluded);\n if (Object.getOwnPropertySymbols) {\n sourceKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _object_without_properties_loose(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n}\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(_0) {\n var extensionSlotName = _0.name, legacyExtensionSlotName = _0.extensionSlotName, _0_select = _0.select, select = _0_select === void 0 ? defaultSelect : _0_select, children = _0.children, state = _0.state, style = _0.style, divProps = _object_without_properties(_0, [\n \"name\",\n \"extensionSlotName\",\n \"select\",\n \"children\",\n \"state\",\n \"style\"\n ]);\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 var name = extensionSlotName !== null && extensionSlotName !== void 0 ? extensionSlotName : legacyExtensionSlotName;\n var slotRef = (0,react__rspack_import_0.useRef)(null);\n var _useExtensionSlot = (0,_useExtensionSlot_js__rspack_import_3.useExtensionSlot)(name, state), extensions = _useExtensionSlot.extensions, extensionSlotModuleName = _useExtensionSlot.extensionSlotModuleName;\n var extensionsToRender = (0,react__rspack_import_0.useMemo)(function() {\n return select(extensions);\n }, [\n select,\n extensions\n ]);\n var extensionsFromChildrenFunction = (0,react__rspack_import_0.useMemo)(function() {\n if (typeof children == 'function' && !/*#__PURE__*/ react__rspack_import_0_default().isValidElement(children)) {\n return extensionsToRender.map(function(extension) {\n return children(extension, state);\n });\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(\"div\", _object_spread({\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: _object_spread_props(_object_spread({}, style), {\n position: 'relative'\n })\n }, divProps), name && (extensionsToRender === null || extensionsToRender === void 0 ? void 0 : extensionsToRender.map(function(extension, i) {\n var _ref, _ref1;\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(_ComponentContext_js__rspack_import_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: extensionSlotModuleName\n }\n }\n }, (_ref = (_ref1 = extensionsFromChildrenFunction === null || extensionsFromChildrenFunction === void 0 ? void 0 : extensionsFromChildrenFunction[i]) !== null && _ref1 !== void 0 ? _ref1 : typeof children !== 'function' ? children : null) !== null && _ref !== void 0 ? _ref : /*#__PURE__*/ react__rspack_import_0_default().createElement(_Extension_js__rspack_import_2.Extension, {\n state: state\n }));\n })));\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvRXh0ZW5zaW9uU2xvdC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanM/ZjBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRXh0ZW5zaW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi9FeHRlbnNpb24uanNcIjtcbmltcG9ydCB7IHVzZUV4dGVuc2lvblNsb3QgfSBmcm9tIFwiLi91c2VFeHRlbnNpb25TbG90LmpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0U2VsZWN0KGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbi8qKlxuICogQW4gW2V4dGVuc2lvbiBzbG90XShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9leHRlbnNpb24tc3lzdGVtKS5cbiAqIEEgcGxhY2Ugd2l0aCBhIG5hbWUuIEV4dGVuc2lvbnMgdGhhdCBnZXQgY29ubmVjdGVkIHRvIHRoYXQgbmFtZVxuICogd2lsbCBiZSByZW5kZXJlZCBpbnRvIHRoaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSByZWFjdCBub2RlIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiRm9vXCI+XG4gKiAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDEwcmVtIH19PlxuICogICAgIDxFeHRlbnNpb24gLz5cbiAqICAgPC9kaXY+XG4gKiA8L0V4dGVuc2lvblNsb3Q+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFzc2luZyBhIGZ1bmN0aW9uIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiQmFyXCI+XG4gKiAgIHsoZXh0ZW5zaW9uKSA9PiAoXG4gKiAgICAgPGgxPntleHRlbnNpb24ubmFtZX08L2gxPlxuICogICAgIDxkaXYgc3R5bGU9e3sgY29sb3I6IGV4dGVuc2lvbi5tZXRhLmNvbG9yIH19PlxuICogICAgICAgPEV4dGVuc2lvbiAvPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICovIGV4cG9ydCBmdW5jdGlvbiBFeHRlbnNpb25TbG90KHsgbmFtZTogZXh0ZW5zaW9uU2xvdE5hbWUsIGV4dGVuc2lvblNsb3ROYW1lOiBsZWdhY3lFeHRlbnNpb25TbG90TmFtZSwgc2VsZWN0ID0gZGVmYXVsdFNlbGVjdCwgY2hpbGRyZW4sIHN0YXRlLCBzdHlsZSwgLi4uZGl2UHJvcHMgfSkge1xuICAgIGlmIChjaGlsZHJlbiAmJiBzdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggY2hpbGRyZW4gYW5kIHN0YXRlIGhhdmUgYmVlbiBwcm92aWRlZC4gSWYgY2hpbGRyZW4gYXJlIHByb3ZpZGVkLCB0aGUgc3RhdGUgbXVzdCBiZSBwYXNzZWQgYXMgYSBwcm9wIHRvIHRoZSBgRXh0ZW5zaW9uYCBjb21wb25lbnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBleHRlbnNpb25TbG90TmFtZSA/PyBsZWdhY3lFeHRlbnNpb25TbG90TmFtZTtcbiAgICBjb25zdCBzbG90UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucywgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUgfSA9IHVzZUV4dGVuc2lvblNsb3QobmFtZSwgc3RhdGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnNUb1JlbmRlciA9IHVzZU1lbW8oKCk9PnNlbGVjdChleHRlbnNpb25zKSwgW1xuICAgICAgICBzZWxlY3QsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24gPSB1c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT0gJ2Z1bmN0aW9uJyAmJiAhLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZW5kZXIubWFwKChleHRlbnNpb24pPT5jaGlsZHJlbihleHRlbnNpb24sIHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBleHRlbnNpb25zVG9SZW5kZXJcbiAgICBdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBzbG90UmVmLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbmFtZVwiOiBuYW1lLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbW9kdWxlLW5hbWVcIjogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRpdlByb3BzXG4gICAgfSwgbmFtZSAmJiBleHRlbnNpb25zVG9SZW5kZXI/Lm1hcCgoZXh0ZW5zaW9uLCBpKT0+LyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIGtleTogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb25TbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBleHRlbnNpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TW9kdWxlTmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uPy5baV0gPz8gKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuIDogbnVsbCkgPz8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dGVuc2lvbiwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0pKSkpO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwidXNlUmVmIiwidXNlTWVtbyIsIkNvbXBvbmVudENvbnRleHQiLCJFeHRlbnNpb24iLCJ1c2VFeHRlbnNpb25TbG90IiwiZGVmYXVsdFNlbGVjdCIsImV4dGVuc2lvbnMiLCJFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE5hbWUiLCJsZWdhY3lFeHRlbnNpb25TbG90TmFtZSIsInNlbGVjdCIsImNoaWxkcmVuIiwic3RhdGUiLCJzdHlsZSIsImRpdlByb3BzIiwiRXJyb3IiLCJuYW1lIiwic2xvdFJlZiIsIl91c2VFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25zVG9SZW5kZXIiLCJleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24iLCJleHRlbnNpb24iLCJpIiwiX3JlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUFrRDtBQUN6QjtBQUNkO0FBQ2M7QUFDekQsU0FBU00sY0FBY0MsVUFBVTtJQUM3QixPQUFPQTtBQUNYO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUFVLFNBQVNDLGNBQWMsRUFBb0k7UUFBNUhDLHVCQUFOLE1BQTRDQyw2QkFBbkIsa0NBQTRDQyxRQUFBQSxnQ0FBU0wsMkJBQWVNLGNBQUFBLFVBQVVDLFdBQUFBLE9BQU9DLFdBQUFBLE9BQVVDOzs7Ozs7OztJQUN4SixJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLElBQU1DLE9BQU9SLDhCQUFBQSwrQkFBQUEsb0JBQXFCQztJQUNsQyxJQUFNUSxVQUFVakIsaUNBQU1BLENBQUM7SUFDdkIsSUFBZ0RrQixvQkFBQUEsMERBQWdCQSxDQUFDRixNQUFNSixRQUEvRE4sYUFBd0NZLGtCQUF4Q1osWUFBWWEsMEJBQTRCRCxrQkFBNUJDO0lBQ3BCLElBQU1DLHFCQUFxQm5CLGtDQUFPQSxDQUFDO2VBQUlTLE9BQU9KO09BQWE7UUFDdkRJO1FBQ0FKO0tBQ0g7SUFDRCxJQUFNZSxpQ0FBaUNwQixrQ0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9VLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR1osK0NBQW9CLENBQUNZLFdBQVc7WUFDaEYsT0FBT1MsbUJBQW1CLEdBQUcsQ0FBQyxTQUFDRTt1QkFBWVgsU0FBU1csV0FBV1Y7O1FBQ25FO0lBQ0osR0FBRztRQUNDRDtRQUNBUztLQUNIO0lBQ0QsT0FBTyxXQUFXLEdBQUdyQiw4Q0FBbUIsQ0FBQyxPQUFPO1FBQzVDLEtBQUtrQjtRQUNMLDRCQUE0QkQ7UUFDNUIsbUNBQW1DRztRQUNuQyxPQUFPLHdDQUNBTjtZQUNILFVBQVU7O09BRVhDLFdBQ0pFLFNBQVFJLCtCQUFBQSx5Q0FBQUEsbUJBQW9CLEdBQUcsQ0FBQyxTQUFDRSxXQUFXQztZQVd4Q0M7ZUFYNEMsV0FBVyxHQUFHekIsOENBQW1CLENBQUNHLCtEQUF5QixFQUFFO1lBQ3hHLEtBQUtvQixVQUFVLEVBQUU7WUFDakIsT0FBTztnQkFDSCxZQUFZSDtnQkFDWixhQUFhO2dCQUNiLFdBQVc7b0JBQ1AsYUFBYUcsVUFBVSxFQUFFO29CQUN6QixtQkFBbUJOO29CQUNuQkcseUJBQUFBO2dCQUNKO1lBQ0o7UUFDSixJQUFHSyxnQkFBQUEsMkNBQUFBLHFEQUFBQSw4QkFBZ0MsQ0FBQ0QsRUFBRSx5Q0FBSyxPQUFPWixhQUFhLGFBQWFBLFdBQVcsa0JBQXBGYSxrQkFBQUEsT0FBNkYsV0FBVyxHQUFHekIsOENBQW1CLENBQUNJLHdDQUFTQSxFQUFFO1lBQ3pJLE9BQU9TO1FBQ1g7O0FBQ1IifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n\n}");
5933
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n ExtensionSlot: () => (ExtensionSlot)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var _ComponentContext_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* import */ var _Extension_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-react-utils/dist/Extension.js\");\n/* import */ var _useExtensionSlot_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _object_without_properties(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys, key, i;\n if (typeof Reflect !== \"undefined\" && Reflect.ownKeys) {\n sourceKeys = Reflect.ownKeys(Object(source));\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n }\n target = _object_without_properties_loose(source, excluded);\n if (Object.getOwnPropertySymbols) {\n sourceKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _object_without_properties_loose(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n}\n/** @module @category Extension */ \n\n\n\nfunction defaultSelect(extensions) {\n return extensions;\n}\n/**\n * An [extension slot](https://o3-docs.openmrs.org/en-US/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(_0) {\n var extensionSlotName = _0.name, legacyExtensionSlotName = _0.extensionSlotName, _0_select = _0.select, select = _0_select === void 0 ? defaultSelect : _0_select, children = _0.children, state = _0.state, style = _0.style, divProps = _object_without_properties(_0, [\n \"name\",\n \"extensionSlotName\",\n \"select\",\n \"children\",\n \"state\",\n \"style\"\n ]);\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 var name = extensionSlotName !== null && extensionSlotName !== void 0 ? extensionSlotName : legacyExtensionSlotName;\n var slotRef = (0,react__rspack_import_0.useRef)(null);\n var _useExtensionSlot = (0,_useExtensionSlot_js__rspack_import_3.useExtensionSlot)(name, state), extensions = _useExtensionSlot.extensions, extensionSlotModuleName = _useExtensionSlot.extensionSlotModuleName;\n var extensionsToRender = (0,react__rspack_import_0.useMemo)(function() {\n return select(extensions);\n }, [\n select,\n extensions\n ]);\n var extensionsFromChildrenFunction = (0,react__rspack_import_0.useMemo)(function() {\n if (typeof children == 'function' && !/*#__PURE__*/ react__rspack_import_0_default().isValidElement(children)) {\n return extensionsToRender.map(function(extension) {\n return children(extension, state);\n });\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(\"div\", _object_spread({\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: _object_spread_props(_object_spread({}, style), {\n position: 'relative'\n })\n }, divProps), name && (extensionsToRender === null || extensionsToRender === void 0 ? void 0 : extensionsToRender.map(function(extension, i) {\n var _ref, _ref1;\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(_ComponentContext_js__rspack_import_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: extensionSlotModuleName\n }\n }\n }, (_ref = (_ref1 = extensionsFromChildrenFunction === null || extensionsFromChildrenFunction === void 0 ? void 0 : extensionsFromChildrenFunction[i]) !== null && _ref1 !== void 0 ? _ref1 : typeof children !== 'function' ? children : null) !== null && _ref !== void 0 ? _ref : /*#__PURE__*/ react__rspack_import_0_default().createElement(_Extension_js__rspack_import_2.Extension, {\n state: state\n }));\n })));\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvRXh0ZW5zaW9uU2xvdC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanM/ZjBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRXh0ZW5zaW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi9FeHRlbnNpb24uanNcIjtcbmltcG9ydCB7IHVzZUV4dGVuc2lvblNsb3QgfSBmcm9tIFwiLi91c2VFeHRlbnNpb25TbG90LmpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0U2VsZWN0KGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbi8qKlxuICogQW4gW2V4dGVuc2lvbiBzbG90XShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZW4tVVMvZG9jcy9leHRlbnNpb24tc3lzdGVtKS5cbiAqIEEgcGxhY2Ugd2l0aCBhIG5hbWUuIEV4dGVuc2lvbnMgdGhhdCBnZXQgY29ubmVjdGVkIHRvIHRoYXQgbmFtZVxuICogd2lsbCBiZSByZW5kZXJlZCBpbnRvIHRoaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSByZWFjdCBub2RlIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiRm9vXCI+XG4gKiAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDEwcmVtIH19PlxuICogICAgIDxFeHRlbnNpb24gLz5cbiAqICAgPC9kaXY+XG4gKiA8L0V4dGVuc2lvblNsb3Q+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFzc2luZyBhIGZ1bmN0aW9uIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiQmFyXCI+XG4gKiAgIHsoZXh0ZW5zaW9uKSA9PiAoXG4gKiAgICAgPGgxPntleHRlbnNpb24ubmFtZX08L2gxPlxuICogICAgIDxkaXYgc3R5bGU9e3sgY29sb3I6IGV4dGVuc2lvbi5tZXRhLmNvbG9yIH19PlxuICogICAgICAgPEV4dGVuc2lvbiAvPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICovIGV4cG9ydCBmdW5jdGlvbiBFeHRlbnNpb25TbG90KHsgbmFtZTogZXh0ZW5zaW9uU2xvdE5hbWUsIGV4dGVuc2lvblNsb3ROYW1lOiBsZWdhY3lFeHRlbnNpb25TbG90TmFtZSwgc2VsZWN0ID0gZGVmYXVsdFNlbGVjdCwgY2hpbGRyZW4sIHN0YXRlLCBzdHlsZSwgLi4uZGl2UHJvcHMgfSkge1xuICAgIGlmIChjaGlsZHJlbiAmJiBzdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggY2hpbGRyZW4gYW5kIHN0YXRlIGhhdmUgYmVlbiBwcm92aWRlZC4gSWYgY2hpbGRyZW4gYXJlIHByb3ZpZGVkLCB0aGUgc3RhdGUgbXVzdCBiZSBwYXNzZWQgYXMgYSBwcm9wIHRvIHRoZSBgRXh0ZW5zaW9uYCBjb21wb25lbnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBleHRlbnNpb25TbG90TmFtZSA/PyBsZWdhY3lFeHRlbnNpb25TbG90TmFtZTtcbiAgICBjb25zdCBzbG90UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucywgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUgfSA9IHVzZUV4dGVuc2lvblNsb3QobmFtZSwgc3RhdGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnNUb1JlbmRlciA9IHVzZU1lbW8oKCk9PnNlbGVjdChleHRlbnNpb25zKSwgW1xuICAgICAgICBzZWxlY3QsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24gPSB1c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT0gJ2Z1bmN0aW9uJyAmJiAhLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZW5kZXIubWFwKChleHRlbnNpb24pPT5jaGlsZHJlbihleHRlbnNpb24sIHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBleHRlbnNpb25zVG9SZW5kZXJcbiAgICBdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBzbG90UmVmLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbmFtZVwiOiBuYW1lLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbW9kdWxlLW5hbWVcIjogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRpdlByb3BzXG4gICAgfSwgbmFtZSAmJiBleHRlbnNpb25zVG9SZW5kZXI/Lm1hcCgoZXh0ZW5zaW9uLCBpKT0+LyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIGtleTogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb25TbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBleHRlbnNpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TW9kdWxlTmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uPy5baV0gPz8gKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuIDogbnVsbCkgPz8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dGVuc2lvbiwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0pKSkpO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwidXNlUmVmIiwidXNlTWVtbyIsIkNvbXBvbmVudENvbnRleHQiLCJFeHRlbnNpb24iLCJ1c2VFeHRlbnNpb25TbG90IiwiZGVmYXVsdFNlbGVjdCIsImV4dGVuc2lvbnMiLCJFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE5hbWUiLCJsZWdhY3lFeHRlbnNpb25TbG90TmFtZSIsInNlbGVjdCIsImNoaWxkcmVuIiwic3RhdGUiLCJzdHlsZSIsImRpdlByb3BzIiwiRXJyb3IiLCJuYW1lIiwic2xvdFJlZiIsIl91c2VFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25zVG9SZW5kZXIiLCJleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24iLCJleHRlbnNpb24iLCJpIiwiX3JlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUFrRDtBQUN6QjtBQUNkO0FBQ2M7QUFDekQsU0FBU00sY0FBY0MsVUFBVTtJQUM3QixPQUFPQTtBQUNYO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUFVLFNBQVNDLGNBQWMsRUFBb0k7UUFBNUhDLHVCQUFOLE1BQTRDQyw2QkFBbkIsa0NBQTRDQyxRQUFBQSxnQ0FBU0wsMkJBQWVNLGNBQUFBLFVBQVVDLFdBQUFBLE9BQU9DLFdBQUFBLE9BQVVDOzs7Ozs7OztJQUN4SixJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLElBQU1DLE9BQU9SLDhCQUFBQSwrQkFBQUEsb0JBQXFCQztJQUNsQyxJQUFNUSxVQUFVakIsaUNBQU1BLENBQUM7SUFDdkIsSUFBZ0RrQixvQkFBQUEsMERBQWdCQSxDQUFDRixNQUFNSixRQUEvRE4sYUFBd0NZLGtCQUF4Q1osWUFBWWEsMEJBQTRCRCxrQkFBNUJDO0lBQ3BCLElBQU1DLHFCQUFxQm5CLGtDQUFPQSxDQUFDO2VBQUlTLE9BQU9KO09BQWE7UUFDdkRJO1FBQ0FKO0tBQ0g7SUFDRCxJQUFNZSxpQ0FBaUNwQixrQ0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9VLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR1osK0NBQW9CLENBQUNZLFdBQVc7WUFDaEYsT0FBT1MsbUJBQW1CLEdBQUcsQ0FBQyxTQUFDRTt1QkFBWVgsU0FBU1csV0FBV1Y7O1FBQ25FO0lBQ0osR0FBRztRQUNDRDtRQUNBUztLQUNIO0lBQ0QsT0FBTyxXQUFXLEdBQUdyQiw4Q0FBbUIsQ0FBQyxPQUFPO1FBQzVDLEtBQUtrQjtRQUNMLDRCQUE0QkQ7UUFDNUIsbUNBQW1DRztRQUNuQyxPQUFPLHdDQUNBTjtZQUNILFVBQVU7O09BRVhDLFdBQ0pFLFNBQVFJLCtCQUFBQSx5Q0FBQUEsbUJBQW9CLEdBQUcsQ0FBQyxTQUFDRSxXQUFXQztZQVd4Q0M7ZUFYNEMsV0FBVyxHQUFHekIsOENBQW1CLENBQUNHLCtEQUF5QixFQUFFO1lBQ3hHLEtBQUtvQixVQUFVLEVBQUU7WUFDakIsT0FBTztnQkFDSCxZQUFZSDtnQkFDWixhQUFhO2dCQUNiLFdBQVc7b0JBQ1AsYUFBYUcsVUFBVSxFQUFFO29CQUN6QixtQkFBbUJOO29CQUNuQkcseUJBQUFBO2dCQUNKO1lBQ0o7UUFDSixJQUFHSyxnQkFBQUEsMkNBQUFBLHFEQUFBQSw4QkFBZ0MsQ0FBQ0QsRUFBRSx5Q0FBSyxPQUFPWixhQUFhLGFBQWFBLFdBQVcsa0JBQXBGYSxrQkFBQUEsT0FBNkYsV0FBVyxHQUFHekIsOENBQW1CLENBQUNJLHdDQUFTQSxFQUFFO1lBQ3pJLE9BQU9TO1FBQ1g7O0FBQ1IifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n\n}");
5934
5934
 
5935
5935
  },
5936
5936
  "../../framework/esm-react-utils/dist/OpenmrsContext.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {