botframework-webchat-component
Version:
React component of botframework-webchat
103 lines (100 loc) • 23 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useActivityAccessibleName;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _react = require("react");
var _SendStatus = require("../types/internal/SendStatus");
var _activityAltText = _interopRequireDefault(require("../Utils/activityAltText"));
var _tabbableElements = _interopRequireDefault(require("../Utils/tabbableElements"));
var _useRenderMarkdownAsHTML = _interopRequireDefault(require("../hooks/useRenderMarkdownAsHTML"));
var _useValueRef = _interopRequireDefault(require("../hooks/internal/useValueRef"));
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 InteractiveType;
(function (InteractiveType) {
InteractiveType[InteractiveType["LINK"] = 0] = "LINK";
InteractiveType[InteractiveType["WIDGET"] = 1] = "WIDGET";
})(InteractiveType || (InteractiveType = {}));
var useAvatarForBot = _botframeworkWebchatApi.hooks.useAvatarForBot,
useGetKeyByActivity = _botframeworkWebchatApi.hooks.useGetKeyByActivity,
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
useSendStatusByActivityKey = _botframeworkWebchatApi.hooks.useSendStatusByActivityKey;
var ACTIVITY_NUM_ATTACHMENTS_ALT_IDS = {
few: 'ACTIVITY_NUM_ATTACHMENTS_FEW_ALT',
many: 'ACTIVITY_NUM_ATTACHMENTS_MANY_ALT',
one: 'ACTIVITY_NUM_ATTACHMENTS_ONE_ALT',
other: 'ACTIVITY_NUM_ATTACHMENTS_OTHER_ALT',
two: 'ACTIVITY_NUM_ATTACHMENTS_TWO_ALT'
};
/**
* Computes accessible name of an activity during transcript navigation.
*
* This text should be kept simple and short.
*
* Due to a bug in Safari, accessible name for active descendant must be a string but not a DOM element.
*/
function useActivityAccessibleName(activity, bodyRef) {
var _activity$from, _activity$attachments;
var _useAvatarForBot = useAvatarForBot(),
_useAvatarForBot2 = _slicedToArray(_useAvatarForBot, 1),
botInitials = _useAvatarForBot2[0].initials;
var _useState = (0, _react.useState)(false),
_useState2 = _slicedToArray(_useState, 2),
interactiveType = _useState2[0],
setInteractiveType = _useState2[1];
var _useSendStatusByActiv = useSendStatusByActivityKey(),
_useSendStatusByActiv2 = _slicedToArray(_useSendStatusByActiv, 1),
sendStatusByActivityKey = _useSendStatusByActiv2[0];
var fromSelf = ((_activity$from = activity.from) === null || _activity$from === void 0 ? void 0 : _activity$from.role) === 'user';
var getKeyByActivity = useGetKeyByActivity();
var localize = useLocalizer();
var localizeWithPlural = useLocalizer({
plural: true
});
var numAttachments = activity.type === 'message' ? ((_activity$attachments = activity.attachments) === null || _activity$attachments === void 0 ? void 0 : _activity$attachments.length) || 0 : 0;
var renderMarkdownAsHTML = (0, _useRenderMarkdownAsHTML.default)();
/** "Click to interact." */
var activityInteractiveFootNoteAlt = localize('ACTIVITY_INTERACTIVE_FOOTNOTE_ALT');
/** "Message is interactive." */
var activityInteractiveReasonInteractiveContentAlt = localize('ACTIVITY_INTERACTIVE_REASON_INTERACTIVE_CONTENT_ALT');
/** "One or more links in the message." */
var activityInteractiveReasonLinkAlt = localize('ACTIVITY_INTERACTIVE_REASON_LINK_ALT');
/** "Send failed." */
var activityInteractiveReasonSendFailedAlt = localize('ACTIVITY_INTERACTIVE_REASON_SEND_FAILED_ALT');
var activityKey = (0, _react.useMemo)(function () {
return getKeyByActivity(activity);
}, [activity, getKeyByActivity]);
var greetingAlt = (0, _react.useMemo)(function () {
return (fromSelf ? localize('ACTIVITY_YOU_SAID_ALT') : localize('ACTIVITY_BOT_SAID_ALT', botInitials || '')).replace(/[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]{2,}/g, ' ');
}, [botInitials, fromSelf, localize]);
var interactiveTypeRef = (0, _useValueRef.default)(interactiveType);
var messageTextAlt = (0, _react.useMemo)(function () {
return (0, _activityAltText.default)(activity, renderMarkdownAsHTML);
}, [activity, renderMarkdownAsHTML]);
var numAttachmentsAlt = (0, _react.useMemo)(function () {
return numAttachments ? localizeWithPlural(ACTIVITY_NUM_ATTACHMENTS_ALT_IDS, numAttachments) : '';
}, [localizeWithPlural, numAttachments]);
var isSendFailed = (0, _react.useMemo)(function () {
return sendStatusByActivityKey.get(activityKey) === _SendStatus.SEND_FAILED;
}, [activityKey, sendStatusByActivityKey]);
var accessibleName = (0, _react.useMemo)(
// We are concatenating in a single string for Safari. If we split it up, Safari will only narrate the first section.
function () {
return [greetingAlt, messageTextAlt, numAttachmentsAlt, isSendFailed ? activityInteractiveReasonSendFailedAlt : '', interactiveType === InteractiveType.LINK ? activityInteractiveReasonLinkAlt : interactiveType === InteractiveType.WIDGET ? activityInteractiveReasonInteractiveContentAlt : '', interactiveType || isSendFailed ? activityInteractiveFootNoteAlt : ''].filter(Boolean).join(' ');
}, [activityInteractiveFootNoteAlt, activityInteractiveReasonInteractiveContentAlt, activityInteractiveReasonLinkAlt, activityInteractiveReasonSendFailedAlt, greetingAlt, interactiveType, isSendFailed, messageTextAlt, numAttachmentsAlt]);
(0, _react.useEffect)(function () {
var _bodyRef$current;
var hasLinks = !!((_bodyRef$current = bodyRef.current) !== null && _bodyRef$current !== void 0 && _bodyRef$current.querySelector('a'));
var hasWidgets = !!(0, _tabbableElements.default)(bodyRef.current).length;
interactiveTypeRef.current !== hasWidgets && setInteractiveType(hasLinks ? InteractiveType.LINK : hasWidgets ? InteractiveType.WIDGET : false);
}, [bodyRef, interactiveTypeRef, setInteractiveType]);
return [accessibleName];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfcmVhY3QiLCJfU2VuZFN0YXR1cyIsIl9hY3Rpdml0eUFsdFRleHQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3RhYmJhYmxlRWxlbWVudHMiLCJfdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJfdXNlVmFsdWVSZWYiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJvIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJuIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibGVuIiwibGVuZ3RoIiwiYXJyMiIsIl9pIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9zIiwiX2UiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJJbnRlcmFjdGl2ZVR5cGUiLCJ1c2VBdmF0YXJGb3JCb3QiLCJob29rcyIsInVzZUdldEtleUJ5QWN0aXZpdHkiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTZW5kU3RhdHVzQnlBY3Rpdml0eUtleSIsIkFDVElWSVRZX05VTV9BVFRBQ0hNRU5UU19BTFRfSURTIiwiZmV3IiwibWFueSIsIm9uZSIsIm90aGVyIiwidHdvIiwidXNlQWN0aXZpdHlBY2Nlc3NpYmxlTmFtZSIsImFjdGl2aXR5IiwiYm9keVJlZiIsIl9hY3Rpdml0eSRmcm9tIiwiX2FjdGl2aXR5JGF0dGFjaG1lbnRzIiwiX3VzZUF2YXRhckZvckJvdCIsIl91c2VBdmF0YXJGb3JCb3QyIiwiYm90SW5pdGlhbHMiLCJpbml0aWFscyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImludGVyYWN0aXZlVHlwZSIsInNldEludGVyYWN0aXZlVHlwZSIsIl91c2VTZW5kU3RhdHVzQnlBY3RpdiIsIl91c2VTZW5kU3RhdHVzQnlBY3RpdjIiLCJzZW5kU3RhdHVzQnlBY3Rpdml0eUtleSIsImZyb21TZWxmIiwicm9sZSIsImdldEtleUJ5QWN0aXZpdHkiLCJsb2NhbGl6ZSIsImxvY2FsaXplV2l0aFBsdXJhbCIsInBsdXJhbCIsIm51bUF0dGFjaG1lbnRzIiwidHlwZSIsImF0dGFjaG1lbnRzIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJ1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCIsImFjdGl2aXR5SW50ZXJhY3RpdmVGb290Tm90ZUFsdCIsImFjdGl2aXR5SW50ZXJhY3RpdmVSZWFzb25JbnRlcmFjdGl2ZUNvbnRlbnRBbHQiLCJhY3Rpdml0eUludGVyYWN0aXZlUmVhc29uTGlua0FsdCIsImFjdGl2aXR5SW50ZXJhY3RpdmVSZWFzb25TZW5kRmFpbGVkQWx0IiwiYWN0aXZpdHlLZXkiLCJ1c2VNZW1vIiwiZ3JlZXRpbmdBbHQiLCJyZXBsYWNlIiwiaW50ZXJhY3RpdmVUeXBlUmVmIiwidXNlVmFsdWVSZWYiLCJtZXNzYWdlVGV4dEFsdCIsImFjdGl2aXR5QWx0VGV4dCIsIm51bUF0dGFjaG1lbnRzQWx0IiwiaXNTZW5kRmFpbGVkIiwiZ2V0IiwiU0VORF9GQUlMRUQiLCJhY2Nlc3NpYmxlTmFtZSIsIkxJTksiLCJXSURHRVQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiam9pbiIsInVzZUVmZmVjdCIsIl9ib2R5UmVmJGN1cnJlbnQiLCJoYXNMaW5rcyIsImN1cnJlbnQiLCJxdWVyeVNlbGVjdG9yIiwiaGFzV2lkZ2V0cyIsInRhYmJhYmxlRWxlbWVudHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UcmFuc2NyaXB0L3VzZUFjdGl2aXR5QWNjZXNzaWJsZU5hbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgUmVmT2JqZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBXZWJDaGF0QWN0aXZpdHkgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuaW1wb3J0IHsgU0VORF9GQUlMRUQgfSBmcm9tICcuLi90eXBlcy9pbnRlcm5hbC9TZW5kU3RhdHVzJztcbmltcG9ydCBhY3Rpdml0eUFsdFRleHQgZnJvbSAnLi4vVXRpbHMvYWN0aXZpdHlBbHRUZXh0JztcbmltcG9ydCB0YWJiYWJsZUVsZW1lbnRzIGZyb20gJy4uL1V0aWxzL3RhYmJhYmxlRWxlbWVudHMnO1xuaW1wb3J0IHVzZVJlbmRlck1hcmtkb3duQXNIVE1MIGZyb20gJy4uL2hvb2tzL3VzZVJlbmRlck1hcmtkb3duQXNIVE1MJztcbmltcG9ydCB1c2VWYWx1ZVJlZiBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VWYWx1ZVJlZic7XG5cbmVudW0gSW50ZXJhY3RpdmVUeXBlIHtcbiAgTElOSyxcbiAgV0lER0VUXG59XG5cbmNvbnN0IHsgdXNlQXZhdGFyRm9yQm90LCB1c2VHZXRLZXlCeUFjdGl2aXR5LCB1c2VMb2NhbGl6ZXIsIHVzZVNlbmRTdGF0dXNCeUFjdGl2aXR5S2V5IH0gPSBob29rcztcblxuY29uc3QgQUNUSVZJVFlfTlVNX0FUVEFDSE1FTlRTX0FMVF9JRFMgPSB7XG4gIGZldzogJ0FDVElWSVRZX05VTV9BVFRBQ0hNRU5UU19GRVdfQUxUJyxcbiAgbWFueTogJ0FDVElWSVRZX05VTV9BVFRBQ0hNRU5UU19NQU5ZX0FMVCcsXG4gIG9uZTogJ0FDVElWSVRZX05VTV9BVFRBQ0hNRU5UU19PTkVfQUxUJyxcbiAgb3RoZXI6ICdBQ1RJVklUWV9OVU1fQVRUQUNITUVOVFNfT1RIRVJfQUxUJyxcbiAgdHdvOiAnQUNUSVZJVFlfTlVNX0FUVEFDSE1FTlRTX1RXT19BTFQnXG59O1xuXG4vKipcbiAqIENvbXB1dGVzIGFjY2Vzc2libGUgbmFtZSBvZiBhbiBhY3Rpdml0eSBkdXJpbmcgdHJhbnNjcmlwdCBuYXZpZ2F0aW9uLlxuICpcbiAqIFRoaXMgdGV4dCBzaG91bGQgYmUga2VwdCBzaW1wbGUgYW5kIHNob3J0LlxuICpcbiAqIER1ZSB0byBhIGJ1ZyBpbiBTYWZhcmksIGFjY2Vzc2libGUgbmFtZSBmb3IgYWN0aXZlIGRlc2NlbmRhbnQgbXVzdCBiZSBhIHN0cmluZyBidXQgbm90IGEgRE9NIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFjdGl2aXR5QWNjZXNzaWJsZU5hbWUoYWN0aXZpdHk6IFdlYkNoYXRBY3Rpdml0eSwgYm9keVJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pikge1xuICBjb25zdCBbeyBpbml0aWFsczogYm90SW5pdGlhbHMgfV0gPSB1c2VBdmF0YXJGb3JCb3QoKTtcbiAgY29uc3QgW2ludGVyYWN0aXZlVHlwZSwgc2V0SW50ZXJhY3RpdmVUeXBlXSA9IHVzZVN0YXRlPEludGVyYWN0aXZlVHlwZSB8IGZhbHNlPihmYWxzZSk7XG4gIGNvbnN0IFtzZW5kU3RhdHVzQnlBY3Rpdml0eUtleV0gPSB1c2VTZW5kU3RhdHVzQnlBY3Rpdml0eUtleSgpO1xuICBjb25zdCBmcm9tU2VsZiA9IGFjdGl2aXR5LmZyb20/LnJvbGUgPT09ICd1c2VyJztcbiAgY29uc3QgZ2V0S2V5QnlBY3Rpdml0eSA9IHVzZUdldEtleUJ5QWN0aXZpdHkoKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3QgbG9jYWxpemVXaXRoUGx1cmFsID0gdXNlTG9jYWxpemVyKHsgcGx1cmFsOiB0cnVlIH0pO1xuICBjb25zdCBudW1BdHRhY2htZW50cyA9IGFjdGl2aXR5LnR5cGUgPT09ICdtZXNzYWdlJyA/IGFjdGl2aXR5LmF0dGFjaG1lbnRzPy5sZW5ndGggfHwgMCA6IDA7XG4gIGNvbnN0IHJlbmRlck1hcmtkb3duQXNIVE1MID0gdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwoKTtcblxuICAvKiogXCJDbGljayB0byBpbnRlcmFjdC5cIiAqL1xuICBjb25zdCBhY3Rpdml0eUludGVyYWN0aXZlRm9vdE5vdGVBbHQgPSBsb2NhbGl6ZSgnQUNUSVZJVFlfSU5URVJBQ1RJVkVfRk9PVE5PVEVfQUxUJyk7XG4gIC8qKiBcIk1lc3NhZ2UgaXMgaW50ZXJhY3RpdmUuXCIgKi9cbiAgY29uc3QgYWN0aXZpdHlJbnRlcmFjdGl2ZVJlYXNvbkludGVyYWN0aXZlQ29udGVudEFsdCA9IGxvY2FsaXplKFxuICAgICdBQ1RJVklUWV9JTlRFUkFDVElWRV9SRUFTT05fSU5URVJBQ1RJVkVfQ09OVEVOVF9BTFQnXG4gICk7XG4gIC8qKiBcIk9uZSBvciBtb3JlIGxpbmtzIGluIHRoZSBtZXNzYWdlLlwiICovXG4gIGNvbnN0IGFjdGl2aXR5SW50ZXJhY3RpdmVSZWFzb25MaW5rQWx0ID0gbG9jYWxpemUoJ0FDVElWSVRZX0lOVEVSQUNUSVZFX1JFQVNPTl9MSU5LX0FMVCcpO1xuICAvKiogXCJTZW5kIGZhaWxlZC5cIiAqL1xuICBjb25zdCBhY3Rpdml0eUludGVyYWN0aXZlUmVhc29uU2VuZEZhaWxlZEFsdCA9IGxvY2FsaXplKCdBQ1RJVklUWV9JTlRFUkFDVElWRV9SRUFTT05fU0VORF9GQUlMRURfQUxUJyk7XG4gIGNvbnN0IGFjdGl2aXR5S2V5ID0gdXNlTWVtbygoKSA9PiBnZXRLZXlCeUFjdGl2aXR5KGFjdGl2aXR5KSwgW2FjdGl2aXR5LCBnZXRLZXlCeUFjdGl2aXR5XSk7XG4gIGNvbnN0IGdyZWV0aW5nQWx0ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgKGZyb21TZWxmID8gbG9jYWxpemUoJ0FDVElWSVRZX1lPVV9TQUlEX0FMVCcpIDogbG9jYWxpemUoJ0FDVElWSVRZX0JPVF9TQUlEX0FMVCcsIGJvdEluaXRpYWxzIHx8ICcnKSkucmVwbGFjZShcbiAgICAgICAgL1xcc3syLH0vZ3UsXG4gICAgICAgICcgJ1xuICAgICAgKSxcbiAgICBbYm90SW5pdGlhbHMsIGZyb21TZWxmLCBsb2NhbGl6ZV1cbiAgKTtcbiAgY29uc3QgaW50ZXJhY3RpdmVUeXBlUmVmID0gdXNlVmFsdWVSZWYoaW50ZXJhY3RpdmVUeXBlKTtcbiAgY29uc3QgbWVzc2FnZVRleHRBbHQgPSB1c2VNZW1vKFxuICAgICgpID0+IGFjdGl2aXR5QWx0VGV4dChhY3Rpdml0eSwgcmVuZGVyTWFya2Rvd25Bc0hUTUwpLFxuICAgIFthY3Rpdml0eSwgcmVuZGVyTWFya2Rvd25Bc0hUTUxdXG4gICk7XG4gIGNvbnN0IG51bUF0dGFjaG1lbnRzQWx0ID0gdXNlTWVtbyhcbiAgICAoKSA9PiAobnVtQXR0YWNobWVudHMgPyBsb2NhbGl6ZVdpdGhQbHVyYWwoQUNUSVZJVFlfTlVNX0FUVEFDSE1FTlRTX0FMVF9JRFMsIG51bUF0dGFjaG1lbnRzKSA6ICcnKSxcbiAgICBbbG9jYWxpemVXaXRoUGx1cmFsLCBudW1BdHRhY2htZW50c11cbiAgKTtcblxuICBjb25zdCBpc1NlbmRGYWlsZWQgPSB1c2VNZW1vKFxuICAgICgpID0+IHNlbmRTdGF0dXNCeUFjdGl2aXR5S2V5LmdldChhY3Rpdml0eUtleSkgPT09IFNFTkRfRkFJTEVELFxuICAgIFthY3Rpdml0eUtleSwgc2VuZFN0YXR1c0J5QWN0aXZpdHlLZXldXG4gICk7XG5cbiAgY29uc3QgYWNjZXNzaWJsZU5hbWUgPSB1c2VNZW1vKFxuICAgIC8vIFdlIGFyZSBjb25jYXRlbmF0aW5nIGluIGEgc2luZ2xlIHN0cmluZyBmb3IgU2FmYXJpLiBJZiB3ZSBzcGxpdCBpdCB1cCwgU2FmYXJpIHdpbGwgb25seSBuYXJyYXRlIHRoZSBmaXJzdCBzZWN0aW9uLlxuICAgICgpID0+XG4gICAgICBbXG4gICAgICAgIGdyZWV0aW5nQWx0LFxuICAgICAgICBtZXNzYWdlVGV4dEFsdCxcbiAgICAgICAgbnVtQXR0YWNobWVudHNBbHQsXG4gICAgICAgIGlzU2VuZEZhaWxlZCA/IGFjdGl2aXR5SW50ZXJhY3RpdmVSZWFzb25TZW5kRmFpbGVkQWx0IDogJycsXG4gICAgICAgIGludGVyYWN0aXZlVHlwZSA9PT0gSW50ZXJhY3RpdmVUeXBlLkxJTktcbiAgICAgICAgICA/IGFjdGl2aXR5SW50ZXJhY3RpdmVSZWFzb25MaW5rQWx0XG4gICAgICAgICAgOiBpbnRlcmFjdGl2ZVR5cGUgPT09IEludGVyYWN0aXZlVHlwZS5XSURHRVRcbiAgICAgICAgICAgID8gYWN0aXZpdHlJbnRlcmFjdGl2ZVJlYXNvbkludGVyYWN0aXZlQ29udGVudEFsdFxuICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgaW50ZXJhY3RpdmVUeXBlIHx8IGlzU2VuZEZhaWxlZCA/IGFjdGl2aXR5SW50ZXJhY3RpdmVGb290Tm90ZUFsdCA6ICcnXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKSxcbiAgICBbXG4gICAgICBhY3Rpdml0eUludGVyYWN0aXZlRm9vdE5vdGVBbHQsXG4gICAgICBhY3Rpdml0eUludGVyYWN0aXZlUmVhc29uSW50ZXJhY3RpdmVDb250ZW50QWx0LFxuICAgICAgYWN0aXZpdHlJbnRlcmFjdGl2ZVJlYXNvbkxpbmtBbHQsXG4gICAgICBhY3Rpdml0eUludGVyYWN0aXZlUmVhc29uU2VuZEZhaWxlZEFsdCxcbiAgICAgIGdyZWV0aW5nQWx0LFxuICAgICAgaW50ZXJhY3RpdmVUeXBlLFxuICAgICAgaXNTZW5kRmFpbGVkLFxuICAgICAgbWVzc2FnZVRleHRBbHQsXG4gICAgICBudW1BdHRhY2htZW50c0FsdFxuICAgIF1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc0xpbmtzID0gISFib2R5UmVmLmN1cnJlbnQ/LnF1ZXJ5U2VsZWN0b3IoJ2EnKTtcbiAgICBjb25zdCBoYXNXaWRnZXRzID0gISF0YWJiYWJsZUVsZW1lbnRzKGJvZHlSZWYuY3VycmVudCkubGVuZ3RoO1xuXG4gICAgaW50ZXJhY3RpdmVUeXBlUmVmLmN1cnJlbnQgIT09IGhhc1dpZGdldHMgJiZcbiAgICAgIHNldEludGVyYWN0aXZlVHlwZShoYXNMaW5rcyA/IEludGVyYWN0aXZlVHlwZS5MSU5LIDogaGFzV2lkZ2V0cyA/IEludGVyYWN0aXZlVHlwZS5XSURHRVQgOiBmYWxzZSk7XG4gIH0sIFtib2R5UmVmLCBpbnRlcmFjdGl2ZVR5cGVSZWYsIHNldEludGVyYWN0aXZlVHlwZV0pO1xuXG4gIHJldHVybiBbYWNjZXNzaWJsZU5hbWVdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBSUEsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLGlCQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSx3QkFBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8sWUFBQSxHQUFBSCxzQkFBQSxDQUFBSixPQUFBO0FBQXdELFNBQUFJLHVCQUFBSSxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUUsT0FBQSxFQUFBRixHQUFBO0FBQUEsU0FBQUcsZUFBQUMsR0FBQSxFQUFBQyxDQUFBLFdBQUFDLGVBQUEsQ0FBQUYsR0FBQSxLQUFBRyxxQkFBQSxDQUFBSCxHQUFBLEVBQUFDLENBQUEsS0FBQUcsMkJBQUEsQ0FBQUosR0FBQSxFQUFBQyxDQUFBLEtBQUFJLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFGLDRCQUFBRyxDQUFBLEVBQUFDLE1BQUEsU0FBQUQsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQUUsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLENBQUFDLFFBQUEsQ0FBQUMsSUFBQSxDQUFBUCxDQUFBLEVBQUFRLEtBQUEsYUFBQUwsQ0FBQSxpQkFBQUgsQ0FBQSxDQUFBUyxXQUFBLEVBQUFOLENBQUEsR0FBQUgsQ0FBQSxDQUFBUyxXQUFBLENBQUFDLElBQUEsTUFBQVAsQ0FBQSxjQUFBQSxDQUFBLG1CQUFBUSxLQUFBLENBQUFDLElBQUEsQ0FBQVosQ0FBQSxPQUFBRyxDQUFBLCtEQUFBVSxJQUFBLENBQUFWLENBQUEsVUFBQUQsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBO0FBQUEsU0FBQUMsa0JBQUFULEdBQUEsRUFBQXFCLEdBQUEsUUFBQUEsR0FBQSxZQUFBQSxHQUFBLEdBQUFyQixHQUFBLENBQUFzQixNQUFBLEVBQUFELEdBQUEsR0FBQXJCLEdBQUEsQ0FBQXNCLE1BQUEsV0FBQXJCLENBQUEsTUFBQXNCLElBQUEsT0FBQUwsS0FBQSxDQUFBRyxHQUFBLEdBQUFwQixDQUFBLEdBQUFvQixHQUFBLEVBQUFwQixDQUFBLE1BQUFzQixJQUFBLENBQUF0QixDQUFBLElBQUFELEdBQUEsQ0FBQUMsQ0FBQSxZQUFBc0IsSUFBQTtBQUFBLFNBQUFwQixzQkFBQUgsR0FBQSxFQUFBQyxDQUFBLFFBQUF1QixFQUFBLEdBQUF4QixHQUFBLHlCQUFBeUIsTUFBQSxvQkFBQXpCLEdBQUEsQ0FBQXlCLE1BQUEsQ0FBQUMsUUFBQSxLQUFBMUIsR0FBQSxvQkFBQXdCLEVBQUEsc0JBQUFHLElBQUEsV0FBQUMsRUFBQSxhQUFBQyxFQUFBLGNBQUFDLEVBQUEsRUFBQUMsRUFBQSxhQUFBUCxFQUFBLEdBQUFBLEVBQUEsQ0FBQVYsSUFBQSxDQUFBZCxHQUFBLEtBQUE0QixFQUFBLElBQUFFLEVBQUEsR0FBQU4sRUFBQSxDQUFBUSxJQUFBLElBQUFDLElBQUEsR0FBQUwsRUFBQSxXQUFBRCxJQUFBLENBQUFPLElBQUEsQ0FBQUosRUFBQSxDQUFBSyxLQUFBLE9BQUFsQyxDQUFBLElBQUEwQixJQUFBLENBQUFMLE1BQUEsS0FBQXJCLENBQUEsb0JBQUFtQyxHQUFBLElBQUFQLEVBQUEsU0FBQUUsRUFBQSxHQUFBSyxHQUFBLHlCQUFBUixFQUFBLElBQUFKLEVBQUEsb0JBQUFBLEVBQUEsOEJBQUFLLEVBQUEsUUFBQUUsRUFBQSxhQUFBSixJQUFBO0FBQUEsU0FBQXpCLGdCQUFBRixHQUFBLFFBQUFrQixLQUFBLENBQUFtQixPQUFBLENBQUFyQyxHQUFBLFVBQUFBLEdBQUE7QUFBQSxJQUVuRHNDLGVBQWU7QUFBQSxXQUFmQSxlQUFlO0VBQWZBLGVBQWUsQ0FBZkEsZUFBZTtFQUFmQSxlQUFlLENBQWZBLGVBQWU7QUFBQSxHQUFmQSxlQUFlLEtBQWZBLGVBQWU7QUFLcEIsSUFBUUMsZUFBZSxHQUFvRUMsNkJBQUssQ0FBeEZELGVBQWU7RUFBRUUsbUJBQW1CLEdBQStDRCw2QkFBSyxDQUF2RUMsbUJBQW1CO0VBQUVDLFlBQVksR0FBaUNGLDZCQUFLLENBQWxERSxZQUFZO0VBQUVDLDBCQUEwQixHQUFLSCw2QkFBSyxDQUFwQ0csMEJBQTBCO0FBRXRGLElBQU1DLGdDQUFnQyxHQUFHO0VBQ3ZDQyxHQUFHLEVBQUUsa0NBQWtDO0VBQ3ZDQyxJQUFJLEVBQUUsbUNBQW1DO0VBQ3pDQyxHQUFHLEVBQUUsa0NBQWtDO0VBQ3ZDQyxLQUFLLEVBQUUsb0NBQW9DO0VBQzNDQyxHQUFHLEVBQUU7QUFDUCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU0MseUJBQXlCQSxDQUFDQyxRQUF5QixFQUFFQyxPQUErQixFQUFFO0VBQUEsSUFBQUMsY0FBQSxFQUFBQyxxQkFBQTtFQUM1RyxJQUFBQyxnQkFBQSxHQUFvQ2hCLGVBQWUsQ0FBQyxDQUFDO0lBQUFpQixpQkFBQSxHQUFBekQsY0FBQSxDQUFBd0QsZ0JBQUE7SUFBbENFLFdBQVcsR0FBQUQsaUJBQUEsSUFBckJFLFFBQVE7RUFDakIsSUFBQUMsU0FBQSxHQUE4QyxJQUFBQyxlQUFRLEVBQTBCLEtBQUssQ0FBQztJQUFBQyxVQUFBLEdBQUE5RCxjQUFBLENBQUE0RCxTQUFBO0lBQS9FRyxlQUFlLEdBQUFELFVBQUE7SUFBRUUsa0JBQWtCLEdBQUFGLFVBQUE7RUFDMUMsSUFBQUcscUJBQUEsR0FBa0NyQiwwQkFBMEIsQ0FBQyxDQUFDO0lBQUFzQixzQkFBQSxHQUFBbEUsY0FBQSxDQUFBaUUscUJBQUE7SUFBdkRFLHVCQUF1QixHQUFBRCxzQkFBQTtFQUM5QixJQUFNRSxRQUFRLEdBQUcsRUFBQWQsY0FBQSxHQUFBRixRQUFRLENBQUNoQyxJQUFJLGNBQUFrQyxjQUFBLHVCQUFiQSxjQUFBLENBQWVlLElBQUksTUFBSyxNQUFNO0VBQy9DLElBQU1DLGdCQUFnQixHQUFHNUIsbUJBQW1CLENBQUMsQ0FBQztFQUM5QyxJQUFNNkIsUUFBUSxHQUFHNUIsWUFBWSxDQUFDLENBQUM7RUFDL0IsSUFBTTZCLGtCQUFrQixHQUFHN0IsWUFBWSxDQUFDO0lBQUU4QixNQUFNLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDekQsSUFBTUMsY0FBYyxHQUFHdEIsUUFBUSxDQUFDdUIsSUFBSSxLQUFLLFNBQVMsR0FBRyxFQUFBcEIscUJBQUEsR0FBQUgsUUFBUSxDQUFDd0IsV0FBVyxjQUFBckIscUJBQUEsdUJBQXBCQSxxQkFBQSxDQUFzQmhDLE1BQU0sS0FBSSxDQUFDLEdBQUcsQ0FBQztFQUMxRixJQUFNc0Qsb0JBQW9CLEdBQUcsSUFBQUMsZ0NBQXVCLEVBQUMsQ0FBQzs7RUFFdEQ7RUFDQSxJQUFNQyw4QkFBOEIsR0FBR1IsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO0VBQ3BGO0VBQ0EsSUFBTVMsOENBQThDLEdBQUdULFFBQVEsQ0FDN0QscURBQ0YsQ0FBQztFQUNEO0VBQ0EsSUFBTVUsZ0NBQWdDLEdBQUdWLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztFQUN6RjtFQUNBLElBQU1XLHNDQUFzQyxHQUFHWCxRQUFRLENBQUMsNkNBQTZDLENBQUM7RUFDdEcsSUFBTVksV0FBVyxHQUFHLElBQUFDLGNBQU8sRUFBQztJQUFBLE9BQU1kLGdCQUFnQixDQUFDbEIsUUFBUSxDQUFDO0VBQUEsR0FBRSxDQUFDQSxRQUFRLEVBQUVrQixnQkFBZ0IsQ0FBQyxDQUFDO0VBQzNGLElBQU1lLFdBQVcsR0FBRyxJQUFBRCxjQUFPLEVBQ3pCO0lBQUEsT0FDRSxDQUFDaEIsUUFBUSxHQUFHRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsR0FBR0EsUUFBUSxDQUFDLHVCQUF1QixFQUFFYixXQUFXLElBQUksRUFBRSxDQUFDLEVBQUU0QixPQUFPLENBQzNHLDBFQUFVLEVBQ1YsR0FDRixDQUFDO0VBQUEsR0FDSCxDQUFDNUIsV0FBVyxFQUFFVSxRQUFRLEVBQUVHLFFBQVEsQ0FDbEMsQ0FBQztFQUNELElBQU1nQixrQkFBa0IsR0FBRyxJQUFBQyxvQkFBVyxFQUFDekIsZUFBZSxDQUFDO0VBQ3ZELElBQU0wQixjQUFjLEdBQUcsSUFBQUwsY0FBTyxFQUM1QjtJQUFBLE9BQU0sSUFBQU0sd0JBQWUsRUFBQ3RDLFFBQVEsRUFBRXlCLG9CQUFvQixDQUFDO0VBQUEsR0FDckQsQ0FBQ3pCLFFBQVEsRUFBRXlCLG9CQUFvQixDQUNqQyxDQUFDO0VBQ0QsSUFBTWMsaUJBQWlCLEdBQUcsSUFBQVAsY0FBTyxFQUMvQjtJQUFBLE9BQU9WLGNBQWMsR0FBR0Ysa0JBQWtCLENBQUMzQixnQ0FBZ0MsRUFBRTZCLGNBQWMsQ0FBQyxHQUFHLEVBQUU7RUFBQSxDQUFDLEVBQ2xHLENBQUNGLGtCQUFrQixFQUFFRSxjQUFjLENBQ3JDLENBQUM7RUFFRCxJQUFNa0IsWUFBWSxHQUFHLElBQUFSLGNBQU8sRUFDMUI7SUFBQSxPQUFNakIsdUJBQXVCLENBQUMwQixHQUFHLENBQUNWLFdBQVcsQ0FBQyxLQUFLVyx1QkFBVztFQUFBLEdBQzlELENBQUNYLFdBQVcsRUFBRWhCLHVCQUF1QixDQUN2QyxDQUFDO0VBRUQsSUFBTTRCLGNBQWMsR0FBRyxJQUFBWCxjQUFPO0VBQzVCO0VBQ0E7SUFBQSxPQUNFLENBQ0VDLFdBQVcsRUFDWEksY0FBYyxFQUNkRSxpQkFBaUIsRUFDakJDLFlBQVksR0FBR1Ysc0NBQXNDLEdBQUcsRUFBRSxFQUMxRG5CLGVBQWUsS0FBS3hCLGVBQWUsQ0FBQ3lELElBQUksR0FDcENmLGdDQUFnQyxHQUNoQ2xCLGVBQWUsS0FBS3hCLGVBQWUsQ0FBQzBELE1BQU0sR0FDeENqQiw4Q0FBOEMsR0FDOUMsRUFBRSxFQUNSakIsZUFBZSxJQUFJNkIsWUFBWSxHQUFHYiw4QkFBOEIsR0FBRyxFQUFFLENBQ3RFLENBQ0VtQixNQUFNLENBQUNDLE9BQU8sQ0FBQyxDQUNmQyxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQUEsR0FDZCxDQUNFckIsOEJBQThCLEVBQzlCQyw4Q0FBOEMsRUFDOUNDLGdDQUFnQyxFQUNoQ0Msc0NBQXNDLEVBQ3RDRyxXQUFXLEVBQ1h0QixlQUFlLEVBQ2Y2QixZQUFZLEVBQ1pILGNBQWMsRUFDZEUsaUJBQWlCLENBRXJCLENBQUM7RUFFRCxJQUFBVSxnQkFBUyxFQUFDLFlBQU07SUFBQSxJQUFBQyxnQkFBQTtJQUNkLElBQU1DLFFBQVEsR0FBRyxDQUFDLEdBQUFELGdCQUFBLEdBQUNqRCxPQUFPLENBQUNtRCxPQUFPLGNBQUFGLGdCQUFBLGVBQWZBLGdCQUFBLENBQWlCRyxhQUFhLENBQUMsR0FBRyxDQUFDO0lBQ3RELElBQU1DLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBQUMseUJBQWdCLEVBQUN0RCxPQUFPLENBQUNtRCxPQUFPLENBQUMsQ0FBQ2pGLE1BQU07SUFFN0RnRSxrQkFBa0IsQ0FBQ2lCLE9BQU8sS0FBS0UsVUFBVSxJQUN2QzFDLGtCQUFrQixDQUFDdUMsUUFBUSxHQUFHaEUsZUFBZSxDQUFDeUQsSUFBSSxHQUFHVSxVQUFVLEdBQUduRSxlQUFlLENBQUMwRCxNQUFNLEdBQUcsS0FBSyxDQUFDO0VBQ3JHLENBQUMsRUFBRSxDQUFDNUMsT0FBTyxFQUFFa0Msa0JBQWtCLEVBQUV2QixrQkFBa0IsQ0FBQyxDQUFDO0VBRXJELE9BQU8sQ0FBQytCLGNBQWMsQ0FBQztBQUN6QiJ9
;