UNPKG

botframework-webchat-component

Version:
166 lines (162 loc) 30.9 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _botframeworkWebchatApi = require("botframework-webchat-api"); var _botframeworkWebchatCore = require("botframework-webchat-core"); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _simpleUpdateIn = _interopRequireDefault(require("simple-update-in")); var _createCustomEvent = _interopRequireDefault(require("./createCustomEvent")); var _randomId = _interopRequireDefault(require("./randomId")); var _useInternalMarkdownIt = _interopRequireDefault(require("../hooks/internal/useInternalMarkdownIt")); var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject")); var _walkMarkdownTokens = _interopRequireDefault(require("./walkMarkdownTokens")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint react/no-danger: "off" */ var useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions; function replaceAnchorWithButton(markdownTokens) { return (0, _walkMarkdownTokens.default)(markdownTokens, function (markdownToken) { markdownToken = _objectSpread({}, markdownToken); switch (markdownToken.type) { case 'link_open': markdownToken.tag = 'button'; markdownToken.attrs = [].concat(_toConsumableArray((0, _simpleUpdateIn.default)(markdownToken.attrs, [function (_ref) { var _ref2 = _slicedToArray(_ref, 2), name = _ref2[0], value = _ref2[1]; return name === 'href' && value.startsWith('#'); }], function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), value = _ref4[1]; return ['data-markdown-href', value.substr(1)]; })), [['type', 'button']]); break; case 'link_close': markdownToken.tag = 'button'; break; default: break; } return markdownToken; }); } var InlineMarkdown = function InlineMarkdown(_ref5) { var children = _ref5.children, onReference = _ref5.onReference, references = _ref5.references; if (typeof children !== 'string') { console.warn('botframework-webchat: "children" prop passed to <InlineMarkdown> must be of type string.'); children = ''; } var _useInternalMarkdownI = (0, _useInternalMarkdownIt.default)(), _useInternalMarkdownI2 = _slicedToArray(_useInternalMarkdownI, 1), markdownIt = _useInternalMarkdownI2[0]; var _useStyleOptions = useStyleOptions(), _useStyleOptions2 = _slicedToArray(_useStyleOptions, 1), accent = _useStyleOptions2[0].accent; var styleToClassName = (0, _useStyleToEmotionObject.default)(); // We inlined the style here because this style is: // 1. Internal to Web Chat // 2. Not customizable from developers (other than setting `styleOptions.accent`) var className = (0, _react.useMemo)(function () { return styleToClassName({ '& button[data-markdown-href]': { appearance: 'none', backgroundColor: 'transparent', border: 0, color: accent, cursor: 'pointer', fontFamily: 'inherit', fontSize: 'inherit', padding: 0 }, '@media screen and (forced-colors: active)': { '& button[data-markdown-href]': { color: 'LinkText', textDecoration: 'underline' } } }) + ''; }, [accent, styleToClassName]); // Markdown-It only support references in uppercase. references = references.map(function (reference) { return reference.toUpperCase(); }); var _references$reduce = references.reduce(function (_ref6, ref) { var hrefToRef = _ref6.hrefToRef, refToHref = _ref6.refToHref; var href = (0, _randomId.default)(); return { hrefToRef: _objectSpread(_objectSpread({}, hrefToRef), {}, _defineProperty({}, href, ref)), refToHref: _objectSpread(_objectSpread({}, refToHref), {}, _defineProperty({}, ref, href)) }; }, { hrefToRef: {}, refToHref: {} }), hrefToRef = _references$reduce.hrefToRef, refToHref = _references$reduce.refToHref; var html = (0, _react.useMemo)(function () { var tree = markdownIt.parseInline(children, { references: references.reduce(function (references, key) { return ( // Mitigated through denylisting. // eslint-disable-next-line security/detect-object-injection (0, _botframeworkWebchatCore.isForbiddenPropertyName)(key) ? references : _objectSpread(_objectSpread({}, references), {}, _defineProperty({}, key, { href: "#".concat(refToHref[key]) })) ); }, {}) }); // Turn "<a href="#retry">Retry</a>" into "<button data-ref="retry" type="button">Retry</button>" var updatedTree = replaceAnchorWithButton(tree); return { __html: markdownIt.renderer.render(updatedTree) }; }, [children, refToHref, markdownIt, references]); var handleClick = (0, _react.useCallback)(function (event) { event.stopPropagation(); var href = event.target.getAttribute('data-markdown-href'); href && onReference && onReference((0, _createCustomEvent.default)('reference', // Mitigated through denylisting. // eslint-disable-next-line security/detect-object-injection (0, _botframeworkWebchatCore.isForbiddenPropertyName)(href) ? {} : { data: hrefToRef[href] })); }, [hrefToRef, onReference]); return /*#__PURE__*/_react.default.createElement("span", { className: className, dangerouslySetInnerHTML: html, onClick: handleClick }); }; InlineMarkdown.defaultProps = { children: '', onReference: undefined, references: [] }; InlineMarkdown.propTypes = { children: _propTypes.default.string, onReference: _propTypes.default.func, references: _propTypes.default.arrayOf(_propTypes.default.string) }; var _default = InlineMarkdown; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfYm90ZnJhbWV3b3JrV2ViY2hhdENvcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3NpbXBsZVVwZGF0ZUluIiwiX2NyZWF0ZUN1c3RvbUV2ZW50IiwiX3JhbmRvbUlkIiwiX3VzZUludGVybmFsTWFya2Rvd25JdCIsIl91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCIsIl93YWxrTWFya2Rvd25Ub2tlbnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJfaSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX2FyciIsIl9uIiwiX2QiLCJfcyIsIl9lIiwibmV4dCIsImRvbmUiLCJwdXNoIiwidmFsdWUiLCJsZW5ndGgiLCJlcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIml0ZXIiLCJsZW4iLCJhcnIyIiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJlbnVtZXJhYmxlIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ1c2VTdHlsZU9wdGlvbnMiLCJob29rcyIsInJlcGxhY2VBbmNob3JXaXRoQnV0dG9uIiwibWFya2Rvd25Ub2tlbnMiLCJ3YWxrTWFya2Rvd25Ub2tlbnMiLCJtYXJrZG93blRva2VuIiwidHlwZSIsInRhZyIsImF0dHJzIiwiY29uY2F0IiwidXBkYXRlSW4iLCJfcmVmIiwiX3JlZjIiLCJzdGFydHNXaXRoIiwiX3JlZjMiLCJfcmVmNCIsInN1YnN0ciIsIklubGluZU1hcmtkb3duIiwiX3JlZjUiLCJjaGlsZHJlbiIsIm9uUmVmZXJlbmNlIiwicmVmZXJlbmNlcyIsImNvbnNvbGUiLCJ3YXJuIiwiX3VzZUludGVybmFsTWFya2Rvd25JIiwidXNlSW50ZXJuYWxNYXJrZG93bkl0IiwiX3VzZUludGVybmFsTWFya2Rvd25JMiIsIm1hcmtkb3duSXQiLCJfdXNlU3R5bGVPcHRpb25zIiwiX3VzZVN0eWxlT3B0aW9uczIiLCJhY2NlbnQiLCJzdHlsZVRvQ2xhc3NOYW1lIiwidXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJjbGFzc05hbWUiLCJ1c2VNZW1vIiwiYXBwZWFyYW5jZSIsImJhY2tncm91bmRDb2xvciIsImJvcmRlciIsImNvbG9yIiwiY3Vyc29yIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwicGFkZGluZyIsInRleHREZWNvcmF0aW9uIiwibWFwIiwicmVmZXJlbmNlIiwidG9VcHBlckNhc2UiLCJfcmVmZXJlbmNlcyRyZWR1Y2UiLCJyZWR1Y2UiLCJfcmVmNiIsInJlZiIsImhyZWZUb1JlZiIsInJlZlRvSHJlZiIsImhyZWYiLCJyYW5kb21JZCIsImh0bWwiLCJ0cmVlIiwicGFyc2VJbmxpbmUiLCJpc0ZvcmJpZGRlblByb3BlcnR5TmFtZSIsInVwZGF0ZWRUcmVlIiwiX19odG1sIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJoYW5kbGVDbGljayIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJnZXRBdHRyaWJ1dGUiLCJjcmVhdGVDdXN0b21FdmVudCIsImRhdGEiLCJjcmVhdGVFbGVtZW50IiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJvbkNsaWNrIiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiZnVuYyIsImFycmF5T2YiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9VdGlscy9JbmxpbmVNYXJrZG93bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgcmVhY3Qvbm8tZGFuZ2VyOiBcIm9mZlwiICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVwZGF0ZUluIGZyb20gJ3NpbXBsZS11cGRhdGUtaW4nO1xuXG5pbXBvcnQgY3JlYXRlQ3VzdG9tRXZlbnQgZnJvbSAnLi9jcmVhdGVDdXN0b21FdmVudCc7XG5pbXBvcnQgcmFuZG9tSWQgZnJvbSAnLi9yYW5kb21JZCc7XG5pbXBvcnQgdXNlSW50ZXJuYWxNYXJrZG93bkl0IGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZUludGVybmFsTWFya2Rvd25JdCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QnO1xuaW1wb3J0IHdhbGtNYXJrZG93blRva2VucyBmcm9tICcuL3dhbGtNYXJrZG93blRva2Vucyc7XG5cbmNvbnN0IHsgdXNlU3R5bGVPcHRpb25zIH0gPSBob29rcztcblxuZnVuY3Rpb24gcmVwbGFjZUFuY2hvcldpdGhCdXR0b24obWFya2Rvd25Ub2tlbnMpIHtcbiAgcmV0dXJuIHdhbGtNYXJrZG93blRva2VucyhtYXJrZG93blRva2VucywgbWFya2Rvd25Ub2tlbiA9PiB7XG4gICAgbWFya2Rvd25Ub2tlbiA9IHsgLi4ubWFya2Rvd25Ub2tlbiB9O1xuXG4gICAgc3dpdGNoIChtYXJrZG93blRva2VuLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmtfb3Blbic6XG4gICAgICAgIG1hcmtkb3duVG9rZW4udGFnID0gJ2J1dHRvbic7XG4gICAgICAgIG1hcmtkb3duVG9rZW4uYXR0cnMgPSBbXG4gICAgICAgICAgLi4udXBkYXRlSW4oXG4gICAgICAgICAgICBtYXJrZG93blRva2VuLmF0dHJzLFxuICAgICAgICAgICAgWyhbbmFtZSwgdmFsdWVdKSA9PiBuYW1lID09PSAnaHJlZicgJiYgdmFsdWUuc3RhcnRzV2l0aCgnIycpXSxcbiAgICAgICAgICAgIChbLCB2YWx1ZV0pID0+IFsnZGF0YS1tYXJrZG93bi1ocmVmJywgdmFsdWUuc3Vic3RyKDEpXVxuICAgICAgICAgICksXG4gICAgICAgICAgWyd0eXBlJywgJ2J1dHRvbiddXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsaW5rX2Nsb3NlJzpcbiAgICAgICAgbWFya2Rvd25Ub2tlbi50YWcgPSAnYnV0dG9uJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrZG93blRva2VuO1xuICB9KTtcbn1cblxuY29uc3QgSW5saW5lTWFya2Rvd24gPSAoeyBjaGlsZHJlbiwgb25SZWZlcmVuY2UsIHJlZmVyZW5jZXMgfSkgPT4ge1xuICBpZiAodHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJykge1xuICAgIGNvbnNvbGUud2FybignYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IFwiY2hpbGRyZW5cIiBwcm9wIHBhc3NlZCB0byA8SW5saW5lTWFya2Rvd24+IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgY2hpbGRyZW4gPSAnJztcbiAgfVxuXG4gIGNvbnN0IFttYXJrZG93bkl0XSA9IHVzZUludGVybmFsTWFya2Rvd25JdCgpO1xuICBjb25zdCBbeyBhY2NlbnQgfV0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3Qgc3R5bGVUb0NsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCk7XG5cbiAgLy8gV2UgaW5saW5lZCB0aGUgc3R5bGUgaGVyZSBiZWNhdXNlIHRoaXMgc3R5bGUgaXM6XG4gIC8vIDEuIEludGVybmFsIHRvIFdlYiBDaGF0XG4gIC8vIDIuIE5vdCBjdXN0b21pemFibGUgZnJvbSBkZXZlbG9wZXJzIChvdGhlciB0aGFuIHNldHRpbmcgYHN0eWxlT3B0aW9ucy5hY2NlbnRgKVxuICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBzdHlsZVRvQ2xhc3NOYW1lKHtcbiAgICAgICAgJyYgYnV0dG9uW2RhdGEtbWFya2Rvd24taHJlZl0nOiB7XG4gICAgICAgICAgYXBwZWFyYW5jZTogJ25vbmUnLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgY29sb3I6IGFjY2VudCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBmb250RmFtaWx5OiAnaW5oZXJpdCcsXG4gICAgICAgICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICAgICAgICBwYWRkaW5nOiAwXG4gICAgICAgIH0sXG4gICAgICAgICdAbWVkaWEgc2NyZWVuIGFuZCAoZm9yY2VkLWNvbG9yczogYWN0aXZlKSc6IHtcbiAgICAgICAgICAnJiBidXR0b25bZGF0YS1tYXJrZG93bi1ocmVmXSc6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnTGlua1RleHQnLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSArICcnLFxuICAgIFthY2NlbnQsIHN0eWxlVG9DbGFzc05hbWVdXG4gICk7XG5cbiAgLy8gTWFya2Rvd24tSXQgb25seSBzdXBwb3J0IHJlZmVyZW5jZXMgaW4gdXBwZXJjYXNlLlxuICByZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5tYXAocmVmZXJlbmNlID0+IHJlZmVyZW5jZS50b1VwcGVyQ2FzZSgpKTtcblxuICBjb25zdCB7IGhyZWZUb1JlZiwgcmVmVG9IcmVmIH0gPSByZWZlcmVuY2VzLnJlZHVjZShcbiAgICAoeyBocmVmVG9SZWYsIHJlZlRvSHJlZiB9LCByZWYpID0+IHtcbiAgICAgIGNvbnN0IGhyZWYgPSByYW5kb21JZCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmVG9SZWY6IHsgLi4uaHJlZlRvUmVmLCBbaHJlZl06IHJlZiB9LFxuICAgICAgICByZWZUb0hyZWY6IHsgLi4ucmVmVG9IcmVmLCBbcmVmXTogaHJlZiB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgeyBocmVmVG9SZWY6IHt9LCByZWZUb0hyZWY6IHt9IH1cbiAgKTtcblxuICBjb25zdCBodG1sID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgdHJlZSA9IG1hcmtkb3duSXQucGFyc2VJbmxpbmUoY2hpbGRyZW4sIHtcbiAgICAgIHJlZmVyZW5jZXM6IHJlZmVyZW5jZXMucmVkdWNlKFxuICAgICAgICAocmVmZXJlbmNlcywga2V5KSA9PlxuICAgICAgICAgIC8vIE1pdGlnYXRlZCB0aHJvdWdoIGRlbnlsaXN0aW5nLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgIGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lKGtleSkgPyByZWZlcmVuY2VzIDogeyAuLi5yZWZlcmVuY2VzLCBba2V5XTogeyBocmVmOiBgIyR7cmVmVG9IcmVmW2tleV19YCB9IH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSk7XG5cbiAgICAvLyBUdXJuIFwiPGEgaHJlZj1cIiNyZXRyeVwiPlJldHJ5PC9hPlwiIGludG8gXCI8YnV0dG9uIGRhdGEtcmVmPVwicmV0cnlcIiB0eXBlPVwiYnV0dG9uXCI+UmV0cnk8L2J1dHRvbj5cIlxuICAgIGNvbnN0IHVwZGF0ZWRUcmVlID0gcmVwbGFjZUFuY2hvcldpdGhCdXR0b24odHJlZSk7XG5cbiAgICByZXR1cm4geyBfX2h0bWw6IG1hcmtkb3duSXQucmVuZGVyZXIucmVuZGVyKHVwZGF0ZWRUcmVlKSB9O1xuICB9LCBbY2hpbGRyZW4sIHJlZlRvSHJlZiwgbWFya2Rvd25JdCwgcmVmZXJlbmNlc10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IGhyZWYgPSBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW1hcmtkb3duLWhyZWYnKTtcblxuICAgICAgaHJlZiAmJlxuICAgICAgICBvblJlZmVyZW5jZSAmJlxuICAgICAgICBvblJlZmVyZW5jZShcbiAgICAgICAgICBjcmVhdGVDdXN0b21FdmVudChcbiAgICAgICAgICAgICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgLy8gTWl0aWdhdGVkIHRocm91Z2ggZGVueWxpc3RpbmcuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgIGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lKGhyZWYpID8ge30gOiB7IGRhdGE6IGhyZWZUb1JlZltocmVmXSB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH0sXG4gICAgW2hyZWZUb1JlZiwgb25SZWZlcmVuY2VdXG4gICk7XG5cbiAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbH0gb25DbGljaz17aGFuZGxlQ2xpY2t9IC8+O1xufTtcblxuSW5saW5lTWFya2Rvd24uZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogJycsXG4gIG9uUmVmZXJlbmNlOiB1bmRlZmluZWQsXG4gIHJlZmVyZW5jZXM6IFtdXG59O1xuXG5JbmxpbmVNYXJrZG93bi5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvblJlZmVyZW5jZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHJlZmVyZW5jZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbmxpbmVNYXJrZG93bjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyx3QkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBQyx1QkFBQSxDQUFBTCxP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