UNPKG

botframework-webchat-component

Version:
138 lines (129 loc) 27.8 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 _markdownIt = _interopRequireDefault(require("markdown-it")); var _react = _interopRequireWildcard(require("react")); var _betterLinks = _interopRequireDefault(require("./betterLinks")); 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 _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 allowedSchemes = ['data', 'http', 'https', 'ftp', 'mailto', 'sip', 'tel']; var linkDefinitions = []; var externalLinkAlt = ''; var defaultDecorateLink = function defaultDecorateLink(href, textContent, linkOptions) { var _decoration$title; var decoration = _objectSpread({ rel: 'noopener noreferrer', target: '_blank', wrapZeroWidthSpace: true }, linkOptions); var ariaLabelSegments = [textContent]; var classes = new Set(); var linkDefinition = linkDefinitions.find(function (_ref) { var url = _ref.url; return url === href; }); var protocol = (0, _botframeworkWebchatCore.onErrorResumeNext)(function () { return new URL(href).protocol; }); if (linkDefinition) { ariaLabelSegments.push(linkDefinition.title || (0, _botframeworkWebchatCore.onErrorResumeNext)(function () { return new URL(linkDefinition.url).host; }) || linkDefinition.url); // linkDefinition.identifier is uppercase, while linkDefinition.label is as-is. linkDefinition.label === textContent && classes.add('webchat__render-markdown__pure-identifier'); } // For links that would be sanitized out, let's turn them into a button so we could handle them later. if (!allowedSchemes.map(function (scheme) { return "".concat(scheme, ":"); }).includes(protocol)) { var _decoration$asButton; (_decoration$asButton = decoration.asButton) !== null && _decoration$asButton !== void 0 ? _decoration$asButton : decoration.asButton = true; classes.add('webchat__render-markdown__citation'); } else if (protocol === 'http:' || protocol === 'https:') { decoration.iconClassName = [decoration.iconClassName, 'webchat__render-markdown__external-link-icon'].filter(function (className) { return className; }).join(' '); ariaLabelSegments.push(externalLinkAlt); } // The first segment is textContent. Putting textContent is aria-label is useless. if (ariaLabelSegments.length > 1) { var _decoration$ariaLabel; // If "aria-label" is already applied, do not overwrite it. (_decoration$ariaLabel = decoration.ariaLabel) !== null && _decoration$ariaLabel !== void 0 ? _decoration$ariaLabel : decoration.ariaLabel = function (value) { return value || ariaLabelSegments.join(' '); }; } if (typeof (linkOptions === null || linkOptions === void 0 ? void 0 : linkOptions.className) === 'string') { classes.add(linkOptions.className); } // Resolve className var classNamesString = Array.from(classes).join(' '); if (linkOptions !== null && linkOptions !== void 0 && linkOptions.className && (linkOptions === null || linkOptions === void 0 ? void 0 : linkOptions.className) instanceof Function) { decoration.className = linkOptions.className(classNamesString); } else { decoration.className = classNamesString; } // By default, Markdown-It will set "title" to the link title in link definition. // However, "title" may be narrated by screen reader: // - Edge // - <a> will narrate "aria-label" but not "title" // - <button> will narrate both "aria-label" and "title" // - NVDA // - <a> will narrate both "aria-label" and "title" // - <button> will narrate both "aria-label" and "title" // Title makes it very difficult to control narrations by the screen reader. Thus, we are disabling it in favor of "aria-label". // This will not affect our accessibility compliance but UX. We could use a non-native tooltip or other forms of visual hint. (_decoration$title = decoration.title) !== null && _decoration$title !== void 0 ? _decoration$title : decoration.title = false; return decoration; }; var useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer; var markdownIt = new _markdownIt.default().use(_betterLinks.default); function isPlural(props) { return typeof props.stringIds !== 'string'; } var LocalizedString = function LocalizedString(props) { var className = props.className, linkClassName = props.linkClassName, _props$onDecorateLink = props.onDecorateLink, onDecorateLink = _props$onDecorateLink === void 0 ? defaultDecorateLink : _props$onDecorateLink, stringIds = props.stringIds, values = props.values; var localize = useLocalizer(isPlural(props) && { plural: true }); var env = (0, _react.useMemo)(function () { return { linkOptions: { className: linkClassName }, decorateLink: onDecorateLink }; }, [linkClassName, onDecorateLink]); var html = (0, _react.useMemo)(function () { return { __html: markdownIt.renderer.render(markdownIt.parseInline(localize.apply(void 0, [stringIds].concat(_toConsumableArray(values !== null && values !== void 0 ? values : []))), env), env) }; }, [env, localize, stringIds, values]); return /*#__PURE__*/_react.default.createElement("span", { className: className, dangerouslySetInnerHTML: html }); }; var _default = /*#__PURE__*/(0, _react.memo)(LocalizedString); exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfYm90ZnJhbWV3b3JrV2ViY2hhdENvcmUiLCJfbWFya2Rvd25JdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9iZXR0ZXJMaW5rcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYXJyIiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIlR5cGVFcnJvciIsIm8iLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsIm4iLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsIml0ZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlzQXJyYXkiLCJsZW4iLCJsZW5ndGgiLCJpIiwiYXJyMiIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJhcmd1bWVudHMiLCJzb3VyY2UiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYWxsb3dlZFNjaGVtZXMiLCJsaW5rRGVmaW5pdGlvbnMiLCJleHRlcm5hbExpbmtBbHQiLCJkZWZhdWx0RGVjb3JhdGVMaW5rIiwiaHJlZiIsInRleHRDb250ZW50IiwibGlua09wdGlvbnMiLCJfZGVjb3JhdGlvbiR0aXRsZSIsImRlY29yYXRpb24iLCJyZWwiLCJ3cmFwWmVyb1dpZHRoU3BhY2UiLCJhcmlhTGFiZWxTZWdtZW50cyIsImNsYXNzZXMiLCJTZXQiLCJsaW5rRGVmaW5pdGlvbiIsImZpbmQiLCJfcmVmIiwidXJsIiwicHJvdG9jb2wiLCJvbkVycm9yUmVzdW1lTmV4dCIsIlVSTCIsInRpdGxlIiwiaG9zdCIsImxhYmVsIiwiYWRkIiwibWFwIiwic2NoZW1lIiwiY29uY2F0IiwiaW5jbHVkZXMiLCJfZGVjb3JhdGlvbiRhc0J1dHRvbiIsImFzQnV0dG9uIiwiaWNvbkNsYXNzTmFtZSIsImNsYXNzTmFtZSIsImpvaW4iLCJfZGVjb3JhdGlvbiRhcmlhTGFiZWwiLCJhcmlhTGFiZWwiLCJjbGFzc05hbWVzU3RyaW5nIiwiRnVuY3Rpb24iLCJ1c2VMb2NhbGl6ZXIiLCJob29rcyIsIm1hcmtkb3duSXQiLCJNYXJrZG93bkl0IiwidXNlIiwiYmV0dGVyTGlua3MiLCJpc1BsdXJhbCIsInByb3BzIiwic3RyaW5nSWRzIiwiTG9jYWxpemVkU3RyaW5nIiwibGlua0NsYXNzTmFtZSIsIl9wcm9wcyRvbkRlY29yYXRlTGluayIsIm9uRGVjb3JhdGVMaW5rIiwidmFsdWVzIiwibG9jYWxpemUiLCJwbHVyYWwiLCJlbnYiLCJ1c2VNZW1vIiwiZGVjb3JhdGVMaW5rIiwiaHRtbCIsIl9faHRtbCIsInJlbmRlcmVyIiwicmVuZGVyIiwicGFyc2VJbmxpbmUiLCJjcmVhdGVFbGVtZW50IiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfZGVmYXVsdCIsIm1lbW8iLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiJjb21wb25lbnQ6Ly8vIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVXRpbHMvTG9jYWxpemVkU3RyaW5nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgcmVhY3Qvbm8tZGFuZ2VyOiBcIm9mZlwiICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IG9uRXJyb3JSZXN1bWVOZXh0IH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgTWFya2Rvd25JdCBmcm9tICdtYXJrZG93bi1pdCc7XG5pbXBvcnQgUmVhY3QsIHsgbWVtbywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBiZXR0ZXJMaW5rcywgeyB0eXBlIEJldHRlckxpbmtFbnYsIHR5cGUgTGlua09wdGlvbnMgfSBmcm9tICcuL2JldHRlckxpbmtzJztcblxuY29uc3QgYWxsb3dlZFNjaGVtZXMgPSBbJ2RhdGEnLCAnaHR0cCcsICdodHRwcycsICdmdHAnLCAnbWFpbHRvJywgJ3NpcCcsICd0ZWwnXTtcblxuY29uc3QgbGlua0RlZmluaXRpb25zID0gW107XG5cbmNvbnN0IGV4dGVybmFsTGlua0FsdCA9ICcnO1xuXG5jb25zdCBkZWZhdWx0RGVjb3JhdGVMaW5rID0gKGhyZWY6IHN0cmluZywgdGV4dENvbnRlbnQ6IHN0cmluZywgbGlua09wdGlvbnM/OiBMaW5rT3B0aW9ucyk6IExpbmtPcHRpb25zIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZGVjb3JhdGlvbjogTGlua09wdGlvbnMgPSB7XG4gICAgcmVsOiAnbm9vcGVuZXIgbm9yZWZlcnJlcicsXG4gICAgdGFyZ2V0OiAnX2JsYW5rJyxcbiAgICB3cmFwWmVyb1dpZHRoU3BhY2U6IHRydWUsXG4gICAgLi4ubGlua09wdGlvbnNcbiAgfTtcblxuICBjb25zdCBhcmlhTGFiZWxTZWdtZW50czogc3RyaW5nW10gPSBbdGV4dENvbnRlbnRdO1xuICBjb25zdCBjbGFzc2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbGlua0RlZmluaXRpb24gPSBsaW5rRGVmaW5pdGlvbnMuZmluZCgoeyB1cmwgfSkgPT4gdXJsID09PSBocmVmKTtcbiAgY29uc3QgcHJvdG9jb2wgPSBvbkVycm9yUmVzdW1lTmV4dCgoKSA9PiBuZXcgVVJMKGhyZWYpLnByb3RvY29sKTtcblxuICBpZiAobGlua0RlZmluaXRpb24pIHtcbiAgICBhcmlhTGFiZWxTZWdtZW50cy5wdXNoKFxuICAgICAgbGlua0RlZmluaXRpb24udGl0bGUgfHwgb25FcnJvclJlc3VtZU5leHQoKCkgPT4gbmV3IFVSTChsaW5rRGVmaW5pdGlvbi51cmwpLmhvc3QpIHx8IGxpbmtEZWZpbml0aW9uLnVybFxuICAgICk7XG5cbiAgICAvLyBsaW5rRGVmaW5pdGlvbi5pZGVudGlmaWVyIGlzIHVwcGVyY2FzZSwgd2hpbGUgbGlua0RlZmluaXRpb24ubGFiZWwgaXMgYXMtaXMuXG4gICAgbGlua0RlZmluaXRpb24ubGFiZWwgPT09IHRleHRDb250ZW50ICYmIGNsYXNzZXMuYWRkKCd3ZWJjaGF0X19yZW5kZXItbWFya2Rvd25fX3B1cmUtaWRlbnRpZmllcicpO1xuICB9XG5cbiAgLy8gRm9yIGxpbmtzIHRoYXQgd291bGQgYmUgc2FuaXRpemVkIG91dCwgbGV0J3MgdHVybiB0aGVtIGludG8gYSBidXR0b24gc28gd2UgY291bGQgaGFuZGxlIHRoZW0gbGF0ZXIuXG4gIGlmICghYWxsb3dlZFNjaGVtZXMubWFwKHNjaGVtZSA9PiBgJHtzY2hlbWV9OmApLmluY2x1ZGVzKHByb3RvY29sKSkge1xuICAgIGRlY29yYXRpb24uYXNCdXR0b24gPz89IHRydWU7XG5cbiAgICBjbGFzc2VzLmFkZCgnd2ViY2hhdF9fcmVuZGVyLW1hcmtkb3duX19jaXRhdGlvbicpO1xuICB9IGVsc2UgaWYgKHByb3RvY29sID09PSAnaHR0cDonIHx8IHByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgIGRlY29yYXRpb24uaWNvbkNsYXNzTmFtZSA9IFtkZWNvcmF0aW9uLmljb25DbGFzc05hbWUsICd3ZWJjaGF0X19yZW5kZXItbWFya2Rvd25fX2V4dGVybmFsLWxpbmstaWNvbiddXG4gICAgICAuZmlsdGVyKChjbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gY2xhc3NOYW1lKVxuICAgICAgLmpvaW4oJyAnKTtcblxuICAgIGFyaWFMYWJlbFNlZ21lbnRzLnB1c2goZXh0ZXJuYWxMaW5rQWx0KTtcbiAgfVxuXG4gIC8vIFRoZSBmaXJzdCBzZWdtZW50IGlzIHRleHRDb250ZW50LiBQdXR0aW5nIHRleHRDb250ZW50IGlzIGFyaWEtbGFiZWwgaXMgdXNlbGVzcy5cbiAgaWYgKGFyaWFMYWJlbFNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBJZiBcImFyaWEtbGFiZWxcIiBpcyBhbHJlYWR5IGFwcGxpZWQsIGRvIG5vdCBvdmVyd3JpdGUgaXQuXG4gICAgZGVjb3JhdGlvbi5hcmlhTGFiZWwgPz89ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZSB8fCBhcmlhTGFiZWxTZWdtZW50cy5qb2luKCcgJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGxpbmtPcHRpb25zPy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY2xhc3Nlcy5hZGQobGlua09wdGlvbnMuY2xhc3NOYW1lKTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgY2xhc3NOYW1lXG4gIGNvbnN0IGNsYXNzTmFtZXNTdHJpbmcgPSBBcnJheS5mcm9tKGNsYXNzZXMpLmpvaW4oJyAnKTtcbiAgaWYgKGxpbmtPcHRpb25zPy5jbGFzc05hbWUgJiYgbGlua09wdGlvbnM/LmNsYXNzTmFtZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBsaW5rT3B0aW9ucy5jbGFzc05hbWUoY2xhc3NOYW1lc1N0cmluZyk7XG4gIH0gZWxzZSB7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBjbGFzc05hbWVzU3RyaW5nO1xuICB9XG5cbiAgLy8gQnkgZGVmYXVsdCwgTWFya2Rvd24tSXQgd2lsbCBzZXQgXCJ0aXRsZVwiIHRvIHRoZSBsaW5rIHRpdGxlIGluIGxpbmsgZGVmaW5pdGlvbi5cblxuICAvLyBIb3dldmVyLCBcInRpdGxlXCIgbWF5IGJlIG5hcnJhdGVkIGJ5IHNjcmVlbiByZWFkZXI6XG4gIC8vIC0gRWRnZVxuICAvLyAgIC0gPGE+IHdpbGwgbmFycmF0ZSBcImFyaWEtbGFiZWxcIiBidXQgbm90IFwidGl0bGVcIlxuICAvLyAgIC0gPGJ1dHRvbj4gd2lsbCBuYXJyYXRlIGJvdGggXCJhcmlhLWxhYmVsXCIgYW5kIFwidGl0bGVcIlxuICAvLyAtIE5WREFcbiAgLy8gICAtIDxhPiB3aWxsIG5hcnJhdGUgYm90aCBcImFyaWEtbGFiZWxcIiBhbmQgXCJ0aXRsZVwiXG4gIC8vICAgLSA8YnV0dG9uPiB3aWxsIG5hcnJhdGUgYm90aCBcImFyaWEtbGFiZWxcIiBhbmQgXCJ0aXRsZVwiXG5cbiAgLy8gVGl0bGUgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgdG8gY29udHJvbCBuYXJyYXRpb25zIGJ5IHRoZSBzY3JlZW4gcmVhZGVyLiBUaHVzLCB3ZSBhcmUgZGlzYWJsaW5nIGl0IGluIGZhdm9yIG9mIFwiYXJpYS1sYWJlbFwiLlxuICAvLyBUaGlzIHdpbGwgbm90IGFmZmVjdCBvdXIgYWNjZXNzaWJpbGl0eSBjb21wbGlhbmNlIGJ1dCBVWC4gV2UgY291bGQgdXNlIGEgbm9uLW5hdGl2ZSB0b29sdGlwIG9yIG90aGVyIGZvcm1zIG9mIHZpc3VhbCBoaW50LlxuXG4gIGRlY29yYXRpb24udGl0bGUgPz89IGZhbHNlO1xuXG4gIHJldHVybiBkZWNvcmF0aW9uO1xufTtcblxuY29uc3QgeyB1c2VMb2NhbGl6ZXIgfSA9IGhvb2tzO1xuXG50eXBlIFBsdXJhbCA9IHtcbiAgemVybz86IHN0cmluZztcbiAgb25lPzogc3RyaW5nO1xuICB0d28/OiBzdHJpbmc7XG4gIGZldz86IHN0cmluZztcbiAgbWFueT86IHN0cmluZztcbiAgb3RoZXI6IHN0cmluZztcbn07XG5cbmNvbnN0IG1hcmtkb3duSXQgPSBuZXcgTWFya2Rvd25JdCgpLnVzZShiZXR0ZXJMaW5rcyk7XG5cbnR5cGUgUGx1cmFsUHJvcHMgPSBSZWFkb25seTx7XG4gIHN0cmluZ0lkczogUGx1cmFsO1xuICB2YWx1ZXM6IHJlYWRvbmx5IFtudW1iZXIsIC4uLihudW1iZXIgfCBzdHJpbmcpW11dIHwgdW5kZWZpbmVkO1xufT47XG5cbnR5cGUgU2luZ3VsYXJQcm9wcyA9IFJlYWRvbmx5PHtcbiAgc3RyaW5nSWRzOiBzdHJpbmc7XG4gIHZhbHVlcz86IHJlYWRvbmx5IChudW1iZXIgfCBzdHJpbmcpW10gfCB1bmRlZmluZWQ7XG59PjtcblxudHlwZSBQcm9wcyA9IFJlYWRvbmx5PHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsaW5rQ2xhc3NOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvbkRlY29yYXRlTGluaz86ICgoaHJlZjogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKSA9PiBMaW5rT3B0aW9ucyB8IHVuZGVmaW5lZCkgfCB1bmRlZmluZWQ7XG59PiAmXG4gIChTaW5ndWxhclByb3BzIHwgUGx1cmFsUHJvcHMpO1xuXG5mdW5jdGlvbiBpc1BsdXJhbChwcm9wczogUHJvcHMpOiBwcm9wcyBpcyBQbHVyYWxQcm9wcyB7XG4gIHJldHVybiB0eXBlb2YgcHJvcHMuc3RyaW5nSWRzICE9PSAnc3RyaW5nJztcbn1cblxuY29uc3QgTG9jYWxpemVkU3RyaW5nID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgbGlua0NsYXNzTmFtZSwgb25EZWNvcmF0ZUxpbmsgPSBkZWZhdWx0RGVjb3JhdGVMaW5rLCBzdHJpbmdJZHMsIHZhbHVlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKGlzUGx1cmFsKHByb3BzKSAmJiB7IHBsdXJhbDogdHJ1ZSB9KTtcbiAgY29uc3QgZW52ID0gdXNlTWVtbzxCZXR0ZXJMaW5rRW52PihcbiAgICAoKSA9PiAoe1xuICAgICAgbGlua09wdGlvbnM6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBsaW5rQ2xhc3NOYW1lXG4gICAgICB9LFxuICAgICAgZGVjb3JhdGVMaW5rOiBvbkRlY29yYXRlTGlua1xuICAgIH0pLFxuICAgIFtsaW5rQ2xhc3NOYW1lLCBvbkRlY29yYXRlTGlua11cbiAgKTtcblxuICBjb25zdCBodG1sID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgX19odG1sOiBtYXJrZG93bkl0LnJlbmRlcmVyLnJlbmRlcihtYXJrZG93bkl0LnBhcnNlSW5saW5lKGxvY2FsaXplKHN0cmluZ0lkcywgLi4uKHZhbHVlcyA/PyBbXSkpLCBlbnYpLCBlbnYpXG4gICAgfSksXG4gICAgW2VudiwgbG9jYWxpemUsIHN0cmluZ0lkcywgdmFsdWVzXVxuICApO1xuXG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWx9IC8+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhMb2NhbGl6ZWRTdHJpbmcpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUEsSUFBQUEsdUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLHdCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFDLHVCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFILHNCQUFBLENBQUFILE9BQUE7QUFBa0YsU0FBQU8seUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFILHdCQUFBTyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsYUFBQUUsT0FBQSxDQUFBRixHQUFBLHlCQUFBQSxHQUFBLDRCQUFBRyxPQUFBLEVBQUFILEdBQUEsVUFBQUksS0FBQSxHQUFBVCx3QkFBQSxDQUFBQyxXQUFBLE9BQUFRLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFMLEdBQUEsWUFBQUksS0FBQSxDQUFBRSxHQUFBLENBQUFOLEdBQUEsU0FBQU8sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFaLEdBQUEsUUFBQVksR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZixHQUFBLEVBQUFZLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFYLEdBQUEsRUFBQVksR0FBQSxjQUFBSSxJQUFBLEtBQUFBLElBQUEsQ0FBQVYsR0FBQSxJQUFBVSxJQUFBLENBQUFDLEdBQUEsS0FBQVIsTUFBQSxDQUFBQyxjQUFBLENBQUFILE1BQUEsRUFBQUssR0FBQSxFQUFBSSxJQUFBLFlBQUFULE1BQUEsQ0FBQUssR0FBQSxJQUFBWixHQUFBLENBQUFZLEdBQUEsU0FBQUwsTUFBQSxDQUFBSixPQUFBLEdBQUFILEdBQUEsTUFBQUksS0FBQSxJQUFBQSxLQUFBLENBQUFhLEdBQUEsQ0FBQWpCLEdBQUEsRUFBQU8sTUFBQSxZQUFBQSxNQUFBO0FBQUEsU0FBQWhCLHVCQUFBUyxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUcsT0FBQSxFQUFBSCxHQUFBO0FBQUEsU0FBQWtCLG1CQUFBQyxHQUFBLFdBQUFDLGtCQUFBLENBQUFELEdBQUEsS0FBQUUsZ0JBQUEsQ0FBQUYsR0FBQSxLQUFBRywyQkFBQSxDQUFBSCxHQUFBLEtBQUFJLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFGLDRCQUFBRyxDQUFBLEVBQUFDLE1BQUEsU0FBQUQsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQUUsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBLE9BQUFFLENBQUEsR0FBQW5CLE1BQUEsQ0FBQUksU0FBQSxDQUFBZ0IsUUFBQSxDQUFBZCxJQUFBLENBQUFVLENBQUEsRUFBQUssS0FBQSxhQUFBRixDQUFBLGlCQUFBSCxDQUFBLENBQUFNLFdBQUEsRUFBQUgsQ0FBQSxHQUFBSCxDQUFBLENBQUFNLFdBQUEsQ0FBQUMsSUFBQSxNQUFBSixDQUFBLGNBQUFBLENBQUEsbUJBQUFLLEtBQUEsQ0FBQUMsSUFBQSxDQUFBVCxDQUFBLE9BQUFHLENBQUEsK0RBQUFPLElBQUEsQ0FBQVAsQ0FBQSxVQUFBRCxpQkFBQSxDQUFBRixDQUFBLEVBQUFDLE1BQUE7QUFBQSxTQUFBTCxpQkFBQWUsSUFBQSxlQUFBQyxNQUFBLG9CQUFBRCxJQUFBLENBQUFDLE1BQUEsQ0FBQUMsUUFBQSxhQUFBRixJQUFBLCtCQUFBSCxLQUFBLENBQUFDLElBQUEsQ0FBQUUsSUFBQTtBQUFBLFNBQUFoQixtQkFBQUQsR0FBQSxRQUFBYyxLQUFBLENBQUFNLE9BQUEsQ0FBQXBCLEdBQUEsVUFBQVEsaUJBQUEsQ0FBQVIsR0FBQTtBQUFBLFNBQUFRLGtCQUFBUixHQUFBLEVBQUFxQixHQUFBLFFBQUFBLEdBQUEsWUFBQUEsR0FBQSxHQUFBckIsR0FBQSxDQUFBc0IsTUFBQSxFQUFBRCxHQUFBLEdBQUFyQixHQUFBLENBQUFzQixNQUFBLFdBQUFDLENBQUEsTUFBQUMsSUFBQSxPQUFBVixLQUFBLENBQUFPLEdBQUEsR0FBQUUsQ0FBQSxHQUFBRixHQUFBLEVBQUFFLENBQUEsTUFBQUMsSUFBQSxDQUFBRCxDQUFBLElBQUF2QixHQUFBLENBQUF1QixDQUFBLFlBQUFDLElBQUE7QUFBQSxTQUFBQyxRQUFBQyxNQUFBLEVBQUFDLGNBQUEsUUFBQUMsSUFBQSxHQUFBdEMsTUFBQSxDQUFBc0MsSUFBQSxDQUFBRixNQUFBLE9BQUFwQyxNQUFBLENBQUF1QyxxQkFBQSxRQUFBQyxPQUFBLEdBQUF4QyxNQUFBLENBQUF1QyxxQkFBQSxDQUFBSCxNQUFBLEdBQUFDLGNBQUEsS0FBQUcsT0FBQSxHQUFBQSxPQUFBLENBQUFDLE1BQUEsV0FBQUMsR0FBQSxXQUFBMUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBa0MsTUFBQSxFQUFBTSxHQUFBLEVBQUFDLFVBQUEsT0FBQUwsSUFBQSxDQUFBTSxJQUFBLENBQUFDLEtBQUEsQ0FBQVAsSUFBQSxFQUFBRSxPQUFBLFlBQUFGLElBQUE7QUFBQSxTQUFBUSxjQUFBQyxNQUFBLGFBQUFkLENBQUEsTUFBQUEsQ0FBQSxHQUFBZSxTQUFBLENBQUFoQixNQUFBLEVBQUFDLENBQUEsVUFBQWdCLE1BQUEsV0FBQUQsU0FBQSxDQUFBZixDQUFBLElBQUFlLFNBQUEsQ0FBQWYsQ0FBQSxRQUFBQSxDQUFBLE9BQUFFLE9BQUEsQ0FBQW5DLE1BQUEsQ0FBQWlELE1BQUEsT0FBQUMsT0FBQSxXQUFBL0MsR0FBQSxJQUFBZ0QsZUFBQSxDQUFBSixNQUFBLEVBQUE1QyxHQUFBLEVBQUE4QyxNQUFBLENBQUE5QyxHQUFBLFNBQUFILE1BQUEsQ0FBQW9ELHlCQUFBLEdBQUFwRCxNQUFBLENBQUFxRCxnQkFBQSxDQUFBTixNQUFBLEVBQUEvQyxNQUFBLENBQUFvRCx5QkFBQSxDQUFBSCxNQUFBLEtBQUFkLE9BQUEsQ0FBQW5DLE1BQUEsQ0FBQWlELE1BQUEsR0FBQUMsT0FBQSxXQUFBL0MsR0FBQSxJQUFBSCxNQUFBLENBQUFDLGNBQUEsQ0FBQThDLE1BQUEsRUFBQTVDLEdBQUEsRUFBQUgsTUFBQSxDQUFBRSx3QkFBQSxDQUFBK0MsTUFBQSxFQUFBOUMsR0FBQSxpQkFBQTRDLE1BQUE7QUFBQSxTQUFBSSxnQkFBQTVELEdBQUEsRUFBQVksR0FBQSxFQUFBbUQsS0FBQSxRQUFBbkQsR0FBQSxJQUFBWixHQUFBLElBQUFTLE1BQUEsQ0FBQUMsY0FBQSxDQUFBVixHQUFBLEVBQUFZLEdBQUEsSUFBQW1ELEtBQUEsRUFBQUEsS0FBQSxFQUFBWCxVQUFBLFFBQUFZLFlBQUEsUUFBQUMsUUFBQSxvQkFBQWpFLEdBQUEsQ0FBQVksR0FBQSxJQUFBbUQsS0FBQSxXQUFBL0QsR0FBQSxJQU5sRjtBQVFBLElBQU1rRSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7QUFFL0UsSUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFFMUIsSUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFFMUIsSUFBTUMsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBSUMsSUFBWSxFQUFFQyxXQUFtQixFQUFFQyxXQUF5QixFQUE4QjtFQUFBLElBQUFDLGlCQUFBO0VBQ3JILElBQU1DLFVBQXVCLEdBQUFuQixhQUFBO0lBQzNCb0IsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQm5CLE1BQU0sRUFBRSxRQUFRO0lBQ2hCb0Isa0JBQWtCLEVBQUU7RUFBSSxHQUNyQkosV0FBVyxDQUNmO0VBRUQsSUFBTUssaUJBQTJCLEdBQUcsQ0FBQ04sV0FBVyxDQUFDO0VBQ2pELElBQU1PLE9BQW9CLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUM7RUFDdEMsSUFBTUMsY0FBYyxHQUFHYixlQUFlLENBQUNjLElBQUksQ0FBQyxVQUFBQyxJQUFBO0lBQUEsSUFBR0MsR0FBRyxHQUFBRCxJQUFBLENBQUhDLEdBQUc7SUFBQSxPQUFPQSxHQUFHLEtBQUtiLElBQUk7RUFBQSxFQUFDO0VBQ3RFLElBQU1jLFFBQVEsR0FBRyxJQUFBQywwQ0FBaUIsRUFBQztJQUFBLE9BQU0sSUFBSUMsR0FBRyxDQUFDaEIsSUFBSSxDQUFDLENBQUNjLFFBQVE7RUFBQSxFQUFDO0VBRWhFLElBQUlKLGNBQWMsRUFBRTtJQUNsQkgsaUJBQWlCLENBQUN4QixJQUFJLENBQ3BCMkIsY0FBYyxDQUFDTyxLQUFLLElBQUksSUFBQUYsMENBQWlCLEVBQUM7TUFBQSxPQUFNLElBQUlDLEdBQUcsQ0FBQ04sY0FBYyxDQUFDRyxHQUFHLENBQUMsQ0FBQ0ssSUFBSTtJQUFBLEVBQUMsSUFBSVIsY0FBYyxDQUFDRyxHQUN0RyxDQUFDOztJQUVEO0lBQ0FILGNBQWMsQ0FBQ1MsS0FBSyxLQUFLbEIsV0FBVyxJQUFJTyxPQUFPLENBQUNZLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztFQUNsRzs7RUFFQTtFQUNBLElBQUksQ0FBQ3hCLGNBQWMsQ0FBQ3lCLEdBQUcsQ0FBQyxVQUFBQyxNQUFNO0lBQUEsVUFBQUMsTUFBQSxDQUFPRCxNQUFNO0VBQUEsQ0FBRyxDQUFDLENBQUNFLFFBQVEsQ0FBQ1YsUUFBUSxDQUFDLEVBQUU7SUFBQSxJQUFBVyxvQkFBQTtJQUNsRSxDQUFBQSxvQkFBQSxHQUFBckIsVUFBVSxDQUFDc0IsUUFBUSxjQUFBRCxvQkFBQSxjQUFBQSxvQkFBQSxHQUFuQnJCLFVBQVUsQ0FBQ3NCLFFBQVEsR0FBSyxJQUFJO0lBRTVCbEIsT0FBTyxDQUFDWSxHQUFHLENBQUMsb0NBQW9DLENBQUM7RUFDbkQsQ0FBQyxNQUFNLElBQUlOLFFBQVEsS0FBSyxPQUFPLElBQUlBLFFBQVEsS0FBSyxRQUFRLEVBQUU7SUFDeERWLFVBQVUsQ0FBQ3VCLGFBQWEsR0FBRyxDQUFDdkIsVUFBVSxDQUFDdUIsYUFBYSxFQUFFLDhDQUE4QyxDQUFDLENBQ2xHL0MsTUFBTSxDQUFDLFVBQUNnRCxTQUE2QjtNQUFBLE9BQUtBLFNBQVM7SUFBQSxFQUFDLENBQ3BEQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVp0QixpQkFBaUIsQ0FBQ3hCLElBQUksQ0FBQ2UsZUFBZSxDQUFDO0VBQ3pDOztFQUVBO0VBQ0EsSUFBSVMsaUJBQWlCLENBQUNwQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQUEsSUFBQTJELHFCQUFBO0lBQ2hDO0lBQ0EsQ0FBQUEscUJBQUEsR0FBQTFCLFVBQVUsQ0FBQzJCLFNBQVMsY0FBQUQscUJBQUEsY0FBQUEscUJBQUEsR0FBcEIxQixVQUFVLENBQUMyQixTQUFTLEdBQUssVUFBQ3RDLEtBQWE7TUFBQSxPQUFLQSxLQUFLLElBQUljLGlCQUFpQixDQUFDc0IsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUFBO0VBQ2xGO0VBRUEsSUFBSSxRQUFPM0IsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUUwQixTQUFTLE1BQUssUUFBUSxFQUFFO0lBQzlDcEIsT0FBTyxDQUFDWSxHQUFHLENBQUNsQixXQUFXLENBQUMwQixTQUFTLENBQUM7RUFDcEM7O0VBRUE7RUFDQSxJQUFNSSxnQkFBZ0IsR0FBR3JFLEtBQUssQ0FBQ0MsSUFBSSxDQUFDNEMsT0FBTyxDQUFDLENBQUNxQixJQUFJLENBQUMsR0FBRyxDQUFDO0VBQ3RELElBQUkzQixXQUFXLGFBQVhBLFdBQVcsZUFBWEEsV0FBVyxDQUFFMEIsU0FBUyxJQUFJLENBQUExQixXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRTBCLFNBQVMsYUFBWUssUUFBUSxFQUFFO0lBQ3hFN0IsVUFBVSxDQUFDd0IsU0FBUyxHQUFHMUIsV0FBVyxDQUFDMEIsU0FBUyxDQUFDSSxnQkFBZ0IsQ0FBQztFQUNoRSxDQUFDLE1BQU07SUFDTDVCLFVBQVUsQ0FBQ3dCLFNBQVMsR0FBR0ksZ0JBQWdCO0VBQ3pDOztFQUVBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBO0VBQ0E7O0VBRUEsQ0FBQTdCLGlCQUFBLEdBQUFDLFVBQVUsQ0FBQ2EsS0FBSyxjQUFBZCxpQkFBQSxjQUFBQSxpQkFBQSxHQUFoQkMsVUFBVSxDQUFDYSxLQUFLLEdBQUssS0FBSztFQUUxQixPQUFPYixVQUFVO0FBQ25CLENBQUM7QUFFRCxJQUFROEIsWUFBWSxHQUFLQyw2QkFBSyxDQUF0QkQsWUFBWTtBQVdwQixJQUFNRSxVQUFVLEdBQUcsSUFBSUMsbUJBQVUsQ0FBQyxDQUFDLENBQUNDLEdBQUcsQ0FBQ0Msb0JBQVcsQ0FBQztBQW1CcEQsU0FBU0MsUUFBUUEsQ0FBQ0MsS0FBWSxFQUF3QjtFQUNwRCxPQUFPLE9BQU9BLEtBQUssQ0FBQ0MsU0FBUyxLQUFLLFFBQVE7QUFDNUM7QUFFQSxJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUlGLEtBQVksRUFBSztFQUN4QyxJQUFRYixTQUFTLEdBQTZFYSxLQUFLLENBQTNGYixTQUFTO0lBQUVnQixhQUFhLEdBQThESCxLQUFLLENBQWhGRyxhQUFhO0lBQUFDLHFCQUFBLEdBQThESixLQUFLLENBQWpFSyxjQUFjO0lBQWRBLGNBQWMsR0FBQUQscUJBQUEsY0FBRzlDLG1CQUFtQixHQUFBOEMscUJBQUE7SUFBRUgsU0FBUyxHQUFhRCxLQUFLLENBQTNCQyxTQUFTO0lBQUVLLE1BQU0sR0FBS04sS0FBSyxDQUFoQk0sTUFBTTtFQUN6RixJQUFNQyxRQUFRLEdBQUdkLFlBQVksQ0FBQ00sUUFBUSxDQUFDQyxLQUFLLENBQUMsSUFBSTtJQUFFUSxNQUFNLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDbEUsSUFBTUMsR0FBRyxHQUFHLElBQUFDLGNBQU8sRUFDakI7SUFBQSxPQUFPO01BQ0xqRCxXQUFXLEVBQUU7UUFDWDBCLFNBQVMsRUFBRWdCO01BQ2IsQ0FBQztNQUNEUSxZQUFZLEVBQUVOO0lBQ2hCLENBQUM7RUFBQSxDQUFDLEVBQ0YsQ0FBQ0YsYUFBYSxFQUFFRSxjQUFjLENBQ2hDLENBQUM7RUFFRCxJQUFNTyxJQUFJLEdBQUcsSUFBQUYsY0FBTyxFQUNsQjtJQUFBLE9BQU87TUFDTEcsTUFBTSxFQUFFbEIsVUFBVSxDQUFDbUIsUUFBUSxDQUFDQyxNQUFNLENBQUNwQixVQUFVLENBQUNxQixXQUFXLENBQUNULFFBQVEsQ0FBQWhFLEtBQUEsVUFBQzBELFNBQVMsRUFBQW5CLE1BQUEsQ0FBQTNFLGtCQUFBLENBQU1tRyxNQUFNLGFBQU5BLE1BQU0sY0FBTkEsTUFBTSxHQUFJLEVBQUUsRUFBQyxDQUFDLEVBQUVHLEdBQUcsQ0FBQyxFQUFFQSxHQUFHO0lBQzdHLENBQUM7RUFBQSxDQUFDLEVBQ0YsQ0FBQ0EsR0FBRyxFQUFFRixRQUFRLEVBQUVOLFNBQVMsRUFBRUssTUFBTSxDQUNuQyxDQUFDO0VBRUQsb0JBQU83SCxNQUFBLENBQUFXLE9BQUEsQ0FBQTZILGFBQUE7SUFBTTlCLFNBQVMsRUFBRUEsU0FBVTtJQUFDK0IsdUJBQXVCLEVBQUVOO0VBQUssQ0FBRSxDQUFDO0FBQ3RFLENBQUM7QUFBQyxJQUFBTyxRQUFBLGdCQUVhLElBQUFDLFdBQUksRUFBQ2xCLGVBQWUsQ0FBQztBQUFBbUIsT0FBQSxDQUFBakksT0FBQSxHQUFBK0gsUUFBQSJ9