botframework-webchat-component
Version:
React component of botframework-webchat
385 lines (319 loc) • 58.5 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _reactSay = require("react-say");
var _createEmotion = _interopRequireDefault(require("create-emotion"));
var _createStyleSet = _interopRequireDefault(require("./Styles/createStyleSet"));
var _markdownIt = _interopRequireDefault(require("markdown-it"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _BypassSpeechSynthesisPonyfill = require("./hooks/internal/BypassSpeechSynthesisPonyfill");
var _addTargetBlankToHyperlinksMarkdown = _interopRequireDefault(require("./Utils/addTargetBlankToHyperlinksMarkdown"));
var _createCSSKey = _interopRequireDefault(require("./Utils/createCSSKey"));
var _createCoreMiddleware = _interopRequireDefault(require("./Middleware/Activity/createCoreMiddleware"));
var _createCoreMiddleware2 = _interopRequireDefault(require("./Middleware/ActivityStatus/createCoreMiddleware"));
var _createCoreMiddleware3 = _interopRequireDefault(require("./Middleware/AttachmentForScreenReader/createCoreMiddleware"));
var _createCoreMiddleware4 = _interopRequireDefault(require("./Middleware/Attachment/createCoreMiddleware"));
var _createCoreMiddleware5 = _interopRequireDefault(require("./Middleware/Avatar/createCoreMiddleware"));
var _createCoreMiddleware6 = _interopRequireDefault(require("./Middleware/CardAction/createCoreMiddleware"));
var _createCoreMiddleware7 = _interopRequireDefault(require("./Middleware/Toast/createCoreMiddleware"));
var _createCoreMiddleware8 = _interopRequireDefault(require("./Middleware/TypingIndicator/createCoreMiddleware"));
var _Dictation = _interopRequireDefault(require("./Dictation"));
var _downscaleImageToDataURL = _interopRequireDefault(require("./Utils/downscaleImageToDataURL"));
var _ErrorBox = _interopRequireDefault(require("./ErrorBox"));
var _mapMap = _interopRequireDefault(require("./Utils/mapMap"));
var _singleToArray = _interopRequireDefault(require("./Utils/singleToArray"));
var _UITracker = _interopRequireDefault(require("./hooks/internal/UITracker"));
var _WebChatUIContext = _interopRequireDefault(require("./hooks/internal/WebChatUIContext"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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 _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
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 _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (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 = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { 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; }
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 _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 _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 _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_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; }
var useReferenceGrammarID = _botframeworkWebchatApi.hooks.useReferenceGrammarID,
useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions; // eslint-disable-next-line no-undef
var node_env = undefined || "production";
var emotionPool = {};
function styleSetToEmotionObjects(styleToEmotionObject, styleSet) {
return (0, _mapMap.default)(styleSet, function (style, key) {
return key === 'options' ? style : styleToEmotionObject(style);
});
}
var ComposerCore = function ComposerCore(_ref) {
var children = _ref.children,
extraStyleSet = _ref.extraStyleSet,
nonce = _ref.nonce,
renderMarkdown = _ref.renderMarkdown,
styleSet = _ref.styleSet,
suggestedActionsAccessKey = _ref.suggestedActionsAccessKey,
webSpeechPonyfillFactory = _ref.webSpeechPonyfillFactory;
var _useState = (0, _react.useState)(),
_useState2 = _slicedToArray(_useState, 2),
dictateAbortable = _useState2[0],
setDictateAbortable = _useState2[1];
var _useReferenceGrammarI = useReferenceGrammarID(),
_useReferenceGrammarI2 = _slicedToArray(_useReferenceGrammarI, 1),
referenceGrammarID = _useReferenceGrammarI2[0];
var _useStyleOptions = useStyleOptions(),
_useStyleOptions2 = _slicedToArray(_useStyleOptions, 1),
styleOptions = _useStyleOptions2[0];
var focusSendBoxCallbacksRef = (0, _react.useRef)([]);
var focusTranscriptCallbacksRef = (0, _react.useRef)([]);
var internalMarkdownIt = (0, _react.useMemo)(function () {
return new _markdownIt.default();
}, []);
var scrollToCallbacksRef = (0, _react.useRef)([]);
var scrollToEndCallbacksRef = (0, _react.useRef)([]); // Instead of having a `scrollUpCallbacksRef` and `scrollDownCallbacksRef`, they are combined into a single `scrollRelativeCallbacksRef`.
// The first argument tells whether it should go "up" or "down".
var scrollRelativeCallbacksRef = (0, _react.useRef)([]);
var dictationOnError = (0, _react.useCallback)(function (err) {
console.error(err);
}, []);
var internalRenderMarkdownInline = (0, _react.useMemo)(function () {
return function (markdown) {
var tree = internalMarkdownIt.parseInline(markdown); // We should add rel="noopener noreferrer" and target="_blank"
var patchedTree = (0, _addTargetBlankToHyperlinksMarkdown.default)(tree);
return internalMarkdownIt.renderer.render(patchedTree);
};
}, [internalMarkdownIt]);
var styleToEmotionObject = (0, _react.useMemo)(function () {
// Emotion doesn't hash with nonce. We need to provide the pooling mechanism.
// 1. If 2 instances use different nonce, they should result in different hash;
// 2. If 2 instances are being mounted, pooling will make sure we render only 1 set of <style> tags, instead of 2.
var emotion = emotionPool[nonce] || (emotionPool[nonce] = (0, _createEmotion.default)({
key: "webchat--css-".concat((0, _createCSSKey.default)()),
nonce: nonce
}));
return function (style) {
return emotion.css(style);
};
}, [nonce]);
var patchedStyleSet = (0, _react.useMemo)(function () {
return styleSetToEmotionObjects(styleToEmotionObject, _objectSpread(_objectSpread({}, styleSet || (0, _createStyleSet.default)(styleOptions)), extraStyleSet));
}, [extraStyleSet, styleOptions, styleSet, styleToEmotionObject]);
var webSpeechPonyfill = (0, _react.useMemo)(function () {
var ponyfill = webSpeechPonyfillFactory && webSpeechPonyfillFactory({
referenceGrammarID: referenceGrammarID
});
var _ref2 = ponyfill || {},
speechSynthesis = _ref2.speechSynthesis,
SpeechSynthesisUtterance = _ref2.SpeechSynthesisUtterance;
return _objectSpread(_objectSpread({}, ponyfill), {}, {
speechSynthesis: speechSynthesis || _BypassSpeechSynthesisPonyfill.speechSynthesis,
SpeechSynthesisUtterance: SpeechSynthesisUtterance || _BypassSpeechSynthesisPonyfill.SpeechSynthesisUtterance
});
}, [referenceGrammarID, webSpeechPonyfillFactory]);
var scrollPositionObserversRef = (0, _react.useRef)([]);
var _useState3 = (0, _react.useState)(0),
_useState4 = _slicedToArray(_useState3, 2),
numScrollPositionObservers = _useState4[0],
setNumScrollPositionObservers = _useState4[1];
var dispatchScrollPosition = (0, _react.useCallback)(function (event) {
return scrollPositionObserversRef.current.forEach(function (observer) {
return observer(event);
});
}, [scrollPositionObserversRef]);
var observeScrollPosition = (0, _react.useCallback)(function (observer) {
scrollPositionObserversRef.current = [].concat(_toConsumableArray(scrollPositionObserversRef.current), [observer]);
setNumScrollPositionObservers(scrollPositionObserversRef.current.length);
return function () {
scrollPositionObserversRef.current = scrollPositionObserversRef.current.filter(function (target) {
return target !== observer;
});
setNumScrollPositionObservers(scrollPositionObserversRef.current.length);
};
}, [scrollPositionObserversRef, setNumScrollPositionObservers]);
var transcriptFocusObserversRef = (0, _react.useRef)([]);
var _useState5 = (0, _react.useState)(0),
_useState6 = _slicedToArray(_useState5, 2),
numTranscriptFocusObservers = _useState6[0],
setNumTranscriptFocusObservers = _useState6[1];
var dispatchTranscriptFocus = (0, _react.useCallback)(function (event) {
return transcriptFocusObserversRef.current.forEach(function (observer) {
return observer(event);
});
}, [transcriptFocusObserversRef]);
var observeTranscriptFocus = (0, _react.useCallback)(function (observer) {
transcriptFocusObserversRef.current = [].concat(_toConsumableArray(transcriptFocusObserversRef.current), [observer]);
setNumTranscriptFocusObservers(transcriptFocusObserversRef.current.length);
return function () {
transcriptFocusObserversRef.current = transcriptFocusObserversRef.current.filter(function (target) {
return target !== observer;
});
setNumTranscriptFocusObservers(transcriptFocusObserversRef.current.length);
};
}, [transcriptFocusObserversRef, setNumTranscriptFocusObservers]);
var context = (0, _react.useMemo)(function () {
return {
dictateAbortable: dictateAbortable,
dispatchScrollPosition: dispatchScrollPosition,
dispatchTranscriptFocus: dispatchTranscriptFocus,
focusSendBoxCallbacksRef: focusSendBoxCallbacksRef,
focusTranscriptCallbacksRef: focusTranscriptCallbacksRef,
internalMarkdownItState: [internalMarkdownIt],
internalRenderMarkdownInline: internalRenderMarkdownInline,
nonce: nonce,
numScrollPositionObservers: numScrollPositionObservers,
numTranscriptFocusObservers: numTranscriptFocusObservers,
observeScrollPosition: observeScrollPosition,
observeTranscriptFocus: observeTranscriptFocus,
renderMarkdown: renderMarkdown,
scrollRelativeCallbacksRef: scrollRelativeCallbacksRef,
scrollToCallbacksRef: scrollToCallbacksRef,
scrollToEndCallbacksRef: scrollToEndCallbacksRef,
setDictateAbortable: setDictateAbortable,
styleSet: patchedStyleSet,
styleToEmotionObject: styleToEmotionObject,
suggestedActionsAccessKey: suggestedActionsAccessKey,
webSpeechPonyfill: webSpeechPonyfill
};
}, [dictateAbortable, dispatchScrollPosition, dispatchTranscriptFocus, focusSendBoxCallbacksRef, focusTranscriptCallbacksRef, internalMarkdownIt, internalRenderMarkdownInline, nonce, numScrollPositionObservers, numTranscriptFocusObservers, observeScrollPosition, observeTranscriptFocus, patchedStyleSet, renderMarkdown, scrollRelativeCallbacksRef, scrollToCallbacksRef, scrollToEndCallbacksRef, setDictateAbortable, styleToEmotionObject, suggestedActionsAccessKey, webSpeechPonyfill]);
return /*#__PURE__*/_react.default.createElement(_reactSay.Composer, {
ponyfill: webSpeechPonyfill
}, /*#__PURE__*/_react.default.createElement(_WebChatUIContext.default.Provider, {
value: context
}, children, /*#__PURE__*/_react.default.createElement(_Dictation.default, {
onError: dictationOnError
})));
};
ComposerCore.defaultProps = {
extraStyleSet: undefined,
nonce: undefined,
renderMarkdown: undefined,
styleSet: undefined,
suggestedActionsAccessKey: 'A a Å å',
webSpeechPonyfillFactory: undefined
};
ComposerCore.propTypes = {
extraStyleSet: _propTypes.default.any,
nonce: _propTypes.default.string,
renderMarkdown: _propTypes.default.func,
styleSet: _propTypes.default.any,
suggestedActionsAccessKey: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.string]),
webSpeechPonyfillFactory: _propTypes.default.func
};
var Composer = function Composer(_ref3) {
var activityMiddleware = _ref3.activityMiddleware,
activityStatusMiddleware = _ref3.activityStatusMiddleware,
attachmentForScreenReaderMiddleware = _ref3.attachmentForScreenReaderMiddleware,
attachmentMiddleware = _ref3.attachmentMiddleware,
avatarMiddleware = _ref3.avatarMiddleware,
cardActionMiddleware = _ref3.cardActionMiddleware,
children = _ref3.children,
extraStyleSet = _ref3.extraStyleSet,
renderMarkdown = _ref3.renderMarkdown,
styleSet = _ref3.styleSet,
suggestedActionsAccessKey = _ref3.suggestedActionsAccessKey,
toastMiddleware = _ref3.toastMiddleware,
typingIndicatorMiddleware = _ref3.typingIndicatorMiddleware,
webSpeechPonyfillFactory = _ref3.webSpeechPonyfillFactory,
composerProps = _objectWithoutProperties(_ref3, ["activityMiddleware", "activityStatusMiddleware", "attachmentForScreenReaderMiddleware", "attachmentMiddleware", "avatarMiddleware", "cardActionMiddleware", "children", "extraStyleSet", "renderMarkdown", "styleSet", "suggestedActionsAccessKey", "toastMiddleware", "typingIndicatorMiddleware", "webSpeechPonyfillFactory"]);
var nonce = composerProps.nonce,
onTelemetry = composerProps.onTelemetry;
var patchedActivityMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(activityMiddleware)), _toConsumableArray((0, _createCoreMiddleware.default)()));
}, [activityMiddleware]);
var patchedActivityStatusMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(activityStatusMiddleware)), _toConsumableArray((0, _createCoreMiddleware2.default)()));
}, [activityStatusMiddleware]);
var patchedAttachmentForScreenReaderMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(attachmentForScreenReaderMiddleware)), _toConsumableArray((0, _createCoreMiddleware3.default)()));
}, [attachmentForScreenReaderMiddleware]);
var patchedAttachmentMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(attachmentMiddleware)), _toConsumableArray((0, _createCoreMiddleware4.default)()));
}, [attachmentMiddleware]);
var patchedAvatarMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(avatarMiddleware)), _toConsumableArray((0, _createCoreMiddleware5.default)()));
}, [avatarMiddleware]);
var patchedCardActionMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(cardActionMiddleware)), _toConsumableArray((0, _createCoreMiddleware6.default)()));
}, [cardActionMiddleware]);
var patchedToastMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(toastMiddleware)), _toConsumableArray((0, _createCoreMiddleware7.default)()));
}, [toastMiddleware]);
var patchedTypingIndicatorMiddleware = (0, _react.useMemo)(function () {
return [].concat(_toConsumableArray((0, _singleToArray.default)(typingIndicatorMiddleware)), _toConsumableArray((0, _createCoreMiddleware8.default)()));
}, [typingIndicatorMiddleware]);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_botframeworkWebchatApi.Composer, _extends({
activityMiddleware: patchedActivityMiddleware,
activityStatusMiddleware: patchedActivityStatusMiddleware,
attachmentForScreenReaderMiddleware: patchedAttachmentForScreenReaderMiddleware,
attachmentMiddleware: patchedAttachmentMiddleware,
avatarMiddleware: patchedAvatarMiddleware,
cardActionMiddleware: patchedCardActionMiddleware,
downscaleImageToDataURL: _downscaleImageToDataURL.default // Under dev server of create-react-app, "NODE_ENV" will be set to "development".
,
internalErrorBoxClass: node_env === 'development' ? _ErrorBox.default : undefined,
nonce: nonce,
toastMiddleware: patchedToastMiddleware,
typingIndicatorMiddleware: patchedTypingIndicatorMiddleware
}, composerProps), /*#__PURE__*/_react.default.createElement(ComposerCore, {
extraStyleSet: extraStyleSet,
nonce: nonce,
renderMarkdown: renderMarkdown,
styleSet: styleSet,
suggestedActionsAccessKey: suggestedActionsAccessKey,
webSpeechPonyfillFactory: webSpeechPonyfillFactory
}, children, onTelemetry && /*#__PURE__*/_react.default.createElement(_UITracker.default, null))));
};
Composer.defaultProps = _objectSpread(_objectSpread(_objectSpread({}, _botframeworkWebchatApi.Composer.defaultProps), ComposerCore.defaultProps), {}, {
activityMiddleware: undefined,
activityRenderer: undefined,
activityStatusMiddleware: undefined,
activityStatusRenderer: undefined,
attachmentForScreenReaderMiddleware: undefined,
attachmentMiddleware: undefined,
attachmentRenderer: undefined,
avatarMiddleware: undefined,
avatarRenderer: undefined,
cardActionMiddleware: undefined,
children: undefined,
nonce: undefined,
renderMarkdown: undefined,
toastMiddleware: undefined,
toastRenderer: undefined,
typingIndicatorMiddleware: undefined,
typingIndicatorRenderer: undefined,
webSpeechPonyfillFactory: undefined
});
Composer.propTypes = _objectSpread(_objectSpread(_objectSpread({}, _botframeworkWebchatApi.Composer.propTypes), ComposerCore.propTypes), {}, {
activityMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
activityRenderer: _propTypes.default.func,
activityStatusMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
activityStatusRenderer: _propTypes.default.func,
attachmentForScreenReaderMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
attachmentMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
attachmentRenderer: _propTypes.default.func,
avatarMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
avatarRenderer: _propTypes.default.func,
cardActionMiddleware: _propTypes.default.func,
children: _propTypes.default.any,
nonce: _propTypes.default.string,
renderMarkdown: _propTypes.default.func,
toastMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
toastRenderer: _propTypes.default.func,
typingIndicatorMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]),
typingIndicatorRenderer: _propTypes.default.func,
webSpeechPonyfillFactory: _propTypes.default.func
});
var _default = Composer;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJ1c2VSZWZlcmVuY2VHcmFtbWFySUQiLCJob29rcyIsInVzZVN0eWxlT3B0aW9ucyIsIm5vZGVfZW52IiwiZW1vdGlvblBvb2wiLCJzdHlsZVNldFRvRW1vdGlvbk9iamVjdHMiLCJzdHlsZVRvRW1vdGlvbk9iamVjdCIsInN0eWxlU2V0Iiwic3R5bGUiLCJrZXkiLCJDb21wb3NlckNvcmUiLCJjaGlsZHJlbiIsImV4dHJhU3R5bGVTZXQiLCJub25jZSIsInJlbmRlck1hcmtkb3duIiwic3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSIsIndlYlNwZWVjaFBvbnlmaWxsRmFjdG9yeSIsImRpY3RhdGVBYm9ydGFibGUiLCJzZXREaWN0YXRlQWJvcnRhYmxlIiwicmVmZXJlbmNlR3JhbW1hcklEIiwic3R5bGVPcHRpb25zIiwiZm9jdXNTZW5kQm94Q2FsbGJhY2tzUmVmIiwiZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2tzUmVmIiwiaW50ZXJuYWxNYXJrZG93bkl0IiwiTWFya2Rvd25JdCIsInNjcm9sbFRvQ2FsbGJhY2tzUmVmIiwic2Nyb2xsVG9FbmRDYWxsYmFja3NSZWYiLCJzY3JvbGxSZWxhdGl2ZUNhbGxiYWNrc1JlZiIsImRpY3RhdGlvbk9uRXJyb3IiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJpbnRlcm5hbFJlbmRlck1hcmtkb3duSW5saW5lIiwibWFya2Rvd24iLCJ0cmVlIiwicGFyc2VJbmxpbmUiLCJwYXRjaGVkVHJlZSIsInJlbmRlcmVyIiwicmVuZGVyIiwiZW1vdGlvbiIsImNzcyIsInBhdGNoZWRTdHlsZVNldCIsIndlYlNwZWVjaFBvbnlmaWxsIiwicG9ueWZpbGwiLCJzcGVlY2hTeW50aGVzaXMiLCJTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJieXBhc3NTcGVlY2hTeW50aGVzaXMiLCJCeXBhc3NTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZiIsIm51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzIiwic2V0TnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMiLCJkaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwiZXZlbnQiLCJjdXJyZW50IiwiZm9yRWFjaCIsIm9ic2VydmVyIiwib2JzZXJ2ZVNjcm9sbFBvc2l0aW9uIiwibGVuZ3RoIiwiZmlsdGVyIiwidGFyZ2V0IiwidHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmIiwibnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzIiwic2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzIiwiZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMiLCJvYnNlcnZlVHJhbnNjcmlwdEZvY3VzIiwiY29udGV4dCIsImludGVybmFsTWFya2Rvd25JdFN0YXRlIiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYW55Iiwic3RyaW5nIiwiZnVuYyIsIm9uZU9mVHlwZSIsIm9uZU9mIiwiQ29tcG9zZXIiLCJhY3Rpdml0eU1pZGRsZXdhcmUiLCJhY3Rpdml0eVN0YXR1c01pZGRsZXdhcmUiLCJhdHRhY2htZW50Rm9yU2NyZWVuUmVhZGVyTWlkZGxld2FyZSIsImF0dGFjaG1lbnRNaWRkbGV3YXJlIiwiYXZhdGFyTWlkZGxld2FyZSIsImNhcmRBY3Rpb25NaWRkbGV3YXJlIiwidG9hc3RNaWRkbGV3YXJlIiwidHlwaW5nSW5kaWNhdG9yTWlkZGxld2FyZSIsImNvbXBvc2VyUHJvcHMiLCJvblRlbGVtZXRyeSIsInBhdGNoZWRBY3Rpdml0eU1pZGRsZXdhcmUiLCJwYXRjaGVkQWN0aXZpdHlTdGF0dXNNaWRkbGV3YXJlIiwicGF0Y2hlZEF0dGFjaG1lbnRGb3JTY3JlZW5SZWFkZXJNaWRkbGV3YXJlIiwicGF0Y2hlZEF0dGFjaG1lbnRNaWRkbGV3YXJlIiwicGF0Y2hlZEF2YXRhck1pZGRsZXdhcmUiLCJwYXRjaGVkQ2FyZEFjdGlvbk1pZGRsZXdhcmUiLCJwYXRjaGVkVG9hc3RNaWRkbGV3YXJlIiwicGF0Y2hlZFR5cGluZ0luZGljYXRvck1pZGRsZXdhcmUiLCJkb3duc2NhbGVJbWFnZVRvRGF0YVVSTCIsIkVycm9yQm94IiwiQVBJQ29tcG9zZXIiLCJhY3Rpdml0eVJlbmRlcmVyIiwiYWN0aXZpdHlTdGF0dXNSZW5kZXJlciIsImF0dGFjaG1lbnRSZW5kZXJlciIsImF2YXRhclJlbmRlcmVyIiwidG9hc3RSZW5kZXJlciIsInR5cGluZ0luZGljYXRvclJlbmRlcmVyIiwiYXJyYXlPZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFUUEscUIsR0FBMkNDLDZCLENBQTNDRCxxQjtJQUF1QkUsZSxHQUFvQkQsNkIsQ0FBcEJDLGUsRUFFL0I7O0FBQ0EsSUFBTUMsUUFBUSxHQUFHLHlCQUFqQjtBQUVBLElBQU1DLFdBQVcsR0FBRyxFQUFwQjs7QUFFQSxTQUFTQyx3QkFBVCxDQUFrQ0Msb0JBQWxDLEVBQXdEQyxRQUF4RCxFQUFrRTtBQUNoRSxTQUFPLHFCQUFPQSxRQUFQLEVBQWlCLFVBQUNDLEtBQUQsRUFBUUMsR0FBUjtBQUFBLFdBQWlCQSxHQUFHLEtBQUssU0FBUixHQUFvQkQsS0FBcEIsR0FBNEJGLG9CQUFvQixDQUFDRSxLQUFELENBQWpFO0FBQUEsR0FBakIsQ0FBUDtBQUNEOztBQUVELElBQU1FLFlBQVksR0FBRyxTQUFmQSxZQUFlLE9BUWY7QUFBQSxNQVBKQyxRQU9JLFFBUEpBLFFBT0k7QUFBQSxNQU5KQyxhQU1JLFFBTkpBLGFBTUk7QUFBQSxNQUxKQyxLQUtJLFFBTEpBLEtBS0k7QUFBQSxNQUpKQyxjQUlJLFFBSkpBLGNBSUk7QUFBQSxNQUhKUCxRQUdJLFFBSEpBLFFBR0k7QUFBQSxNQUZKUSx5QkFFSSxRQUZKQSx5QkFFSTtBQUFBLE1BREpDLHdCQUNJLFFBREpBLHdCQUNJOztBQUFBLGtCQUM0QyxzQkFENUM7QUFBQTtBQUFBLE1BQ0dDLGdCQURIO0FBQUEsTUFDcUJDLG1CQURyQjs7QUFBQSw4QkFFeUJsQixxQkFBcUIsRUFGOUM7QUFBQTtBQUFBLE1BRUdtQixrQkFGSDs7QUFBQSx5QkFHbUJqQixlQUFlLEVBSGxDO0FBQUE7QUFBQSxNQUdHa0IsWUFISDs7QUFJSixNQUFNQyx3QkFBd0IsR0FBRyxtQkFBTyxFQUFQLENBQWpDO0FBQ0EsTUFBTUMsMkJBQTJCLEdBQUcsbUJBQU8sRUFBUCxDQUFwQztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLG9CQUFRO0FBQUEsV0FBTSxJQUFJQyxtQkFBSixFQUFOO0FBQUEsR0FBUixFQUFnQyxFQUFoQyxDQUEzQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLG1CQUFPLEVBQVAsQ0FBN0I7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxtQkFBTyxFQUFQLENBQWhDLENBUkksQ0FVSjtBQUNBOztBQUNBLE1BQU1DLDBCQUEwQixHQUFHLG1CQUFPLEVBQVAsQ0FBbkM7QUFFQSxNQUFNQyxnQkFBZ0IsR0FBRyx3QkFBWSxVQUFBQyxHQUFHLEVBQUk7QUFDMUNDLElBQUFBLE9BQU8sQ0FBQ0MsS0FBUixDQUFjRixHQUFkO0FBQ0QsR0FGd0IsRUFFdEIsRUFGc0IsQ0FBekI7QUFJQSxNQUFNRyw0QkFBNEIsR0FBRyxvQkFDbkM7QUFBQSxXQUFNLFVBQUFDLFFBQVEsRUFBSTtBQUNoQixVQUFNQyxJQUFJLEdBQUdYLGtCQUFrQixDQUFDWSxXQUFuQixDQUErQkYsUUFBL0IsQ0FBYixDQURnQixDQUdoQjs7QUFDQSxVQUFNRyxXQUFXLEdBQUcsaURBQW1DRixJQUFuQyxDQUFwQjtBQUVBLGFBQU9YLGtCQUFrQixDQUFDYyxRQUFuQixDQUE0QkMsTUFBNUIsQ0FBbUNGLFdBQW5DLENBQVA7QUFDRCxLQVBEO0FBQUEsR0FEbUMsRUFTbkMsQ0FBQ2Isa0JBQUQsQ0FUbUMsQ0FBckM7QUFZQSxNQUFNakIsb0JBQW9CLEdBQUcsb0JBQVEsWUFBTTtBQUN6QztBQUNBO0FBQ0E7QUFDQSxRQUFNaUMsT0FBTyxHQUNYbkMsV0FBVyxDQUFDUyxLQUFELENBQVgsS0FBdUJULFdBQVcsQ0FBQ1MsS0FBRCxDQUFYLEdBQXFCLDRCQUFjO0FBQUVKLE1BQUFBLEdBQUcseUJBQWtCLDRCQUFsQixDQUFMO0FBQXlDSSxNQUFBQSxLQUFLLEVBQUxBO0FBQXpDLEtBQWQsQ0FBNUMsQ0FERjtBQUdBLFdBQU8sVUFBQUwsS0FBSztBQUFBLGFBQUkrQixPQUFPLENBQUNDLEdBQVIsQ0FBWWhDLEtBQVosQ0FBSjtBQUFBLEtBQVo7QUFDRCxHQVI0QixFQVExQixDQUFDSyxLQUFELENBUjBCLENBQTdCO0FBVUEsTUFBTTRCLGVBQWUsR0FBRyxvQkFDdEI7QUFBQSxXQUNFcEMsd0JBQXdCLENBQUNDLG9CQUFELGtDQUNsQkMsUUFBUSxJQUFJLDZCQUFlYSxZQUFmLENBRE0sR0FFbkJSLGFBRm1CLEVBRDFCO0FBQUEsR0FEc0IsRUFNdEIsQ0FBQ0EsYUFBRCxFQUFnQlEsWUFBaEIsRUFBOEJiLFFBQTlCLEVBQXdDRCxvQkFBeEMsQ0FOc0IsQ0FBeEI7QUFTQSxNQUFNb0MsaUJBQWlCLEdBQUcsb0JBQVEsWUFBTTtBQUN0QyxRQUFNQyxRQUFRLEdBQUczQix3QkFBd0IsSUFBSUEsd0JBQXdCLENBQUM7QUFBRUcsTUFBQUEsa0JBQWtCLEVBQWxCQTtBQUFGLEtBQUQsQ0FBckU7O0FBRHNDLGdCQUVnQndCLFFBQVEsSUFBSSxFQUY1QjtBQUFBLFFBRTlCQyxlQUY4QixTQUU5QkEsZUFGOEI7QUFBQSxRQUViQyx3QkFGYSxTQUViQSx3QkFGYTs7QUFJdEMsMkNBQ0tGLFFBREw7QUFFRUMsTUFBQUEsZUFBZSxFQUFFQSxlQUFlLElBQUlFLDhDQUZ0QztBQUdFRCxNQUFBQSx3QkFBd0IsRUFBRUEsd0JBQXdCLElBQUlFO0FBSHhEO0FBS0QsR0FUeUIsRUFTdkIsQ0FBQzVCLGtCQUFELEVBQXFCSCx3QkFBckIsQ0FUdUIsQ0FBMUI7QUFXQSxNQUFNZ0MsMEJBQTBCLEdBQUcsbUJBQU8sRUFBUCxDQUFuQzs7QUE1REksbUJBNkRnRSxxQkFBUyxDQUFULENBN0RoRTtBQUFBO0FBQUEsTUE2REdDLDBCQTdESDtBQUFBLE1BNkQrQkMsNkJBN0QvQjs7QUErREosTUFBTUMsc0JBQXNCLEdBQUcsd0JBQzdCLFVBQUFDLEtBQUs7QUFBQSxXQUFJSiwwQkFBMEIsQ0FBQ0ssT0FBM0IsQ0FBbUNDLE9BQW5DLENBQTJDLFVBQUFDLFFBQVE7QUFBQSxhQUFJQSxRQUFRLENBQUNILEtBQUQsQ0FBWjtBQUFBLEtBQW5ELENBQUo7QUFBQSxHQUR3QixFQUU3QixDQUFDSiwwQkFBRCxDQUY2QixDQUEvQjtBQUtBLE1BQU1RLHFCQUFxQixHQUFHLHdCQUM1QixVQUFBRCxRQUFRLEVBQUk7QUFDVlAsSUFBQUEsMEJBQTBCLENBQUNLLE9BQTNCLGdDQUF5Q0wsMEJBQTBCLENBQUNLLE9BQXBFLElBQTZFRSxRQUE3RTtBQUNBTCxJQUFBQSw2QkFBNkIsQ0FBQ0YsMEJBQTBCLENBQUNLLE9BQTNCLENBQW1DSSxNQUFwQyxDQUE3QjtBQUVBLFdBQU8sWUFBTTtBQUNYVCxNQUFBQSwwQkFBMEIsQ0FBQ0ssT0FBM0IsR0FBcUNMLDBCQUEwQixDQUFDSyxPQUEzQixDQUFtQ0ssTUFBbkMsQ0FBMEMsVUFBQUMsTUFBTTtBQUFBLGVBQUlBLE1BQU0sS0FBS0osUUFBZjtBQUFBLE9BQWhELENBQXJDO0FBQ0FMLE1BQUFBLDZCQUE2QixDQUFDRiwwQkFBMEIsQ0FBQ0ssT0FBM0IsQ0FBbUNJLE1BQXBDLENBQTdCO0FBQ0QsS0FIRDtBQUlELEdBVDJCLEVBVTVCLENBQUNULDBCQUFELEVBQTZCRSw2QkFBN0IsQ0FWNEIsQ0FBOUI7QUFhQSxNQUFNVSwyQkFBMkIsR0FBRyxtQkFBTyxFQUFQLENBQXBDOztBQWpGSSxtQkFrRmtFLHFCQUFTLENBQVQsQ0FsRmxFO0FBQUE7QUFBQSxNQWtGR0MsMkJBbEZIO0FBQUEsTUFrRmdDQyw4QkFsRmhDOztBQW9GSixNQUFNQyx1QkFBdUIsR0FBRyx3QkFDOUIsVUFBQVgsS0FBSztBQUFBLFdBQUlRLDJCQUEyQixDQUFDUCxPQUE1QixDQUFvQ0MsT0FBcEMsQ0FBNEMsVUFBQUMsUUFBUTtBQUFBLGFBQUlBLFFBQVEsQ0FBQ0gsS0FBRCxDQUFaO0FBQUEsS0FBcEQsQ0FBSjtBQUFBLEdBRHlCLEVBRTlCLENBQUNRLDJCQUFELENBRjhCLENBQWhDO0FBS0EsTUFBTUksc0JBQXNCLEdBQUcsd0JBQzdCLFVBQUFULFFBQVEsRUFBSTtBQUNWSyxJQUFBQSwyQkFBMkIsQ0FBQ1AsT0FBNUIsZ0NBQTBDTywyQkFBMkIsQ0FBQ1AsT0FBdEUsSUFBK0VFLFFBQS9FO0FBQ0FPLElBQUFBLDhCQUE4QixDQUFDRiwyQkFBMkIsQ0FBQ1AsT0FBNUIsQ0FBb0NJLE1BQXJDLENBQTlCO0FBRUEsV0FBTyxZQUFNO0FBQ1hHLE1BQUFBLDJCQUEyQixDQUFDUCxPQUE1QixHQUFzQ08sMkJBQTJCLENBQUNQLE9BQTVCLENBQW9DSyxNQUFwQyxDQUEyQyxVQUFBQyxNQUFNO0FBQUEsZUFBSUEsTUFBTSxLQUFLSixRQUFmO0FBQUEsT0FBakQsQ0FBdEM7QUFDQU8sTUFBQUEsOEJBQThCLENBQUNGLDJCQUEyQixDQUFDUCxPQUE1QixDQUFvQ0ksTUFBckMsQ0FBOUI7QUFDRCxLQUhEO0FBSUQsR0FUNEIsRUFVN0IsQ0FBQ0csMkJBQUQsRUFBOEJFLDhCQUE5QixDQVY2QixDQUEvQjtBQWFBLE1BQU1HLE9BQU8sR0FBRyxvQkFDZDtBQUFBLFdBQU87QUFDTGhELE1BQUFBLGdCQUFnQixFQUFoQkEsZ0JBREs7QUFFTGtDLE1BQUFBLHNCQUFzQixFQUF0QkEsc0JBRks7QUFHTFksTUFBQUEsdUJBQXVCLEVBQXZCQSx1QkFISztBQUlMMUMsTUFBQUEsd0JBQXdCLEVBQXhCQSx3QkFKSztBQUtMQyxNQUFBQSwyQkFBMkIsRUFBM0JBLDJCQUxLO0FBTUw0QyxNQUFBQSx1QkFBdUIsRUFBRSxDQUFDM0Msa0JBQUQsQ0FOcEI7QUFPTFMsTUFBQUEsNEJBQTRCLEVBQTVCQSw0QkFQSztBQVFMbkIsTUFBQUEsS0FBSyxFQUFMQSxLQVJLO0FBU0xvQyxNQUFBQSwwQkFBMEIsRUFBMUJBLDBCQVRLO0FBVUxZLE1BQUFBLDJCQUEyQixFQUEzQkEsMkJBVks7QUFXTEwsTUFBQUEscUJBQXFCLEVBQXJCQSxxQkFYSztBQVlMUSxNQUFBQSxzQkFBc0IsRUFBdEJBLHNCQVpLO0FBYUxsRCxNQUFBQSxjQUFjLEVBQWRBLGNBYks7QUFjTGEsTUFBQUEsMEJBQTBCLEVBQTFCQSwwQkFkSztBQWVMRixNQUFBQSxvQkFBb0IsRUFBcEJBLG9CQWZLO0FBZ0JMQyxNQUFBQSx1QkFBdUIsRUFBdkJBLHVCQWhCSztBQWlCTFIsTUFBQUEsbUJBQW1CLEVBQW5CQSxtQkFqQks7QUFrQkxYLE1BQUFBLFFBQVEsRUFBRWtDLGVBbEJMO0FBbUJMbkMsTUFBQUEsb0JBQW9CLEVBQXBCQSxvQkFuQks7QUFvQkxTLE1BQUFBLHlCQUF5QixFQUF6QkEseUJBcEJLO0FBcUJMMkIsTUFBQUEsaUJBQWlCLEVBQWpCQTtBQXJCSyxLQUFQO0FBQUEsR0FEYyxFQXdCZCxDQUNFekIsZ0JBREYsRUFFRWtDLHNCQUZGLEVBR0VZLHVCQUhGLEVBSUUxQyx3QkFKRixFQUtFQywyQkFMRixFQU1FQyxrQkFORixFQU9FUyw0QkFQRixFQVFFbkIsS0FSRixFQVNFb0MsMEJBVEYsRUFVRVksMkJBVkYsRUFXRUwscUJBWEYsRUFZRVEsc0JBWkYsRUFhRXZCLGVBYkYsRUFjRTNCLGNBZEYsRUFlRWEsMEJBZkYsRUFnQkVGLG9CQWhCRixFQWlCRUMsdUJBakJGLEVBa0JFUixtQkFsQkYsRUFtQkVaLG9CQW5CRixFQW9CRVMseUJBcEJGLEVBcUJFMkIsaUJBckJGLENBeEJjLENBQWhCO0FBaURBLHNCQUNFLDZCQUFDLGtCQUFEO0FBQWEsSUFBQSxRQUFRLEVBQUVBO0FBQXZCLGtCQUNFLDZCQUFDLHlCQUFELENBQWtCLFFBQWxCO0FBQTJCLElBQUEsS0FBSyxFQUFFdUI7QUFBbEMsS0FDR3RELFFBREgsZUFFRSw2QkFBQyxrQkFBRDtBQUFXLElBQUEsT0FBTyxFQUFFaUI7QUFBcEIsSUFGRixDQURGLENBREY7QUFRRCxDQXZLRDs7QUF5S0FsQixZQUFZLENBQUN5RCxZQUFiLEdBQTRCO0FBQzFCdkQsRUFBQUEsYUFBYSxFQUFFd0QsU0FEVztBQUUxQnZELEVBQUFBLEtBQUssRUFBRXVELFNBRm1CO0FBRzFCdEQsRUFBQUEsY0FBYyxFQUFFc0QsU0FIVTtBQUkxQjdELEVBQUFBLFFBQVEsRUFBRTZELFNBSmdCO0FBSzFCckQsRUFBQUEseUJBQXlCLEVBQUUsU0FMRDtBQU0xQkMsRUFBQUEsd0JBQXdCLEVBQUVvRDtBQU5BLENBQTVCO0FBU0ExRCxZQUFZLENBQUMyRCxTQUFiLEdBQXlCO0FBQ3ZCekQsRUFBQUEsYUFBYSxFQUFFMEQsbUJBQVVDLEdBREY7QUFFdkIxRCxFQUFBQSxLQUFLLEVBQUV5RCxtQkFBVUUsTUFGTTtBQUd2QjFELEVBQUFBLGNBQWMsRUFBRXdELG1CQUFVRyxJQUhIO0FBSXZCbEUsRUFBQUEsUUFBUSxFQUFFK0QsbUJBQVVDLEdBSkc7QUFLdkJ4RCxFQUFBQSx5QkFBeUIsRUFBRXVELG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVSyxLQUFWLENBQWdCLENBQUMsS0FBRCxDQUFoQixDQUFELEVBQTJCTCxtQkFBVUUsTUFBckMsQ0FBcEIsQ0FMSjtBQU12QnhELEVBQUFBLHdCQUF3QixFQUFFc0QsbUJBQVVHO0FBTmIsQ0FBekI7O0FBU0EsSUFBTUcsUUFBUSxHQUFHLFNBQVhBLFFBQVcsUUFnQlg7QUFBQSxNQWZKQyxrQkFlSSxTQWZKQSxrQkFlSTtBQUFBLE1BZEpDLHdCQWNJLFNBZEpBLHdCQWNJO0FBQUEsTUFiSkMsbUNBYUksU0FiSkEsbUNBYUk7QUFBQSxNQVpKQyxvQkFZSSxTQVpKQSxvQkFZSTtBQUFBLE1BWEpDLGdCQVdJLFNBWEpBLGdCQVdJO0FBQUEsTUFWSkMsb0JBVUksU0FWSkEsb0JBVUk7QUFBQSxNQVRKdkUsUUFTSSxTQVRKQSxRQVNJO0FBQUEsTUFSSkMsYUFRSSxTQVJKQSxhQVFJO0FBQUEsTUFQSkUsY0FPSSxTQVBKQSxjQU9JO0FBQUEsTUFOSlAsUUFNSSxTQU5KQSxRQU1JO0FBQUEsTUFMSlEseUJBS0ksU0FMSkEseUJBS0k7QUFBQSxNQUpKb0UsZUFJSSxTQUpKQSxlQUlJO0FBQUEsTUFISkMseUJBR0ksU0FISkEseUJBR0k7QUFBQSxNQUZKcEUsd0JBRUksU0FGSkEsd0JBRUk7QUFBQSxNQUREcUUsYUFDQzs7QUFBQSxNQUNJeEUsS0FESixHQUMyQndFLGFBRDNCLENBQ0l4RSxLQURKO0FBQUEsTUFDV3lFLFdBRFgsR0FDMkJELGFBRDNCLENBQ1dDLFdBRFg7QUFHSixNQUFNQyx5QkFBeUIsR0FBRyxvQkFDaEM7QUFBQSx3Q0FBVSw0QkFBY1Ysa0JBQWQsQ0FBVixzQkFBZ0Qsb0NBQWhEO0FBQUEsR0FEZ0MsRUFFaEMsQ0FBQ0Esa0JBQUQsQ0FGZ0MsQ0FBbEM7QUFLQSxNQUFNVywrQkFBK0IsR0FBRyxvQkFDdEM7QUFBQSx3Q0FBVSw0QkFBY1Ysd0JBQWQsQ0FBVixzQkFBc0QscUNBQXREO0FBQUEsR0FEc0MsRUFFdEMsQ0FBQ0Esd0JBQUQsQ0FGc0MsQ0FBeEM7QUFLQSxNQUFNVywwQ0FBMEMsR0FBRyxvQkFDakQ7QUFBQSx3Q0FDSyw0QkFBY1YsbUNBQWQsQ0FETCxzQkFFSyxxQ0FGTDtBQUFBLEdBRGlELEVBS2pELENBQUNBLG1DQUFELENBTGlELENBQW5EO0FBUUEsTUFBTVcsMkJBQTJCLEdBQUcsb0JBQ2xDO0FBQUEsd0NBQVUsNEJBQWNWLG9CQUFkLENBQVYsc0JBQWtELHFDQUFsRDtBQUFBLEdBRGtDLEVBRWxDLENBQUNBLG9CQUFELENBRmtDLENBQXBDO0FBS0EsTUFBTVcsdUJBQXVCLEdBQUcsb0JBQzlCO0FBQUEsd0NBQVUsNEJBQWNWLGdCQUFkLENBQVYsc0JBQThDLHFDQUE5QztBQUFBLEdBRDhCLEVBRTlCLENBQUNBLGdCQUFELENBRjhCLENBQWhDO0FBS0EsTUFBTVcsMkJBQTJCLEdBQUcsb0JBQ2xDO0FBQUEsd0NBQVUsNEJBQWNWLG9CQUFkLENBQVYsc0JBQWtELHFDQUFsRDtBQUFBLEdBRGtDLEVBRWxDLENBQUNBLG9CQUFELENBRmtDLENBQXBDO0FBS0EsTUFBTVcsc0JBQXNCLEdBQUcsb0JBQVE7QUFBQSx3Q0FBVSw0QkFBY1YsZUFBZCxDQUFWLHNCQUE2QyxxQ0FBN0M7QUFBQSxHQUFSLEVBQXNGLENBQ25IQSxlQURtSCxDQUF0RixDQUEvQjtBQUlBLE1BQU1XLGdDQUFnQyxHQUFHLG9CQUN2QztBQUFBLHdDQUFVLDRCQUFjVix5QkFBZCxDQUFWLHNCQUF1RCxxQ0FBdkQ7QUFBQSxHQUR1QyxFQUV2QyxDQUFDQSx5QkFBRCxDQUZ1QyxDQUF6QztBQUtBLHNCQUNFLDZCQUFDLGNBQUQsQ0FBTyxRQUFQLHFCQUNFLDZCQUFDLGdDQUFEO0FBQ0UsSUFBQSxrQkFBa0IsRUFBRUcseUJBRHRCO0FBRUUsSUFBQSx3QkFBd0IsRUFBRUMsK0JBRjVCO0FBR0UsSUFBQSxtQ0FBbUMsRUFBRUMsMENBSHZDO0FBSUUsSUFBQSxvQkFBb0IsRUFBRUMsMkJBSnhCO0FBS0UsSUFBQSxnQkFBZ0IsRUFBRUMsdUJBTHBCO0FBTUUsSUFBQSxvQkFBb0IsRUFBRUMsMkJBTnhCO0FBT0UsSUFBQSx1QkFBdUIsRUFBRUcsZ0NBUDNCLENBUUU7QUFSRjtBQVNFLElBQUEscUJBQXFCLEVBQUU1RixRQUFRLEtBQUssYUFBYixHQUE2QjZGLGlCQUE3QixHQUF3QzVCLFNBVGpFO0FBVUUsSUFBQSxLQUFLLEVBQUV2RCxLQVZUO0FBV0UsSUFBQSxlQUFlLEVBQUVnRixzQkFYbkI7QUFZRSxJQUFBLHlCQUF5QixFQUFFQztBQVo3QixLQWFNVCxhQWJOLGdCQWVFLDZCQUFDLFlBQUQ7QUFDRSxJQUFBLGFBQWEsRUFBRXpFLGFBRGpCO0FBRUUsSUFBQSxLQUFLLEVBQUVDLEtBRlQ7QUFHRSxJQUFBLGNBQWMsRUFBRUMsY0FIbEI7QUFJRSxJQUFBLFFBQVEsRUFBRVAsUUFKWjtBQUtFLElBQUEseUJBQXlCLEVBQUVRLHlCQUw3QjtBQU1FLElBQUEsd0JBQXdCLEVBQUVDO0FBTjVCLEtBUUdMLFFBUkgsRUFTRzJFLFdBQVcsaUJBQUksNkJBQUMsa0JBQUQsT0FUbEIsQ0FmRixDQURGLENBREY7QUErQkQsQ0E1RkQ7O0FBOEZBVixRQUFRLENBQUNULFlBQVQsaURBQ0s4QixpQ0FBWTlCLFlBRGpCLEdBRUt6RCxZQUFZLENBQUN5RCxZQUZsQjtBQUdFVSxFQUFBQSxrQkFBa0IsRUFBRVQsU0FIdEI7QUFJRThCLEVBQUFBLGdCQUFnQixFQUFFOUIsU0FKcEI7QUFLRVUsRUFBQUEsd0JBQXdCLEVBQUVWLFNBTDVCO0FBTUUrQixFQUFBQSxzQkFBc0IsRUFBRS9CLFNBTjFCO0FBT0VXLEVBQUFBLG1DQUFtQyxFQUFFWCxTQVB2QztBQVFFWSxFQUFBQSxvQkFBb0IsRUFBRVosU0FSeEI7QUFTRWdDLEVBQUFBLGtCQUFrQixFQUFFaEMsU0FUdEI7QUFVRWEsRUFBQUEsZ0JBQWdCLEVBQUViLFNBVnBCO0FBV0VpQyxFQUFBQSxjQUFjLEVBQUVqQyxTQVhsQjtBQVlFYyxFQUFBQSxvQkFBb0IsRUFBRWQsU0FaeEI7QUFhRXpELEVBQUFBLFFBQVEsRUFBRXlELFNBYlo7QUFjRXZELEVBQUFBLEtBQUssRUFBRXVELFNBZFQ7QUFlRXRELEVBQUFBLGNBQWMsRUFBRXNELFNBZmxCO0FBZ0JFZSxFQUFBQSxlQUFlLEVBQUVmLFNBaEJuQjtBQWlCRWtDLEVBQUFBLGFBQWEsRUFBRWxDLFNBakJqQjtBQWtCRWdCLEVBQUFBLHlCQUF5QixFQUFFaEIsU0FsQjdCO0FBbUJFbUMsRUFBQUEsdUJBQXVCLEVBQUVuQyxTQW5CM0I7QUFvQkVwRCxFQUFBQSx3QkFBd0IsRUFBRW9EO0FBcEI1QjtBQXVCQVEsUUFBUSxDQUFDUCxTQUFULGlEQUNLNEIsaUNBQVk1QixTQURqQixHQUVLM0QsWUFBWSxDQUFDMkQsU0FGbEI7QUFHRVEsRUFBQUEsa0JBQWtCLEVBQUVQLG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVa0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FIdEI7QUFJRXlCLEVBQUFBLGdCQUFnQixFQUFFNUIsbUJBQVVHLElBSjlCO0FBS0VLLEVBQUFBLHdCQUF3QixFQUFFUixtQkFBVUksU0FBVixDQUFvQixDQUFDSixtQkFBVWtDLE9BQVYsQ0FBa0JsQyxtQkFBVUcsSUFBNUIsQ0FBRCxFQUFvQ0gsbUJBQVVHLElBQTlDLENBQXBCLENBTDVCO0FBTUUwQixFQUFBQSxzQkFBc0IsRUFBRTdCLG1CQUFVRyxJQU5wQztBQU9FTSxFQUFBQSxtQ0FBbUMsRUFBRVQsbUJBQVVJLFNBQVYsQ0FBb0IsQ0FBQ0osbUJBQVVrQyxPQUFWLENBQWtCbEMsbUJBQVVHLElBQTVCLENBQUQsRUFBb0NILG1CQUFVRyxJQUE5QyxDQUFwQixDQVB2QztBQVFFTyxFQUFBQSxvQkFBb0IsRUFBRVYsbUJBQVVJLFNBQVYsQ0FBb0IsQ0FBQ0osbUJBQVVrQyxPQUFWLENBQWtCbEMsbUJBQVVHLElBQTVCLENBQUQsRUFBb0NILG1CQUFVRyxJQUE5QyxDQUFwQixDQVJ4QjtBQVNFMkIsRUFBQUEsa0JBQWtCLEVBQUU5QixtQkFBVUcsSUFUaEM7QUFVRVEsRUFBQUEsZ0JBQWdCLEVBQUVYLG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVa0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FWcEI7QUFXRTRCLEVBQUFBLGNBQWMsRUFBRS9CLG1CQUFVRyxJQVg1QjtBQVlFUyxFQUFBQSxvQkFBb0IsRUFBRVosbUJBQVVHLElBWmxDO0FBYUU5RCxFQUFBQSxRQUFRLEVBQUUyRCxtQkFBVUMsR0FidEI7QUFjRTFELEVBQUFBLEtBQUssRUFBRXlELG1CQUFVRSxNQWRuQjtBQWVFMUQsRUFBQUEsY0FBYyxFQUFFd0QsbUJBQVVHLElBZjVCO0FBZ0JFVSxFQUFBQSxlQUFlLEVBQUViLG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVa0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FoQm5CO0FBaUJFNkIsRUFBQUEsYUFBYSxFQUFFaEMsbUJBQVVHLElBakIzQjtBQWtCRVcsRUFBQUEseUJBQXlCLEVBQUVkLG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVa0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FsQjdCO0FBbUJFOEIsRUFBQUEsdUJBQXVCLEVBQUVqQyxtQkFBVUcsSUFuQnJDO0FBb0JFekQsRUFBQUEsd0JBQXdCLEVBQUVzRCxtQkFBVUc7QUFwQnRDO2VBdUJlRyxRIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb3NlciBhcyBBUElDb21wb3NlciwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IHsgQ29tcG9zZXIgYXMgU2F5Q29tcG9zZXIgfSBmcm9tICdyZWFjdC1zYXknO1xuaW1wb3J0IGNyZWF0ZUVtb3Rpb24gZnJvbSAnY3JlYXRlLWVtb3Rpb24nO1xuaW1wb3J0IGNyZWF0ZVN0eWxlU2V0IGZyb20gJy4vU3R5bGVzL2NyZWF0ZVN0eWxlU2V0JztcbmltcG9ydCBNYXJrZG93bkl0IGZyb20gJ21hcmtkb3duLWl0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHNwZWVjaFN5bnRoZXNpcyBhcyBieXBhc3NTcGVlY2hTeW50aGVzaXMsXG4gIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSBhcyBCeXBhc3NTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2Vcbn0gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9CeXBhc3NTcGVlY2hTeW50aGVzaXNQb255ZmlsbCc7XG5pbXBvcnQgYWRkVGFyZ2V0QmxhbmtUb0h5cGVybGlua3NNYXJrZG93biBmcm9tICcuL1V0aWxzL2FkZFRhcmdldEJsYW5rVG9IeXBlcmxpbmtzTWFya2Rvd24nO1xuaW1wb3J0IGNyZWF0ZUNTU0tleSBmcm9tICcuL1V0aWxzL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdEFjdGl2aXR5TWlkZGxld2FyZSBmcm9tICcuL01pZGRsZXdhcmUvQWN0aXZpdHkvY3JlYXRlQ29yZU1pZGRsZXdhcmUnO1xuaW1wb3J0IGNyZWF0ZURlZmF1bHRBY3Rpdml0eVN0YXR1c01pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0FjdGl2aXR5U3RhdHVzL2NyZWF0ZUNvcmVNaWRkbGV3YXJlJztcbmltcG9ydCBjcmVhdGVEZWZhdWx0QXR0YWNobWVudEZvclNjcmVlblJlYWRlck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0F0dGFjaG1lbnRGb3JTY3JlZW5SZWFkZXIvY3JlYXRlQ29yZU1pZGRsZXdhcmUnO1xuaW1wb3J0IGNyZWF0ZURlZmF1bHRBdHRhY2htZW50TWlkZGxld2FyZSBmcm9tICcuL01pZGRsZXdhcmUvQXR0YWNobWVudC9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdEF2YXRhck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0F2YXRhci9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdENhcmRBY3Rpb25NaWRkbGV3YXJlIGZyb20gJy4vTWlkZGxld2FyZS9DYXJkQWN0aW9uL2NyZWF0ZUNvcmVNaWRkbGV3YXJlJztcbmltcG9ydCBjcmVhdGVEZWZhdWx0VG9hc3RNaWRkbGV3YXJlIGZyb20gJy4vTWlkZGxld2FyZS9Ub2FzdC9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdFR5cGluZ0luZGljYXRvck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL1R5cGluZ0luZGljYXRvci9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgRGljdGF0aW9uIGZyb20gJy4vRGljdGF0aW9uJztcbmltcG9ydCBkb3duc2NhbGVJbWFnZVRvRGF0YVVSTCBmcm9tICcuL1V0aWxzL2Rvd25zY2FsZUltYWdlVG9EYXRhVVJMJztcbmltcG9ydCBFcnJvckJveCBmcm9tICcuL0Vycm9yQm94JztcbmltcG9ydCBtYXBNYXAgZnJvbSAnLi9VdGlscy9tYXBNYXAnO1xuaW1wb3J0IHNpbmdsZVRvQXJyYXkgZnJvbSAnLi9VdGlscy9zaW5nbGVUb0FycmF5JztcbmltcG9ydCBVSVRyYWNrZXIgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9VSVRyYWNrZXInO1xuaW1wb3J0IFdlYkNoYXRVSUNvbnRleHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9XZWJDaGF0VUlDb250ZXh0JztcblxuY29uc3QgeyB1c2VSZWZlcmVuY2VHcmFtbWFySUQsIHVzZVN0eWxlT3B0aW9ucyB9ID0gaG9va3M7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuY29uc3Qgbm9kZV9lbnYgPSBwcm9jZXNzLmVudi5ub2RlX2VudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOVjtcblxuY29uc3QgZW1vdGlvblBvb2wgPSB7fTtcblxuZnVuY3Rpb24gc3R5bGVTZXRUb0Vtb3Rpb25PYmplY3RzKHN0eWxlVG9FbW90aW9uT2JqZWN0LCBzdHlsZVNldCkge1xuICByZXR1cm4gbWFwTWFwKHN0eWxlU2V0LCAoc3R5bGUsIGtleSkgPT4gKGtleSA9PT0gJ29wdGlvbnMnID8gc3R5bGUgOiBzdHlsZVRvRW1vdGlvbk9iamVjdChzdHlsZSkpKTtcbn1cblxuY29uc3QgQ29tcG9zZXJDb3JlID0gKHtcbiAgY2hpbGRyZW4sXG4gIGV4dHJhU3R5bGVTZXQsXG4gIG5vbmNlLFxuICByZW5kZXJNYXJrZG93bixcbiAgc3R5bGVTZXQsXG4gIHN1Z2dlc3RlZEFjdGlvbnNBY2Nlc3NLZXksXG4gIHdlYlNwZWVjaFBvbnlmaWxsRmFjdG9yeVxufSkgPT4ge1xuICBjb25zdCBbZGljdGF0ZUFib3J0YWJsZSwgc2V0RGljdGF0ZUFib3J0YWJsZV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbcmVmZXJlbmNlR3JhbW1hcklEXSA9IHVzZVJlZmVyZW5jZUdyYW1tYXJJRCgpO1xuICBjb25zdCBbc3R5bGVPcHRpb25zXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBmb2N1c1NlbmRCb3hDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBmb2N1c1RyYW5zY3JpcHRDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBpbnRlcm5hbE1hcmtkb3duSXQgPSB1c2VNZW1vKCgpID0+IG5ldyBNYXJrZG93bkl0KCksIFtdKTtcbiAgY29uc3Qgc2Nyb2xsVG9DYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBzY3JvbGxUb0VuZENhbGxiYWNrc1JlZiA9IHVzZVJlZihbXSk7XG5cbiAgLy8gSW5zdGVhZCBvZiBoYXZpbmcgYSBgc2Nyb2xsVXBDYWxsYmFja3NSZWZgIGFuZCBgc2Nyb2xsRG93bkNhbGxiYWNrc1JlZmAsIHRoZXkgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgYHNjcm9sbFJlbGF0aXZlQ2FsbGJhY2tzUmVmYC5cbiAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IHRlbGxzIHdoZXRoZXIgaXQgc2hvdWxkIGdvIFwidXBcIiBvciBcImRvd25cIi5cbiAgY29uc3Qgc2Nyb2xsUmVsYXRpdmVDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuXG4gIGNvbnN0IGRpY3RhdGlvbk9uRXJyb3IgPSB1c2VDYWxsYmFjayhlcnIgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGludGVybmFsUmVuZGVyTWFya2Rvd25JbmxpbmUgPSB1c2VNZW1vKFxuICAgICgpID0+IG1hcmtkb3duID0+IHtcbiAgICAgIGNvbnN0IHRyZWUgPSBpbnRlcm5hbE1hcmtkb3duSXQucGFyc2VJbmxpbmUobWFya2Rvd24pO1xuXG4gICAgICAvLyBXZSBzaG91bGQgYWRkIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBhbmQgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgIGNvbnN0IHBhdGNoZWRUcmVlID0gYWRkVGFyZ2V0QmxhbmtUb0h5cGVybGlua3NNYXJrZG93bih0cmVlKTtcblxuICAgICAgcmV0dXJuIGludGVybmFsTWFya2Rvd25JdC5yZW5kZXJlci5yZW5kZXIocGF0Y2hlZFRyZWUpO1xuICAgIH0sXG4gICAgW2ludGVybmFsTWFya2Rvd25JdF1cbiAgKTtcblxuICBjb25zdCBzdHlsZVRvRW1vdGlvbk9iamVjdCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIEVtb3Rpb24gZG9lc24ndCBoYXNoIHdpdGggbm9uY2UuIFdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgcG9vbGluZyBtZWNoYW5pc20uXG4gICAgLy8gMS4gSWYgMiBpbnN0YW5jZXMgdXNlIGRpZmZlcmVudCBub25jZSwgdGhleSBzaG91bGQgcmVzdWx0IGluIGRpZmZlcmVudCBoYXNoO1xuICAgIC8vIDIuIElmIDIgaW5zdGFuY2VzIGFyZSBiZWluZyBtb3VudGVkLCBwb29saW5nIHdpbGwgbWFrZSBzdXJlIHdlIHJlbmRlciBvbmx5IDEgc2V0IG9mIDxzdHlsZT4gdGFncywgaW5zdGVhZCBvZiAyLlxuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgd2ViY2hhdC0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIHN0eWxlID0+IGVtb3Rpb24uY3NzKHN0eWxlKTtcbiAgfSwgW25vbmNlXSk7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlU2V0ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgc3R5bGVTZXRUb0Vtb3Rpb25PYmplY3RzKHN0eWxlVG9FbW90aW9uT2JqZWN0LCB7XG4gICAgICAgIC4uLihzdHlsZVNldCB8fCBjcmVhdGVTdHlsZVNldChzdHlsZU9wdGlvbnMpKSxcbiAgICAgICAgLi4uZXh0cmFTdHlsZVNldFxuICAgICAgfSksXG4gICAgW2V4dHJhU3R5bGVTZXQsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQsIHN0eWxlVG9FbW90aW9uT2JqZWN0XVxuICApO1xuXG4gIGNvbnN0IHdlYlNwZWVjaFBvbnlmaWxsID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcG9ueWZpbGwgPSB3ZWJTcGVlY2hQb255ZmlsbEZhY3RvcnkgJiYgd2ViU3BlZWNoUG9ueWZpbGxGYWN0b3J5KHsgcmVmZXJlbmNlR3JhbW1hcklEIH0pO1xuICAgIGNvbnN0IHsgc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfSA9IHBvbnlmaWxsIHx8IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBvbnlmaWxsLFxuICAgICAgc3BlZWNoU3ludGhlc2lzOiBzcGVlY2hTeW50aGVzaXMgfHwgYnlwYXNzU3BlZWNoU3ludGhlc2lzLFxuICAgICAgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlOiBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfHwgQnlwYXNzU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlXG4gICAgfTtcbiAgfSwgW3JlZmVyZW5jZUdyYW1tYXJJRCwgd2ViU3BlZWNoUG9ueWZpbGxGYWN0b3J5XSk7XG5cbiAgY29uc3Qgc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBbbnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMsIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzXSA9IHVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiBzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LmZvckVhY2gob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIoZXZlbnQpKSxcbiAgICBbc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWZdXG4gICk7XG5cbiAgY29uc3Qgb2JzZXJ2ZVNjcm9sbFBvc2l0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgb2JzZXJ2ZXIgPT4ge1xuICAgICAgc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYuY3VycmVudCA9IFsuLi5zY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LCBvYnNlcnZlcl07XG4gICAgICBzZXROdW1TY3JvbGxQb3NpdGlvbk9ic2VydmVycyhzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzUmVmLmN1cnJlbnQgPSBzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LmZpbHRlcih0YXJnZXQgPT4gdGFyZ2V0ICE9PSBvYnNlcnZlcik7XG4gICAgICAgIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzKHNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzUmVmLmN1cnJlbnQubGVuZ3RoKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBbc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYsIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzXVxuICApO1xuXG4gIGNvbnN0IHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZiA9IHVzZVJlZihbXSk7XG4gIGNvbnN0IFtudW1UcmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnMsIHNldE51bVRyYW5zY3JpcHRGb2N1c09ic2VydmVyc10gPSB1c2VTdGF0ZSgwKTtcblxuICBjb25zdCBkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50LmZvckVhY2gob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIoZXZlbnQpKSxcbiAgICBbdHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmXVxuICApO1xuXG4gIGNvbnN0IG9ic2VydmVUcmFuc2NyaXB0Rm9jdXMgPSB1c2VDYWxsYmFjayhcbiAgICBvYnNlcnZlciA9PiB7XG4gICAgICB0cmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnNSZWYuY3VycmVudCA9IFsuLi50cmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnNSZWYuY3VycmVudCwgb2JzZXJ2ZXJdO1xuICAgICAgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzKHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50ID0gdHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmLmN1cnJlbnQuZmlsdGVyKHRhcmdldCA9PiB0YXJnZXQgIT09IG9ic2VydmVyKTtcbiAgICAgICAgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzKHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgW3RyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZiwgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzXVxuICApO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBkaWN0YXRlQWJvcnRhYmxlLFxuICAgICAgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbixcbiAgICAgIGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzLFxuICAgICAgZm9jdXNTZW5kQm94Q2FsbGJhY2tzUmVmLFxuICAgICAgZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2tzUmVmLFxuICAgICAgaW50ZXJuYWxNYXJrZG93bkl0U3RhdGU6IFtpbnRlcm5hbE1hcmtkb3duSXRdLFxuICAgICAgaW50ZXJuYWxSZW5kZXJNYXJrZG93bklubGluZSxcbiAgICAgIG5vbmNlLFxuICAgICAgbnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMsXG4gICAgICBudW1UcmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnMsXG4gICAgICBvYnNlcnZlU2Nyb2xsUG9zaXRpb24sXG4gICAgICBvYnNlcnZlVHJhbnNjcmlwdEZvY3VzLFxuICAgICAgcmVuZGVyTWFya2Rvd24sXG4gICAgICBzY3JvbGxSZWxhdGl2ZUNhbGxiYWNrc1JlZixcbiAgICAgIHNjcm9sbFRvQ2FsbGJhY2tzUmVmLFxuICAgICAgc2Nyb2xsVG9FbmRDYWxsYmFja3NSZWYsXG4gICAgICBzZXREaWN0YXRlQWJvcnRhYmxlLFxuICAgICAgc3R5bGVTZXQ6IHBhdGNoZWRTdHlsZVNldCxcbiAgICAgIHN0eWxlVG9FbW90aW9uT2JqZWN0LFxuICAgICAgc3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSxcbiAgICAgIHdlYlNwZWVjaFBvbnlmaWxsXG4gICAgfSksXG4gICAgW1xuICAgICAgZGljdGF0ZUFib3J0YWJsZSxcbiAgICAgIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24sXG4gICAgICBkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyxcbiAgICAgIGZvY3VzU2VuZEJveENhbGxiYWNrc1JlZixcbiAgICAgIGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrc1JlZixcbiAgICAgIGludGVybmFsTWFya2Rvd25JdCxcbiAgICAgIGludGVybmFsUmVuZGVyTWFya2Rvd25Jbm