|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ toText: () => (/* binding */ toText)\n/* harmony export */ });\n/* harmony import */ var hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hast-util-is-element */ \"(ssr)/./node_modules/hast-util-is-element/index.js\");\n/* harmony import */ var unist_util_find_after__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! unist-util-find-after */ \"(ssr)/./node_modules/unist-util-find-after/lib/index.js\");\n/**\n * @typedef {import('hast-util-is-element').TestFunctionAnything} TestFunctionAnything\n * @typedef {import('hast').Content} Content\n * @typedef {import('hast').Text} Text\n * @typedef {import('hast').Comment} Comment\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast').Element} Element\n */ /**\n * @typedef {Content | Root} Node\n * Any node.\n * @typedef {Extract<Node, import('unist').Parent>} Parent\n * Any parent.\n * @typedef {'normal' | 'pre' | 'nowrap' | 'pre-wrap'} Whitespace\n * Valid and useful whitespace values (from CSS).\n * @typedef {0 | 1 | 2} BreakNumber\n * Specific break:\n *\n * * `0` — space\n * * `1` — line ending\n * * `2` — blank line\n * @typedef {'\\n'} BreakForce\n * Forced break.\n * @typedef {boolean} BreakValue\n * Whether there was a break.\n * @typedef {BreakValue | BreakNumber | undefined} BreakBefore\n * Any value for a break before.\n * @typedef {BreakValue | BreakNumber | BreakForce | undefined} BreakAfter\n * Any value for a break after.\n *\n * @typedef CollectionInfo\n * Info on current collection.\n * @property {Whitespace} whitespace\n * Current whitespace setting.\n * @property {BreakBefore} breakBefore\n * Whether there was a break before.\n * @property {BreakAfter} breakAfter\n * Whether there was a break after.\n *\n * @typedef Options\n * Configuration.\n * @property {Whitespace | null | undefined} [whitespace='normal']\n * Initial CSS whitespace setting to use.\n */ \n\nconst searchLineFeeds = /\\n/g;\nconst searchTabOrSpaces = /[\\t ]+/g;\nconst br = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)(\"br\");\nconst p = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)(\"p\");\nconst cell = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)([\n \"th\",\n \"td\"\n]);\nconst row = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)(\"tr\");\n// Note that we don’t need to include void elements here as they don’t have text.\n// See: <https://github.com/wooorm/html-void-elements>\nconst notRendered = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)([\n // List from: <https://html.spec.whatwg.org/#hidden-elements>\n \"datalist\",\n \"head\",\n \"noembed\",\n \"noframes\",\n \"noscript\",\n \"rp\",\n \"script\",\n \"style\",\n \"template\",\n \"title\",\n // Hidden attribute.\n hidden,\n // From: <https://html.spec.whatwg.org/#flow-content-3>\n closedDialog\n]);\n// See: <https://html.spec.whatwg.org/#the-css-user-agent-style-sheet-and-presentational-hints>\nconst blockOrCaption = (0,hast_util_is_element__WEBPACK_IMPORTED_MODULE_0__.convertElement)([\n \"address\",\n \"article\",\n \"aside\",\n \"blockquote\",\n \"body\",\n \"caption\",\n \"center\",\n \"dd\",\n \"dialog\",\n \"dir\",\n \"dl\",\n \"dt\",\n \"div\",\n \"figure\",\n \"figcaption\",\n \"footer\",\n \"form,\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"header\",\n \"hgroup\",\n \"hr\",\n \"html\",\n \"legend\",\n \"listing\",\n \"main\",\n \"menu\",\n \"nav\",\n \"ol\",\n \"p\",\n \"plaintext\",\n \"pre\",\n \"section\",\n \"ul\",\n \"xmp\" // Flow content (legacy)\n]);\n/**\n * Get the plain-text value of a node.\n *\n * ###### Algorithm\n *\n * * if `tree` is a comment, returns its `value`\n * * if `tree` is a text, applies normal whitespace collapsing to its\n * `value`, as defined by the CSS Text spec\n * * if `tree` is a root or element, applies an algorithm similar to the\n * `innerText` getter as defined by HTML\n *\n * ###### Notes\n *\n * > 👉 **Note**: the algorithm acts as if `tree` is being rendered, and as if\n * > we’re a CSS-supporting user agent, with scripting enabled.\n *\n * * if `tree` is an element that is not displayed (such as a `head`), we’ll\n * still use the `innerText` algorithm instead of switching to `textContent`\n * * if descendants of `tree` are elements that are not displayed, they are\n * ignored\n * * CSS is not considered, except for the default user agent style sheet\n * * a line feed is collapsed instead of ignored in cases where Fullwidth, Wide,\n * or Halfwidth East Asian Width characters are used, the same goes for a case\n * with Chinese, Japanese, or Yi writing systems\n * * replaced elements (such as `audio`) are treated like non-replaced elements\n *\n * @param {Node} tree\n * Tree to turn into text.\n * @param {Options} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `tree`.\n */ function toText(tree, options = {}) {\n const children = \"children\" in tree ? tree.children : [];\n const block = blockOrCaption(tree);\n const whitespace = inferWhitespace(tree, {\n whitespace: options.whitespace || \"normal\",\n breakBefore: false,\n breakAfter: false\n });\n /** @type {Array<string | BreakNumber>} */ const results = [];\n // Treat `text` and `comment` as having normal white-space.\n // This deviates from the spec as in the DOM the node’s `.data` has to be\n // returned.\n // If you want that behavior use `hast-util-to-string`.\n // All other nodes are later handled as if they are `element`s (so the\n // algorithm also works on a `root`).\n // Nodes without children are treated as a void element, so `doctype` is thus\n // ignored.\n if (tree.type === \"text\" || tree.type === \"comment\") {\n results.push(...collectText(tree, {\n whitespace,\n breakBefore: true,\n breakAfter: true\n }));\n }\n // 1. If this element is not being rendered, or if the user agent is a\n // non-CSS user agent, then return the same value as the textContent IDL\n // attribute on this element.\n //\n // Note: we’re not supporting stylesheets so we’re acting as if the node\n // is rendered.\n //\n // If you want that behavior use `hast-util-to-string`.\n // Important: we’ll have to account for this later though.\n // 2. Let results be a new empty list.\n let index = -1;\n // 3. For each child node node of this element:\n while(++index < children.length){\n // 3.1. Let current be the list resulting in running the inner text\n // collection steps with node.\n // Each item in results will either be a JavaScript string or a\n // positive integer (a required line break count).\n // 3.2. For each item item in current, append item to results.\n results.push(// @ts-expect-error Looks like a parent.\n ...innerTextCollection(children[index], tree, {\n whitespace,\n breakBefore: index ? undefined : block,\n breakAfter: index < children.length - 1 ? br(children[index + 1]) : block\n }));\n }\n // 4. Remove any items from results that are the empty string.\n // 5. Remove any runs of consecutive required line break count items at the\n // start or end of results.\n // 6. Replace each remaining run of consecutive required line break count\n // items with a string consisting of as many U+000A LINE FEED (LF)\n // characters as the maximum of the values in the required line break\n // count items.\n /** @type {Array<string>} */ const result = [];\n /** @type {number | undefined} */ let count;\n index = -1;\n while(++index < results.length){\n const value = results[index];\n if (typeof value === \"number\") {\n if (count !== undefined && value > count) count = value;\n } else if (value) {\n if (count !== undefined && count > -1) {\n result.push(\"\\n\".repeat(count) || \" \");\n }\n count = -1;\n result.push(value);\n }\n }\n // 7. Return the concatenation of the string items in results.\n return result.join(\"\");\n}\n/**\n * <https://html.spec.whatwg.org/#inner-text-collection-steps>\n *\n * @param {Node} node\n * @param {Parent} parent\n * @param {CollectionInfo} info\n * @returns {Array<string | BreakNumber>}\n */ function innerTextCollection(node, parent, info) {\n if (node.type === \"element\") {\n return collectElement(node, parent, info);\n }\n if (node.type === \"text\") {\n return info.whitespace === \"normal\" ? collectText(node, info) : collectPreText(node);\n }\n return [];\n}\n/**\n * Collect an element.\n *\n * @param {Element} node\n * Element node.\n * @param {Parent} parent\n * @param {CollectionInfo} info\n * Info on current collection.\n * @returns {Array<string | BreakNumber>}\n */ function collectElement(node, parent, info) {\n // First we infer the `white-space` property.\n const whitespace = inferWhitespace(node, info);\n const children = node.children || [];\n let index = -1;\n /** @type {Array<string | BreakNumber>} */ let items = [];\n // We’re ignoring point 3, and exiting without any content here, because we\n // deviated from the spec in `toText` at step 3.\n if (notRendered(node)) {\n return items;\n }\n /** @type {BreakNumber | undefined} */ let prefix;\n /** @type {BreakNumber | BreakForce | undefined} */ let suffix;\n // Note: we first detect if there is going to be a break before or after the\n // contents, as that changes the white-space handling.\n // 2. If node’s computed value of `visibility` is not `visible`, then return\n // items.\n //\n // Note: Ignored, as everything is visible by default user agent styles.\n // 3. If node is not being rendered, then return items. [...]\n //\n // Note: We already did this above.\n // See `collectText` for step 4.\n // 5. If node is a `<br>` element, then append a string containing a single\n // U+000A LINE FEED (LF) character to items.\n if (br(node)) {\n suffix = \"\\n\";\n } else if (row(node) && (0,unist_util_find_after__WEBPACK_IMPORTED_MODULE_1__.findAfter)(parent, node, row)) {\n suffix = \"\\n\";\n } else if (p(node)) {\n prefix = 2;\n suffix = 2;\n } else if (blockOrCaption(node)) {\n prefix = 1;\n suffix = 1;\n }\n // 1. Let items be the result of running the inner text collection steps with\n // each child node of node in tree order, and then concatenating the\n // results to a single list.\n while(++index < children.length){\n items = items.concat(innerTextCollection(children[index], node, {\n whitespace,\n breakBefore: index ? undefined : prefix,\n breakAfter: index < children.length - 1 ? br(children[index + 1]) : suffix\n }));\n }\n // 6. If node’s computed value of `display` is `table-cell`, and node’s CSS\n // box is not the last `table-cell` box of its enclosing `table-row` box,\n // then append a string containing a single U+0009 CHARACTER TABULATION\n // (tab) character to items.\n //\n // See: <https://html.spec.whatwg.org/#tables-2>\n if (cell(node) && (0,unist_util_find_after__WEBPACK_IMPORTED_MODULE_1__.findAfter)(parent, node, cell)) {\n items.push(\"\t\");\n }\n // Add the pre- and suffix.\n if (prefix) items.unshift(prefix);\n if (suffix) items.push(suffix);\n return items;\n}\n/**\n * 4. If node is a Text node, then for each CSS text box produced by node,\n * in content order, compute the text of the box after application of the\n * CSS `white-space` processing rules and `text-transform` rules, set\n * items to the list of the resulting strings, and return items.\n * The CSS `white-space` processing rules are slightly modified:\n * collapsible spaces at the end of lines are always collapsed, but they\n * are only removed if the line is the last line of the block, or it ends\n * with a br element.\n * Soft hyphens should be preserved.\n *\n * Note: See `collectText` and `collectPreText`.\n * Note: we don’t deal with `text-transform`, no element has that by\n * default.\n *\n * See: <https://drafts.csswg.org/css-text/#white-space-phase-1>\n *\n * @param {Text | Comment} node\n * Text node.\n * @param {CollectionInfo} info\n * Info on current collection.\n * @returns {Array<string | BreakNumber>}\n * Result.\n */ function collectText(node, info) {\n const value = String(node.value);\n /** @type {Array<string>} */ const lines = [];\n /** @type {Array<string | BreakNumber>} */ const result = [];\n let start = 0;\n while(start <= value.length){\n searchLineFeeds.lastIndex = start;\n const match = searchLineFeeds.exec(value);\n const end = match && \"index\" in match ? match.index : value.length;\n lines.push(// Any sequence of collapsible spaces and tabs immediately preceding or\n // following a segment break is removed.\n trimAndCollapseSpacesAndTabs(// […] ignoring bidi formatting characters (characters with the\n // Bidi_Control property [UAX9]: ALM, LTR, RTL, LRE-RLO, LRI-PDI) as if\n // they were not there.\n value.slice(start, end).replace(/[\\u061C\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u2069]/g, \"\"), start === 0 ? info.breakBefore : true, end === value.length ? info.breakAfter : true));\n start = end + 1;\n }\n // Collapsible segment breaks are transformed for rendering according to the\n // segment break transformation rules.\n // So here we jump to 4.1.2 of [CSSTEXT]:\n // Any collapsible segment break immediately following another collapsible\n // segment break is removed\n let index = -1;\n /** @type {BreakNumber | undefined} */ let join;\n while(++index < lines.length){\n // * If the character immediately before or immediately after the segment\n // break is the zero-width space character (U+200B), then the break is\n // removed, leaving behind the zero-width space.\n if (lines[index].charCodeAt(lines[index].length - 1) === 0x200b /* ZWSP */ || index < lines.length - 1 && lines[index + 1].charCodeAt(0) === 0x200b) {\n result.push(lines[index]);\n join = undefined;\n } else if (lines[index]) {\n if (typeof join === \"number\") result.push(join);\n result.push(lines[index]);\n join = 0;\n } else if (index === 0 || index === lines.length - 1) {\n // If this line is empty, and it’s the first or last, add a space.\n // Note that this function is only called in normal whitespace, so we\n // don’t worry about `pre`.\n result.push(0);\n }\n }\n return result;\n}\n/**\n * Collect a text node as “pre” whitespace.\n *\n * @param {Text} node\n * Text node.\n * @returns {Array<string | BreakNumber>}\n * Result.\n */ function collectPreText(node) {\n return [\n String(node.value)\n ];\n}\n/**\n * 3. Every collapsible tab is converted to a collapsible space (U+0020).\n * 4. Any collapsible space immediately following another collapsible\n * space—even one outside the boundary of the inline containing that\n * space, provided both spaces are within the same inline formatting\n * context—is collapsed to have zero advance width. (It is invisible,\n * but retains its soft wrap opportunity, if any.)\n *\n * @param {string} value\n * Value to collapse.\n * @param {BreakBefore} breakBefore\n * Whether there was a break before.\n * @param {BreakAfter} breakAfter\n * Whether there was a break after.\n * @returns {string}\n * Result.\n */ function trimAndCollapseSpacesAndTabs(value, breakBefore, breakAfter) {\n /** @type {Array<string>} */ const result = [];\n let start = 0;\n /** @type {number | undefined} */ let end;\n while(start < value.length){\n searchTabOrSpaces.lastIndex = start;\n const match = searchTabOrSpaces.exec(value);\n end = match ? match.index : value.length;\n // If we’re not directly after a segment break, but there was white space,\n // add an empty value that will be turned into a space.\n if (!start && !end && match && !breakBefore) {\n result.push(\"\");\n }\n if (start !== end) {\n result.push(value.slice(start, end));\n }\n start = match ? end + match[0].length : end;\n }\n // If we reached the end, there was trailing white space, and there’s no\n // segment break after this node, add an empty value that will be turned\n // into a space.\n if (start !== end && !breakAfter) {\n result.push(\"\");\n }\n return result.join(\" \");\n}\n/**\n * Figure out the whitespace of a node.\n *\n * We don’t support void elements here (so `nobr wbr` -> `normal` is ignored).\n *\n * @param {Node} node\n * Node (typically `Element`).\n * @param {CollectionInfo} info\n * Info on current collection.\n * @returns {Whitespace}\n * Applied whitespace.\n */ function inferWhitespace(node, info) {\n if (node.type === \"element\") {\n const props = node.properties || {};\n switch(node.tagName){\n case \"listing\":\n case \"plaintext\":\n case \"xmp\":\n {\n return \"pre\";\n }\n case \"nobr\":\n {\n return \"nowrap\";\n }\n case \"pre\":\n {\n return props.wrap ? \"pre-wrap\" : \"pre\";\n }\n case \"td\":\n case \"th\":\n {\n return props.noWrap ? \"nowrap\" : info.whitespace;\n }\n case \"textarea\":\n {\n return \"pre-wrap\";\n }\n default:\n }\n }\n return info.whitespace;\n}\n/** @type {TestFunctionAnything} */ function hidden(node) {\n return Boolean((node.properties || {}).hidden);\n}\n/** @type {TestFunctionAnything} */ function closedDialog(node) {\n return node.tagName === \"dialog\" && !(node.properties || {}).open;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLXRleHQvbGliL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7Ozs7O0NBT0MsR0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQ0MsR0FFa0Q7QUFDSjtBQUUvQyxNQUFNRSxrQkFBa0I7QUFDeEIsTUFBTUMsb0JBQW9CO0FBRTFCLE1BQU1DLEtBQUtKLG9FQUFjQSxDQUFDO0FBQzFCLE1BQU1LLElBQUlMLG9FQUFjQSxDQUFDO0FBQ3pCLE1BQU1NLE9BQU9OLG9FQUFjQSxDQUFDO0lBQUM7SUFBTTtDQUFLO0FBQ3hDLE1BQU1PLE1BQU1QLG9FQUFjQSxDQUFDO0FBRTNCLGlGQUFpRjtBQUNqRixzREFBc0Q7QUFDdEQsTUFBTVEsY0FBY1Isb0VBQWNBLENBQUM7SUFDakMsNkRBQTZEO0lBQzdEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0Esb0JBQW9CO0lBQ3BCUztJQUNBLHVEQUF1RDtJQUN2REM7Q0FDRDtBQUVELCtGQUErRjtBQUMvRixNQUFNQyxpQkFBaUJYLG9FQUFjQSxDQUFDO0lBQ3BDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxNQUFNLHdCQUF3QjtDQUMvQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWdDQyxHQUNNLFNBQVNZLE9BQU9DLElBQUksRUFBRUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsTUFBTUMsV0FBVyxjQUFjRixPQUFPQSxLQUFLRSxRQUFRLEdBQUcsRUFBRTtJQUN4RCxN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LENBQUMxQixLQUFLc0IsVUFBVSxJQUFJLENBQUMsR0FBRy9DLE1BQU07QUFDL0M7QUFFQSxpQ0FBaUMsR0FDakMsU0FBU0MsYUFBYXdCLElBQUk7SUFDeEIsT0FBT0EsS0FBS3VCLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQ3ZCLEtBQUtzQixVQUFVLElBQUksQ0FBQyxHQUFHSyxJQUFJO0FBQ25FIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGNoYXQvLi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLXRleHQvbGliL2luZGV4LmpzPzczZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoYXN0LXV0aWwtaXMtZWxlbWVudCcpLlRlc3RGdW5jdGlvbkFueXRoaW5nfSBUZXN0RnVuY3Rpb25Bbnl0aGluZ1xuICogQHR5cGVkZWYge2ltcG9ydCgnaGFzdCcpLkNvbnRlbnR9IENvbnRlbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hhc3QnKS5UZXh0fSBUZXh0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoYXN0JykuQ29tbWVudH0gQ29tbWVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGFzdCcpLlJvb3R9IFJvb3RcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hhc3QnKS5FbGVtZW50fSBFbGVtZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29udGVudCB8IFJvb3R9IE5vZGVcbiAqICAgQW55IG5vZGUuXG4gKiBAdHlwZWRlZiB7RXh0cmFjdDxOb2RlLCBpbXBvcnQoJ3VuaXN0JykuUGFyZW50Pn0gUGFyZW50XG4gKiAgIEFueSBwYXJlbnQuXG4gKiBAdHlwZWRlZiB7J25vcm1hbCcgfCAncHJlJyB8ICdub3dyYXAnIHwgJ3ByZS13cmFwJ30gV2hpdGVzcGFjZVxuICogICBWYWxpZCBhbmQgdXNlZnVsIHdoaXRlc3BhY2UgdmFsdWVzIChmcm9tIENTUykuXG4gKiBAdHlwZWRlZiB7MCB8IDEgfCAyfSBCcmVha051bWJlclxuICogICBTcGVjaWZpYyBicmVhazpcbiAqXG4gKiAgICogICBgMGAg4oCUIHNwYWNlXG4gKiAgICogICBgMWAg4oCUIGxpbmUgZW5kaW5nXG4gKiAgICogICBgMmAg4oCUIGJsYW5rIGxpbmVcbiAqIEB0eXBlZGVmIHsnXFxuJ30gQnJlYWtGb3JjZVxuICogICBGb3JjZWQgYnJlYWsuXG4gKiBAdHlwZWRlZiB7Ym9vbGVhbn0gQnJlYWtWYWx1ZVxuICogICBXaGV0aGVyIHRoZXJlIHdhcyBhIGJyZWFrLlxuICogQHR5cGVkZWYge0JyZWFrVmFsdWUgfCBCcmVha051bWJlciB8IHVuZGVmaW5lZH0gQnJlYWtCZWZvcmVcbiAqICAgQW55IHZhbHVlIGZvciBhIGJyZWFrIGJlZm9yZS5cbiAqIEB0eXBlZGVmIHtCcmVha1ZhbHVlIHwgQnJlYWtOdW1iZXIgfCBCcmVha0ZvcmNlIHwgdW5kZWZpbmVkfSBCcmVha0FmdGVyXG4gKiAgIEFueSB2YWx1ZSBmb3IgYSBicmVhayBhZnRlci5cbiAqXG4gKiBAdHlwZWRlZiBDb2xsZWN0aW9uSW5mb1xuICogICBJbmZvIG9uIGN1cnJlbnQgY29sbGVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7V2hpdGVzcGFjZX0gd2hpdGVzcGFjZVxuICogICBDdXJyZW50IHdoaXRlc3BhY2Ugc2V0dGluZy5cbiAqIEBwcm9wZXJ0eSB7QnJlYWtCZWZvcmV9IGJyZWFrQmVmb3JlXG4gKiAgIFdoZXRoZXIgdGhlcmUgd2FzIGEgYnJlYWsgYmVmb3JlLlxuICogQHByb3BlcnR5IHtCcmVha0FmdGVyfSBicmVha0FmdGVyXG4gKiAgIFdoZXRoZXIgdGhlcmUgd2FzIGEgYnJlYWsgYWZ0ZXIuXG4gKlxuICogQHR5cGVkZWYgT3B0aW9uc1xuICogICBDb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtXaGl0ZXNwYWNlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3doaXRlc3BhY2U9J25vcm1hbCddXG4gKiAgIEluaXRpYWwgQ1NTIHdoaXRlc3BhY2Ugc2V0dGluZyB0byB1c2UuXG4gKi9cblxuaW1wb3J0IHtjb252ZXJ0RWxlbWVudH0gZnJvbSAnaGFzdC11dGlsLWlzLWVsZW1lbnQnXG5pbXBvcnQge2ZpbmRBZnRlcn0gZnJvbSAndW5pc3QtdXRpbC1maW5kLWFmdGVyJ1xuXG5jb25zdCBzZWFyY2hMaW5lRmVlZHMgPSAvXFxuL2dcbmNvbnN0IHNlYXJjaFRhYk9yU3BhY2VzID0gL1tcXHQgXSsvZ1xuXG5jb25zdCBiciA9IGNvbnZlcnRFbGVtZW50KCdicicpXG5jb25zdCBwID0gY29udmVydEVsZW1lbnQoJ3AnKVxuY29uc3QgY2VsbCA9IGNvbnZlcnRFbGVtZW50KFsndGgnLCAndGQnXSlcbmNvbnN0IHJvdyA9IGNvbnZlcnRFbGVtZW50KCd0cicpXG5cbi8vIE5vdGUgdGhhdCB3ZSBkb27igJl0IG5lZWQgdG8gaW5jbHVkZSB2b2lkIGVsZW1lbnRzIGhlcmUgYXMgdGhleSBkb27igJl0IGhhdmUgdGV4dC5cbi8vIFNlZTogPGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vaHRtbC12b2lkLWVsZW1lbnRzPlxuY29uc3Qgbm90UmVuZGVyZWQgPSBjb252ZXJ0RWxlbWVudChbXG4gIC8vIExpc3QgZnJvbTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2hpZGRlbi1lbGVtZW50cz5cbiAgJ2RhdGFsaXN0JyxcbiAgJ2hlYWQnLFxuICAnbm9lbWJlZCcsXG4gICdub2ZyYW1lcycsXG4gICdub3NjcmlwdCcsIC8vIEFjdCBhcyBpZiB3ZSBzdXBwb3J0IHNjcmlwdGluZy5cbiAgJ3JwJyxcbiAgJ3NjcmlwdCcsXG4gICdzdHlsZScsXG4gICd0ZW1wbGF0ZScsXG4gICd0aXRsZScsXG4gIC8vIEhpZGRlbiBhdHRyaWJ1dGUuXG4gIGhpZGRlbixcbiAgLy8gRnJvbTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2Zsb3ctY29udGVudC0zPlxuICBjbG9zZWREaWFsb2dcbl0pXG5cbi8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3RoZS1jc3MtdXNlci1hZ2VudC1zdHlsZS1zaGVldC1hbmQtcHJlc2VudGF0aW9uYWwtaGludHM+XG5jb25zdCBibG9ja09yQ2FwdGlvbiA9IGNvbnZlcnRFbGVtZW50KFtcbiAgJ2FkZHJlc3MnLCAvLyBGbG93IGNvbnRlbnRcbiAgJ2FydGljbGUnLCAvLyBTZWN0aW9ucyBhbmQgaGVhZGluZ3NcbiAgJ2FzaWRlJywgLy8gU2VjdGlvbnMgYW5kIGhlYWRpbmdzXG4gICdibG9ja3F1b3RlJywgLy8gRmxvdyBjb250ZW50XG4gICdib2R5JywgLy8gUGFnZVxuICAnY2FwdGlvbicsIC8vIGB0YWJsZS1jYXB0aW9uYFxuICAnY2VudGVyJywgLy8gRmxvdyBjb250ZW50IChsZWdhY3kpXG4gICdkZCcsIC8vIExpc3RzXG4gICdkaWFsb2cnLCAvLyBGbG93IGNvbnRlbnRcbiAgJ2RpcicsIC8vIExpc3RzIChsZWdhY3kpXG4gICdkbCcsIC8vIExpc3RzXG4gICdkdCcsIC8vIExpc3RzXG4gICdkaXYnLCAvLyBGbG93IGNvbnRlbnRcbiAgJ2ZpZ3VyZScsIC8vIEZsb3cgY29udGVudFxuICAnZmlnY2FwdGlvbicsIC8vIEZsb3cgY29udGVudFxuICAnZm9vdGVyJywgLy8gRmxvdyBjb250ZW50XG4gICdmb3JtLCcsIC8vIEZsb3cgY29udGVudFxuICAnaDEnLCAvLyBTZWN0aW9ucyBhbmQgaGVhZGluZ3NcbiAgJ2gyJywgLy8gU2VjdGlvbnMgYW5kIGhlYWRpbmdzXG4gICdoMycsIC8vIFNlY3Rpb25zIGFuZCBoZWFkaW5nc1xuICAnaDQnLCAvLyBTZWN0aW9ucyBhbmQgaGVhZGluZ3NcbiAgJ2g1JywgLy8gU2VjdGlvbnMgYW5kIGhlYWRpbmdzXG4gICdoNicsIC8vIFNlY3Rpb25zIGFuZCBoZWFkaW5nc1xuICAnaGVhZGVyJywgLy8gRmxvdyBjb250ZW50XG4gICdoZ3JvdXAnLCAvLyBTZWN0aW9ucyBhbmQgaGVhZGluZ3NcbiAgJ2hyJywgLy8gRmxvdyBjb250ZW50XG4gICdodG1sJywgLy8gUGFnZVxuICAnbGVnZW5kJywgLy8gRmxvdyBjb250ZW50XG4gICdsaXN0aW5nJywgLy8gRmxvdyBjb250ZW50IChsZWdhY3kpXG4gICdtYWluJywgLy8gRmxvdyBjb250ZW50XG4gICdtZW51JywgLy8gTGlzdHNcbiAgJ25hdicsIC8vIFNlY3Rpb25zIGFuZCBoZWFkaW5nc1xuICAnb2wnLCAvLyBMaXN0c1xuICAncCcsIC8vIEZsb3cgY29udGVudFxuICAncGxhaW50ZXh0JywgLy8gRmxvdyBjb250ZW50IChsZWdhY3kpXG4gICdwcmUnLCAvLyBGbG93IGNvbnRlbnRcbiAgJ3NlY3Rpb24nLCAvLyBTZWN0aW9ucyBhbmQgaGVhZGluZ3NcbiAgJ3VsJywgLy8gTGlzdHNcbiAgJ3htcCcgLy8gRmxvdyBjb250ZW50IChsZWdhY3kpXG5dKVxuXG4vKipcbiAqIEdldCB0aGUgcGxhaW4tdGV4dCB2YWx1ZSBvZiBhIG5vZGUuXG4gKlxuICogIyMjIyMjIEFsZ29yaXRobVxuICpcbiAqICogICBpZiBgdHJlZWAgaXMgYSBjb21tZW50LCByZXR1cm5zIGl0cyBgdmFsdWVgXG4gKiAqICAgaWYgYHRyZWVgIGlzIGEgdGV4dCwgYXBwbGllcyBub3JtYWwgd2hpdGVzcGFjZSBjb2xsYXBzaW5nIHRvIGl0c1xuICogICAgIGB2YWx1ZWAsIGFzIGRlZmluZWQgYnkgdGhlIENTUyBUZXh0IHNwZWNcbiAqICogICBpZiBgdHJlZWAgaXMgYSByb290IG9yIGVsZW1lbnQsIGFwcGxpZXMgYW4gYWxnb3JpdGhtIHNpbWlsYXIgdG8gdGhlXG4gKiAgICAgYGlubmVyVGV4dGAgZ2V0dGVyIGFzIGRlZmluZWQgYnkgSFRNTFxuICpcbiAqICMjIyMjIyBOb3Rlc1xuICpcbiAqID4g8J+RiSAqKk5vdGUqKjogdGhlIGFsZ29yaXRobSBhY3RzIGFzIGlmIGB0cmVlYCBpcyBiZWluZyByZW5kZXJlZCwgYW5kIGFzIGlmXG4gKiA+IHdl4oCZcmUgYSBDU1Mtc3VwcG9ydGluZyB1c2VyIGFnZW50LCB3aXRoIHNjcmlwdGluZyBlbmFibGVkLlxuICpcbiAqICogICBpZiBgdHJlZWAgaXMgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBkaXNwbGF5ZWQgKHN1Y2ggYXMgYSBgaGVhZGApLCB3ZeKAmWxsXG4gKiAgICAgc3RpbGwgdXNlIHRoZSBgaW5uZXJUZXh0YCBhbGdvcml0aG0gaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gYHRleHRDb250ZW50YFxuICogKiAgIGlmIGRlc2NlbmRhbnRzIG9mIGB0cmVlYCBhcmUgZWxlbWVudHMgdGhhdCBhcmUgbm90IGRpc3BsYXllZCwgdGhleSBhcmVcbiAqICAgICBpZ25vcmVkXG4gKiAqICAgQ1NTIGlzIG5vdCBjb25zaWRlcmVkLCBleGNlcHQgZm9yIHRoZSBkZWZhdWx0IHVzZXIgYWdlbnQgc3R5bGUgc2hlZXRcbiAqICogICBhIGxpbmUgZmVlZCBpcyBjb2xsYXBzZWQgaW5zdGVhZCBvZiBpZ25vcmVkIGluIGNhc2VzIHdoZXJlIEZ1bGx3aWR0aCwgV2lkZSxcbiAqICAgICBvciBIYWxmd2lkdGggRWFzdCBBc2lhbiBXaWR0aCBjaGFyYWN0ZXJzIGFyZSB1c2VkLCB0aGUgc2FtZSBnb2VzIGZvciBhIGNhc2VcbiAqICAgICB3aXRoIENoaW5lc2UsIEphcGFuZXNlLCBvciBZaSB3cml0aW5nIHN5c3RlbXNcbiAqICogICByZXBsYWNlZCBlbGVtZW50cyAoc3VjaCBhcyBgYXVkaW9gKSBhcmUgdHJlYXRlZCBsaWtlIG5vbi1yZXBsYWNlZCBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHR1cm4gaW50byB0ZXh0LlxuICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc11cbiAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqICAgU2VyaWFsaXplZCBgdHJlZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHQodHJlZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gJ2NoaWxkcmVuJyBpbiB0cmVlID8gdHJlZS5jaGlsZHJlbiA6IFtdXG4gIGNvbnN0IGJsb2NrID0gYmxvY2tPckNhcHRpb24odHJlZSlcbiAgY29uc3Qgd2hpdGVzcGFjZSA9IGluZmVyV2hpdGVzcGFjZSh0cmVlLCB7XG4gICAgd2hpdGVzcGFjZTogb3B0aW9ucy53aGl0ZXNwYWNlIHx8ICdub3JtYWwnLFxuICAgIGJyZWFrQmVmb3JlOiBmYWxzZSxcbiAgICBicmVha0FmdGVyOiBmYWxzZVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgQnJlYWtOdW1iZXI+fSAqL1xuICBjb25zdCByZXN1bHRzID0gW11cblxuICAvLyBUcmVhdCBgdGV4dGAgYW5kIGBjb21tZW50YCBhcyBoYXZpbmcgbm9ybWFsIHdoaXRlLXNwYWNlLlxuICAvLyBUaGlzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYXMgaW4gdGhlIERPTSB0aGUgbm9kZeKAmXMgYC5kYXRhYCBoYXMgdG8gYmVcbiAgLy8gcmV0dXJuZWQuXG4gIC8vIElmIHlvdSB3YW50IHRoYXQgYmVoYXZpb3IgdXNlIGBoYXN0LXV0aWwtdG8tc3RyaW5nYC5cbiAgLy8gQWxsIG90aGVyIG5vZGVzIGFyZSBsYXRlciBoYW5kbGVkIGFzIGlmIHRoZXkgYXJlIGBlbGVtZW50YHMgKHNvIHRoZVxuICAvLyBhbGdvcml0aG0gYWxzbyB3b3JrcyBvbiBhIGByb290YCkuXG4gIC8vIE5vZGVzIHdpdGhvdXQgY2hpbGRyZW4gYXJlIHRyZWF0ZWQgYXMgYSB2b2lkIGVsZW1lbnQsIHNvIGBkb2N0eXBlYCBpcyB0aHVzXG4gIC8vIGlnbm9yZWQuXG4gIGlmICh0cmVlLnR5cGUgPT09ICd0ZXh0JyB8fCB0cmVlLnR5cGUgPT09ICdjb21tZW50Jykge1xuICAgIHJlc3VsdHMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RUZXh0KHRyZWUsIHtcbiAgICAgICAgd2hpdGVzcGFjZSxcbiAgICAgICAgYnJlYWtCZWZvcmU6IHRydWUsXG4gICAgICAgIGJyZWFrQWZ0ZXI6IHRydWVcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgLy8gMS4gIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYmVpbmcgcmVuZGVyZWQsIG9yIGlmIHRoZSB1c2VyIGFnZW50IGlzIGFcbiAgLy8gICAgIG5vbi1DU1MgdXNlciBhZ2VudCwgdGhlbiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHRleHRDb250ZW50IElETFxuICAvLyAgICAgYXR0cmlidXRlIG9uIHRoaXMgZWxlbWVudC5cbiAgLy9cbiAgLy8gICAgIE5vdGU6IHdl4oCZcmUgbm90IHN1cHBvcnRpbmcgc3R5bGVzaGVldHMgc28gd2XigJlyZSBhY3RpbmcgYXMgaWYgdGhlIG5vZGVcbiAgLy8gICAgIGlzIHJlbmRlcmVkLlxuICAvL1xuICAvLyAgICAgSWYgeW91IHdhbnQgdGhhdCBiZWhhdmlvciB1c2UgYGhhc3QtdXRpbC10by1zdHJpbmdgLlxuICAvLyAgICAgSW1wb3J0YW50OiB3ZeKAmWxsIGhhdmUgdG8gYWNjb3VudCBmb3IgdGhpcyBsYXRlciB0aG91Z2guXG5cbiAgLy8gMi4gIExldCByZXN1bHRzIGJlIGEgbmV3IGVtcHR5IGxpc3QuXG4gIGxldCBpbmRleCA9IC0xXG5cbiAgLy8gMy4gIEZvciBlYWNoIGNoaWxkIG5vZGUgbm9kZSBvZiB0aGlzIGVsZW1lbnQ6XG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgLy8gMy4xLiBMZXQgY3VycmVudCBiZSB0aGUgbGlzdCByZXN1bHRpbmcgaW4gcnVubmluZyB0aGUgaW5uZXIgdGV4dFxuICAgIC8vICAgICAgY29sbGVjdGlvbiBzdGVwcyB3aXRoIG5vZGUuXG4gICAgLy8gICAgICBFYWNoIGl0ZW0gaW4gcmVzdWx0cyB3aWxsIGVpdGhlciBiZSBhIEphdmFTY3JpcHQgc3RyaW5nIG9yIGFcbiAgICAvLyAgICAgIHBvc2l0aXZlIGludGVnZXIgKGEgcmVxdWlyZWQgbGluZSBicmVhayBjb3VudCkuXG4gICAgLy8gMy4yLiBGb3IgZWFjaCBpdGVtIGl0ZW0gaW4gY3VycmVudCwgYXBwZW5kIGl0ZW0gdG8gcmVzdWx0cy5cbiAgICByZXN1bHRzLnB1c2goXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIExvb2tzIGxpa2UgYSBwYXJlbnQuXG4gICAgICAuLi5pbm5lclRleHRDb2xsZWN0aW9uKGNoaWxkcmVuW2luZGV4XSwgdHJlZSwge1xuICAgICAgICB3aGl0ZXNwYWNlLFxuICAgICAgICBicmVha0JlZm9yZTogaW5kZXggPyB1bmRlZmluZWQgOiBibG9jayxcbiAgICAgICAgYnJlYWtBZnRlcjpcbiAgICAgICAgICBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAtIDEgPyBicihjaGlsZHJlbltpbmRleCArIDFdKSA6IGJsb2NrXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIC8vIDQuICBSZW1vdmUgYW55IGl0ZW1zIGZyb20gcmVzdWx0cyB0aGF0IGFyZSB0aGUgZW1wdHkgc3RyaW5nLlxuICAvLyA1LiAgUmVtb3ZlIGFueSBydW5zIG9mIGNvbnNlY3V0aXZlIHJlcXVpcmVkIGxpbmUgYnJlYWsgY291bnQgaXRlbXMgYXQgdGhlXG4gIC8vICAgICBzdGFydCBvciBlbmQgb2YgcmVzdWx0cy5cbiAgLy8gNi4gIFJlcGxhY2UgZWFjaCByZW1haW5pbmcgcnVuIG9mIGNvbnNlY3V0aXZlIHJlcXVpcmVkIGxpbmUgYnJlYWsgY291bnRcbiAgLy8gICAgIGl0ZW1zIHdpdGggYSBzdHJpbmcgY29uc2lzdGluZyBvZiBhcyBtYW55IFUrMDAwQSBMSU5FIEZFRUQgKExGKVxuICAvLyAgICAgY2hhcmFjdGVycyBhcyB0aGUgbWF4aW11bSBvZiB0aGUgdmFsdWVzIGluIHRoZSByZXF1aXJlZCBsaW5lIGJyZWFrXG4gIC8vICAgICBjb3VudCBpdGVtcy5cbiAgLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuICBjb25zdCByZXN1bHQgPSBbXVxuICAvKiogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGNvdW50XG5cbiAgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgcmVzdWx0cy5sZW5ndGgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlc3VsdHNbaW5kZXhdXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGNvdW50ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBjb3VudCkgY291bnQgPSB2YWx1ZVxuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIGlmIChjb3VudCAhPT0gdW5kZWZpbmVkICYmIGNvdW50ID4gLTEpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ1xcbicucmVwZWF0KGNvdW50KSB8fCAnICcpXG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gLTFcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDcuICBSZXR1cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZyBpdGVtcyBpbiByZXN1bHRzLlxuICByZXR1cm4gcmVzdWx0LmpvaW4oJycpXG59XG5cbi8qKlxuICogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2lubmVyLXRleHQtY29sbGVjdGlvbi1zdGVwcz5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEBwYXJhbSB7UGFyZW50fSBwYXJlbnRcbiAqIEBwYXJhbSB7Q29sbGVjdGlvbkluZm99IGluZm9cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmcgfCBCcmVha051bWJlcj59XG4gKi9cbmZ1bmN0aW9uIGlubmVyVGV4dENvbGxlY3Rpb24obm9kZSwgcGFyZW50LCBpbmZvKSB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdlbGVtZW50Jykge1xuICAgIHJldHVybiBjb2xsZWN0RWxlbWVudChub2RlLCBwYXJlbnQsIGluZm8pXG4gIH1cblxuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICByZXR1cm4gaW5mby53aGl0ZXNwYWNlID09PSAnbm9ybWFsJ1xuICAgICAgPyBjb2xsZWN0VGV4dChub2RlLCBpbmZvKVxuICAgICAgOiBjb2xsZWN0UHJlVGV4dChub2RlKVxuICB9XG5cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogQ29sbGVjdCBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZVxuICogICBFbGVtZW50IG5vZGUuXG4gKiBAcGFyYW0ge1BhcmVudH0gcGFyZW50XG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25JbmZvfSBpbmZvXG4gKiAgIEluZm8gb24gY3VycmVudCBjb2xsZWN0aW9uLlxuICogQHJldHVybnMge0FycmF5PHN0cmluZyB8IEJyZWFrTnVtYmVyPn1cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEVsZW1lbnQobm9kZSwgcGFyZW50LCBpbmZvKSB7XG4gIC8vIEZpcnN0IHdlIGluZmVyIHRoZSBgd2hpdGUtc3BhY2VgIHByb3BlcnR5LlxuICBjb25zdCB3aGl0ZXNwYWNlID0gaW5mZXJXaGl0ZXNwYWNlKG5vZGUsIGluZm8pXG4gIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiB8fCBbXVxuICBsZXQgaW5kZXggPSAtMVxuICAvKiogQHR5cGUge0FycmF5PHN0cmluZyB8IEJyZWFrTnVtYmVyPn0gKi9cbiAgbGV0IGl0ZW1zID0gW11cblxuICAvLyBXZeKAmXJlIGlnbm9yaW5nIHBvaW50IDMsIGFuZCBleGl0aW5nIHdpdGhvdXQgYW55IGNvbnRlbnQgaGVyZSwgYmVjYXVzZSB3ZVxuICAvLyBkZXZpYXRlZCBmcm9tIHRoZSBzcGVjIGluIGB0b1RleHRgIGF0IHN0ZXAgMy5cbiAgaWYgKG5vdFJlbmRlcmVkKG5vZGUpKSB7XG4gICAgcmV0dXJuIGl0ZW1zXG4gIH1cblxuICAvKiogQHR5cGUge0JyZWFrTnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgcHJlZml4XG4gIC8qKiBAdHlwZSB7QnJlYWtOdW1iZXIgfCBCcmVha0ZvcmNlIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgc3VmZml4XG4gIC8vIE5vdGU6IHdlIGZpcnN0IGRldGVjdCBpZiB0aGVyZSBpcyBnb2luZyB0byBiZSBhIGJyZWFrIGJlZm9yZSBvciBhZnRlciB0aGVcbiAgLy8gY29udGVudHMsIGFzIHRoYXQgY2hhbmdlcyB0aGUgd2hpdGUtc3BhY2UgaGFuZGxpbmcuXG5cbiAgLy8gMi4gIElmIG5vZGXigJlzIGNvbXB1dGVkIHZhbHVlIG9mIGB2aXNpYmlsaXR5YCBpcyBub3QgYHZpc2libGVgLCB0aGVuIHJldHVyblxuICAvLyAgICAgaXRlbXMuXG4gIC8vXG4gIC8vICAgICBOb3RlOiBJZ25vcmVkLCBhcyBldmVyeXRoaW5nIGlzIHZpc2libGUgYnkgZGVmYXVsdCB1c2VyIGFnZW50IHN0eWxlcy5cblxuICAvLyAzLiAgSWYgbm9kZSBpcyBub3QgYmVpbmcgcmVuZGVyZWQsIHRoZW4gcmV0dXJuIGl0ZW1zLiBbLi4uXVxuICAvL1xuICAvLyAgICAgTm90ZTogV2UgYWxyZWFkeSBkaWQgdGhpcyBhYm92ZS5cblxuICAvLyBTZWUgYGNvbGxlY3RUZXh0YCBmb3Igc3RlcCA0LlxuXG4gIC8vIDUuICBJZiBub2RlIGlzIGEgYDxicj5gIGVsZW1lbnQsIHRoZW4gYXBwZW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzaW5nbGVcbiAgLy8gICAgIFUrMDAwQSBMSU5FIEZFRUQgKExGKSBjaGFyYWN0ZXIgdG8gaXRlbXMuXG4gIGlmIChicihub2RlKSkge1xuICAgIHN1ZmZpeCA9ICdcXG4nXG4gIH1cblxuICAvLyA3LiAgSWYgbm9kZeKAmXMgY29tcHV0ZWQgdmFsdWUgb2YgYGRpc3BsYXlgIGlzIGB0YWJsZS1yb3dgLCBhbmQgbm9kZeKAmXMgQ1NTXG4gIC8vICAgICBib3ggaXMgbm90IHRoZSBsYXN0IGB0YWJsZS1yb3dgIGJveCBvZiB0aGUgbmVhcmVzdCBhbmNlc3RvciBgdGFibGVgXG4gIC8vICAgICBib3gsIHRoZW4gYXBwZW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzaW5nbGUgVSswMDBBIExJTkUgRkVFRCAoTEYpXG4gIC8vICAgICBjaGFyYWN0ZXIgdG8gaXRlbXMuXG4gIC8vXG4gIC8vICAgICBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyN0YWJsZXMtMj5cbiAgLy8gICAgIE5vdGU6IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBhcyB0aGlzIGRvZXMgbm90IGFjY291bnQgZm9yIGltcGxpY2l0XG4gIC8vICAgICByb3dzLlxuICBlbHNlIGlmIChyb3cobm9kZSkgJiYgZmluZEFmdGVyKHBhcmVudCwgbm9kZSwgcm93KSkge1xuICAgIHN1ZmZpeCA9ICdcXG4nXG4gIH1cblxuICAvLyA4LiAgSWYgbm9kZSBpcyBhIGA8cD5gIGVsZW1lbnQsIHRoZW4gYXBwZW5kIDIgKGEgcmVxdWlyZWQgbGluZSBicmVhayBjb3VudClcbiAgLy8gICAgIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBpdGVtcy5cbiAgZWxzZSBpZiAocChub2RlKSkge1xuICAgIHByZWZpeCA9IDJcbiAgICBzdWZmaXggPSAyXG4gIH1cblxuICAvLyA5LiAgSWYgbm9kZeKAmXMgdXNlZCB2YWx1ZSBvZiBgZGlzcGxheWAgaXMgYmxvY2stbGV2ZWwgb3IgYHRhYmxlLWNhcHRpb25gLFxuICAvLyAgICAgdGhlbiBhcHBlbmQgMSAoYSByZXF1aXJlZCBsaW5lIGJyZWFrIGNvdW50KSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2ZcbiAgLy8gICAgIGl0ZW1zLlxuICBlbHNlIGlmIChibG9ja09yQ2FwdGlvbihub2RlKSkge1xuICAgIHByZWZpeCA9IDFcbiAgICBzdWZmaXggPSAxXG4gIH1cblxuICAvLyAxLiAgTGV0IGl0ZW1zIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgaW5uZXIgdGV4dCBjb2xsZWN0aW9uIHN0ZXBzIHdpdGhcbiAgLy8gICAgIGVhY2ggY2hpbGQgbm9kZSBvZiBub2RlIGluIHRyZWUgb3JkZXIsIGFuZCB0aGVuIGNvbmNhdGVuYXRpbmcgdGhlXG4gIC8vICAgICByZXN1bHRzIHRvIGEgc2luZ2xlIGxpc3QuXG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoXG4gICAgICBpbm5lclRleHRDb2xsZWN0aW9uKGNoaWxkcmVuW2luZGV4XSwgbm9kZSwge1xuICAgICAgICB3aGl0ZXNwYWNlLFxuICAgICAgICBicmVha0JlZm9yZTogaW5kZXggPyB1bmRlZmluZWQgOiBwcmVmaXgsXG4gICAgICAgIGJyZWFrQWZ0ZXI6XG4gICAgICAgICAgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggLSAxID8gYnIoY2hpbGRyZW5baW5kZXggKyAxXSkgOiBzdWZmaXhcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgLy8gNi4gIElmIG5vZGXigJlzIGNvbXB1dGVkIHZhbHVlIG9mIGBkaXNwbGF5YCBpcyBgdGFibGUtY2VsbGAsIGFuZCBub2Rl4oCZcyBDU1NcbiAgLy8gICAgIGJveCBpcyBub3QgdGhlIGxhc3QgYHRhYmxlLWNlbGxgIGJveCBvZiBpdHMgZW5jbG9zaW5nIGB0YWJsZS1yb3dgIGJveCxcbiAgLy8gICAgIHRoZW4gYXBwZW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzaW5nbGUgVSswMDA5IENIQVJBQ1RFUiBUQUJVTEFUSU9OXG4gIC8vICAgICAodGFiKSBjaGFyYWN0ZXIgdG8gaXRlbXMuXG4gIC8vXG4gIC8vICAgICBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyN0YWJsZXMtMj5cbiAgaWYgKGNlbGwobm9kZSkgJiYgZmluZEFmdGVyKHBhcmVudCwgbm9kZSwgY2VsbCkpIHtcbiAgICBpdGVtcy5wdXNoKCdcXHQnKVxuICB9XG5cbiAgLy8gQWRkIHRoZSBwcmUtIGFuZCBzdWZmaXguXG4gIGlmIChwcmVmaXgpIGl0ZW1zLnVuc2hpZnQocHJlZml4KVxuICBpZiAoc3VmZml4KSBpdGVtcy5wdXNoKHN1ZmZpeClcblxuICByZXR1cm4gaXRlbXNcbn1cblxuLyoqXG4gKiA0LiAgSWYgbm9kZSBpcyBhIFRleHQgbm9kZSwgdGhlbiBmb3IgZWFjaCBDU1MgdGV4dCBib3ggcHJvZHVjZWQgYnkgbm9kZSxcbiAqICAgICBpbiBjb250ZW50IG9yZGVyLCBjb21wdXRlIHRoZSB0ZXh0IG9mIHRoZSBib3ggYWZ0ZXIgYXBwbGljYXRpb24gb2YgdGhlXG4gKiAgICAgQ1NTIGB3aGl0ZS1zcGFjZWAgcHJvY2Vzc2luZyBydWxlcyBhbmQgYHRleHQtdHJhbnNmb3JtYCBydWxlcywgc2V0XG4gKiAgICAgaXRlbXMgdG8gdGhlIGxpc3Qgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmdzLCBhbmQgcmV0dXJuIGl0ZW1zLlxuICogICAgIFRoZSBDU1MgYHdoaXRlLXNwYWNlYCBwcm9jZXNzaW5nIHJ1bGVzIGFyZSBzbGlnaHRseSBtb2RpZmllZDpcbiAqICAgICBjb2xsYXBzaWJsZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiBsaW5lcyBhcmUgYWx3YXlzIGNvbGxhcHNlZCwgYnV0IHRoZXlcbiAqICAgICBhcmUgb25seSByZW1vdmVkIGlmIHRoZSBsaW5lIGlzIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGJsb2NrLCBvciBpdCBlbmRzXG4gKiAgICAgd2l0aCBhIGJyIGVsZW1lbnQuXG4gKiAgICAgU29mdCBoeXBoZW5zIHNob3VsZCBiZSBwcmVzZXJ2ZWQuXG4gKlxuICogICAgIE5vdGU6IFNlZSBgY29sbGVjdFRleHRgIGFuZCBgY29sbGVjdFByZVRleHRgLlxuICogICAgIE5vdGU6IHdlIGRvbuKAmXQgZGVhbCB3aXRoIGB0ZXh0LXRyYW5zZm9ybWAsIG5vIGVsZW1lbnQgaGFzIHRoYXQgYnlcbiAqICAgICBkZWZhdWx0LlxuICpcbiAqIFNlZTogPGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC8jd2hpdGUtc3BhY2UtcGhhc2UtMT5cbiAqXG4gKiBAcGFyYW0ge1RleHQgfCBDb21tZW50fSBub2RlXG4gKiAgIFRleHQgbm9kZS5cbiAqIEBwYXJhbSB7Q29sbGVjdGlvbkluZm99IGluZm9cbiAqICAgSW5mbyBvbiBjdXJyZW50IGNvbGxlY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nIHwgQnJlYWtOdW1iZXI+fVxuICogICBSZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUZXh0KG5vZGUsIGluZm8pIHtcbiAgY29uc3QgdmFsdWUgPSBTdHJpbmcobm9kZS52YWx1ZSlcbiAgLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuICBjb25zdCBsaW5lcyA9IFtdXG4gIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgQnJlYWtOdW1iZXI+fSAqL1xuICBjb25zdCByZXN1bHQgPSBbXVxuICBsZXQgc3RhcnQgPSAwXG5cbiAgd2hpbGUgKHN0YXJ0IDw9IHZhbHVlLmxlbmd0aCkge1xuICAgIHNlYXJjaExpbmVGZWVkcy5sYXN0SW5kZXggPSBzdGFydFxuXG4gICAgY29uc3QgbWF0Y2ggPSBzZWFyY2hMaW5lRmVlZHMuZXhlYyh2YWx1ZSlcbiAgICBjb25zdCBlbmQgPSBtYXRjaCAmJiAnaW5kZXgnIGluIG1hdGNoID8gbWF0Y2guaW5kZXggOiB2YWx1ZS5sZW5ndGhcblxuICAgIGxpbmVzLnB1c2goXG4gICAgICAvLyBBbnkgc2VxdWVuY2Ugb2YgY29sbGFwc2libGUgc3BhY2VzIGFuZCB0YWJzIGltbWVkaWF0ZWx5IHByZWNlZGluZyBvclxuICAgICAgLy8gZm9sbG93aW5nIGEgc2VnbWVudCBicmVhayBpcyByZW1vdmVkLlxuICAgICAgdHJpbUFuZENvbGxhcHNlU3BhY2VzQW5kVGFicyhcbiAgICAgICAgLy8gW+KApl0gaWdub3JpbmcgYmlkaSBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgKGNoYXJhY3RlcnMgd2l0aCB0aGVcbiAgICAgICAgLy8gQmlkaV9Db250cm9sIHByb3BlcnR5IFtVQVg5XTogQUxNLCBMVFIsIFJUTCwgTFJFLVJMTywgTFJJLVBESSkgYXMgaWZcbiAgICAgICAgLy8gdGhleSB3ZXJlIG5vdCB0aGVyZS5cbiAgICAgICAgdmFsdWVcbiAgICAgICAgICAuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICAgICAgICAucmVwbGFjZSgvW1xcdTA2MUNcXHUyMDBFXFx1MjAwRlxcdTIwMkEtXFx1MjAyRVxcdTIwNjYtXFx1MjA2OV0vZywgJycpLFxuICAgICAgICBzdGFydCA9PT0gMCA/IGluZm8uYnJlYWtCZWZvcmUgOiB0cnVlLFxuICAgICAgICBlbmQgPT09IHZhbHVlLmxlbmd0aCA/IGluZm8uYnJlYWtBZnRlciA6IHRydWVcbiAgICAgIClcbiAgICApXG5cbiAgICBzdGFydCA9IGVuZCArIDFcbiAgfVxuXG4gIC8vIENvbGxhcHNpYmxlIHNlZ21lbnQgYnJlYWtzIGFyZSB0cmFuc2Zvcm1lZCBmb3IgcmVuZGVyaW5nIGFjY29yZGluZyB0byB0aGVcbiAgLy8gc2VnbWVudCBicmVhayB0cmFuc2Zvcm1hdGlvbiBydWxlcy5cbiAgLy8gU28gaGVyZSB3ZSBqdW1wIHRvIDQuMS4yIG9mIFtDU1NURVhUXTpcbiAgLy8gQW55IGNvbGxhcHNpYmxlIHNlZ21lbnQgYnJlYWsgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFub3RoZXIgY29sbGFwc2libGVcbiAgLy8gc2VnbWVudCBicmVhayBpcyByZW1vdmVkXG4gIGxldCBpbmRleCA9IC0xXG4gIC8qKiBAdHlwZSB7QnJlYWtOdW1iZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCBqb2luXG5cbiAgd2hpbGUgKCsraW5kZXggPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAvLyAqICAgSWYgdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNlZ21lbnRcbiAgICAvLyAgICAgYnJlYWsgaXMgdGhlIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyIChVKzIwMEIpLCB0aGVuIHRoZSBicmVhayBpc1xuICAgIC8vICAgICByZW1vdmVkLCBsZWF2aW5nIGJlaGluZCB0aGUgemVyby13aWR0aCBzcGFjZS5cbiAgICBpZiAoXG4gICAgICBsaW5lc1tpbmRleF0uY2hhckNvZGVBdChsaW5lc1tpbmRleF0ubGVuZ3RoIC0gMSkgPT09IDB4MjAwYiAvKiBaV1NQICovIHx8XG4gICAgICAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmXG4gICAgICAgIGxpbmVzW2luZGV4ICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gMHgyMDBiKSAvKiBaV1NQICovXG4gICAgKSB7XG4gICAgICByZXN1bHQucHVzaChsaW5lc1tpbmRleF0pXG4gICAgICBqb2luID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy8gKiAgIE90aGVyd2lzZSwgaWYgdGhlIEVhc3QgQXNpYW4gV2lkdGggcHJvcGVydHkgW1VBWDExXSBvZiBib3RoIHRoZVxuICAgIC8vICAgICBjaGFyYWN0ZXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgc2VnbWVudCBicmVhayBpcyBGdWxsd2lkdGgsIFdpZGUsIG9yXG4gICAgLy8gICAgIEhhbGZ3aWR0aCAobm90IEFtYmlndW91cyksIGFuZCBuZWl0aGVyIHNpZGUgaXMgSGFuZ3VsLCB0aGVuIHRoZVxuICAgIC8vICAgICBzZWdtZW50IGJyZWFrIGlzIHJlbW92ZWQuXG4gICAgLy9cbiAgICAvLyAgICAgTm90ZTogaWdub3JlZC5cbiAgICAvLyAqICAgT3RoZXJ3aXNlLCBpZiB0aGUgd3JpdGluZyBzeXN0ZW0gb2YgdGhlIHNlZ21lbnQgYnJlYWsgaXMgQ2hpbmVzZSxcbiAgICAvLyAgICAgSmFwYW5lc2UsIG9yIFlpLCBhbmQgdGhlIGNoYXJhY3RlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNlZ21lbnQgYnJlYWtcbiAgICAvLyAgICAgaXMgcHVuY3R1YXRpb24gb3IgYSBzeW1ib2wgKFVuaWNvZGUgZ2VuZXJhbCBjYXRlZ29yeSBQKiBvciBTKikgYW5kXG4gICAgLy8gICAgIGhhcyBhbiBFYXN0IEFzaWFuIFdpZHRoIHByb3BlcnR5IG9mIEFtYmlndW91cywgYW5kIHRoZSBjaGFyYWN0ZXIgb25cbiAgICAvLyAgICAgdGhlIG90aGVyIHNpZGUgb2YgdGhlIHNlZ21lbnQgYnJlYWsgaXMgRnVsbHdpZHRoLCBXaWRlLCBvciBIYWxmd2lkdGgsXG4gICAgLy8gICAgIGFuZCBub3QgSGFuZ3VsLCB0aGVuIHRoZSBzZWdtZW50IGJyZWFrIGlzIHJlbW92ZWQuXG4gICAgLy9cbiAgICAvLyAgICAgTm90ZTogaWdub3JlZC5cblxuICAgIC8vICogICBPdGhlcndpc2UsIHRoZSBzZWdtZW50IGJyZWFrIGlzIGNvbnZlcnRlZCB0byBhIHNwYWNlIChVKzAwMjApLlxuICAgIGVsc2UgaWYgKGxpbmVzW2luZGV4XSkge1xuICAgICAgaWYgKHR5cGVvZiBqb2luID09PSAnbnVtYmVyJykgcmVzdWx0LnB1c2goam9pbilcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmVzW2luZGV4XSlcbiAgICAgIGpvaW4gPSAwXG4gICAgfSBlbHNlIGlmIChpbmRleCA9PT0gMCB8fCBpbmRleCA9PT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gSWYgdGhpcyBsaW5lIGlzIGVtcHR5LCBhbmQgaXTigJlzIHRoZSBmaXJzdCBvciBsYXN0LCBhZGQgYSBzcGFjZS5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGluIG5vcm1hbCB3aGl0ZXNwYWNlLCBzbyB3ZVxuICAgICAgLy8gZG9u4oCZdCB3b3JyeSBhYm91dCBgcHJlYC5cbiAgICAgIHJlc3VsdC5wdXNoKDApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENvbGxlY3QgYSB0ZXh0IG5vZGUgYXMg4oCccHJl4oCdIHdoaXRlc3BhY2UuXG4gKlxuICogQHBhcmFtIHtUZXh0fSBub2RlXG4gKiAgIFRleHQgbm9kZS5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmcgfCBCcmVha051bWJlcj59XG4gKiAgIFJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFByZVRleHQobm9kZSkge1xuICByZXR1cm4gW1N0cmluZyhub2RlLnZhbHVlKV1cbn1cblxuLyoqXG4gKiAzLiAgRXZlcnkgY29sbGFwc2libGUgdGFiIGlzIGNvbnZlcnRlZCB0byBhIGNvbGxhcHNpYmxlIHNwYWNlIChVKzAwMjApLlxuICogNC4gIEFueSBjb2xsYXBzaWJsZSBzcGFjZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW5vdGhlciBjb2xsYXBzaWJsZVxuICogICAgIHNwYWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXRcbiAqICAgICBzcGFjZSwgcHJvdmlkZWQgYm90aCBzcGFjZXMgYXJlIHdpdGhpbiB0aGUgc2FtZSBpbmxpbmUgZm9ybWF0dGluZ1xuICogICAgIGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lkdGguIChJdCBpcyBpbnZpc2libGUsXG4gKiAgICAgYnV0IHJldGFpbnMgaXRzIHNvZnQgd3JhcCBvcHBvcnR1bml0eSwgaWYgYW55LilcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqICAgVmFsdWUgdG8gY29sbGFwc2UuXG4gKiBAcGFyYW0ge0JyZWFrQmVmb3JlfSBicmVha0JlZm9yZVxuICogICBXaGV0aGVyIHRoZXJlIHdhcyBhIGJyZWFrIGJlZm9yZS5cbiAqIEBwYXJhbSB7QnJlYWtBZnRlcn0gYnJlYWtBZnRlclxuICogICBXaGV0aGVyIHRoZXJlIHdhcyBhIGJyZWFrIGFmdGVyLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqICAgUmVzdWx0LlxuICovXG5mdW5jdGlvbiB0cmltQW5kQ29sbGFwc2VTcGFjZXNBbmRUYWJzKHZhbHVlLCBicmVha0JlZm9yZSwgYnJlYWtBZnRlcikge1xuICAvKiogQHR5cGUge0FycmF5PHN0cmluZz59ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGxldCBzdGFydCA9IDBcbiAgLyoqIEB0eXBlIHtudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCBlbmRcblxuICB3aGlsZSAoc3RhcnQgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICBzZWFyY2hUYWJPclNwYWNlcy5sYXN0SW5kZXggPSBzdGFydFxuICAgIGNvbnN0IG1hdGNoID0gc2VhcmNoVGFiT3JTcGFjZXMuZXhlYyh2YWx1ZSlcbiAgICBlbmQgPSBtYXRjaCA/IG1hdGNoLmluZGV4IDogdmFsdWUubGVuZ3RoXG5cbiAgICAvLyBJZiB3ZeKAmXJlIG5vdCBkaXJlY3RseSBhZnRlciBhIHNlZ21lbnQgYnJlYWssIGJ1dCB0aGVyZSB3YXMgd2hpdGUgc3BhY2UsXG4gICAgLy8gYWRkIGFuIGVtcHR5IHZhbHVlIHRoYXQgd2lsbCBiZSB0dXJuZWQgaW50byBhIHNwYWNlLlxuICAgIGlmICghc3RhcnQgJiYgIWVuZCAmJiBtYXRjaCAmJiAhYnJlYWtCZWZvcmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCcnKVxuICAgIH1cblxuICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZS5zbGljZShzdGFydCwgZW5kKSlcbiAgICB9XG5cbiAgICBzdGFydCA9IG1hdGNoID8gZW5kICsgbWF0Y2hbMF0ubGVuZ3RoIDogZW5kXG4gIH1cblxuICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBlbmQsIHRoZXJlIHdhcyB0cmFpbGluZyB3aGl0ZSBzcGFjZSwgYW5kIHRoZXJl4oCZcyBub1xuICAvLyBzZWdtZW50IGJyZWFrIGFmdGVyIHRoaXMgbm9kZSwgYWRkIGFuIGVtcHR5IHZhbHVlIHRoYXQgd2lsbCBiZSB0dXJuZWRcbiAgLy8gaW50byBhIHNwYWNlLlxuICBpZiAoc3RhcnQgIT09IGVuZCAmJiAhYnJlYWtBZnRlcikge1xuICAgIHJlc3VsdC5wdXNoKCcnKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBGaWd1cmUgb3V0IHRoZSB3aGl0ZXNwYWNlIG9mIGEgbm9kZS5cbiAqXG4gKiBXZSBkb27igJl0IHN1cHBvcnQgdm9pZCBlbGVtZW50cyBoZXJlIChzbyBgbm9iciB3YnJgIC0+IGBub3JtYWxgIGlzIGlnbm9yZWQpLlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogICBOb2RlICh0eXBpY2FsbHkgYEVsZW1lbnRgKS5cbiAqIEBwYXJhbSB7Q29sbGVjdGlvbkluZm99IGluZm9cbiAqICAgSW5mbyBvbiBjdXJyZW50IGNvbGxlY3Rpb24uXG4gKiBAcmV0dXJucyB7V2hpdGVzcGFjZX1cbiAqICAgQXBwbGllZCB3aGl0ZXNwYWNlLlxuICovXG5mdW5jdGlvbiBpbmZlcldoaXRlc3BhY2Uobm9kZSwgaW5mbykge1xuICBpZiAobm9kZS50eXBlID09PSAnZWxlbWVudCcpIHtcbiAgICBjb25zdCBwcm9wcyA9IG5vZGUucHJvcGVydGllcyB8fCB7fVxuICAgIHN3aXRjaCAobm9kZS50YWdOYW1lKSB7XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3BsYWludGV4dCc6XG4gICAgICBjYXNlICd4bXAnOiB7XG4gICAgICAgIHJldHVybiAncHJlJ1xuICAgICAgfVxuXG4gICAgICBjYXNlICdub2JyJzoge1xuICAgICAgICByZXR1cm4gJ25vd3JhcCdcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICByZXR1cm4gcHJvcHMud3JhcCA/ICdwcmUtd3JhcCcgOiAncHJlJ1xuICAgICAgfVxuXG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0aCc6IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLm5vV3JhcCA/ICdub3dyYXAnIDogaW5mby53aGl0ZXNwYWNlXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3RleHRhcmVhJzoge1xuICAgICAgICByZXR1cm4gJ3ByZS13cmFwJ1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvLndoaXRlc3BhY2Vcbn1cblxuLyoqIEB0eXBlIHtUZXN0RnVuY3Rpb25Bbnl0aGluZ30gKi9cbmZ1bmN0aW9uIGhpZGRlbihub2RlKSB7XG4gIHJldHVybiBCb29sZWFuKChub2RlLnByb3BlcnRpZXMgfHwge30pLmhpZGRlbilcbn1cblxuLyoqIEB0eXBlIHtUZXN0RnVuY3Rpb25Bbnl0aGluZ30gKi9cbmZ1bmN0aW9uIGNsb3NlZERpYWxvZyhub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdkaWFsb2cnICYmICEobm9kZS5wcm9wZXJ0aWVzIHx8IHt9KS5vcGVuXG59XG4iXSwibmFtZXMiOlsiY29udmVydEVsZW1lbnQiLCJmaW5kQWZ0ZXIiLCJzZWFyY2hMaW5lRmVlZHMiLCJzZWFyY2hUYWJPclNwYWNlcyIsImJyIiwicCIsImNlbGwiLCJyb3ciLCJub3RSZW5kZXJlZCIsImhpZGRlbiIsImNsb3NlZERpYWxvZyIsImJsb2NrT3JDYXB0aW9uIiwidG9UZXh0IiwidHJlZSIsIm9wdGlvbnMiLCJjaGlsZHJlbiIsImJsb2NrIiwid2hpdGVzcGFjZSIsImluZmVyV2hpdGVzcGFjZSIsImJyZWFrQmVmb3JlIiwiYnJlYWtBZnRlciIsInJlc3VsdHMiLCJ0eXBlIiwicHVzaCIsImNvbGxlY3RUZXh0IiwiaW5kZXgiLCJsZW5ndGgiLCJpbm5lclRleHRDb2xsZWN0aW9uIiwidW5kZWZpbmVkIiwicmVzdWx0IiwiY291bnQiLCJ2YWx1ZSIsInJlcGVhdCIsImpvaW4iLCJub2RlIiwicGFyZW50IiwiaW5mbyIsImNvbGxlY3RFbGVtZW50IiwiY29sbGVjdFByZVRleHQiLCJpdGVtcyIsInByZWZpeCIsInN1ZmZpeCIsImNvbmNhdCIsInVuc2hpZnQiLCJTdHJpbmciLCJsaW5lcyIsInN0YXJ0IiwibGFzdEluZGV4IiwibWF0Y2giLCJleGVjIiwiZW5kIiwidHJpbUFuZENvbGxhcHNlU3BhY2VzQW5kVGFicyIsInNsaWNlIiwicmVwbGFjZSIsImNoYXJDb2RlQXQiLCJwcm9wcyIsInByb3BlcnRpZXMiLCJ0YWdOYW1lIiwid3JhcCIsIm5vV3JhcCIsIkJvb2xlYW4iLCJvcGVuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/hast-util-to-text/lib/index.js\n");
|