botframework-webchat-component
Version:
React component of botframework-webchat
161 lines (154 loc) • 32.5 kB
JavaScript
;
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 _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _useRefFrom = require("use-ref-from");
var _useStyleToEmotionObject = _interopRequireDefault(require("../../../hooks/internal/useStyleToEmotionObject"));
var _useUniqueId = _interopRequireDefault(require("../../../hooks/internal/useUniqueId"));
var _useFocus = _interopRequireDefault(require("../../../hooks/useFocus"));
var _useScrollToEnd = _interopRequireDefault(require("../../../hooks/useScrollToEnd"));
var _Context = _interopRequireDefault(require("./private/Context"));
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 _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) { 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; }
var useConnectivityStatus = _botframeworkWebchatApi.hooks.useConnectivityStatus,
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
usePonyfill = _botframeworkWebchatApi.hooks.usePonyfill,
useSendBoxAttachments = _botframeworkWebchatApi.hooks.useSendBoxAttachments,
useSendBoxValue = _botframeworkWebchatApi.hooks.useSendBoxValue,
useSubmitSendBox = _botframeworkWebchatApi.hooks.useSubmitSendBox;
var SUBMIT_ERROR_MESSAGE_STYLE = {
'&.webchat__submit-error-message': {
// .sr-only - This component is intended to be invisible to the visual Web Chat user, but read by the AT when using a screen reader
color: 'transparent',
height: 1,
overflow: 'hidden',
position: 'absolute',
// We need to set top: 0, otherwise, it will repro:
// - Run NVDA
// - Make the transcript long enough to show the scrollbar
// - Press SHIFT-TAB, focus on upload button
// - Press up arrow multiple times
top: 0,
whiteSpace: 'nowrap',
width: 1
}
};
// False positive: we are using `setTimeout` as a type.
// eslint-disable-next-line no-restricted-globals
var TIME_TO_QUEUE_ERROR_MESSAGE = 500;
var TIME_TO_RESET_ERROR_MESSAGE = 50;
// This component is marked as internal because it is not fully implemented and is not ready to be consumed publicly.
// When it is done, it should provide and replace all the functionalities we did in Redux, including but not limited to:
// - Speech interims
// - Maintain text box value
// - Multiple <SendBoxComposer> in a single Web Chat instance
// - Web devs should be able to put an individual send box instance into an activity
// - The send box instance in the activity, should be separated from the bottommost send box
// - The valued typed inside the activity, should be separated from the value typed into the bottommost send box
// In the old days, we use Redux to keep the send box state.
// However, when web devs put 2 send box on their page, it makes things complex because both send boxes will interact with each other.
// We would rather have them separate. If web devs want them to interact with each other, they will do the wiring themselves.
// TODO: [P2] Complete this component.
var SendBoxComposer = function SendBoxComposer(_ref) {
var children = _ref.children;
var _usePonyfill = usePonyfill(),
_usePonyfill2 = _slicedToArray(_usePonyfill, 1),
_usePonyfill2$ = _usePonyfill2[0],
clearTimeout = _usePonyfill2$.clearTimeout,
setTimeout = _usePonyfill2$.setTimeout;
var _useSendBoxAttachment = useSendBoxAttachments(),
_useSendBoxAttachment2 = _slicedToArray(_useSendBoxAttachment, 1),
attachments = _useSendBoxAttachment2[0];
var _useConnectivityStatu = useConnectivityStatus(),
_useConnectivityStatu2 = _slicedToArray(_useConnectivityStatu, 1),
connectivityStatus = _useConnectivityStatu2[0];
var _useState = (0, _react.useState)(false),
_useState2 = _slicedToArray(_useState, 2),
error = _useState2[0],
setError = _useState2[1];
var _useSendBoxValue = useSendBoxValue(),
_useSendBoxValue2 = _slicedToArray(_useSendBoxValue, 1),
sendBoxValue = _useSendBoxValue2[0];
var apiSubmitSendBox = useSubmitSendBox();
var focus = (0, _useFocus.default)();
var localize = useLocalizer();
var scrollToEnd = (0, _useScrollToEnd.default)();
var styleToEmotionObject = (0, _useStyleToEmotionObject.default)();
var submitErrorMessageId = (0, _useUniqueId.default)('webchat__send-box__error-message-id');
var timeoutRef = (0, _react.useRef)(undefined);
var errorMessageStringMap = (0, _react.useMemo)(function () {
return Object.freeze(new Map().set('empty', localize('SEND_BOX_IS_EMPTY_TOOLTIP_ALT'))
// TODO: [P0] We should add a new string for "Cannot send message while offline."
.set('offline', localize('CONNECTIVITY_STATUS_ALT_FATAL')));
}, [localize]);
var focusRef = (0, _useRefFrom.useRefFrom)(focus);
var scrollToEndRef = (0, _useRefFrom.useRefFrom)(scrollToEnd);
var setErrorRef = (0, _react.useRef)(setError);
var submitErrorMessageClassName = styleToEmotionObject(SUBMIT_ERROR_MESSAGE_STYLE) + '';
var submitErrorMessageIdState = (0, _react.useMemo)(function () {
return Object.freeze([error ? submitErrorMessageId : undefined]);
}, [error, submitErrorMessageId]);
setErrorRef.current = setError;
var submitErrorRef = (0, _useRefFrom.useRefFrom)(connectivityStatus !== 'connected' && connectivityStatus !== 'reconnected' ? 'offline' : !sendBoxValue && !attachments.length ? 'empty' : undefined);
var submit = (0, _react.useCallback)(function () {
var _focusRef$current;
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
setFocus = _ref2.setFocus;
(setFocus === 'main' || setFocus === 'sendBox' || setFocus === 'sendBoxWithoutKeyboard') && ((_focusRef$current = focusRef.current) === null || _focusRef$current === void 0 ? void 0 : _focusRef$current.call(focusRef, setFocus === 'main' || setFocus === 'sendBox' ? setFocus : 'sendBoxWithoutKeyboard'));
var submitError = submitErrorRef.current;
if (submitError) {
var _setErrorRef$current;
timeoutRef.current && timeoutRef.current.forEach(clearTimeout);
(_setErrorRef$current = setErrorRef.current) === null || _setErrorRef$current === void 0 ? void 0 : _setErrorRef$current.call(setErrorRef, false);
timeoutRef.current = Object.freeze([setTimeout(function () {
var _setErrorRef$current2;
return (_setErrorRef$current2 = setErrorRef.current) === null || _setErrorRef$current2 === void 0 ? void 0 : _setErrorRef$current2.call(setErrorRef, submitError);
}, TIME_TO_RESET_ERROR_MESSAGE), setTimeout(function () {
var _setErrorRef$current3;
return (_setErrorRef$current3 = setErrorRef.current) === null || _setErrorRef$current3 === void 0 ? void 0 : _setErrorRef$current3.call(setErrorRef, false);
}, TIME_TO_QUEUE_ERROR_MESSAGE)]);
} else {
var _scrollToEndRef$curre;
(_scrollToEndRef$curre = scrollToEndRef.current) === null || _scrollToEndRef$curre === void 0 ? void 0 : _scrollToEndRef$curre.call(scrollToEndRef);
apiSubmitSendBox();
}
}, [apiSubmitSendBox, clearTimeout, focusRef, scrollToEndRef, setErrorRef, setTimeout, submitErrorRef, timeoutRef]);
(0, _react.useEffect)(
// Prevent `setTimeout()` from firing after unmount.
function () {
return function () {
setErrorRef.current = undefined;
};
}, [setErrorRef]);
var context = (0, _react.useMemo)(function () {
return {
submit: submit,
submitErrorMessageIdState: submitErrorMessageIdState
};
}, [submit, submitErrorMessageIdState]);
return /*#__PURE__*/_react.default.createElement(_Context.default.Provider, {
value: context
}, children, /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)('webchat__submit-error-message', submitErrorMessageClassName)
// "id" is required for "aria-errormessage" as IDREF.
// eslint-disable-next-line react/forbid-dom-props
,
id: submitErrorMessageId,
role: "alert"
}, error ? errorMessageStringMap.get(error) : ''));
};
var _default = SendBoxComposer;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91c2VSZWZGcm9tIiwiX3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0IiwiX3VzZVVuaXF1ZUlkIiwiX3VzZUZvY3VzIiwiX3VzZVNjcm9sbFRvRW5kIiwiX0NvbnRleHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJvIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJuIiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJsZW4iLCJsZW5ndGgiLCJhcnIyIiwiX2kiLCJTeW1ib2wiLCJpdGVyYXRvciIsIl9hcnIiLCJfbiIsIl9kIiwiX3MiLCJfZSIsIm5leHQiLCJkb25lIiwicHVzaCIsInZhbHVlIiwiZXJyIiwiaXNBcnJheSIsInVzZUNvbm5lY3Rpdml0eVN0YXR1cyIsImhvb2tzIiwidXNlTG9jYWxpemVyIiwidXNlUG9ueWZpbGwiLCJ1c2VTZW5kQm94QXR0YWNobWVudHMiLCJ1c2VTZW5kQm94VmFsdWUiLCJ1c2VTdWJtaXRTZW5kQm94IiwiU1VCTUlUX0VSUk9SX01FU1NBR0VfU1RZTEUiLCJjb2xvciIsImhlaWdodCIsIm92ZXJmbG93IiwicG9zaXRpb24iLCJ0b3AiLCJ3aGl0ZVNwYWNlIiwid2lkdGgiLCJUSU1FX1RPX1FVRVVFX0VSUk9SX01FU1NBR0UiLCJUSU1FX1RPX1JFU0VUX0VSUk9SX01FU1NBR0UiLCJTZW5kQm94Q29tcG9zZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJfdXNlUG9ueWZpbGwiLCJfdXNlUG9ueWZpbGwyIiwiX3VzZVBvbnlmaWxsMiQiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiX3VzZVNlbmRCb3hBdHRhY2htZW50IiwiX3VzZVNlbmRCb3hBdHRhY2htZW50MiIsImF0dGFjaG1lbnRzIiwiX3VzZUNvbm5lY3Rpdml0eVN0YXR1IiwiX3VzZUNvbm5lY3Rpdml0eVN0YXR1MiIsImNvbm5lY3Rpdml0eVN0YXR1cyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImVycm9yIiwic2V0RXJyb3IiLCJfdXNlU2VuZEJveFZhbHVlIiwiX3VzZVNlbmRCb3hWYWx1ZTIiLCJzZW5kQm94VmFsdWUiLCJhcGlTdWJtaXRTZW5kQm94IiwiZm9jdXMiLCJ1c2VGb2N1cyIsImxvY2FsaXplIiwic2Nyb2xsVG9FbmQiLCJ1c2VTY3JvbGxUb0VuZCIsInN0eWxlVG9FbW90aW9uT2JqZWN0IiwidXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJzdWJtaXRFcnJvck1lc3NhZ2VJZCIsInVzZVVuaXF1ZUlkIiwidGltZW91dFJlZiIsInVzZVJlZiIsInVuZGVmaW5lZCIsImVycm9yTWVzc2FnZVN0cmluZ01hcCIsInVzZU1lbW8iLCJmcmVlemUiLCJNYXAiLCJmb2N1c1JlZiIsInVzZVJlZkZyb20iLCJzY3JvbGxUb0VuZFJlZiIsInNldEVycm9yUmVmIiwic3VibWl0RXJyb3JNZXNzYWdlQ2xhc3NOYW1lIiwic3VibWl0RXJyb3JNZXNzYWdlSWRTdGF0ZSIsImN1cnJlbnQiLCJzdWJtaXRFcnJvclJlZiIsInN1Ym1pdCIsInVzZUNhbGxiYWNrIiwiX2ZvY3VzUmVmJGN1cnJlbnQiLCJfcmVmMiIsImFyZ3VtZW50cyIsInNldEZvY3VzIiwic3VibWl0RXJyb3IiLCJfc2V0RXJyb3JSZWYkY3VycmVudCIsImZvckVhY2giLCJfc2V0RXJyb3JSZWYkY3VycmVudDIiLCJfc2V0RXJyb3JSZWYkY3VycmVudDMiLCJfc2Nyb2xsVG9FbmRSZWYkY3VycmUiLCJ1c2VFZmZlY3QiLCJjb250ZXh0IiwiY3JlYXRlRWxlbWVudCIsIlByb3ZpZGVyIiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsImlkIiwicm9sZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9pbnRlcm5hbC9TZW5kQm94L1NlbmRCb3hDb21wb3Nlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSwgdHlwZSBQcm9wc1dpdGhDaGlsZHJlbiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZkZyb20gfSBmcm9tICd1c2UtcmVmLWZyb20nO1xuXG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi4vLi4vLi4vaG9va3MvaW50ZXJuYWwvdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QnO1xuaW1wb3J0IHVzZVVuaXF1ZUlkIGZyb20gJy4uLy4uLy4uL2hvb2tzL2ludGVybmFsL3VzZVVuaXF1ZUlkJztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VGb2N1cyc7XG5pbXBvcnQgdXNlU2Nyb2xsVG9FbmQgZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU2Nyb2xsVG9FbmQnO1xuaW1wb3J0IFNlbmRCb3hDb250ZXh0IGZyb20gJy4vcHJpdmF0ZS9Db250ZXh0JztcbmltcG9ydCB7IHR5cGUgQ29udGV4dFR5cGUsIHR5cGUgU2VuZEVycm9yIH0gZnJvbSAnLi9wcml2YXRlL3R5cGVzJztcblxuY29uc3QgeyB1c2VDb25uZWN0aXZpdHlTdGF0dXMsIHVzZUxvY2FsaXplciwgdXNlUG9ueWZpbGwsIHVzZVNlbmRCb3hBdHRhY2htZW50cywgdXNlU2VuZEJveFZhbHVlLCB1c2VTdWJtaXRTZW5kQm94IH0gPVxuICBob29rcztcblxuY29uc3QgU1VCTUlUX0VSUk9SX01FU1NBR0VfU1RZTEUgPSB7XG4gICcmLndlYmNoYXRfX3N1Ym1pdC1lcnJvci1tZXNzYWdlJzoge1xuICAgIC8vIC5zci1vbmx5IC0gVGhpcyBjb21wb25lbnQgaXMgaW50ZW5kZWQgdG8gYmUgaW52aXNpYmxlIHRvIHRoZSB2aXN1YWwgV2ViIENoYXQgdXNlciwgYnV0IHJlYWQgYnkgdGhlIEFUIHdoZW4gdXNpbmcgYSBzY3JlZW4gcmVhZGVyXG4gICAgY29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgaGVpZ2h0OiAxLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAvLyBXZSBuZWVkIHRvIHNldCB0b3A6IDAsIG90aGVyd2lzZSwgaXQgd2lsbCByZXBybzpcbiAgICAvLyAtIFJ1biBOVkRBXG4gICAgLy8gLSBNYWtlIHRoZSB0cmFuc2NyaXB0IGxvbmcgZW5vdWdoIHRvIHNob3cgdGhlIHNjcm9sbGJhclxuICAgIC8vIC0gUHJlc3MgU0hJRlQtVEFCLCBmb2N1cyBvbiB1cGxvYWQgYnV0dG9uXG4gICAgLy8gLSBQcmVzcyB1cCBhcnJvdyBtdWx0aXBsZSB0aW1lc1xuICAgIHRvcDogMCxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICB3aWR0aDogMVxuICB9XG59O1xuXG4vLyBGYWxzZSBwb3NpdGl2ZTogd2UgYXJlIHVzaW5nIGBzZXRUaW1lb3V0YCBhcyBhIHR5cGUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG50eXBlIFRpbWVvdXQgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuY29uc3QgVElNRV9UT19RVUVVRV9FUlJPUl9NRVNTQUdFID0gNTAwO1xuY29uc3QgVElNRV9UT19SRVNFVF9FUlJPUl9NRVNTQUdFID0gNTA7XG5cbi8vIFRoaXMgY29tcG9uZW50IGlzIG1hcmtlZCBhcyBpbnRlcm5hbCBiZWNhdXNlIGl0IGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBhbmQgaXMgbm90IHJlYWR5IHRvIGJlIGNvbnN1bWVkIHB1YmxpY2x5LlxuLy8gV2hlbiBpdCBpcyBkb25lLCBpdCBzaG91bGQgcHJvdmlkZSBhbmQgcmVwbGFjZSBhbGwgdGhlIGZ1bmN0aW9uYWxpdGllcyB3ZSBkaWQgaW4gUmVkdXgsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86XG5cbi8vIC0gU3BlZWNoIGludGVyaW1zXG4vLyAtIE1haW50YWluIHRleHQgYm94IHZhbHVlXG4vLyAtIE11bHRpcGxlIDxTZW5kQm94Q29tcG9zZXI+IGluIGEgc2luZ2xlIFdlYiBDaGF0IGluc3RhbmNlXG4vLyAgICAtIFdlYiBkZXZzIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBhbiBpbmRpdmlkdWFsIHNlbmQgYm94IGluc3RhbmNlIGludG8gYW4gYWN0aXZpdHlcbi8vICAgIC0gVGhlIHNlbmQgYm94IGluc3RhbmNlIGluIHRoZSBhY3Rpdml0eSwgc2hvdWxkIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBib3R0b21tb3N0IHNlbmQgYm94XG4vLyAgICAtIFRoZSB2YWx1ZWQgdHlwZWQgaW5zaWRlIHRoZSBhY3Rpdml0eSwgc2hvdWxkIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSB2YWx1ZSB0eXBlZCBpbnRvIHRoZSBib3R0b21tb3N0IHNlbmQgYm94XG5cbi8vIEluIHRoZSBvbGQgZGF5cywgd2UgdXNlIFJlZHV4IHRvIGtlZXAgdGhlIHNlbmQgYm94IHN0YXRlLlxuLy8gSG93ZXZlciwgd2hlbiB3ZWIgZGV2cyBwdXQgMiBzZW5kIGJveCBvbiB0aGVpciBwYWdlLCBpdCBtYWtlcyB0aGluZ3MgY29tcGxleCBiZWNhdXNlIGJvdGggc2VuZCBib3hlcyB3aWxsIGludGVyYWN0IHdpdGggZWFjaCBvdGhlci5cbi8vIFdlIHdvdWxkIHJhdGhlciBoYXZlIHRoZW0gc2VwYXJhdGUuIElmIHdlYiBkZXZzIHdhbnQgdGhlbSB0byBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIsIHRoZXkgd2lsbCBkbyB0aGUgd2lyaW5nIHRoZW1zZWx2ZXMuXG5cbnR5cGUgRXJyb3JNZXNzYWdlU3RyaW5nTWFwID0gUmVhZG9ubHlNYXA8U2VuZEVycm9yLCBzdHJpbmc+O1xuXG4vLyBUT0RPOiBbUDJdIENvbXBsZXRlIHRoaXMgY29tcG9uZW50LlxuY29uc3QgU2VuZEJveENvbXBvc2VyID0gKHsgY2hpbGRyZW4gfTogUHJvcHNXaXRoQ2hpbGRyZW48e30+KSA9PiB7XG4gIGNvbnN0IFt7IGNsZWFyVGltZW91dCwgc2V0VGltZW91dCB9XSA9IHVzZVBvbnlmaWxsKCk7XG4gIGNvbnN0IFthdHRhY2htZW50c10gPSB1c2VTZW5kQm94QXR0YWNobWVudHMoKTtcbiAgY29uc3QgW2Nvbm5lY3Rpdml0eVN0YXR1c10gPSB1c2VDb25uZWN0aXZpdHlTdGF0dXMoKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxTZW5kRXJyb3IgfCBmYWxzZT4oZmFsc2UpO1xuICBjb25zdCBbc2VuZEJveFZhbHVlXSA9IHVzZVNlbmRCb3hWYWx1ZSgpO1xuICBjb25zdCBhcGlTdWJtaXRTZW5kQm94ID0gdXNlU3VibWl0U2VuZEJveCgpO1xuICBjb25zdCBmb2N1cyA9IHVzZUZvY3VzKCk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcbiAgY29uc3Qgc3R5bGVUb0Vtb3Rpb25PYmplY3QgPSB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCgpO1xuICBjb25zdCBzdWJtaXRFcnJvck1lc3NhZ2VJZCA9IHVzZVVuaXF1ZUlkKCd3ZWJjaGF0X19zZW5kLWJveF9fZXJyb3ItbWVzc2FnZS1pZCcpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gdXNlUmVmPHJlYWRvbmx5IFtUaW1lb3V0LCBUaW1lb3V0XSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBjb25zdCBlcnJvck1lc3NhZ2VTdHJpbmdNYXAgPSB1c2VNZW1vPEVycm9yTWVzc2FnZVN0cmluZ01hcD4oXG4gICAgKCkgPT5cbiAgICAgIE9iamVjdC5mcmVlemUoXG4gICAgICAgIG5ldyBNYXA8U2VuZEVycm9yLCBzdHJpbmc+KClcbiAgICAgICAgICAuc2V0KCdlbXB0eScsIGxvY2FsaXplKCdTRU5EX0JPWF9JU19FTVBUWV9UT09MVElQX0FMVCcpKVxuICAgICAgICAgIC8vIFRPRE86IFtQMF0gV2Ugc2hvdWxkIGFkZCBhIG5ldyBzdHJpbmcgZm9yIFwiQ2Fubm90IHNlbmQgbWVzc2FnZSB3aGlsZSBvZmZsaW5lLlwiXG4gICAgICAgICAgLnNldCgnb2ZmbGluZScsIGxvY2FsaXplKCdDT05ORUNUSVZJVFlfU1RBVFVTX0FMVF9GQVRBTCcpKVxuICAgICAgKSxcbiAgICBbbG9jYWxpemVdXG4gICk7XG4gIGNvbnN0IGZvY3VzUmVmID0gdXNlUmVmRnJvbShmb2N1cyk7XG4gIGNvbnN0IHNjcm9sbFRvRW5kUmVmID0gdXNlUmVmRnJvbShzY3JvbGxUb0VuZCk7XG4gIGNvbnN0IHNldEVycm9yUmVmID0gdXNlUmVmPHR5cGVvZiBzZXRFcnJvciB8IHVuZGVmaW5lZD4oc2V0RXJyb3IpO1xuICBjb25zdCBzdWJtaXRFcnJvck1lc3NhZ2VDbGFzc05hbWUgPSBzdHlsZVRvRW1vdGlvbk9iamVjdChTVUJNSVRfRVJST1JfTUVTU0FHRV9TVFlMRSkgKyAnJztcbiAgY29uc3Qgc3VibWl0RXJyb3JNZXNzYWdlSWRTdGF0ZSA9IHVzZU1lbW88cmVhZG9ubHkgW3N0cmluZyB8IHVuZGVmaW5lZF0+KFxuICAgICgpID0+IE9iamVjdC5mcmVlemUoW2Vycm9yID8gc3VibWl0RXJyb3JNZXNzYWdlSWQgOiB1bmRlZmluZWRdKSBhcyByZWFkb25seSBbc3RyaW5nIHwgdW5kZWZpbmVkXSxcbiAgICBbZXJyb3IsIHN1Ym1pdEVycm9yTWVzc2FnZUlkXVxuICApO1xuXG4gIHNldEVycm9yUmVmLmN1cnJlbnQgPSBzZXRFcnJvcjtcblxuICBjb25zdCBzdWJtaXRFcnJvclJlZiA9IHVzZVJlZkZyb208J2VtcHR5JyB8ICdvZmZsaW5lJyB8IHVuZGVmaW5lZD4oXG4gICAgY29ubmVjdGl2aXR5U3RhdHVzICE9PSAnY29ubmVjdGVkJyAmJiBjb25uZWN0aXZpdHlTdGF0dXMgIT09ICdyZWNvbm5lY3RlZCdcbiAgICAgID8gJ29mZmxpbmUnXG4gICAgICA6ICFzZW5kQm94VmFsdWUgJiYgIWF0dGFjaG1lbnRzLmxlbmd0aFxuICAgICAgICA/ICdlbXB0eSdcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgKTtcblxuICBjb25zdCBzdWJtaXQgPSB1c2VDYWxsYmFjazxDb250ZXh0VHlwZVsnc3VibWl0J10+KFxuICAgICh7IHNldEZvY3VzIH0gPSB7fSkgPT4ge1xuICAgICAgKHNldEZvY3VzID09PSAnbWFpbicgfHwgc2V0Rm9jdXMgPT09ICdzZW5kQm94JyB8fCBzZXRGb2N1cyA9PT0gJ3NlbmRCb3hXaXRob3V0S2V5Ym9hcmQnKSAmJlxuICAgICAgICBmb2N1c1JlZi5jdXJyZW50Py4oc2V0Rm9jdXMgPT09ICdtYWluJyB8fCBzZXRGb2N1cyA9PT0gJ3NlbmRCb3gnID8gc2V0Rm9jdXMgOiAnc2VuZEJveFdpdGhvdXRLZXlib2FyZCcpO1xuXG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHN1Ym1pdEVycm9yIH0gPSBzdWJtaXRFcnJvclJlZjtcblxuICAgICAgaWYgKHN1Ym1pdEVycm9yKSB7XG4gICAgICAgIHRpbWVvdXRSZWYuY3VycmVudCAmJiB0aW1lb3V0UmVmLmN1cnJlbnQuZm9yRWFjaChjbGVhclRpbWVvdXQpO1xuXG4gICAgICAgIHNldEVycm9yUmVmLmN1cnJlbnQ/LihmYWxzZSk7XG5cbiAgICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gT2JqZWN0LmZyZWV6ZShbXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzZXRFcnJvclJlZi5jdXJyZW50Py4oc3VibWl0RXJyb3IpLCBUSU1FX1RPX1JFU0VUX0VSUk9SX01FU1NBR0UpLFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0RXJyb3JSZWYuY3VycmVudD8uKGZhbHNlKSwgVElNRV9UT19RVUVVRV9FUlJPUl9NRVNTQUdFKVxuICAgICAgICBdKSBhcyByZWFkb25seSBbVGltZW91dCwgVGltZW91dF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JvbGxUb0VuZFJlZi5jdXJyZW50Py4oKTtcbiAgICAgICAgYXBpU3VibWl0U2VuZEJveCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FwaVN1Ym1pdFNlbmRCb3gsIGNsZWFyVGltZW91dCwgZm9jdXNSZWYsIHNjcm9sbFRvRW5kUmVmLCBzZXRFcnJvclJlZiwgc2V0VGltZW91dCwgc3VibWl0RXJyb3JSZWYsIHRpbWVvdXRSZWZdXG4gICk7XG5cbiAgdXNlRWZmZWN0KFxuICAgIC8vIFByZXZlbnQgYHNldFRpbWVvdXQoKWAgZnJvbSBmaXJpbmcgYWZ0ZXIgdW5tb3VudC5cbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICBzZXRFcnJvclJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgW3NldEVycm9yUmVmXVxuICApO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBzdWJtaXQsXG4gICAgICBzdWJtaXRFcnJvck1lc3NhZ2VJZFN0YXRlXG4gICAgfSksXG4gICAgW3N1Ym1pdCwgc3VibWl0RXJyb3JNZXNzYWdlSWRTdGF0ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxTZW5kQm94Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3dlYmNoYXRfX3N1Ym1pdC1lcnJvci1tZXNzYWdlJywgc3VibWl0RXJyb3JNZXNzYWdlQ2xhc3NOYW1lKX1cbiAgICAgICAgLy8gXCJpZFwiIGlzIHJlcXVpcmVkIGZvciBcImFyaWEtZXJyb3JtZXNzYWdlXCIgYXMgSURSRUYuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9mb3JiaWQtZG9tLXByb3BzXG4gICAgICAgIGlkPXtzdWJtaXRFcnJvck1lc3NhZ2VJZH1cbiAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgID5cbiAgICAgICAge2Vycm9yID8gZXJyb3JNZXNzYWdlU3RyaW5nTWFwLmdldChlcnJvcikgOiAnJ31cbiAgICAgIDwvc3Bhbj5cbiAgICA8L1NlbmRCb3hDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2VuZEJveENvbXBvc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsdUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLHdCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxTQUFBLEdB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