mirror of
https://github.com/logos-messaging/lab.waku.org.git
synced 2026-01-02 13:53:09 +00:00
25 lines
94 KiB
JavaScript
25 lines
94 KiB
JavaScript
"use strict";
|
||
/*
|
||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||
* This devtool is neither made for production nor for readable output files.
|
||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||
* or disable the default devtool with "devtool: false".
|
||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||
*/
|
||
exports.id = "vendor-chunks/hast-util-to-jsx-runtime";
|
||
exports.ids = ["vendor-chunks/hast-util-to-jsx-runtime"];
|
||
exports.modules = {
|
||
|
||
/***/ "(ssr)/./node_modules/hast-util-to-jsx-runtime/lib/index.js":
|
||
/*!************************************************************!*\
|
||
!*** ./node_modules/hast-util-to-jsx-runtime/lib/index.js ***!
|
||
\************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ toJsxRuntime: () => (/* binding */ toJsxRuntime)\n/* harmony export */ });\n/* harmony import */ var comma_separated_tokens__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! comma-separated-tokens */ \"(ssr)/./node_modules/comma-separated-tokens/index.js\");\n/* harmony import */ var devlop__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! devlop */ \"(ssr)/./node_modules/devlop/lib/development.js\");\n/* harmony import */ var estree_util_is_identifier_name__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! estree-util-is-identifier-name */ \"(ssr)/./node_modules/estree-util-is-identifier-name/lib/index.js\");\n/* harmony import */ var hast_util_whitespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! hast-util-whitespace */ \"(ssr)/./node_modules/hast-util-whitespace/lib/index.js\");\n/* harmony import */ var property_information__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! property-information */ \"(ssr)/./node_modules/property-information/index.js\");\n/* harmony import */ var property_information__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! property-information */ \"(ssr)/./node_modules/property-information/lib/find.js\");\n/* harmony import */ var property_information__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! property-information */ \"(ssr)/./node_modules/property-information/lib/hast-to-react.js\");\n/* harmony import */ var space_separated_tokens__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! space-separated-tokens */ \"(ssr)/./node_modules/space-separated-tokens/index.js\");\n/* harmony import */ var style_to_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! style-to-object */ \"(ssr)/./node_modules/style-to-object/esm/index.mjs\");\n/* harmony import */ var unist_util_position__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! unist-util-position */ \"(ssr)/./node_modules/unist-util-position/lib/index.js\");\n/* harmony import */ var vfile_message__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vfile-message */ \"(ssr)/./node_modules/vfile-message/lib/index.js\");\n// Register MDX nodes in mdast:\n/// <reference types=\"mdast-util-mdx-expression\" />\n/// <reference types=\"mdast-util-mdx-jsx\" />\n/// <reference types=\"mdast-util-mdxjs-esm\" />\n/**\n * @typedef {import('estree').Identifier} Identifier\n * @typedef {import('estree').Literal} Literal\n * @typedef {import('estree').MemberExpression} MemberExpression\n * @typedef {import('estree').Expression} Expression\n * @typedef {import('estree').Program} Program\n *\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Nodes} Nodes\n * @typedef {import('hast').Parents} Parents\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast').Text} Text\n *\n * @typedef {import('mdast-util-mdx-expression').MdxFlowExpressionHast} MdxFlowExpression\n * @typedef {import('mdast-util-mdx-expression').MdxTextExpressionHast} MdxTextExpression\n *\n * @typedef {import('mdast-util-mdx-jsx').MdxJsxFlowElementHast} MdxJsxFlowElement\n * @typedef {import('mdast-util-mdx-jsx').MdxJsxTextElementHast} MdxJsxTextElement\n *\n * @typedef {import('mdast-util-mdxjs-esm').MdxjsEsmHast} MdxjsEsm\n *\n * @typedef {import('property-information').Schema} Schema\n *\n * @typedef {import('unist').Position} Position\n *\n * @typedef {import('./components.js').Components} Components\n */ /**\n * @typedef {JSX.Element | string | null | undefined} Child\n * Child.\n *\n * @callback Create\n * Create something in development or production.\n * @param {Nodes} node\n * hast node.\n * @param {unknown} type\n * Fragment symbol or tag name.\n * @param {Props} props\n * Properties and children.\n * @param {string | undefined} key\n * Key.\n * @returns {JSX.Element}\n * Result.\n *\n * @callback CreateEvaluater\n * Create an evaluator that turns ESTree ASTs from embedded MDX into values.\n * @returns {Evaluater}\n * Evaluater.\n *\n * @typedef {'html' | 'react'} ElementAttributeNameCase\n * Casing to use for attribute names.\n *\n * HTML casing is for example `class`, `stroke-linecap`, `xml:lang`.\n * React casing is for example `className`, `strokeLinecap`, `xmlLang`.\n *\n * @callback EvaluateExpression\n * Turn an MDX expression into a value.\n * @param {Expression} expression\n * ESTree expression.\n * @returns {unknown}\n * Result of expression.\n *\n * @callback EvaluateProgram\n * Turn an MDX program (export/import statements) into a value.\n * @param {Program} expression\n * ESTree program.\n * @returns {unknown}\n * Result of program;\n * should likely be `undefined` as ESM changes the scope but doesn’t yield\n * something.\n *\n * @typedef Evaluater\n * Evaluator that turns ESTree ASTs from embedded MDX into values.\n * @property {EvaluateExpression} evaluateExpression\n * Evaluate an expression.\n * @property {EvaluateProgram} evaluateProgram\n * Evaluate a program.\n *\n * @typedef {[string, Value]} Field\n * Property field.\n *\n * @typedef {unknown} Fragment\n * Represent the children, typically a symbol.\n *\n * @callback Jsx\n * Create a production element.\n * @param {unknown} type\n * Element type: `Fragment` symbol, tag name (`string`), component.\n * @param {Props} props\n * Element props, `children`, and maybe `node`.\n * @param {string | undefined} [key]\n * Dynamicly generated key to use.\n * @returns {JSX.Element}\n * Element from your framework.\n *\n * @callback JsxDev\n * Create a development element.\n * @param {unknown} type\n * Element type: `Fragment` symbol, tag name (`string`), component.\n * @param {Props} props\n * Element props, `children`, and maybe `node`.\n * @param {string | undefined} key\n * Dynamicly generated key to use.\n * @param {boolean} isStaticChildren\n * Whether two or more children are passed (in an array), which is whether\n * `jsxs` or `jsx` would be used.\n * @param {Source} source\n * Info about source.\n * @param {undefined} self\n * Nothing (this is used by frameworks that have components, we don’t).\n * @returns {JSX.Element}\n * Element from your framework.\n *\n * @typedef {{children?: Array<Child> | Child, node?: Element | MdxJsxFlowElement | MdxJsxTextElement | undefined, [prop: string]: Array<Child> | Child | Element | MdxJsxFlowElement | MdxJsxTextElement | Value | undefined}} Props\n * Properties and children.\n *\n * @typedef RegularFields\n * Configuration.\n * @property {Partial<Components> | null | undefined} [components]\n * Components to use (optional).\n * @property {CreateEvaluater | null | undefined} [createEvaluater]\n * Create an evaluator that turns ESTree ASTs into values (optional).\n * @property {ElementAttributeNameCase | null | undefined} [elementAttributeNameCase='react']\n * Specify casing to use for attribute names (default: `'react'`).\n * @property {string | null | undefined} [filePath]\n * File path to the original source file (optional).\n *\n * Passed in source info to `jsxDEV` when using the automatic runtime with\n * `development: true`.\n * @property {boolean | null | undefined} [ignoreInvalidStyle=false]\n * Ignore invalid CSS in `style` props (default: `false`);\n * the default behavior is to throw an error.\n * @property {boolean | null | undefined} [passKeys=true]\n * Generate keys to optimize frameworks that support them (default: `true`).\n *\n * > 👉 **Note**: Solid currently fails if keys are passed.\n * @property {boolean | null | undefined} [passNode=false]\n * Pass the hast element node to components (default: `false`).\n * @property {Space | null | undefined} [space='html']\n * Whether `tree` is in the `'html'` or `'svg'` space (default: `'html'`).\n *\n * When an `<svg>` element is found in the HTML space, this package already\n * automatically switches to and from the SVG space when entering and exiting\n * it.\n * @property {StylePropertyNameCase | null | undefined} [stylePropertyNameCase='dom']\n * Specify casing to use for property names in `style` objects (default:\n * `'dom'`).\n * @property {boolean | null | undefined} [tableCellAlignToStyle=true]\n * Turn obsolete `align` props on `td` and `th` into CSS `style` props\n * (default: `true`).\n *\n * @typedef RuntimeDevelopment\n * Runtime fields when development is on.\n * @property {Fragment} Fragment\n * Fragment.\n * @property {true} development\n * Whether to use `jsxDEV` (when on) or `jsx` and `jsxs` (when off).\n * @property {Jsx | null | undefined} [jsx]\n * Dynamic JSX (optional).\n * @property {JsxDev} jsxDEV\n * Development JSX.\n * @property {Jsx | null | undefined} [jsxs]\n * Static JSX (optional).\n *\n * @typedef RuntimeProduction\n * Runtime fields when development is off.\n * @property {Fragment} Fragment\n * Fragment.\n * @property {false | null | undefined} [development]\n * Whether to use `jsxDEV` (when on) or `jsx` and `jsxs` (when off) (optional).\n * @property {Jsx} jsx\n * Dynamic JSX.\n * @property {JsxDev | null | undefined} [jsxDEV]\n * Development JSX (optional).\n * @property {Jsx} jsxs\n * Static JSX.\n *\n * @typedef RuntimeUnknown\n * Runtime fields when development might be on or off.\n * @property {Fragment} Fragment\n * Fragment.\n * @property {boolean} development\n * Whether to use `jsxDEV` (when on) or `jsx` and `jsxs` (when off).\n * @property {Jsx | null | undefined} [jsx]\n * Dynamic JSX (optional).\n * @property {JsxDev | null | undefined} [jsxDEV]\n * Development JSX (optional).\n * @property {Jsx | null | undefined} [jsxs]\n * Static JSX (optional).\n *\n * @typedef Source\n * Info about source.\n * @property {number | undefined} columnNumber\n * Column where thing starts (0-indexed).\n * @property {string | undefined} fileName\n * Name of source file.\n * @property {number | undefined} lineNumber\n * Line where thing starts (1-indexed).\n *\n * @typedef {'html' | 'svg'} Space\n * Namespace.\n *\n * > 👉 **Note**: hast is not XML.\n * > It supports SVG as embedded in HTML.\n * > It does not support the features available in XML.\n * > Passing SVG might break but fragments of modern SVG should be fine.\n * > Use `xast` if you need to support SVG as XML.\n *\n * @typedef State\n * Info passed around.\n * @property {unknown} Fragment\n * Fragment symbol.\n * @property {Array<Parents>} ancestors\n * Stack of parents.\n * @property {Partial<Components>} components\n * Components to swap.\n * @property {Create} create\n * Create something in development or production.\n * @property {ElementAttributeNameCase} elementAttributeNameCase\n * Casing to use for attribute names.\n * @property {Evaluater | undefined} evaluater\n * Evaluator that turns ESTree ASTs into values.\n * @property {string | undefined} filePath\n * File path.\n * @property {boolean} ignoreInvalidStyle\n * Ignore invalid CSS in `style` props.\n * @property {boolean} passKeys\n * Generate keys to optimize frameworks that support them.\n * @property {boolean} passNode\n * Pass `node` to components.\n * @property {Schema} schema\n * Current schema.\n * @property {StylePropertyNameCase} stylePropertyNameCase\n * Casing to use for property names in `style` objects.\n * @property {boolean} tableCellAlignToStyle\n * Turn obsolete `align` props on `td` and `th` into CSS `style` props.\n *\n * @typedef {Record<string, string>} Style\n * Style map.\n *\n * @typedef {'css' | 'dom'} StylePropertyNameCase\n * Casing to use for property names in `style` objects.\n *\n * CSS casing is for example `background-color` and `-webkit-line-clamp`.\n * DOM casing is for example `backgroundColor` and `WebkitLineClamp`.\n *\n * @typedef {Style | boolean | number | string} Value\n * Primitive property value and `Style` map.\n */ /**\n * @typedef {RuntimeDevelopment & RegularFields} Development\n * Configuration (development).\n * @typedef {Development | Production | Unknown} Options\n * Configuration.\n * @typedef {RegularFields & RuntimeProduction} Production\n * Configuration (production).\n * @typedef {RegularFields & RuntimeUnknown} Unknown\n * Configuration (production or development).\n */ \n\n\n\n\n\n\n\n\nconst own = {}.hasOwnProperty;\n/** @type {Map<string, number>} */ const emptyMap = new Map();\nconst cap = /[A-Z]/g;\nconst dashSomething = /-([a-z])/g;\n// `react-dom` triggers a warning for *any* white space in tables.\n// To follow GFM, `mdast-util-to-hast` injects line endings between elements.\n// Other tools might do so too, but they don’t do here, so we remove all of\n// that.\n// See: <https://github.com/facebook/react/pull/7081>.\n// See: <https://github.com/facebook/react/pull/7515>.\n// See: <https://github.com/remarkjs/remark-react/issues/64>.\n// See: <https://github.com/rehypejs/rehype-react/pull/29>.\n// See: <https://github.com/rehypejs/rehype-react/pull/32>.\n// See: <https://github.com/rehypejs/rehype-react/pull/45>.\nconst tableElements = new Set([\n \"table\",\n \"tbody\",\n \"thead\",\n \"tfoot\",\n \"tr\"\n]);\nconst tableCellElement = new Set([\n \"td\",\n \"th\"\n]);\nconst docs = \"https://github.com/syntax-tree/hast-util-to-jsx-runtime\";\n/**\n * Transform a hast tree to preact, react, solid, svelte, vue, etc.,\n * with an automatic JSX runtime.\n *\n * @param {Nodes} tree\n * Tree to transform.\n * @param {Options} options\n * Configuration (required).\n * @returns {JSX.Element}\n * JSX element.\n */ function toJsxRuntime(tree, options) {\n if (!options || options.Fragment === undefined) {\n throw new TypeError(\"Expected `Fragment` in options\");\n }\n const filePath = options.filePath || undefined;\n /** @type {Create} */ let create;\n if (options.development) {\n if (typeof options.jsxDEV !== \"function\") {\n throw new TypeError(\"Expected `jsxDEV` in options when `development: true`\");\n }\n create = developmentCreate(filePath, options.jsxDEV);\n } else {\n if (typeof options.jsx !== \"function\") {\n throw new TypeError(\"Expected `jsx` in production options\");\n }\n if (typeof options.jsxs !== \"function\") {\n throw new TypeError(\"Expected `jsxs` in production options\");\n }\n create = productionCreate(filePath, options.jsx, options.jsxs);\n }\n /** @type {State} */ const state = {\n Fragment: options.Fragment,\n ancestors: [],\n components: options.components || {},\n create,\n elementAttributeNameCase: options.elementAttributeNameCase || \"react\",\n evaluater: options.createEvaluater ? options.createEvaluater() : undefined,\n filePath,\n ignoreInvalidStyle: options.ignoreInvalidStyle || false,\n passKeys: options.passKeys !== false,\n passNode: options.passNode || false,\n schema: options.space === \"svg\" ? property_information__WEBPACK_IMPORTED_MODULE_1__.svg : property_information__WEBPACK_IMPORTED_MODULE_1__.html,\n stylePropertyNameCase: options.stylePropertyNameCase || \"dom\",\n tableCellAlignToStyle: options.tableCellAlignToStyle !== false\n };\n const result = one(state, tree, undefined);\n // JSX element.\n if (result && typeof result !== \"string\") {\n return result;\n }\n // Text node or something that turned into nothing.\n return state.create(tree, state.Fragment, {\n children: result || undefined\n }, undefined);\n}\n/**\n * Transform a node.\n *\n * @param {State} state\n * Info passed around.\n * @param {Nodes} node\n * Current node.\n * @param {string | undefined} key\n * Key.\n * @returns {Child | undefined}\n * Child, optional.\n */ function one(state, node, key) {\n if (node.type === \"element\") {\n return element(state, node, key);\n }\n if (node.type === \"mdxFlowExpression\" || node.type === \"mdxTextExpression\") {\n return mdxExpression(state, node);\n }\n if (node.type === \"mdxJsxFlowElement\" || node.type === \"mdxJsxTextElement\") {\n return mdxJsxElement(state, node, key);\n }\n if (node.type === \"mdxjsEsm\") {\n return mdxEsm(state, node);\n }\n if (node.type === \"root\") {\n return root(state, node, key);\n }\n if (node.type === \"text\") {\n return text(state, node);\n }\n}\n/**\n * Handle element.\n *\n * @param {State} state\n * Info passed around.\n * @param {Element} node\n * Current node.\n * @param {string | undefined} key\n * Key.\n * @returns {Child | undefined}\n * Child, optional.\n */ function element(state, node, key) {\n const parentSchema = state.schema;\n let schema = parentSchema;\n if (node.tagName.toLowerCase() === \"svg\" && parentSchema.space === \"html\") {\n schema = property_information__WEBPACK_IMPORTED_MODULE_1__.svg;\n state.schema = schema;\n }\n state.ancestors.push(node);\n const type = findComponentFromName(state, node.tagName, false);\n const props = createElementProps(state, node);\n let children = createChildren(state, node);\n if (tableElements.has(node.tagName)) {\n children = children.filter(function(child) {\n return typeof child === \"string\" ? !(0,hast_util_whitespace__WEBPACK_IMPORTED_MODULE_2__.whitespace)(child) : true;\n });\n }\n addNode(state, props, type, node);\n addChildren(props, children);\n // Restore.\n state.ancestors.pop();\n state.schema = parentSchema;\n return state.create(node, type, props, key);\n}\n/**\n * Handle MDX expression.\n *\n * @param {State} state\n * Info passed around.\n * @param {MdxFlowExpression | MdxTextExpression} node\n * Current node.\n * @returns {Child | undefined}\n * Child, optional.\n */ function mdxExpression(state, node) {\n if (node.data && node.data.estree && state.evaluater) {\n const program = node.data.estree;\n const expression = program.body[0];\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(expression.type === \"ExpressionStatement\");\n // Assume result is a child.\n return /** @type {Child | undefined} */ state.evaluater.evaluateExpression(expression.expression);\n }\n crashEstree(state, node.position);\n}\n/**\n * Handle MDX ESM.\n *\n * @param {State} state\n * Info passed around.\n * @param {MdxjsEsm} node\n * Current node.\n * @returns {Child | undefined}\n * Child, optional.\n */ function mdxEsm(state, node) {\n if (node.data && node.data.estree && state.evaluater) {\n // Assume result is a child.\n return /** @type {Child | undefined} */ state.evaluater.evaluateProgram(node.data.estree);\n }\n crashEstree(state, node.position);\n}\n/**\n * Handle MDX JSX.\n *\n * @param {State} state\n * Info passed around.\n * @param {MdxJsxFlowElement | MdxJsxTextElement} node\n * Current node.\n * @param {string | undefined} key\n * Key.\n * @returns {Child | undefined}\n * Child, optional.\n */ function mdxJsxElement(state, node, key) {\n const parentSchema = state.schema;\n let schema = parentSchema;\n if (node.name === \"svg\" && parentSchema.space === \"html\") {\n schema = property_information__WEBPACK_IMPORTED_MODULE_1__.svg;\n state.schema = schema;\n }\n state.ancestors.push(node);\n const type = node.name === null ? state.Fragment : findComponentFromName(state, node.name, true);\n const props = createJsxElementProps(state, node);\n const children = createChildren(state, node);\n addNode(state, props, type, node);\n addChildren(props, children);\n // Restore.\n state.ancestors.pop();\n state.schema = parentSchema;\n return state.create(node, type, props, key);\n}\n/**\n * Handle root.\n *\n * @param {State} state\n * Info passed around.\n * @param {Root} node\n * Current node.\n * @param {string | undefined} key\n * Key.\n * @returns {Child | undefined}\n * Child, optional.\n */ function root(state, node, key) {\n /** @type {Props} */ const props = {};\n addChildren(props, createChildren(state, node));\n return state.create(node, state.Fragment, props, key);\n}\n/**\n * Handle text.\n *\n * @param {State} _\n * Info passed around.\n * @param {Text} node\n * Current node.\n * @returns {Child | undefined}\n * Child, optional.\n */ function text(_, node) {\n return node.value;\n}\n/**\n * Add `node` to props.\n *\n * @param {State} state\n * Info passed around.\n * @param {Props} props\n * Props.\n * @param {unknown} type\n * Type.\n * @param {Element | MdxJsxFlowElement | MdxJsxTextElement} node\n * Node.\n * @returns {undefined}\n * Nothing.\n */ function addNode(state, props, type, node) {\n // If this is swapped out for a component:\n if (typeof type !== \"string\" && type !== state.Fragment && state.passNode) {\n props.node = node;\n }\n}\n/**\n * Add children to props.\n *\n * @param {Props} props\n * Props.\n * @param {Array<Child>} children\n * Children.\n * @returns {undefined}\n * Nothing.\n */ function addChildren(props, children) {\n if (children.length > 0) {\n const value = children.length > 1 ? children : children[0];\n if (value) {\n props.children = value;\n }\n }\n}\n/**\n * @param {string | undefined} _\n * Path to file.\n * @param {Jsx} jsx\n * Dynamic.\n * @param {Jsx} jsxs\n * Static.\n * @returns {Create}\n * Create a production element.\n */ function productionCreate(_, jsx, jsxs) {\n return create;\n /** @type {Create} */ function create(_, type, props, key) {\n // Only an array when there are 2 or more children.\n const isStaticChildren = Array.isArray(props.children);\n const fn = isStaticChildren ? jsxs : jsx;\n return key ? fn(type, props, key) : fn(type, props);\n }\n}\n/**\n * @param {string | undefined} filePath\n * Path to file.\n * @param {JsxDev} jsxDEV\n * Development.\n * @returns {Create}\n * Create a development element.\n */ function developmentCreate(filePath, jsxDEV) {\n return create;\n /** @type {Create} */ function create(node, type, props, key) {\n // Only an array when there are 2 or more children.\n const isStaticChildren = Array.isArray(props.children);\n const point = (0,unist_util_position__WEBPACK_IMPORTED_MODULE_4__.pointStart)(node);\n return jsxDEV(type, props, key, isStaticChildren, {\n columnNumber: point ? point.column - 1 : undefined,\n fileName: filePath,\n lineNumber: point ? point.line : undefined\n }, undefined);\n }\n}\n/**\n * Create props from an element.\n *\n * @param {State} state\n * Info passed around.\n * @param {Element} node\n * Current element.\n * @returns {Props}\n * Props.\n */ function createElementProps(state, node) {\n /** @type {Props} */ const props = {};\n /** @type {string | undefined} */ let alignValue;\n /** @type {string} */ let prop;\n for(prop in node.properties){\n if (prop !== \"children\" && own.call(node.properties, prop)) {\n const result = createProperty(state, prop, node.properties[prop]);\n if (result) {\n const [key, value] = result;\n if (state.tableCellAlignToStyle && key === \"align\" && typeof value === \"string\" && tableCellElement.has(node.tagName)) {\n alignValue = value;\n } else {\n props[key] = value;\n }\n }\n }\n }\n if (alignValue) {\n // Assume style is an object.\n const style = /** @type {Style} */ props.style || (props.style = {});\n style[state.stylePropertyNameCase === \"css\" ? \"text-align\" : \"textAlign\"] = alignValue;\n }\n return props;\n}\n/**\n * Create props from a JSX element.\n *\n * @param {State} state\n * Info passed around.\n * @param {MdxJsxFlowElement | MdxJsxTextElement} node\n * Current JSX element.\n * @returns {Props}\n * Props.\n */ function createJsxElementProps(state, node) {\n /** @type {Props} */ const props = {};\n for (const attribute of node.attributes){\n if (attribute.type === \"mdxJsxExpressionAttribute\") {\n if (attribute.data && attribute.data.estree && state.evaluater) {\n const program = attribute.data.estree;\n const expression = program.body[0];\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(expression.type === \"ExpressionStatement\");\n const objectExpression = expression.expression;\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(objectExpression.type === \"ObjectExpression\");\n const property = objectExpression.properties[0];\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(property.type === \"SpreadElement\");\n Object.assign(props, state.evaluater.evaluateExpression(property.argument));\n } else {\n crashEstree(state, node.position);\n }\n } else {\n // For JSX, the author is responsible of passing in the correct values.\n const name = attribute.name;\n /** @type {unknown} */ let value;\n if (attribute.value && typeof attribute.value === \"object\") {\n if (attribute.value.data && attribute.value.data.estree && state.evaluater) {\n const program = attribute.value.data.estree;\n const expression = program.body[0];\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(expression.type === \"ExpressionStatement\");\n value = state.evaluater.evaluateExpression(expression.expression);\n } else {\n crashEstree(state, node.position);\n }\n } else {\n value = attribute.value === null ? true : attribute.value;\n }\n // Assume a prop.\n props[name] = /** @type {Props[keyof Props]} */ value;\n }\n }\n return props;\n}\n/**\n * Create children.\n *\n * @param {State} state\n * Info passed around.\n * @param {Parents} node\n * Current element.\n * @returns {Array<Child>}\n * Children.\n */ function createChildren(state, node) {\n /** @type {Array<Child>} */ const children = [];\n let index = -1;\n /** @type {Map<string, number>} */ // Note: test this when Solid doesn’t want to merge my upcoming PR.\n /* c8 ignore next */ const countsByName = state.passKeys ? new Map() : emptyMap;\n while(++index < node.children.length){\n const child = node.children[index];\n /** @type {string | undefined} */ let key;\n if (state.passKeys) {\n const name = child.type === \"element\" ? child.tagName : child.type === \"mdxJsxFlowElement\" || child.type === \"mdxJsxTextElement\" ? child.name : undefined;\n if (name) {\n const count = countsByName.get(name) || 0;\n key = name + \"-\" + count;\n countsByName.set(name, count + 1);\n }\n }\n const result = one(state, child, key);\n if (result !== undefined) children.push(result);\n }\n return children;\n}\n/**\n * Handle a property.\n *\n * @param {State} state\n * Info passed around.\n * @param {string} prop\n * Key.\n * @param {Array<number | string> | boolean | number | string | null | undefined} value\n * hast property value.\n * @returns {Field | undefined}\n * Field for runtime, optional.\n */ function createProperty(state, prop, value) {\n const info = (0,property_information__WEBPACK_IMPORTED_MODULE_5__.find)(state.schema, prop);\n // Ignore nullish and `NaN` values.\n if (value === null || value === undefined || typeof value === \"number\" && Number.isNaN(value)) {\n return;\n }\n if (Array.isArray(value)) {\n // Accept `array`.\n // Most props are space-separated.\n value = info.commaSeparated ? (0,comma_separated_tokens__WEBPACK_IMPORTED_MODULE_6__.stringify)(value) : (0,space_separated_tokens__WEBPACK_IMPORTED_MODULE_7__.stringify)(value);\n }\n // React only accepts `style` as object.\n if (info.property === \"style\") {\n let styleObject = typeof value === \"object\" ? value : parseStyle(state, String(value));\n if (state.stylePropertyNameCase === \"css\") {\n styleObject = transformStylesToCssCasing(styleObject);\n }\n return [\n \"style\",\n styleObject\n ];\n }\n return [\n state.elementAttributeNameCase === \"react\" && info.space ? property_information__WEBPACK_IMPORTED_MODULE_8__.hastToReact[info.property] || info.property : info.attribute,\n value\n ];\n}\n/**\n * Parse a CSS declaration to an object.\n *\n * @param {State} state\n * Info passed around.\n * @param {string} value\n * CSS declarations.\n * @returns {Style}\n * Properties.\n * @throws\n * Throws `VFileMessage` when CSS cannot be parsed.\n */ function parseStyle(state, value) {\n /** @type {Style} */ const result = {};\n try {\n // @ts-expect-error: `style-to-object` types are broken.\n (0,style_to_object__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(value, replacer);\n } catch (error) {\n if (!state.ignoreInvalidStyle) {\n const cause = /** @type {Error} */ error;\n const message = new vfile_message__WEBPACK_IMPORTED_MODULE_9__.VFileMessage(\"Cannot parse `style` attribute\", {\n ancestors: state.ancestors,\n cause,\n ruleId: \"style\",\n source: \"hast-util-to-jsx-runtime\"\n });\n message.file = state.filePath || undefined;\n message.url = docs + \"#cannot-parse-style-attribute\";\n throw message;\n }\n }\n return result;\n /**\n * Add a CSS property (normal, so with dashes) to `result` as a DOM CSS\n * property.\n *\n * @param {string} name\n * Key.\n * @param {string} value\n * Value\n * @returns {undefined}\n * Nothing.\n */ function replacer(name, value) {\n let key = name;\n if (key.slice(0, 2) !== \"--\") {\n if (key.slice(0, 4) === \"-ms-\") key = \"ms-\" + key.slice(4);\n key = key.replace(dashSomething, toCamel);\n }\n result[key] = value;\n }\n}\n/**\n * Create a JSX name from a string.\n *\n * @param {State} state\n * To do.\n * @param {string} name\n * Name.\n * @param {boolean} allowExpression\n * Allow member expressions and identifiers.\n * @returns {unknown}\n * To do.\n */ function findComponentFromName(state, name, allowExpression) {\n /** @type {Identifier | Literal | MemberExpression} */ let result;\n if (!allowExpression) {\n result = {\n type: \"Literal\",\n value: name\n };\n } else if (name.includes(\".\")) {\n const identifiers = name.split(\".\");\n let index = -1;\n /** @type {Identifier | Literal | MemberExpression | undefined} */ let node;\n while(++index < identifiers.length){\n /** @type {Identifier | Literal} */ const prop = (0,estree_util_is_identifier_name__WEBPACK_IMPORTED_MODULE_10__.name)(identifiers[index]) ? {\n type: \"Identifier\",\n name: identifiers[index]\n } : {\n type: \"Literal\",\n value: identifiers[index]\n };\n node = node ? {\n type: \"MemberExpression\",\n object: node,\n property: prop,\n computed: Boolean(index && prop.type === \"Literal\"),\n optional: false\n } : prop;\n }\n (0,devlop__WEBPACK_IMPORTED_MODULE_3__.ok)(node, \"always a result\");\n result = node;\n } else {\n result = (0,estree_util_is_identifier_name__WEBPACK_IMPORTED_MODULE_10__.name)(name) && !/^[a-z]/.test(name) ? {\n type: \"Identifier\",\n name\n } : {\n type: \"Literal\",\n value: name\n };\n }\n // Only literals can be passed in `components` currently.\n // No identifiers / member expressions.\n if (result.type === \"Literal\") {\n const name = /** @type {keyof JSX.IntrinsicElements} */ result.value;\n return own.call(state.components, name) ? state.components[name] : name;\n }\n // Assume component.\n if (state.evaluater) {\n return state.evaluater.evaluateExpression(result);\n }\n crashEstree(state);\n}\n/**\n * @param {State} state\n * @param {Position | undefined} [place]\n * @returns {never}\n */ function crashEstree(state, place) {\n const message = new vfile_message__WEBPACK_IMPORTED_MODULE_9__.VFileMessage(\"Cannot handle MDX estrees without `createEvaluater`\", {\n ancestors: state.ancestors,\n place,\n ruleId: \"mdx-estree\",\n source: \"hast-util-to-jsx-runtime\"\n });\n message.file = state.filePath || undefined;\n message.url = docs + \"#cannot-handle-mdx-estrees-without-createevaluater\";\n throw message;\n}\n/**\n * Transform a DOM casing style object to a CSS casing style object.\n *\n * @param {Style} domCasing\n * @returns {Style}\n */ function transformStylesToCssCasing(domCasing) {\n /** @type {Style} */ const cssCasing = {};\n /** @type {string} */ let from;\n for(from in domCasing){\n if (own.call(domCasing, from)) {\n cssCasing[transformStyleToCssCasing(from)] = domCasing[from];\n }\n }\n return cssCasing;\n}\n/**\n * Transform a DOM casing style field to a CSS casing style field.\n *\n * @param {string} from\n * @returns {string}\n */ function transformStyleToCssCasing(from) {\n let to = from.replace(cap, toDash);\n // Handle `ms-xxx` -> `-ms-xxx`.\n if (to.slice(0, 3) === \"ms-\") to = \"-\" + to;\n return to;\n}\n/**\n * Make `$1` capitalized.\n *\n * @param {string} _\n * Whatever.\n * @param {string} $1\n * Single ASCII alphabetical.\n * @returns {string}\n * Capitalized `$1`.\n */ function toCamel(_, $1) {\n return $1.toUpperCase();\n}\n/**\n * Make `$0` dash cased.\n *\n * @param {string} $0\n * Capitalized ASCII leter.\n * @returns {string}\n * Dash and lower letter.\n */ function toDash($0) {\n return \"-\" + $0.toLowerCase();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWpzeC1ydW50aW1lL2xpYi9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbURBQW1EO0FBQ25ELDRDQUE0QztBQUM1Qyw4Q0FBOEM7QUFFOUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJDLEdBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNk5DLEdBRUQ7Ozs7Ozs7OztDQVNDLEdBRXlEO0FBQ3ZCO0FBQ29DO0FBQ3hCO0FBQ2tCO0FBQ1A7QUFDZjtBQUNHO0FBQ0o7QUFFMUMsTUFBTWUsTUFBTSxDQUFDLEVBQUVDLGNBQWM7QUFFN0IsZ0NBQWdDLEdBQ2hDLE1BQU1DLFdBQVcsSUFBSUM7QUFFckIsTUFBTUMsTUFBTTtBQUNaLE1BQU1DLGdCQUFnQjtBQUV0QixrRUFBa0U7QUFDbEUsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSxRQUFRO0FBRVIsc0RBQXNEO0FBQ3RELHNEQUFzRDtBQUN0RCw2REFBNkQ7QUFDN0QsMkRBQTJEO0FBQzNELDJEQUEyRDtBQUMzRCwyREFBMkQ7QUFDM0QsTUFBTUMsZ0JBQWdCLElBQUlDLElBQUk7SUFBQztJQUFTO0lBQVM7SUFBUztJQUFTO0NBQUs7QUFFeEUsTUFBTUMsbUJBQW1CLElBQUlELElBQUk7SUFBQztJQUFNO0NBQUs7QUFFN0MsTUFBTUUsT0FBTztBQUViOzs7Ozs7Ozs7O0NBVUMsR0FFTSxTQUFTQyxhQUFhQyxJQUFJLEVBQUVDLE9BQU87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S0FBS3NJO0lBQzNCLGdDQUFnQztJQUNoQyxJQUFJRCxHQUFHakIsS0FBSyxDQUFDLEdBQUcsT0FBTyxPQUFPaUIsS0FBSyxNQUFNQTtJQUN6QyxPQUFPQTtBQUNUO0FBRUE7Ozs7Ozs7OztDQVNDLEdBQ0QsU0FBU2YsUUFBUWpELENBQUMsRUFBRWtFLEVBQUU7SUFDcEIsT0FBT0EsR0FBR0MsV0FBVztBQUN2QjtBQUVBOzs7Ozs7O0NBT0MsR0FDRCxTQUFTRixPQUFPRyxFQUFFO0lBQ2hCLE9BQU8sTUFBTUEsR0FBRzFGLFdBQVc7QUFDN0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbHVzaC1ub3Rlcy8uL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8tanN4LXJ1bnRpbWUvbGliL2luZGV4LmpzPzk4Y2YiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gUmVnaXN0ZXIgTURYIG5vZGVzIGluIG1kYXN0OlxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJtZGFzdC11dGlsLW1keC1leHByZXNzaW9uXCIgLz5cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibWRhc3QtdXRpbC1tZHgtanN4XCIgLz5cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibWRhc3QtdXRpbC1tZHhqcy1lc21cIiAvPlxuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2VzdHJlZScpLklkZW50aWZpZXJ9IElkZW50aWZpZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2VzdHJlZScpLkxpdGVyYWx9IExpdGVyYWxcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2VzdHJlZScpLk1lbWJlckV4cHJlc3Npb259IE1lbWJlckV4cHJlc3Npb25cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2VzdHJlZScpLkV4cHJlc3Npb259IEV4cHJlc3Npb25cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2VzdHJlZScpLlByb2dyYW19IFByb2dyYW1cbiAqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoYXN0JykuRWxlbWVudH0gRWxlbWVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGFzdCcpLk5vZGVzfSBOb2Rlc1xuICogQHR5cGVkZWYge2ltcG9ydCgnaGFzdCcpLlBhcmVudHN9IFBhcmVudHNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hhc3QnKS5Sb290fSBSb290XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoYXN0JykuVGV4dH0gVGV4dFxuICpcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0LXV0aWwtbWR4LWV4cHJlc3Npb24nKS5NZHhGbG93RXhwcmVzc2lvbkhhc3R9IE1keEZsb3dFeHByZXNzaW9uXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdC11dGlsLW1keC1leHByZXNzaW9uJykuTWR4VGV4dEV4cHJlc3Npb25IYXN0fSBNZHhUZXh0RXhwcmVzc2lvblxuICpcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0LXV0aWwtbWR4LWpzeCcpLk1keEpzeEZsb3dFbGVtZW50SGFzdH0gTWR4SnN4Rmxvd0VsZW1lbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0LXV0aWwtbWR4LWpzeCcpLk1keEpzeFRleHRFbGVtZW50SGFzdH0gTWR4SnN4VGV4dEVsZW1lbnRcbiAqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdC11dGlsLW1keGpzLWVzbScpLk1keGpzRXNtSGFzdH0gTWR4anNFc21cbiAqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdwcm9wZXJ0eS1pbmZvcm1hdGlvbicpLlNjaGVtYX0gU2NoZW1hXG4gKlxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5Qb3NpdGlvbn0gUG9zaXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2NvbXBvbmVudHMuanMnKS5Db21wb25lbnRzfSBDb21wb25lbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SlNYLkVsZW1lbnQgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBDaGlsZFxuICogICBDaGlsZC5cbiAqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlXG4gKiAgIENyZWF0ZSBzb21ldGhpbmcgaW4gZGV2ZWxvcG1lbnQgb3IgcHJvZHVjdGlvbi5cbiAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVcbiAqICAgaGFzdCBub2RlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlXG4gKiAgIEZyYWdtZW50IHN5bWJvbCBvciB0YWcgbmFtZS5cbiAqIEBwYXJhbSB7UHJvcHN9IHByb3BzXG4gKiAgIFByb3BlcnRpZXMgYW5kIGNoaWxkcmVuLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGtleVxuICogICBLZXkuXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9XG4gKiAgIFJlc3VsdC5cbiAqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlRXZhbHVhdGVyXG4gKiAgIENyZWF0ZSBhbiBldmFsdWF0b3IgdGhhdCB0dXJucyBFU1RyZWUgQVNUcyBmcm9tIGVtYmVkZGVkIE1EWCBpbnRvIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtFdmFsdWF0ZXJ9XG4gKiAgIEV2YWx1YXRlci5cbiAqXG4gKiBAdHlwZWRlZiB7J2h0bWwnIHwgJ3JlYWN0J30gRWxlbWVudEF0dHJpYnV0ZU5hbWVDYXNlXG4gKiAgIENhc2luZyB0byB1c2UgZm9yIGF0dHJpYnV0ZSBuYW1lcy5cbiAqXG4gKiAgIEhUTUwgY2FzaW5nIGlzIGZvciBleGFtcGxlIGBjbGFzc2AsIGBzdHJva2UtbGluZWNhcGAsIGB4bWw6bGFuZ2AuXG4gKiAgIFJlYWN0IGNhc2luZyBpcyBmb3IgZXhhbXBsZSBgY2xhc3NOYW1lYCwgYHN0cm9rZUxpbmVjYXBgLCBgeG1sTGFuZ2AuXG4gKlxuICogQGNhbGxiYWNrIEV2YWx1YXRlRXhwcmVzc2lvblxuICogICBUdXJuIGFuIE1EWCBleHByZXNzaW9uIGludG8gYSB2YWx1ZS5cbiAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvblxuICogICBFU1RyZWUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICogICBSZXN1bHQgb2YgZXhwcmVzc2lvbi5cbiAqXG4gKiBAY2FsbGJhY2sgRXZhbHVhdGVQcm9ncmFtXG4gKiAgIFR1cm4gYW4gTURYIHByb2dyYW0gKGV4cG9ydC9pbXBvcnQgc3RhdGVtZW50cykgaW50byBhIHZhbHVlLlxuICogQHBhcmFtIHtQcm9ncmFtfSBleHByZXNzaW9uXG4gKiAgIEVTVHJlZSBwcm9ncmFtLlxuICogQHJldHVybnMge3Vua25vd259XG4gKiAgIFJlc3VsdCBvZiBwcm9ncmFtO1xuICogICBzaG91bGQgbGlrZWx5IGJlIGB1bmRlZmluZWRgIGFzIEVTTSBjaGFuZ2VzIHRoZSBzY29wZSBidXQgZG9lc27igJl0IHlpZWxkXG4gKiAgIHNvbWV0aGluZy5cbiAqXG4gKiBAdHlwZWRlZiBFdmFsdWF0ZXJcbiAqICAgRXZhbHVhdG9yIHRoYXQgdHVybnMgRVNUcmVlIEFTVHMgZnJvbSBlbWJlZGRlZCBNRFggaW50byB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge0V2YWx1YXRlRXhwcmVzc2lvbn0gZXZhbHVhdGVFeHByZXNzaW9uXG4gKiAgIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge0V2YWx1YXRlUHJvZ3JhbX0gZXZhbHVhdGVQcm9ncmFtXG4gKiAgIEV2YWx1YXRlIGEgcHJvZ3JhbS5cbiAqXG4gKiBAdHlwZWRlZiB7W3N0cmluZywgVmFsdWVdfSBGaWVsZFxuICogICBQcm9wZXJ0eSBmaWVsZC5cbiAqXG4gKiBAdHlwZWRlZiB7dW5rbm93bn0gRnJhZ21lbnRcbiAqICAgUmVwcmVzZW50IHRoZSBjaGlsZHJlbiwgdHlwaWNhbGx5IGEgc3ltYm9sLlxuICpcbiAqIEBjYWxsYmFjayBKc3hcbiAqICAgQ3JlYXRlIGEgcHJvZHVjdGlvbiBlbGVtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlXG4gKiAgIEVsZW1lbnQgdHlwZTogYEZyYWdtZW50YCBzeW1ib2wsIHRhZyBuYW1lIChgc3RyaW5nYCksIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7UHJvcHN9IHByb3BzXG4gKiAgIEVsZW1lbnQgcHJvcHMsIGBjaGlsZHJlbmAsIGFuZCBtYXliZSBgbm9kZWAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2tleV1cbiAqICAgRHluYW1pY2x5IGdlbmVyYXRlZCBrZXkgdG8gdXNlLlxuICogQHJldHVybnMge0pTWC5FbGVtZW50fVxuICogICBFbGVtZW50IGZyb20geW91ciBmcmFtZXdvcmsuXG4gKlxuICogQGNhbGxiYWNrIEpzeERldlxuICogICBDcmVhdGUgYSBkZXZlbG9wbWVudCBlbGVtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlXG4gKiAgIEVsZW1lbnQgdHlwZTogYEZyYWdtZW50YCBzeW1ib2wsIHRhZyBuYW1lIChgc3RyaW5nYCksIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7UHJvcHN9IHByb3BzXG4gKiAgIEVsZW1lbnQgcHJvcHMsIGBjaGlsZHJlbmAsIGFuZCBtYXliZSBgbm9kZWAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0ga2V5XG4gKiAgIER5bmFtaWNseSBnZW5lcmF0ZWQga2V5IHRvIHVzZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdGF0aWNDaGlsZHJlblxuICogICBXaGV0aGVyIHR3byBvciBtb3JlIGNoaWxkcmVuIGFyZSBwYXNzZWQgKGluIGFuIGFycmF5KSwgd2hpY2ggaXMgd2hldGhlclxuICogICBganN4c2Agb3IgYGpzeGAgd291bGQgYmUgdXNlZC5cbiAqIEBwYXJhbSB7U291cmNlfSBzb3VyY2VcbiAqICAgSW5mbyBhYm91dCBzb3VyY2UuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gc2VsZlxuICogICBOb3RoaW5nICh0aGlzIGlzIHVzZWQgYnkgZnJhbWV3b3JrcyB0aGF0IGhhdmUgY29tcG9uZW50cywgd2UgZG9u4oCZdCkuXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9XG4gKiAgIEVsZW1lbnQgZnJvbSB5b3VyIGZyYW1ld29yay5cbiAqXG4gKiBAdHlwZWRlZiB7e2NoaWxkcmVuPzogQXJyYXk8Q2hpbGQ+IHwgQ2hpbGQsIG5vZGU/OiBFbGVtZW50IHwgTWR4SnN4Rmxvd0VsZW1lbnQgfCBNZHhKc3hUZXh0RWxlbWVudCB8IHVuZGVmaW5lZCwgW3Byb3A6IHN0cmluZ106IEFycmF5PENoaWxkPiB8IENoaWxkIHwgRWxlbWVudCB8IE1keEpzeEZsb3dFbGVtZW50IHwgTWR4SnN4VGV4dEVsZW1lbnQgfCBWYWx1ZSB8IHVuZGVmaW5lZH19IFByb3BzXG4gKiAgIFByb3BlcnRpZXMgYW5kIGNoaWxkcmVuLlxuICpcbiAqIEB0eXBlZGVmIFJlZ3VsYXJGaWVsZHNcbiAqICAgQ29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxDb21wb25lbnRzPiB8IG51bGwgfCB1bmRlZmluZWR9IFtjb21wb25lbnRzXVxuICogICBDb21wb25lbnRzIHRvIHVzZSAob3B0aW9uYWwpLlxuICogQHByb3BlcnR5IHtDcmVhdGVFdmFsdWF0ZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbY3JlYXRlRXZhbHVhdGVyXVxuICogICBDcmVhdGUgYW4gZXZhbHVhdG9yIHRoYXQgdHVybnMgRVNUcmVlIEFTVHMgaW50byB2YWx1ZXMgKG9wdGlvbmFsKS5cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudEF0dHJpYnV0ZU5hbWVDYXNlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2VsZW1lbnRBdHRyaWJ1dGVOYW1lQ2FzZT0ncmVhY3QnXVxuICogICBTcGVjaWZ5IGNhc2luZyB0byB1c2UgZm9yIGF0dHJpYnV0ZSBuYW1lcyAoZGVmYXVsdDogYCdyZWFjdCdgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2ZpbGVQYXRoXVxuICogICBGaWxlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIChvcHRpb25hbCkuXG4gKlxuICogICBQYXNzZWQgaW4gc291cmNlIGluZm8gdG8gYGpzeERFVmAgd2hlbiB1c2luZyB0aGUgYXV0b21hdGljIHJ1bnRpbWUgd2l0aFxuICogICBgZGV2ZWxvcG1lbnQ6IHRydWVgLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2lnbm9yZUludmFsaWRTdHlsZT1mYWxzZV1cbiAqICAgSWdub3JlIGludmFsaWQgQ1NTIGluIGBzdHlsZWAgcHJvcHMgKGRlZmF1bHQ6IGBmYWxzZWApO1xuICogICB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB0aHJvdyBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtwYXNzS2V5cz10cnVlXVxuICogICBHZW5lcmF0ZSBrZXlzIHRvIG9wdGltaXplIGZyYW1ld29ya3MgdGhhdCBzdXBwb3J0IHRoZW0gKGRlZmF1bHQ6IGB0cnVlYCkuXG4gKlxuICogICA+IPCfkYkgKipOb3RlKio6IFNvbGlkIGN1cnJlbnRseSBmYWlscyBpZiBrZXlzIGFyZSBwYXNzZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcGFzc05vZGU9ZmFsc2VdXG4gKiAgIFBhc3MgdGhlIGhhc3QgZWxlbWVudCBub2RlIHRvIGNvbXBvbmVudHMgKGRlZmF1bHQ6IGBmYWxzZWApLlxuICogQHByb3BlcnR5IHtTcGFjZSB8IG51bGwgfCB1bmRlZmluZWR9IFtzcGFjZT0naHRtbCddXG4gKiAgIFdoZXRoZXIgYHRyZWVgIGlzIGluIHRoZSBgJ2h0bWwnYCBvciBgJ3N2ZydgIHNwYWNlIChkZWZhdWx0OiBgJ2h0bWwnYCkuXG4gKlxuICogICBXaGVuIGFuIGA8c3ZnPmAgZWxlbWVudCBpcyBmb3VuZCBpbiB0aGUgSFRNTCBzcGFjZSwgdGhpcyBwYWNrYWdlIGFscmVhZHlcbiAqICAgYXV0b21hdGljYWxseSBzd2l0Y2hlcyB0byBhbmQgZnJvbSB0aGUgU1ZHIHNwYWNlIHdoZW4gZW50ZXJpbmcgYW5kIGV4aXRpbmdcbiAqICAgaXQuXG4gKiBAcHJvcGVydHkge1N0eWxlUHJvcGVydHlOYW1lQ2FzZSB8IG51bGwgfCB1bmRlZmluZWR9IFtzdHlsZVByb3BlcnR5TmFtZUNhc2U9J2RvbSddXG4gKiAgIFNwZWNpZnkgY2FzaW5nIHRvIHVzZSBmb3IgcHJvcGVydHkgbmFtZXMgaW4gYHN0eWxlYCBvYmplY3RzIChkZWZhdWx0OlxuICogICBgJ2RvbSdgKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFt0YWJsZUNlbGxBbGlnblRvU3R5bGU9dHJ1ZV1cbiAqICAgVHVybiBvYnNvbGV0ZSBgYWxpZ25gIHByb3BzIG9uIGB0ZGAgYW5kIGB0aGAgaW50byBDU1MgYHN0eWxlYCBwcm9wc1xuICogICAoZGVmYXVsdDogYHRydWVgKS5cbiAqXG4gKiBAdHlwZWRlZiBSdW50aW1lRGV2ZWxvcG1lbnRcbiAqICAgUnVudGltZSBmaWVsZHMgd2hlbiBkZXZlbG9wbWVudCBpcyBvbi5cbiAqIEBwcm9wZXJ0eSB7RnJhZ21lbnR9IEZyYWdtZW50XG4gKiAgIEZyYWdtZW50LlxuICogQHByb3BlcnR5IHt0cnVlfSBkZXZlbG9wbWVudFxuICogICBXaGV0aGVyIHRvIHVzZSBganN4REVWYCAod2hlbiBvbikgb3IgYGpzeGAgYW5kIGBqc3hzYCAod2hlbiBvZmYpLlxuICogQHByb3BlcnR5IHtKc3ggfCBudWxsIHwgdW5kZWZpbmVkfSBbanN4XVxuICogICBEeW5hbWljIEpTWCAob3B0aW9uYWwpLlxuICogQHByb3BlcnR5IHtKc3hEZXZ9IGpzeERFVlxuICogICBEZXZlbG9wbWVudCBKU1guXG4gKiBAcHJvcGVydHkge0pzeCB8IG51bGwgfCB1bmRlZmluZWR9IFtqc3hzXVxuICogICBTdGF0aWMgSlNYIChvcHRpb25hbCkuXG4gKlxuICogQHR5cGVkZWYgUnVudGltZVByb2R1Y3Rpb25cbiAqICAgUnVudGltZSBmaWVsZHMgd2hlbiBkZXZlbG9wbWVudCBpcyBvZmYuXG4gKiBAcHJvcGVydHkge0ZyYWdtZW50fSBGcmFnbWVudFxuICogICBGcmFnbWVudC5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBudWxsIHwgdW5kZWZpbmVkfSBbZGV2ZWxvcG1lbnRdXG4gKiAgIFdoZXRoZXIgdG8gdXNlIGBqc3hERVZgICh3aGVuIG9uKSBvciBganN4YCBhbmQgYGpzeHNgICh3aGVuIG9mZikgKG9wdGlvbmFsKS5cbiAqIEBwcm9wZXJ0eSB7SnN4fSBqc3hcbiAqICAgRHluYW1pYyBKU1guXG4gKiBAcHJvcGVydHkge0pzeERldiB8IG51bGwgfCB1bmRlZmluZWR9IFtqc3hERVZdXG4gKiAgIERldmVsb3BtZW50IEpTWCAob3B0aW9uYWwpLlxuICogQHByb3BlcnR5IHtKc3h9IGpzeHNcbiAqICAgU3RhdGljIEpTWC5cbiAqXG4gKiBAdHlwZWRlZiBSdW50aW1lVW5rbm93blxuICogICBSdW50aW1lIGZpZWxkcyB3aGVuIGRldmVsb3BtZW50IG1pZ2h0IGJlIG9uIG9yIG9mZi5cbiAqIEBwcm9wZXJ0eSB7RnJhZ21lbnR9IEZyYWdtZW50XG4gKiAgIEZyYWdtZW50LlxuICogQHByb3BlcnR5IHtib29sZWFufSBkZXZlbG9wbWVudFxuICogICBXaGV0aGVyIHRvIHVzZSBganN4REVWYCAod2hlbiBvbikgb3IgYGpzeGAgYW5kIGBqc3hzYCAod2hlbiBvZmYpLlxuICogQHByb3BlcnR5IHtKc3ggfCBudWxsIHwgdW5kZWZpbmVkfSBbanN4XVxuICogICBEeW5hbWljIEpTWCAob3B0aW9uYWwpLlxuICogQHByb3BlcnR5IHtKc3hEZXYgfCBudWxsIHwgdW5kZWZpbmVkfSBbanN4REVWXVxuICogICBEZXZlbG9wbWVudCBKU1ggKG9wdGlvbmFsKS5cbiAqIEBwcm9wZXJ0eSB7SnN4IHwgbnVsbCB8IHVuZGVmaW5lZH0gW2pzeHNdXG4gKiAgIFN0YXRpYyBKU1ggKG9wdGlvbmFsKS5cbiAqXG4gKiBAdHlwZWRlZiBTb3VyY2VcbiAqICAgSW5mbyBhYm91dCBzb3VyY2UuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHVuZGVmaW5lZH0gY29sdW1uTnVtYmVyXG4gKiAgIENvbHVtbiB3aGVyZSB0aGluZyBzdGFydHMgKDAtaW5kZXhlZCkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gZmlsZU5hbWVcbiAqICAgTmFtZSBvZiBzb3VyY2UgZmlsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBsaW5lTnVtYmVyXG4gKiAgIExpbmUgd2hlcmUgdGhpbmcgc3RhcnRzICgxLWluZGV4ZWQpLlxuICpcbiAqIEB0eXBlZGVmIHsnaHRtbCcgfCAnc3ZnJ30gU3BhY2VcbiAqICAgTmFtZXNwYWNlLlxuICpcbiAqICAgPiDwn5GJICoqTm90ZSoqOiBoYXN0IGlzIG5vdCBYTUwuXG4gKiAgID4gSXQgc3VwcG9ydHMgU1ZHIGFzIGVtYmVkZGVkIGluIEhUTUwuXG4gKiAgID4gSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIGluIFhNTC5cbiAqICAgPiBQYXNzaW5nIFNWRyBtaWdodCBicmVhayBidXQgZnJhZ21lbnRzIG9mIG1vZGVybiBTVkcgc2hvdWxkIGJlIGZpbmUuXG4gKiAgID4gVXNlIGB4YXN0YCBpZiB5b3UgbmVlZCB0byBzdXBwb3J0IFNWRyBhcyBYTUwuXG4gKlxuICogQHR5cGVkZWYgU3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHByb3BlcnR5IHt1bmtub3dufSBGcmFnbWVudFxuICogICBGcmFnbWVudCBzeW1ib2wuXG4gKiBAcHJvcGVydHkge0FycmF5PFBhcmVudHM+fSBhbmNlc3RvcnNcbiAqICAgU3RhY2sgb2YgcGFyZW50cy5cbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxDb21wb25lbnRzPn0gY29tcG9uZW50c1xuICogICBDb21wb25lbnRzIHRvIHN3YXAuXG4gKiBAcHJvcGVydHkge0NyZWF0ZX0gY3JlYXRlXG4gKiAgIENyZWF0ZSBzb21ldGhpbmcgaW4gZGV2ZWxvcG1lbnQgb3IgcHJvZHVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudEF0dHJpYnV0ZU5hbWVDYXNlfSBlbGVtZW50QXR0cmlidXRlTmFtZUNhc2VcbiAqICAgQ2FzaW5nIHRvIHVzZSBmb3IgYXR0cmlidXRlIG5hbWVzLlxuICogQHByb3BlcnR5IHtFdmFsdWF0ZXIgfCB1bmRlZmluZWR9IGV2YWx1YXRlclxuICogICBFdmFsdWF0b3IgdGhhdCB0dXJucyBFU1RyZWUgQVNUcyBpbnRvIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBmaWxlUGF0aFxuICogICBGaWxlIHBhdGguXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlnbm9yZUludmFsaWRTdHlsZVxuICogICBJZ25vcmUgaW52YWxpZCBDU1MgaW4gYHN0eWxlYCBwcm9wcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc0tleXNcbiAqICAgR2VuZXJhdGUga2V5cyB0byBvcHRpbWl6ZSBmcmFtZXdvcmtzIHRoYXQgc3VwcG9ydCB0aGVtLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXNzTm9kZVxuICogICBQYXNzIGBub2RlYCB0byBjb21wb25lbnRzLlxuICogQHByb3BlcnR5IHtTY2hlbWF9IHNjaGVtYVxuICogICBDdXJyZW50IHNjaGVtYS5cbiAqIEBwcm9wZXJ0eSB7U3R5bGVQcm9wZXJ0eU5hbWVDYXNlfSBzdHlsZVByb3BlcnR5TmFtZUNhc2VcbiAqICAgQ2FzaW5nIHRvIHVzZSBmb3IgcHJvcGVydHkgbmFtZXMgaW4gYHN0eWxlYCBvYmplY3RzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0YWJsZUNlbGxBbGlnblRvU3R5bGVcbiAqICAgVHVybiBvYnNvbGV0ZSBgYWxpZ25gIHByb3BzIG9uIGB0ZGAgYW5kIGB0aGAgaW50byBDU1MgYHN0eWxlYCBwcm9wcy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gU3R5bGVcbiAqICAgU3R5bGUgbWFwLlxuICpcbiAqIEB0eXBlZGVmIHsnY3NzJyB8ICdkb20nfSBTdHlsZVByb3BlcnR5TmFtZUNhc2VcbiAqICAgQ2FzaW5nIHRvIHVzZSBmb3IgcHJvcGVydHkgbmFtZXMgaW4gYHN0eWxlYCBvYmplY3RzLlxuICpcbiAqICAgQ1NTIGNhc2luZyBpcyBmb3IgZXhhbXBsZSBgYmFja2dyb3VuZC1jb2xvcmAgYW5kIGAtd2Via2l0LWxpbmUtY2xhbXBgLlxuICogICBET00gY2FzaW5nIGlzIGZvciBleGFtcGxlIGBiYWNrZ3JvdW5kQ29sb3JgIGFuZCBgV2Via2l0TGluZUNsYW1wYC5cbiAqXG4gKiBAdHlwZWRlZiB7U3R5bGUgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nfSBWYWx1ZVxuICogICBQcmltaXRpdmUgcHJvcGVydHkgdmFsdWUgYW5kIGBTdHlsZWAgbWFwLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1J1bnRpbWVEZXZlbG9wbWVudCAmIFJlZ3VsYXJGaWVsZHN9IERldmVsb3BtZW50XG4gKiAgIENvbmZpZ3VyYXRpb24gKGRldmVsb3BtZW50KS5cbiAqIEB0eXBlZGVmIHtEZXZlbG9wbWVudCB8IFByb2R1Y3Rpb24gfCBVbmtub3dufSBPcHRpb25zXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKiBAdHlwZWRlZiB7UmVndWxhckZpZWxkcyAmIFJ1bnRpbWVQcm9kdWN0aW9ufSBQcm9kdWN0aW9uXG4gKiAgIENvbmZpZ3VyYXRpb24gKHByb2R1Y3Rpb24pLlxuICogQHR5cGVkZWYge1JlZ3VsYXJGaWVsZHMgJiBSdW50aW1lVW5rbm93bn0gVW5rbm93blxuICogICBDb25maWd1cmF0aW9uIChwcm9kdWN0aW9uIG9yIGRldmVsb3BtZW50KS5cbiAqL1xuXG5pbXBvcnQge3N0cmluZ2lmeSBhcyBjb21tYXN9IGZyb20gJ2NvbW1hLXNlcGFyYXRlZC10b2tlbnMnXG5pbXBvcnQge29rIGFzIGFzc2VydH0gZnJvbSAnZGV2bG9wJ1xuaW1wb3J0IHtuYW1lIGFzIGlzSWRlbnRpZmllck5hbWV9IGZyb20gJ2VzdHJlZS11dGlsLWlzLWlkZW50aWZpZXItbmFtZSdcbmltcG9ydCB7d2hpdGVzcGFjZX0gZnJvbSAnaGFzdC11dGlsLXdoaXRlc3BhY2UnXG5pbXBvcnQge2ZpbmQsIGhhc3RUb1JlYWN0LCBodG1sLCBzdmd9IGZyb20gJ3Byb3BlcnR5LWluZm9ybWF0aW9uJ1xuaW1wb3J0IHtzdHJpbmdpZnkgYXMgc3BhY2VzfSBmcm9tICdzcGFjZS1zZXBhcmF0ZWQtdG9rZW5zJ1xuaW1wb3J0IHN0eWxlVG9PYmplY3QgZnJvbSAnc3R5bGUtdG8tb2JqZWN0J1xuaW1wb3J0IHtwb2ludFN0YXJ0fSBmcm9tICd1bmlzdC11dGlsLXBvc2l0aW9uJ1xuaW1wb3J0IHtWRmlsZU1lc3NhZ2V9IGZyb20gJ3ZmaWxlLW1lc3NhZ2UnXG5cbmNvbnN0IG93biA9IHt9Lmhhc093blByb3BlcnR5XG5cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbmNvbnN0IGVtcHR5TWFwID0gbmV3IE1hcCgpXG5cbmNvbnN0IGNhcCA9IC9bQS1aXS9nXG5jb25zdCBkYXNoU29tZXRoaW5nID0gLy0oW2Etel0pL2dcblxuLy8gYHJlYWN0LWRvbWAgdHJpZ2dlcnMgYSB3YXJuaW5nIGZvciAqYW55KiB3aGl0ZSBzcGFjZSBpbiB0YWJsZXMuXG4vLyBUbyBmb2xsb3cgR0ZNLCBgbWRhc3QtdXRpbC10by1oYXN0YCBpbmplY3RzIGxpbmUgZW5kaW5ncyBiZXR3ZWVuIGVsZW1lbnRzLlxuLy8gT3RoZXIgdG9vbHMgbWlnaHQgZG8gc28gdG9vLCBidXQgdGhleSBkb27igJl0IGRvIGhlcmUsIHNvIHdlIHJlbW92ZSBhbGwgb2Zcbi8vIHRoYXQuXG5cbi8vIFNlZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcwODE+LlxuLy8gU2VlOiA8aHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzUxNT4uXG4vLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vcmVtYXJranMvcmVtYXJrLXJlYWN0L2lzc3Vlcy82ND4uXG4vLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0L3B1bGwvMjk+LlxuLy8gU2VlOiA8aHR0cHM6Ly9naXRodWIuY29tL3JlaHlwZWpzL3JlaHlwZS1yZWFjdC9wdWxsLzMyPi5cbi8vIFNlZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3QvcHVsbC80NT4uXG5jb25zdCB0YWJsZUVsZW1lbnRzID0gbmV3IFNldChbJ3RhYmxlJywgJ3Rib2R5JywgJ3RoZWFkJywgJ3Rmb290JywgJ3RyJ10pXG5cbmNvbnN0IHRhYmxlQ2VsbEVsZW1lbnQgPSBuZXcgU2V0KFsndGQnLCAndGgnXSlcblxuY29uc3QgZG9jcyA9ICdodHRwczovL2dpdGh1Yi5jb20vc3ludGF4LXRyZWUvaGFzdC11dGlsLXRvLWpzeC1ydW50aW1lJ1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGhhc3QgdHJlZSB0byBwcmVhY3QsIHJlYWN0LCBzb2xpZCwgc3ZlbHRlLCB2dWUsIGV0Yy4sXG4gKiB3aXRoIGFuIGF1dG9tYXRpYyBKU1ggcnVudGltZS5cbiAqXG4gKiBAcGFyYW0ge05vZGVzfSB0cmVlXG4gKiAgIFRyZWUgdG8gdHJhbnNmb3JtLlxuICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zXG4gKiAgIENvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKS5cbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH1cbiAqICAgSlNYIGVsZW1lbnQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSnN4UnVudGltZSh0cmVlLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLkZyYWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBgRnJhZ21lbnRgIGluIG9wdGlvbnMnKVxuICB9XG5cbiAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLmZpbGVQYXRoIHx8IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge0NyZWF0ZX0gKi9cbiAgbGV0IGNyZWF0ZVxuXG4gIGlmIChvcHRpb25zLmRldmVsb3BtZW50KSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmpzeERFViAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIGBqc3hERVZgIGluIG9wdGlvbnMgd2hlbiBgZGV2ZWxvcG1lbnQ6IHRydWVgJ1xuICAgICAgKVxuICAgIH1cblxuICAgIGNyZWF0ZSA9IGRldmVsb3BtZW50Q3JlYXRlKGZpbGVQYXRoLCBvcHRpb25zLmpzeERFVilcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuanN4ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBganN4YCBpbiBwcm9kdWN0aW9uIG9wdGlvbnMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5qc3hzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBganN4c2AgaW4gcHJvZHVjdGlvbiBvcHRpb25zJylcbiAgICB9XG5cbiAgICBjcmVhdGUgPSBwcm9kdWN0aW9uQ3JlYXRlKGZpbGVQYXRoLCBvcHRpb25zLmpzeCwgb3B0aW9ucy5qc3hzKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtTdGF0ZX0gKi9cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgRnJhZ21lbnQ6IG9wdGlvbnMuRnJhZ21lbnQsXG4gICAgYW5jZXN0b3JzOiBbXSxcbiAgICBjb21wb25lbnRzOiBvcHRpb25zLmNvbXBvbmVudHMgfHwge30sXG4gICAgY3JlYXRlLFxuICAgIGVsZW1lbnRBdHRyaWJ1dGVOYW1lQ2FzZTogb3B0aW9ucy5lbGVtZW50QXR0cmlidXRlTmFtZUNhc2UgfHwgJ3JlYWN0JyxcbiAgICBldmFsdWF0ZXI6IG9wdGlvbnMuY3JlYXRlRXZhbHVhdGVyID8gb3B0aW9ucy5jcmVhdGVFdmFsdWF0ZXIoKSA6IHVuZGVmaW5lZCxcbiAgICBmaWxlUGF0aCxcbiAgICBpZ25vcmVJbnZhbGlkU3R5bGU6IG9wdGlvbnMuaWdub3JlSW52YWxpZFN0eWxlIHx8IGZhbHNlLFxuICAgIHBhc3NLZXlzOiBvcHRpb25zLnBhc3NLZXlzICE9PSBmYWxzZSxcbiAgICBwYXNzTm9kZTogb3B0aW9ucy5wYXNzTm9kZSB8fCBmYWxzZSxcbiAgICBzY2hlbWE6IG9wdGlvbnMuc3BhY2UgPT09ICdzdmcnID8gc3ZnIDogaHRtbCxcbiAgICBzdHlsZVByb3BlcnR5TmFtZUNhc2U6IG9wdGlvbnMuc3R5bGVQcm9wZXJ0eU5hbWVDYXNlIHx8ICdkb20nLFxuICAgIHRhYmxlQ2VsbEFsaWduVG9TdHlsZTogb3B0aW9ucy50YWJsZUNlbGxBbGlnblRvU3R5bGUgIT09IGZhbHNlXG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBvbmUoc3RhdGUsIHRyZWUsIHVuZGVmaW5lZClcblxuICAvLyBKU1ggZWxlbWVudC5cbiAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIFRleHQgbm9kZSBvciBzb21ldGhpbmcgdGhhdCB0dXJuZWQgaW50byBub3RoaW5nLlxuICByZXR1cm4gc3RhdGUuY3JlYXRlKFxuICAgIHRyZWUsXG4gICAgc3RhdGUuRnJhZ21lbnQsXG4gICAge2NoaWxkcmVuOiByZXN1bHQgfHwgdW5kZWZpbmVkfSxcbiAgICB1bmRlZmluZWRcbiAgKVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtOb2Rlc30gbm9kZVxuICogICBDdXJyZW50IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0ga2V5XG4gKiAgIEtleS5cbiAqIEByZXR1cm5zIHtDaGlsZCB8IHVuZGVmaW5lZH1cbiAqICAgQ2hpbGQsIG9wdGlvbmFsLlxuICovXG5mdW5jdGlvbiBvbmUoc3RhdGUsIG5vZGUsIGtleSkge1xuICBpZiAobm9kZS50eXBlID09PSAnZWxlbWVudCcpIHtcbiAgICByZXR1cm4gZWxlbWVudChzdGF0ZSwgbm9kZSwga2V5KVxuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ21keEZsb3dFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdtZHhUZXh0RXhwcmVzc2lvbicpIHtcbiAgICByZXR1cm4gbWR4RXhwcmVzc2lvbihzdGF0ZSwgbm9kZSlcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgPT09ICdtZHhKc3hGbG93RWxlbWVudCcgfHwgbm9kZS50eXBlID09PSAnbWR4SnN4VGV4dEVsZW1lbnQnKSB7XG4gICAgcmV0dXJuIG1keEpzeEVsZW1lbnQoc3RhdGUsIG5vZGUsIGtleSlcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgPT09ICdtZHhqc0VzbScpIHtcbiAgICByZXR1cm4gbWR4RXNtKHN0YXRlLCBub2RlKVxuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3Jvb3QnKSB7XG4gICAgcmV0dXJuIHJvb3Qoc3RhdGUsIG5vZGUsIGtleSlcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgIHJldHVybiB0ZXh0KHN0YXRlLCBub2RlKVxuICB9XG59XG5cbi8qKlxuICogSGFuZGxlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtFbGVtZW50fSBub2RlXG4gKiAgIEN1cnJlbnQgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBrZXlcbiAqICAgS2V5LlxuICogQHJldHVybnMge0NoaWxkIHwgdW5kZWZpbmVkfVxuICogICBDaGlsZCwgb3B0aW9uYWwuXG4gKi9cbmZ1bmN0aW9uIGVsZW1lbnQoc3RhdGUsIG5vZGUsIGtleSkge1xuICBjb25zdCBwYXJlbnRTY2hlbWEgPSBzdGF0ZS5zY2hlbWFcbiAgbGV0IHNjaGVtYSA9IHBhcmVudFNjaGVtYVxuXG4gIGlmIChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycgJiYgcGFyZW50U2NoZW1hLnNwYWNlID09PSAnaHRtbCcpIHtcbiAgICBzY2hlbWEgPSBzdmdcbiAgICBzdGF0ZS5zY2hlbWEgPSBzY2hlbWFcbiAgfVxuXG4gIHN0YXRlLmFuY2VzdG9ycy5wdXNoKG5vZGUpXG5cbiAgY29uc3QgdHlwZSA9IGZpbmRDb21wb25lbnRGcm9tTmFtZShzdGF0ZSwgbm9kZS50YWdOYW1lLCBmYWxzZSlcbiAgY29uc3QgcHJvcHMgPSBjcmVhdGVFbGVtZW50UHJvcHMoc3RhdGUsIG5vZGUpXG4gIGxldCBjaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKHN0YXRlLCBub2RlKVxuXG4gIGlmICh0YWJsZUVsZW1lbnRzLmhhcyhub2RlLnRhZ05hbWUpKSB7XG4gICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyA/ICF3aGl0ZXNwYWNlKGNoaWxkKSA6IHRydWVcbiAgICB9KVxuICB9XG5cbiAgYWRkTm9kZShzdGF0ZSwgcHJvcHMsIHR5cGUsIG5vZGUpXG4gIGFkZENoaWxkcmVuKHByb3BzLCBjaGlsZHJlbilcblxuICAvLyBSZXN0b3JlLlxuICBzdGF0ZS5hbmNlc3RvcnMucG9wKClcbiAgc3RhdGUuc2NoZW1hID0gcGFyZW50U2NoZW1hXG5cbiAgcmV0dXJuIHN0YXRlLmNyZWF0ZShub2RlLCB0eXBlLCBwcm9wcywga2V5KVxufVxuXG4vKipcbiAqIEhhbmRsZSBNRFggZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlfSBzdGF0ZVxuICogICBJbmZvIHBhc3NlZCBhcm91bmQuXG4gKiBAcGFyYW0ge01keEZsb3dFeHByZXNzaW9uIHwgTWR4VGV4dEV4cHJlc3Npb259IG5vZGVcbiAqICAgQ3VycmVudCBub2RlLlxuICogQHJldHVybnMge0NoaWxkIHwgdW5kZWZpbmVkfVxuICogICBDaGlsZCwgb3B0aW9uYWwuXG4gKi9cbmZ1bmN0aW9uIG1keEV4cHJlc3Npb24oc3RhdGUsIG5vZGUpIHtcbiAgaWYgKG5vZGUuZGF0YSAmJiBub2RlLmRhdGEuZXN0cmVlICYmIHN0YXRlLmV2YWx1YXRlcikge1xuICAgIGNvbnN0IHByb2dyYW0gPSBub2RlLmRhdGEuZXN0cmVlXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHByb2dyYW0uYm9keVswXVxuICAgIGFzc2VydChleHByZXNzaW9uLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JylcblxuICAgIC8vIEFzc3VtZSByZXN1bHQgaXMgYSBjaGlsZC5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtDaGlsZCB8IHVuZGVmaW5lZH0gKi8gKFxuICAgICAgc3RhdGUuZXZhbHVhdGVyLmV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uLmV4cHJlc3Npb24pXG4gICAgKVxuICB9XG5cbiAgY3Jhc2hFc3RyZWUoc3RhdGUsIG5vZGUucG9zaXRpb24pXG59XG5cbi8qKlxuICogSGFuZGxlIE1EWCBFU00uXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtNZHhqc0VzbX0gbm9kZVxuICogICBDdXJyZW50IG5vZGUuXG4gKiBAcmV0dXJucyB7Q2hpbGQgfCB1bmRlZmluZWR9XG4gKiAgIENoaWxkLCBvcHRpb25hbC5cbiAqL1xuZnVuY3Rpb24gbWR4RXNtKHN0YXRlLCBub2RlKSB7XG4gIGlmIChub2RlLmRhdGEgJiYgbm9kZS5kYXRhLmVzdHJlZSAmJiBzdGF0ZS5ldmFsdWF0ZXIpIHtcbiAgICAvLyBBc3N1bWUgcmVzdWx0IGlzIGEgY2hpbGQuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7Q2hpbGQgfCB1bmRlZmluZWR9ICovIChcbiAgICAgIHN0YXRlLmV2YWx1YXRlci5ldmFsdWF0ZVByb2dyYW0obm9kZS5kYXRhLmVzdHJlZSlcbiAgICApXG4gIH1cblxuICBjcmFzaEVzdHJlZShzdGF0ZSwgbm9kZS5wb3NpdGlvbilcbn1cblxuLyoqXG4gKiBIYW5kbGUgTURYIEpTWC5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlfSBzdGF0ZVxuICogICBJbmZvIHBhc3NlZCBhcm91bmQuXG4gKiBAcGFyYW0ge01keEpzeEZsb3dFbGVtZW50IHwgTWR4SnN4VGV4dEVsZW1lbnR9IG5vZGVcbiAqICAgQ3VycmVudCBub2RlLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGtleVxuICogICBLZXkuXG4gKiBAcmV0dXJucyB7Q2hpbGQgfCB1bmRlZmluZWR9XG4gKiAgIENoaWxkLCBvcHRpb25hbC5cbiAqL1xuZnVuY3Rpb24gbWR4SnN4RWxlbWVudChzdGF0ZSwgbm9kZSwga2V5KSB7XG4gIGNvbnN0IHBhcmVudFNjaGVtYSA9IHN0YXRlLnNjaGVtYVxuICBsZXQgc2NoZW1hID0gcGFyZW50U2NoZW1hXG5cbiAgaWYgKG5vZGUubmFtZSA9PT0gJ3N2ZycgJiYgcGFyZW50U2NoZW1hLnNwYWNlID09PSAnaHRtbCcpIHtcbiAgICBzY2hlbWEgPSBzdmdcbiAgICBzdGF0ZS5zY2hlbWEgPSBzY2hlbWFcbiAgfVxuXG4gIHN0YXRlLmFuY2VzdG9ycy5wdXNoKG5vZGUpXG5cbiAgY29uc3QgdHlwZSA9XG4gICAgbm9kZS5uYW1lID09PSBudWxsXG4gICAgICA/IHN0YXRlLkZyYWdtZW50XG4gICAgICA6IGZpbmRDb21wb25lbnRGcm9tTmFtZShzdGF0ZSwgbm9kZS5uYW1lLCB0cnVlKVxuICBjb25zdCBwcm9wcyA9IGNyZWF0ZUpzeEVsZW1lbnRQcm9wcyhzdGF0ZSwgbm9kZSlcbiAgY29uc3QgY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbihzdGF0ZSwgbm9kZSlcblxuICBhZGROb2RlKHN0YXRlLCBwcm9wcywgdHlwZSwgbm9kZSlcbiAgYWRkQ2hpbGRyZW4ocHJvcHMsIGNoaWxkcmVuKVxuXG4gIC8vIFJlc3RvcmUuXG4gIHN0YXRlLmFuY2VzdG9ycy5wb3AoKVxuICBzdGF0ZS5zY2hlbWEgPSBwYXJlbnRTY2hlbWFcblxuICByZXR1cm4gc3RhdGUuY3JlYXRlKG5vZGUsIHR5cGUsIHByb3BzLCBrZXkpXG59XG5cbi8qKlxuICogSGFuZGxlIHJvb3QuXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtSb290fSBub2RlXG4gKiAgIEN1cnJlbnQgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBrZXlcbiAqICAgS2V5LlxuICogQHJldHVybnMge0NoaWxkIHwgdW5kZWZpbmVkfVxuICogICBDaGlsZCwgb3B0aW9uYWwuXG4gKi9cbmZ1bmN0aW9uIHJvb3Qoc3RhdGUsIG5vZGUsIGtleSkge1xuICAvKiogQHR5cGUge1Byb3BzfSAqL1xuICBjb25zdCBwcm9wcyA9IHt9XG5cbiAgYWRkQ2hpbGRyZW4ocHJvcHMsIGNyZWF0ZUNoaWxkcmVuKHN0YXRlLCBub2RlKSlcblxuICByZXR1cm4gc3RhdGUuY3JlYXRlKG5vZGUsIHN0YXRlLkZyYWdtZW50LCBwcm9wcywga2V5KVxufVxuXG4vKipcbiAqIEhhbmRsZSB0ZXh0LlxuICpcbiAqIEBwYXJhbSB7U3RhdGV9IF9cbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtUZXh0fSBub2RlXG4gKiAgIEN1cnJlbnQgbm9kZS5cbiAqIEByZXR1cm5zIHtDaGlsZCB8IHVuZGVmaW5lZH1cbiAqICAgQ2hpbGQsIG9wdGlvbmFsLlxuICovXG5mdW5jdGlvbiB0ZXh0KF8sIG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudmFsdWVcbn1cblxuLyoqXG4gKiBBZGQgYG5vZGVgIHRvIHByb3BzLlxuICpcbiAqIEBwYXJhbSB7U3RhdGV9IHN0YXRlXG4gKiAgIEluZm8gcGFzc2VkIGFyb3VuZC5cbiAqIEBwYXJhbSB7UHJvcHN9IHByb3BzXG4gKiAgIFByb3BzLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlXG4gKiAgIFR5cGUuXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBNZHhKc3hGbG93RWxlbWVudCB8IE1keEpzeFRleHRFbGVtZW50fSBub2RlXG4gKiAgIE5vZGUuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICovXG5mdW5jdGlvbiBhZGROb2RlKHN0YXRlLCBwcm9wcywgdHlwZSwgbm9kZSkge1xuICAvLyBJZiB0aGlzIGlzIHN3YXBwZWQgb3V0IGZvciBhIGNvbXBvbmVudDpcbiAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSBzdGF0ZS5GcmFnbWVudCAmJiBzdGF0ZS5wYXNzTm9kZSkge1xuICAgIHByb3BzLm5vZGUgPSBub2RlXG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgY2hpbGRyZW4gdG8gcHJvcHMuXG4gKlxuICogQHBhcmFtIHtQcm9wc30gcHJvcHNcbiAqICAgUHJvcHMuXG4gKiBAcGFyYW0ge0FycmF5PENoaWxkPn0gY2hpbGRyZW5cbiAqICAgQ2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICovXG5mdW5jdGlvbiBhZGRDaGlsZHJlbihwcm9wcywgY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNoaWxkcmVuLmxlbmd0aCA+IDEgPyBjaGlsZHJlbiA6IGNoaWxkcmVuWzBdXG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gX1xuICogICBQYXRoIHRvIGZpbGUuXG4gKiBAcGFyYW0ge0pzeH0ganN4XG4gKiAgIER5bmFtaWMuXG4gKiBAcGFyYW0ge0pzeH0ganN4c1xuICogICBTdGF0aWMuXG4gKiBAcmV0dXJucyB7Q3JlYXRlfVxuICogICBDcmVhdGUgYSBwcm9kdWN0aW9uIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHByb2R1Y3Rpb25DcmVhdGUoXywganN4LCBqc3hzKSB7XG4gIHJldHVybiBjcmVhdGVcbiAgLyoqIEB0eXBlIHtDcmVhdGV9ICovXG4gIGZ1bmN0aW9uIGNyZWF0ZShfLCB0eXBlLCBwcm9wcywga2V5KSB7XG4gICAgLy8gT25seSBhbiBhcnJheSB3aGVuIHRoZXJlIGFyZSAyIG9yIG1vcmUgY2hpbGRyZW4uXG4gICAgY29uc3QgaXNTdGF0aWNDaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkocHJvcHMuY2hpbGRyZW4pXG4gICAgY29uc3QgZm4gPSBpc1N0YXRpY0NoaWxkcmVuID8ganN4cyA6IGpzeFxuICAgIHJldHVybiBrZXkgPyBmbih0eXBlLCBwcm9wcywga2V5KSA6IGZuKHR5cGUsIHByb3BzKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGZpbGVQYXRoXG4gKiAgIFBhdGggdG8gZmlsZS5cbiAqIEBwYXJhbSB7SnN4RGV2fSBqc3hERVZcbiAqICAgRGV2ZWxvcG1lbnQuXG4gKiBAcmV0dXJucyB7Q3JlYXRlfVxuICogICBDcmVhdGUgYSBkZXZlbG9wbWVudCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBkZXZlbG9wbWVudENyZWF0ZShmaWxlUGF0aCwganN4REVWKSB7XG4gIHJldHVybiBjcmVhdGVcbiAgLyoqIEB0eXBlIHtDcmVhdGV9ICovXG4gIGZ1bmN0aW9uIGNyZWF0ZShub2RlLCB0eXBlLCBwcm9wcywga2V5KSB7XG4gICAgLy8gT25seSBhbiBhcnJheSB3aGVuIHRoZXJlIGFyZSAyIG9yIG1vcmUgY2hpbGRyZW4uXG4gICAgY29uc3QgaXNTdGF0aWNDaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkocHJvcHMuY2hpbGRyZW4pXG4gICAgY29uc3QgcG9pbnQgPSBwb2ludFN0YXJ0KG5vZGUpXG4gICAgcmV0dXJuIGpzeERFVihcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGtleSxcbiAgICAgIGlzU3RhdGljQ2hpbGRyZW4sXG4gICAgICB7XG4gICAgICAgIGNvbHVtbk51bWJlcjogcG9pbnQgPyBwb2ludC5jb2x1bW4gLSAxIDogdW5kZWZpbmVkLFxuICAgICAgICBmaWxlTmFtZTogZmlsZVBhdGgsXG4gICAgICAgIGxpbmVOdW1iZXI6IHBvaW50ID8gcG9pbnQubGluZSA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIHVuZGVmaW5lZFxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBwcm9wcyBmcm9tIGFuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtFbGVtZW50fSBub2RlXG4gKiAgIEN1cnJlbnQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtQcm9wc31cbiAqICAgUHJvcHMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRQcm9wcyhzdGF0ZSwgbm9kZSkge1xuICAvKiogQHR5cGUge1Byb3BzfSAqL1xuICBjb25zdCBwcm9wcyA9IHt9XG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgYWxpZ25WYWx1ZVxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgbGV0IHByb3BcblxuICBmb3IgKHByb3AgaW4gbm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3AgIT09ICdjaGlsZHJlbicgJiYgb3duLmNhbGwobm9kZS5wcm9wZXJ0aWVzLCBwcm9wKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlUHJvcGVydHkoc3RhdGUsIHByb3AsIG5vZGUucHJvcGVydGllc1twcm9wXSlcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSByZXN1bHRcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc3RhdGUudGFibGVDZWxsQWxpZ25Ub1N0eWxlICYmXG4gICAgICAgICAga2V5ID09PSAnYWxpZ24nICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIHRhYmxlQ2VsbEVsZW1lbnQuaGFzKG5vZGUudGFnTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWxpZ25WYWx1ZSA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxpZ25WYWx1ZSkge1xuICAgIC8vIEFzc3VtZSBzdHlsZSBpcyBhbiBvYmplY3QuXG4gICAgY29uc3Qgc3R5bGUgPSAvKiogQHR5cGUge1N0eWxlfSAqLyAocHJvcHMuc3R5bGUgfHwgKHByb3BzLnN0eWxlID0ge30pKVxuICAgIHN0eWxlW3N0YXRlLnN0eWxlUHJvcGVydHlOYW1lQ2FzZSA9PT0gJ2NzcycgPyAndGV4dC1hbGlnbicgOiAndGV4dEFsaWduJ10gPVxuICAgICAgYWxpZ25WYWx1ZVxuICB9XG5cbiAgcmV0dXJuIHByb3BzXG59XG5cbi8qKlxuICogQ3JlYXRlIHByb3BzIGZyb20gYSBKU1ggZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlfSBzdGF0ZVxuICogICBJbmZvIHBhc3NlZCBhcm91bmQuXG4gKiBAcGFyYW0ge01keEpzeEZsb3dFbGVtZW50IHwgTWR4SnN4VGV4dEVsZW1lbnR9IG5vZGVcbiAqICAgQ3VycmVudCBKU1ggZWxlbWVudC5cbiAqIEByZXR1cm5zIHtQcm9wc31cbiAqICAgUHJvcHMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUpzeEVsZW1lbnRQcm9wcyhzdGF0ZSwgbm9kZSkge1xuICAvKiogQHR5cGUge1Byb3BzfSAqL1xuICBjb25zdCBwcm9wcyA9IHt9XG5cbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2Ygbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgaWYgKGF0dHJpYnV0ZS50eXBlID09PSAnbWR4SnN4RXhwcmVzc2lvbkF0dHJpYnV0ZScpIHtcbiAgICAgIGlmIChhdHRyaWJ1dGUuZGF0YSAmJiBhdHRyaWJ1dGUuZGF0YS5lc3RyZWUgJiYgc3RhdGUuZXZhbHVhdGVyKSB7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBhdHRyaWJ1dGUuZGF0YS5lc3RyZWVcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHByb2dyYW0uYm9keVswXVxuICAgICAgICBhc3NlcnQoZXhwcmVzc2lvbi50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpXG4gICAgICAgIGNvbnN0IG9iamVjdEV4cHJlc3Npb24gPSBleHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgYXNzZXJ0KG9iamVjdEV4cHJlc3Npb24udHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nKVxuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IG9iamVjdEV4cHJlc3Npb24ucHJvcGVydGllc1swXVxuICAgICAgICBhc3NlcnQocHJvcGVydHkudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc3RhdGUuZXZhbHVhdGVyLmV2YWx1YXRlRXhwcmVzc2lvbihwcm9wZXJ0eS5hcmd1bWVudClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Jhc2hFc3RyZWUoc3RhdGUsIG5vZGUucG9zaXRpb24pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBKU1gsIHRoZSBhdXRob3IgaXMgcmVzcG9uc2libGUgb2YgcGFzc2luZyBpbiB0aGUgY29ycmVjdCB2YWx1ZXMuXG4gICAgICBjb25zdCBuYW1lID0gYXR0cmlidXRlLm5hbWVcbiAgICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICAgIGxldCB2YWx1ZVxuXG4gICAgICBpZiAoYXR0cmlidXRlLnZhbHVlICYmIHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUuZGF0YSAmJlxuICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZS5kYXRhLmVzdHJlZSAmJlxuICAgICAgICAgIHN0YXRlLmV2YWx1YXRlclxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcm9ncmFtID0gYXR0cmlidXRlLnZhbHVlLmRhdGEuZXN0cmVlXG4gICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHByb2dyYW0uYm9keVswXVxuICAgICAgICAgIGFzc2VydChleHByZXNzaW9uLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JylcbiAgICAgICAgICB2YWx1ZSA9IHN0YXRlLmV2YWx1YXRlci5ldmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbi5leHByZXNzaW9uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNyYXNoRXN0cmVlKHN0YXRlLCBub2RlLnBvc2l0aW9uKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZS52YWx1ZSA9PT0gbnVsbCA/IHRydWUgOiBhdHRyaWJ1dGUudmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gQXNzdW1lIGEgcHJvcC5cbiAgICAgIHByb3BzW25hbWVdID0gLyoqIEB0eXBlIHtQcm9wc1trZXlvZiBQcm9wc119ICovICh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvcHNcbn1cblxuLyoqXG4gKiBDcmVhdGUgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgSW5mbyBwYXNzZWQgYXJvdW5kLlxuICogQHBhcmFtIHtQYXJlbnRzfSBub2RlXG4gKiAgIEN1cnJlbnQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheTxDaGlsZD59XG4gKiAgIENoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDaGlsZHJlbihzdGF0ZSwgbm9kZSkge1xuICAvKiogQHR5cGUge0FycmF5PENoaWxkPn0gKi9cbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBsZXQgaW5kZXggPSAtMVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIG51bWJlcj59ICovXG4gIC8vIE5vdGU6IHRlc3QgdGhpcyB3aGVuIFNvbGlkIGRvZXNu4oCZdCB3YW50IHRvIG1lcmdlIG15IHVwY29taW5nIFBSLlxuICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBjb3VudHNCeU5hbWUgPSBzdGF0ZS5wYXNzS2V5cyA/IG5ldyBNYXAoKSA6IGVtcHR5TWFwXG5cbiAgd2hpbGUgKCsraW5kZXggPCBub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpbmRleF1cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQga2V5XG5cbiAgICBpZiAoc3RhdGUucGFzc0tleXMpIHtcbiAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICBjaGlsZC50eXBlID09PSAnZWxlbWVudCdcbiAgICAgICAgICA/IGNoaWxkLnRhZ05hbWVcbiAgICAgICAgICA6IGNoaWxkLnR5cGUgPT09ICdtZHhKc3hGbG93RWxlbWVudCcgfHxcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ21keEpzeFRleHRFbGVtZW50J1xuICAgICAgICAgICAgPyBjaGlsZC5uYW1lXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBjb25zdCBjb3VudCA9IGNvdW50c0J5TmFtZS5nZXQobmFtZSkgfHwgMFxuICAgICAgICBrZXkgPSBuYW1lICsgJy0nICsgY291bnRcbiAgICAgICAgY291bnRzQnlOYW1lLnNldChuYW1lLCBjb3VudCArIDEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gb25lKHN0YXRlLCBjaGlsZCwga2V5KVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgY2hpbGRyZW4ucHVzaChyZXN1bHQpXG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW5cbn1cblxuLyoqXG4gKiBIYW5kbGUgYSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlfSBzdGF0ZVxuICogICBJbmZvIHBhc3NlZCBhcm91bmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcFxuICogICBLZXkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlciB8IHN0cmluZz4gfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWVcbiAqICAgaGFzdCBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtGaWVsZCB8IHVuZGVmaW5lZH1cbiAqICAgRmllbGQgZm9yIHJ1bnRpbWUsIG9wdGlvbmFsLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgY29uc3QgaW5mbyA9IGZpbmQoc3RhdGUuc2NoZW1hLCBwcm9wKVxuXG4gIC8vIElnbm9yZSBudWxsaXNoIGFuZCBgTmFOYCB2YWx1ZXMuXG4gIGlmIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNOYU4odmFsdWUpKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIEFjY2VwdCBgYXJyYXlgLlxuICAgIC8vIE1vc3QgcHJvcHMgYXJlIHNwYWNlLXNlcGFyYXRlZC5cbiAgICB2YWx1ZSA9IGluZm8uY29tbWFTZXBhcmF0ZWQgPyBjb21tYXModmFsdWUpIDogc3BhY2VzKHZhbHVlKVxuICB9XG5cbiAgLy8gUmVhY3Qgb25seSBhY2NlcHRzIGBzdHlsZWAgYXMgb2JqZWN0LlxuICBpZiAoaW5mby5wcm9wZXJ0eSA9PT0gJ3N0eWxlJykge1xuICAgIGxldCBzdHlsZU9iamVjdCA9XG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUgOiBwYXJzZVN0eWxlKHN0YXRlLCBTdHJpbmcodmFsdWUpKVxuXG4gICAgaWYgKHN0YXRlLnN0eWxlUHJvcGVydHlOYW1lQ2FzZSA9PT0gJ2NzcycpIHtcbiAgICAgIHN0eWxlT2JqZWN0ID0gdHJhbnNmb3JtU3R5bGVzVG9Dc3NDYXNpbmcoc3R5bGVPYmplY3QpXG4gICAgfVxuXG4gICAgcmV0dXJuIFsnc3R5bGUnLCBzdHlsZU9iamVjdF1cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgc3RhdGUuZWxlbWVudEF0dHJpYnV0ZU5hbWVDYXNlID09PSAncmVhY3QnICYmIGluZm8uc3BhY2VcbiAgICAgID8gaGFzdFRvUmVhY3RbaW5mby5wcm9wZXJ0eV0gfHwgaW5mby5wcm9wZXJ0eVxuICAgICAgOiBpbmZvLmF0dHJpYnV0ZSxcbiAgICB2YWx1ZVxuICBdXG59XG5cbi8qKlxuICogUGFyc2UgYSBDU1MgZGVjbGFyYXRpb24gdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RhdGV9IHN0YXRlXG4gKiAgIEluZm8gcGFzc2VkIGFyb3VuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogICBDU1MgZGVjbGFyYXRpb25zLlxuICogQHJldHVybnMge1N0eWxlfVxuICogICBQcm9wZXJ0aWVzLlxuICogQHRocm93c1xuICogICBUaHJvd3MgYFZGaWxlTWVzc2FnZWAgd2hlbiBDU1MgY2Fubm90IGJlIHBhcnNlZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdHlsZShzdGF0ZSwgdmFsdWUpIHtcbiAgLyoqIEB0eXBlIHtTdHlsZX0gKi9cbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICB0cnkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBzdHlsZS10by1vYmplY3RgIHR5cGVzIGFyZSBicm9rZW4uXG4gICAgc3R5bGVUb09iamVjdCh2YWx1ZSwgcmVwbGFjZXIpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFzdGF0ZS5pZ25vcmVJbnZhbGlkU3R5bGUpIHtcbiAgICAgIGNvbnN0IGNhdXNlID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKVxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBWRmlsZU1lc3NhZ2UoJ0Nhbm5vdCBwYXJzZSBgc3R5bGVgIGF0dHJpYnV0ZScsIHtcbiAgICAgICAgYW5jZXN0b3JzOiBzdGF0ZS5hbmNlc3RvcnMsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBydWxlSWQ6ICdzdHlsZScsXG4gICAgICAgIHNvdXJjZTogJ2hhc3QtdXRpbC10by1qc3gtcnVudGltZSdcbiAgICAgIH0pXG4gICAgICBtZXNzYWdlLmZpbGUgPSBzdGF0ZS5maWxlUGF0aCB8fCB1bmRlZmluZWRcbiAgICAgIG1lc3NhZ2UudXJsID0gZG9jcyArICcjY2Fubm90LXBhcnNlLXN0eWxlLWF0dHJpYnV0ZSdcblxuICAgICAgdGhyb3cgbWVzc2FnZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcblxuICAvKipcbiAgICogQWRkIGEgQ1NTIHByb3BlcnR5IChub3JtYWwsIHNvIHdpdGggZGFzaGVzKSB0byBgcmVzdWx0YCBhcyBhIERPTSBDU1NcbiAgICogcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqICAgS2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogICBWYWx1ZVxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgKiAgIE5vdGhpbmcuXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlcihuYW1lLCB2YWx1ZSkge1xuICAgIGxldCBrZXkgPSBuYW1lXG5cbiAgICBpZiAoa2V5LnNsaWNlKDAsIDIpICE9PSAnLS0nKSB7XG4gICAgICBpZiAoa2V5LnNsaWNlKDAsIDQpID09PSAnLW1zLScpIGtleSA9ICdtcy0nICsga2V5LnNsaWNlKDQpXG4gICAgICBrZXkgPSBrZXkucmVwbGFjZShkYXNoU29tZXRoaW5nLCB0b0NhbWVsKVxuICAgIH1cblxuICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIEpTWCBuYW1lIGZyb20gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdGF0ZX0gc3RhdGVcbiAqICAgVG8gZG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogICBOYW1lLlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0V4cHJlc3Npb25cbiAqICAgQWxsb3cgbWVtYmVyIGV4cHJlc3Npb25zIGFuZCBpZGVudGlmaWVycy5cbiAqIEByZXR1cm5zIHt1bmtub3dufVxuICogICBUbyBkby5cbiAqL1xuZnVuY3Rpb24gZmluZENvbXBvbmVudEZyb21OYW1lKHN0YXRlLCBuYW1lLCBhbGxvd0V4cHJlc3Npb24pIHtcbiAgLyoqIEB0eXBlIHtJZGVudGlmaWVyIHwgTGl0ZXJhbCB8IE1lbWJlckV4cHJlc3Npb259ICovXG4gIGxldCByZXN1bHRcblxuICBpZiAoIWFsbG93RXhwcmVzc2lvbikge1xuICAgIHJlc3VsdCA9IHt0eXBlOiAnTGl0ZXJhbCcsIHZhbHVlOiBuYW1lfVxuICB9IGVsc2UgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgIGNvbnN0IGlkZW50aWZpZXJzID0gbmFtZS5zcGxpdCgnLicpXG4gICAgbGV0IGluZGV4ID0gLTFcbiAgICAvKiogQHR5cGUge0lkZW50aWZpZXIgfCBMaXRlcmFsIHwgTWVtYmVyRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgbm9kZVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBpZGVudGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIC8qKiBAdHlwZSB7SWRlbnRpZmllciB8IExpdGVyYWx9ICovXG4gICAgICBjb25zdCBwcm9wID0gaXNJZGVudGlmaWVyTmFtZShpZGVudGlmaWVyc1tpbmRleF0pXG4gICAgICAgID8ge3R5cGU6ICdJZGVudGlmaWVyJywgbmFtZTogaWRlbnRpZmllcnNbaW5kZXhdfVxuICAgICAgICA6IHt0eXBlOiAnTGl0ZXJhbCcsIHZhbHVlOiBpZGVudGlmaWVyc1tpbmRleF19XG4gICAgICBub2RlID0gbm9kZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICAgICAgICAgIG9iamVjdDogbm9kZSxcbiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IEJvb2xlYW4oaW5kZXggJiYgcHJvcC50eXBlID09PSAnTGl0ZXJhbCcpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICA6IHByb3BcbiAgICB9XG5cbiAgICBhc3NlcnQobm9kZSwgJ2Fsd2F5cyBhIHJlc3VsdCcpXG4gICAgcmVzdWx0ID0gbm9kZVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9XG4gICAgICBpc0lkZW50aWZpZXJOYW1lKG5hbWUpICYmICEvXlthLXpdLy50ZXN0KG5hbWUpXG4gICAgICAgID8ge3R5cGU6ICdJZGVudGlmaWVyJywgbmFtZX1cbiAgICAgICAgOiB7dHlwZTogJ0xpdGVyYWwnLCB2YWx1ZTogbmFtZX1cbiAgfVxuXG4gIC8vIE9ubHkgbGl0ZXJhbHMgY2FuIGJlIHBhc3NlZCBpbiBgY29tcG9uZW50c2AgY3VycmVudGx5LlxuICAvLyBObyBpZGVudGlmaWVycyAvIG1lbWJlciBleHByZXNzaW9ucy5cbiAgaWYgKHJlc3VsdC50eXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICBjb25zdCBuYW1lID0gLyoqIEB0eXBlIHtrZXlvZiBKU1guSW50cmluc2ljRWxlbWVudHN9ICovIChyZXN1bHQudmFsdWUpXG5cbiAgICByZXR1cm4gb3duLmNhbGwoc3RhdGUuY29tcG9uZW50cywgbmFtZSkgPyBzdGF0ZS5jb21wb25lbnRzW25hbWVdIDogbmFtZVxuICB9XG5cbiAgLy8gQXNzdW1lIGNvbXBvbmVudC5cbiAgaWYgKHN0YXRlLmV2YWx1YXRlcikge1xuICAgIHJldHVybiBzdGF0ZS5ldmFsdWF0ZXIuZXZhbHVhdGVFeHByZXNzaW9uKHJlc3VsdClcbiAgfVxuXG4gIGNyYXNoRXN0cmVlKHN0YXRlKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1Bvc2l0aW9uIHwgdW5kZWZpbmVkfSBbcGxhY2VdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmZ1bmN0aW9uIGNyYXNoRXN0cmVlKHN0YXRlLCBwbGFjZSkge1xuICBjb25zdCBtZXNzYWdlID0gbmV3IFZGaWxlTWVzc2FnZShcbiAgICAnQ2Fubm90IGhhbmRsZSBNRFggZXN0cmVlcyB3aXRob3V0IGBjcmVhdGVFdmFsdWF0ZXJgJyxcbiAgICB7XG4gICAgICBhbmNlc3RvcnM6IHN0YXRlLmFuY2VzdG9ycyxcbiAgICAgIHBsYWNlLFxuICAgICAgcnVsZUlkOiAnbWR4LWVzdHJlZScsXG4gICAgICBzb3VyY2U6ICdoYXN0LXV0aWwtdG8tanN4LXJ1bnRpbWUnXG4gICAgfVxuICApXG4gIG1lc3NhZ2UuZmlsZSA9IHN0YXRlLmZpbGVQYXRoIHx8IHVuZGVmaW5lZFxuICBtZXNzYWdlLnVybCA9IGRvY3MgKyAnI2Nhbm5vdC1oYW5kbGUtbWR4LWVzdHJlZXMtd2l0aG91dC1jcmVhdGVldmFsdWF0ZXInXG5cbiAgdGhyb3cgbWVzc2FnZVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIERPTSBjYXNpbmcgc3R5bGUgb2JqZWN0IHRvIGEgQ1NTIGNhc2luZyBzdHlsZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHlsZX0gZG9tQ2FzaW5nXG4gKiBAcmV0dXJucyB7U3R5bGV9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVN0eWxlc1RvQ3NzQ2FzaW5nKGRvbUNhc2luZykge1xuICAvKiogQHR5cGUge1N0eWxlfSAqL1xuICBjb25zdCBjc3NDYXNpbmcgPSB7fVxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgbGV0IGZyb21cblxuICBmb3IgKGZyb20gaW4gZG9tQ2FzaW5nKSB7XG4gICAgaWYgKG93bi5jYWxsKGRvbUNhc2luZywgZnJvbSkpIHtcbiAgICAgIGNzc0Nhc2luZ1t0cmFuc2Zvcm1TdHlsZVRvQ3NzQ2FzaW5nKGZyb20pXSA9IGRvbUNhc2luZ1tmcm9tXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjc3NDYXNpbmdcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBET00gY2FzaW5nIHN0eWxlIGZpZWxkIHRvIGEgQ1NTIGNhc2luZyBzdHlsZSBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtU3R5bGVUb0Nzc0Nhc2luZyhmcm9tKSB7XG4gIGxldCB0byA9IGZyb20ucmVwbGFjZShjYXAsIHRvRGFzaClcbiAgLy8gSGFuZGxlIGBtcy14eHhgIC0+IGAtbXMteHh4YC5cbiAgaWYgKHRvLnNsaWNlKDAsIDMpID09PSAnbXMtJykgdG8gPSAnLScgKyB0b1xuICByZXR1cm4gdG9cbn1cblxuLyoqXG4gKiBNYWtlIGAkMWAgY2FwaXRhbGl6ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IF9cbiAqICAgV2hhdGV2ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gJDFcbiAqICAgU2luZ2xlIEFTQ0lJIGFscGhhYmV0aWNhbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiAgIENhcGl0YWxpemVkIGAkMWAuXG4gKi9cbmZ1bmN0aW9uIHRvQ2FtZWwoXywgJDEpIHtcbiAgcmV0dXJuICQxLnRvVXBwZXJDYXNlKClcbn1cblxuLyoqXG4gKiBNYWtlIGAkMGAgZGFzaCBjYXNlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gJDBcbiAqICAgQ2FwaXRhbGl6ZWQgQVNDSUkgbGV0ZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogICBEYXNoIGFuZCBsb3dlciBsZXR0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRvRGFzaCgkMCkge1xuICByZXR1cm4gJy0nICsgJDAudG9Mb3dlckNhc2UoKVxufVxuIl0sIm5hbWVzIjpbInN0cmluZ2lmeSIsImNvbW1hcyIsIm9rIiwiYXNzZXJ0IiwibmFtZSIsImlzSWRlbnRpZmllck5hbWUiLCJ3aGl0ZXNwYWNlIiwiZmluZCIsImhhc3RUb1JlYWN0IiwiaHRtbCIsInN2ZyIsInNwYWNlcyIsInN0eWxlVG9PYmplY3QiLCJwb2ludFN0YXJ0IiwiVkZpbGVNZXNzYWdlIiwib3duIiwiaGFzT3duUHJvcGVydHkiLCJlbXB0eU1hcCIsIk1hcCIsImNhcCIsImRhc2hTb21ldGhpbmciLCJ0YWJsZUVsZW1lbnRzIiwiU2V0IiwidGFibGVDZWxsRWxlbWVudCIsImRvY3MiLCJ0b0pzeFJ1bnRpbWUiLCJ0cmVlIiwib3B0aW9ucyIsIkZyYWdtZW50IiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiZmlsZVBhdGgiLCJjcmVhdGUiLCJkZXZlbG9wbWVudCIsImpzeERFViIsImRldmVsb3BtZW50Q3JlYXRlIiwianN4IiwianN4cyIsInByb2R1Y3Rpb25DcmVhdGUiLCJzdGF0ZSIsImFuY2VzdG9ycyIsImNvbXBvbmVudHMiLCJlbGVtZW50QXR0cmlidXRlTmFtZUNhc2UiLCJldmFsdWF0ZXIiLCJjcmVhdGVFdmFsdWF0ZXIiLCJpZ25vcmVJbnZhbGlkU3R5bGUiLCJwYXNzS2V5cyIsInBhc3NOb2RlIiwic2NoZW1hIiwic3BhY2UiLCJzdHlsZVByb3BlcnR5TmFtZUNhc2UiLCJ0YWJsZUNlbGxBbGlnblRvU3R5bGUiLCJyZXN1bHQiLCJvbmUiLCJjaGlsZHJlbiIsIm5vZGUiLCJrZXkiLCJ0eXBlIiwiZWxlbWVudCIsIm1keEV4cHJlc3Npb24iLCJtZHhKc3hFbGVtZW50IiwibWR4RXNtIiwicm9vdCIsInRleHQiLCJwYXJlbnRTY2hlbWEiLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwiZmluZENvbXBvbmVudEZyb21OYW1lIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50UHJvcHMiLCJjcmVhdGVDaGlsZHJlbiIsImhhcyIsImZpbHRlciIsImNoaWxkIiwiYWRkTm9kZSIsImFkZENoaWxkcmVuIiwicG9wIiwiZGF0YSIsImVzdHJlZSIsInByb2dyYW0iLCJleHByZXNzaW9uIiwiYm9keSIsImV2YWx1YXRlRXhwcmVzc2lvbiIsImNyYXNoRXN0cmVlIiwicG9zaXRpb24iLCJldmFsdWF0ZVByb2dyYW0iLCJjcmVhdGVKc3hFbGVtZW50UHJvcHMiLCJfIiwidmFsdWUiLCJsZW5ndGgiLCJpc1N0YXRpY0NoaWxkcmVuIiwiQXJyYXkiLCJpc0FycmF5IiwiZm4iLCJwb2ludCIsImNvbHVtbk51bWJlciIsImNvbHVtbiIsImZpbGVOYW1lIiwibGluZU51bWJlciIsImxpbmUiLCJhbGlnblZhbHVlIiwicHJvcCIsInByb3BlcnRpZXMiLCJjYWxsIiwiY3JlYXRlUHJvcGVydHkiLCJzdHlsZSIsImF0dHJpYnV0ZSIsImF0dHJpYnV0ZXMiLCJvYmplY3RFeHByZXNzaW9uIiwicHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJhcmd1bWVudCIsImluZGV4IiwiY291bnRzQnlOYW1lIiwiY291bnQiLCJnZXQiLCJzZXQiLCJpbmZvIiwiTnVtYmVyIiwiaXNOYU4iLCJjb21tYVNlcGFyYXRlZCIsInN0eWxlT2JqZWN0IiwicGFyc2VTdHlsZSIsIlN0cmluZyIsInRyYW5zZm9ybVN0eWxlc1RvQ3NzQ2FzaW5nIiwicmVwbGFjZXIiLCJlcnJvciIsImNhdXNlIiwibWVzc2FnZSIsInJ1bGVJZCIsInNvdXJjZSIsImZpbGUiLCJ1cmwiLCJzbGljZSIsInJlcGxhY2UiLCJ0b0NhbWVsIiwiYWxsb3dFeHByZXNzaW9uIiwiaW5jbHVkZXMiLCJpZGVudGlmaWVycyIsInNwbGl0Iiwib2JqZWN0IiwiY29tcHV0ZWQiLCJCb29sZWFuIiwib3B0aW9uYWwiLCJ0ZXN0IiwicGxhY2UiLCJkb21DYXNpbmciLCJjc3NDYXNpbmciLCJmcm9tIiwidHJhbnNmb3JtU3R5bGVUb0Nzc0Nhc2luZyIsInRvIiwidG9EYXNoIiwiJDEiLCJ0b1VwcGVyQ2FzZSIsIiQwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/hast-util-to-jsx-runtime/lib/index.js\n");
|
||
|
||
/***/ })
|
||
|
||
};
|
||
; |