UNPKG

matrix-react-sdk

Version:
161 lines (150 loc) 30.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.IncomingCallToast = IncomingCallToast; exports.getIncomingCallToastKey = void 0; var _react = _interopRequireWildcard(require("react")); var _compoundWeb = require("@vector-im/compound-web"); var _videoCallSolid = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/video-call-solid")); var _languageHandler = require("../languageHandler"); var _RoomAvatar = _interopRequireDefault(require("../components/views/avatars/RoomAvatar")); var _MatrixClientPeg = require("../MatrixClientPeg"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _actions = require("../dispatcher/actions"); var _ToastStore = _interopRequireDefault(require("../stores/ToastStore")); var _LiveContentSummary = require("../components/views/rooms/LiveContentSummary"); var _useCall = require("../hooks/useCall"); var _AccessibleButton = _interopRequireDefault(require("../components/views/elements/AccessibleButton")); var _useDispatcher = require("../hooks/useDispatcher"); var _Call = require("../models/Call"); var _LegacyCallHandler = _interopRequireWildcard(require("../LegacyCallHandler")); var _useEventEmitter = require("../hooks/useEventEmitter"); var _CallStore = require("../stores/CallStore"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const getIncomingCallToastKey = (callId, roomId) => `call_${callId}_${roomId}`; exports.getIncomingCallToastKey = getIncomingCallToastKey; const MAX_RING_TIME_MS = 10 * 1000; function JoinCallButtonWithCall({ onClick, call, disabledTooltip }) { let disTooltip = disabledTooltip; const disabledBecauseFullTooltip = (0, _useCall.useJoinCallButtonDisabledTooltip)(call); disTooltip = disabledTooltip ?? disabledBecauseFullTooltip ?? undefined; return /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, { description: disTooltip ?? (0, _languageHandler._t)("voip|video_call") }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, { className: "mx_IncomingCallToast_joinButton", onClick: onClick, disabled: disTooltip != undefined, kind: "primary", Icon: _videoCallSolid.default, size: "sm" }, (0, _languageHandler._t)("action|join"))); } function IncomingCallToast({ notifyEvent }) { const roomId = notifyEvent.getRoomId(); const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(roomId) ?? undefined; const call = (0, _useCall.useCall)(roomId); const [connectedCalls, setConnectedCalls] = (0, _react.useState)(Array.from(_CallStore.CallStore.instance.connectedCalls)); (0, _useEventEmitter.useEventEmitter)(_CallStore.CallStore.instance, _CallStore.CallStoreEvent.ConnectedCalls, () => { setConnectedCalls(Array.from(_CallStore.CallStore.instance.connectedCalls)); }); const otherCallIsOngoing = connectedCalls.find(call => call.roomId !== roomId); // Start ringing if not already. (0, _react.useEffect)(() => { const isRingToast = notifyEvent.getContent()["notify_type"] == "ring"; if (isRingToast && !_LegacyCallHandler.default.instance.isPlaying(_LegacyCallHandler.AudioID.Ring)) { _LegacyCallHandler.default.instance.play(_LegacyCallHandler.AudioID.Ring); } }, [notifyEvent]); // Stop ringing on dismiss. const dismissToast = (0, _react.useCallback)(() => { _ToastStore.default.sharedInstance().dismissToast(getIncomingCallToastKey(notifyEvent.getContent().call_id ?? "", roomId)); _LegacyCallHandler.default.instance.pause(_LegacyCallHandler.AudioID.Ring); }, [notifyEvent, roomId]); // Dismiss if session got ended remotely. const onCall = (0, _react.useCallback)((call, callRoomId) => { const roomId = notifyEvent.getRoomId(); if (!roomId && roomId !== callRoomId) return; if (call === null || call.participants.size === 0) { dismissToast(); } }, [dismissToast, notifyEvent]); // Dismiss if antother device from this user joins. const onParticipantChange = (0, _react.useCallback)((participants, prevParticipants) => { if (Array.from(participants.keys()).some(p => p.userId == room?.client.getUserId())) { dismissToast(); } }, [dismissToast, room?.client]); // Dismiss on timeout. (0, _react.useEffect)(() => { const timeout = setTimeout(dismissToast, MAX_RING_TIME_MS); return () => clearTimeout(timeout); }); // Dismiss on viewing call. (0, _useDispatcher.useDispatcher)(_dispatcher.default, (0, _react.useCallback)(payload => { if (payload.action === _actions.Action.ViewRoom && payload.room_id === roomId && payload.view_call) { dismissToast(); } }, [roomId, dismissToast])); // Dismiss on clicking join. const onJoinClick = (0, _react.useCallback)(e => { e.stopPropagation(); // The toast will be automatically dismissed by the dispatcher callback above _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: room?.roomId, view_call: true, skipLobby: "shiftKey" in e ? e.shiftKey : false, metricsTrigger: undefined }); }, [room]); // Dismiss on closing toast. const onCloseClick = (0, _react.useCallback)(e => { e.stopPropagation(); dismissToast(); }, [dismissToast]); (0, _useEventEmitter.useEventEmitter)(_CallStore.CallStore.instance, _CallStore.CallStoreEvent.Call, onCall); (0, _useEventEmitter.useEventEmitter)(call ?? undefined, _Call.CallEvent.Participants, onParticipantChange); return /*#__PURE__*/_react.default.createElement(_compoundWeb.TooltipProvider, null, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { room: room ?? undefined, size: "24px" })), /*#__PURE__*/_react.default.createElement("div", { className: "mx_IncomingCallToast_content" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_IncomingCallToast_info" }, /*#__PURE__*/_react.default.createElement("span", { className: "mx_IncomingCallToast_room" }, room ? room.name : (0, _languageHandler._t)("voip|call_toast_unknown_room")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_IncomingCallToast_message" }, (0, _languageHandler._t)("voip|video_call_started")), call ? /*#__PURE__*/_react.default.createElement(_LiveContentSummary.LiveContentSummaryWithCall, { call: call }) : /*#__PURE__*/_react.default.createElement(_LiveContentSummary.LiveContentSummary, { type: _LiveContentSummary.LiveContentType.Video, text: (0, _languageHandler._t)("common|video"), active: false, participantCount: 0 })), /*#__PURE__*/_react.default.createElement(JoinCallButtonWithCall, { onClick: onJoinClick, call: call, disabledTooltip: otherCallIsOngoing ? "Ongoing call" : undefined })), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_IncomingCallToast_closeButton", onClick: onCloseClick, title: (0, _languageHandler._t)("action|close") }))); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY29tcG91bmRXZWIiLCJfdmlkZW9DYWxsU29saWQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Sb29tQXZhdGFyIiwiX01hdHJpeENsaWVudFBlZyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfVG9hc3RTdG9yZSIsIl9MaXZlQ29udGVudFN1bW1hcnkiLCJfdXNlQ2FsbCIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX3VzZURpc3BhdGNoZXIiLCJfQ2FsbCIsIl9MZWdhY3lDYWxsSGFuZGxlciIsIl91c2VFdmVudEVtaXR0ZXIiLCJfQ2FsbFN0b3JlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiZ2V0SW5jb21pbmdDYWxsVG9hc3RLZXkiLCJjYWxsSWQiLCJyb29tSWQiLCJleHBvcnRzIiwiTUFYX1JJTkdfVElNRV9NUyIsIkpvaW5DYWxsQnV0dG9uV2l0aENhbGwiLCJvbkNsaWNrIiwiZGlzYWJsZWRUb29sdGlwIiwiZGlzVG9vbHRpcCIsImRpc2FibGVkQmVjYXVzZUZ1bGxUb29sdGlwIiwidXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAiLCJ1bmRlZmluZWQiLCJjcmVhdGVFbGVtZW50IiwiVG9vbHRpcCIsImRlc2NyaXB0aW9uIiwiX3QiLCJCdXR0b24iLCJjbGFzc05hbWUiLCJkaXNhYmxlZCIsImtpbmQiLCJJY29uIiwiVmlkZW9DYWxsSWNvbiIsInNpemUiLCJJbmNvbWluZ0NhbGxUb2FzdCIsIm5vdGlmeUV2ZW50IiwiZ2V0Um9vbUlkIiwicm9vbSIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRSb29tIiwidXNlQ2FsbCIsImNvbm5lY3RlZENhbGxzIiwic2V0Q29ubmVjdGVkQ2FsbHMiLCJ1c2VTdGF0ZSIsIkFycmF5IiwiZnJvbSIsIkNhbGxTdG9yZSIsImluc3RhbmNlIiwidXNlRXZlbnRFbWl0dGVyIiwiQ2FsbFN0b3JlRXZlbnQiLCJDb25uZWN0ZWRDYWxscyIsIm90aGVyQ2FsbElzT25nb2luZyIsImZpbmQiLCJ1c2VFZmZlY3QiLCJpc1JpbmdUb2FzdCIsImdldENvbnRlbnQiLCJMZWdhY3lDYWxsSGFuZGxlciIsImlzUGxheWluZyIsIkF1ZGlvSUQiLCJSaW5nIiwicGxheSIsImRpc21pc3NUb2FzdCIsInVzZUNhbGxiYWNrIiwiVG9hc3RTdG9yZSIsInNoYXJlZEluc3RhbmNlIiwiY2FsbF9pZCIsInBhdXNlIiwib25DYWxsIiwiY2FsbFJvb21JZCIsInBhcnRpY2lwYW50cyIsIm9uUGFydGljaXBhbnRDaGFuZ2UiLCJwcmV2UGFydGljaXBhbnRzIiwia2V5cyIsInNvbWUiLCJwIiwidXNlcklkIiwiY2xpZW50IiwiZ2V0VXNlcklkIiwidGltZW91dCIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJ1c2VEaXNwYXRjaGVyIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJwYXlsb2FkIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1Jvb20iLCJyb29tX2lkIiwidmlld19jYWxsIiwib25Kb2luQ2xpY2siLCJzdG9wUHJvcGFnYXRpb24iLCJkaXNwYXRjaCIsInNraXBMb2JieSIsInNoaWZ0S2V5IiwibWV0cmljc1RyaWdnZXIiLCJvbkNsb3NlQ2xpY2siLCJDYWxsIiwiQ2FsbEV2ZW50IiwiUGFydGljaXBhbnRzIiwiVG9vbHRpcFByb3ZpZGVyIiwiRnJhZ21lbnQiLCJuYW1lIiwiTGl2ZUNvbnRlbnRTdW1tYXJ5V2l0aENhbGwiLCJMaXZlQ29udGVudFN1bW1hcnkiLCJ0eXBlIiwiTGl2ZUNvbnRlbnRUeXBlIiwiVmlkZW8iLCJ0ZXh0IiwiYWN0aXZlIiwicGFydGljaXBhbnRDb3VudCIsInRpdGxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvYXN0cy9JbmNvbWluZ0NhbGxUb2FzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgUm9vbU1lbWJlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEJ1dHRvbiwgVG9vbHRpcCwgVG9vbHRpcFByb3ZpZGVyIH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtd2ViXCI7XG5pbXBvcnQgVmlkZW9DYWxsSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvdmlkZW8tY2FsbC1zb2xpZFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL2F2YXRhcnMvUm9vbUF2YXRhclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IFRvYXN0U3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9Ub2FzdFN0b3JlXCI7XG5pbXBvcnQge1xuICAgIExpdmVDb250ZW50U3VtbWFyeSxcbiAgICBMaXZlQ29udGVudFN1bW1hcnlXaXRoQ2FsbCxcbiAgICBMaXZlQ29udGVudFR5cGUsXG59IGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL0xpdmVDb250ZW50U3VtbWFyeVwiO1xuaW1wb3J0IHsgdXNlQ2FsbCwgdXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAgfSBmcm9tIFwiLi4vaG9va3MvdXNlQ2FsbFwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2hvb2tzL3VzZURpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgQ2FsbCwgQ2FsbEV2ZW50IH0gZnJvbSBcIi4uL21vZGVscy9DYWxsXCI7XG5pbXBvcnQgTGVnYWN5Q2FsbEhhbmRsZXIsIHsgQXVkaW9JRCB9IGZyb20gXCIuLi9MZWdhY3lDYWxsSGFuZGxlclwiO1xuaW1wb3J0IHsgdXNlRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQ2FsbFN0b3JlLCBDYWxsU3RvcmVFdmVudCB9IGZyb20gXCIuLi9zdG9yZXMvQ2FsbFN0b3JlXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRJbmNvbWluZ0NhbGxUb2FzdEtleSA9IChjYWxsSWQ6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGNhbGxfJHtjYWxsSWR9XyR7cm9vbUlkfWA7XG5jb25zdCBNQVhfUklOR19USU1FX01TID0gMTAgKiAxMDAwO1xuXG5pbnRlcmZhY2UgSm9pbkNhbGxCdXR0b25XaXRoQ2FsbFByb3BzIHtcbiAgICBvbkNsaWNrOiAoZTogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgY2FsbDogQ2FsbCB8IG51bGw7XG4gICAgZGlzYWJsZWRUb29sdGlwOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIEpvaW5DYWxsQnV0dG9uV2l0aENhbGwoeyBvbkNsaWNrLCBjYWxsLCBkaXNhYmxlZFRvb2x0aXAgfTogSm9pbkNhbGxCdXR0b25XaXRoQ2FsbFByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGxldCBkaXNUb29sdGlwID0gZGlzYWJsZWRUb29sdGlwO1xuICAgIGNvbnN0IGRpc2FibGVkQmVjYXVzZUZ1bGxUb29sdGlwID0gdXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAoY2FsbCk7XG4gICAgZGlzVG9vbHRpcCA9IGRpc2FibGVkVG9vbHRpcCA/PyBkaXNhYmxlZEJlY2F1c2VGdWxsVG9vbHRpcCA/PyB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8VG9vbHRpcCBkZXNjcmlwdGlvbj17ZGlzVG9vbHRpcCA/PyBfdChcInZvaXB8dmlkZW9fY2FsbFwiKX0+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfSW5jb21pbmdDYWxsVG9hc3Rfam9pbkJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzVG9vbHRpcCAhPSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIEljb249e1ZpZGVvQ2FsbEljb259XG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258am9pblwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgKTtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgICBub3RpZnlFdmVudDogTWF0cml4RXZlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmNvbWluZ0NhbGxUb2FzdCh7IG5vdGlmeUV2ZW50IH06IFByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHJvb21JZCA9IG5vdGlmeUV2ZW50LmdldFJvb21JZCgpITtcbiAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKHJvb21JZCkgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbGwgPSB1c2VDYWxsKHJvb21JZCk7XG4gICAgY29uc3QgW2Nvbm5lY3RlZENhbGxzLCBzZXRDb25uZWN0ZWRDYWxsc10gPSB1c2VTdGF0ZTxDYWxsW10+KEFycmF5LmZyb20oQ2FsbFN0b3JlLmluc3RhbmNlLmNvbm5lY3RlZENhbGxzKSk7XG4gICAgdXNlRXZlbnRFbWl0dGVyKENhbGxTdG9yZS5pbnN0YW5jZSwgQ2FsbFN0b3JlRXZlbnQuQ29ubmVjdGVkQ2FsbHMsICgpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGVkQ2FsbHMoQXJyYXkuZnJvbShDYWxsU3RvcmUuaW5zdGFuY2UuY29ubmVjdGVkQ2FsbHMpKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdGhlckNhbGxJc09uZ29pbmcgPSBjb25uZWN0ZWRDYWxscy5maW5kKChjYWxsKSA9PiBjYWxsLnJvb21JZCAhPT0gcm9vbUlkKTtcbiAgICAvLyBTdGFydCByaW5naW5nIGlmIG5vdCBhbHJlYWR5LlxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzUmluZ1RvYXN0ID0gKG5vdGlmeUV2ZW50LmdldENvbnRlbnQoKSBhcyB1bmtub3duIGFzIHsgbm90aWZ5X3R5cGU6IHN0cmluZyB9KVtcIm5vdGlmeV90eXBlXCJdID09IFwicmluZ1wiO1xuICAgICAgICBpZiAoaXNSaW5nVG9hc3QgJiYgIUxlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLmlzUGxheWluZyhBdWRpb0lELlJpbmcpKSB7XG4gICAgICAgICAgICBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5wbGF5KEF1ZGlvSUQuUmluZyk7XG4gICAgICAgIH1cbiAgICB9LCBbbm90aWZ5RXZlbnRdKTtcblxuICAgIC8vIFN0b3AgcmluZ2luZyBvbiBkaXNtaXNzLlxuICAgIGNvbnN0IGRpc21pc3NUb2FzdCA9IHVzZUNhbGxiYWNrKCgpOiB2b2lkID0+IHtcbiAgICAgICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmRpc21pc3NUb2FzdChcbiAgICAgICAgICAgIGdldEluY29taW5nQ2FsbFRvYXN0S2V5KG5vdGlmeUV2ZW50LmdldENvbnRlbnQoKS5jYWxsX2lkID8/IFwiXCIsIHJvb21JZCksXG4gICAgICAgICk7XG4gICAgICAgIExlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLnBhdXNlKEF1ZGlvSUQuUmluZyk7XG4gICAgfSwgW25vdGlmeUV2ZW50LCByb29tSWRdKTtcblxuICAgIC8vIERpc21pc3MgaWYgc2Vzc2lvbiBnb3QgZW5kZWQgcmVtb3RlbHkuXG4gICAgY29uc3Qgb25DYWxsID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChjYWxsOiBDYWxsLCBjYWxsUm9vbUlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvb21JZCA9IG5vdGlmeUV2ZW50LmdldFJvb21JZCgpO1xuICAgICAgICAgICAgaWYgKCFyb29tSWQgJiYgcm9vbUlkICE9PSBjYWxsUm9vbUlkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoY2FsbCA9PT0gbnVsbCB8fCBjYWxsLnBhcnRpY2lwYW50cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlzbWlzc1RvYXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNtaXNzVG9hc3QsIG5vdGlmeUV2ZW50XSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBpZiBhbnRvdGhlciBkZXZpY2UgZnJvbSB0aGlzIHVzZXIgam9pbnMuXG4gICAgY29uc3Qgb25QYXJ0aWNpcGFudENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAocGFydGljaXBhbnRzOiBNYXA8Um9vbU1lbWJlciwgU2V0PHN0cmluZz4+LCBwcmV2UGFydGljaXBhbnRzOiBNYXA8Um9vbU1lbWJlciwgU2V0PHN0cmluZz4+KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuZnJvbShwYXJ0aWNpcGFudHMua2V5cygpKS5zb21lKChwKSA9PiBwLnVzZXJJZCA9PSByb29tPy5jbGllbnQuZ2V0VXNlcklkKCkpKSB7XG4gICAgICAgICAgICAgICAgZGlzbWlzc1RvYXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNtaXNzVG9hc3QsIHJvb20/LmNsaWVudF0sXG4gICAgKTtcblxuICAgIC8vIERpc21pc3Mgb24gdGltZW91dC5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChkaXNtaXNzVG9hc3QsIE1BWF9SSU5HX1RJTUVfTVMpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gRGlzbWlzcyBvbiB2aWV3aW5nIGNhbGwuXG4gICAgdXNlRGlzcGF0Y2hlcihcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIsXG4gICAgICAgIHVzZUNhbGxiYWNrKFxuICAgICAgICAgICAgKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT09IEFjdGlvbi5WaWV3Um9vbSAmJiBwYXlsb2FkLnJvb21faWQgPT09IHJvb21JZCAmJiBwYXlsb2FkLnZpZXdfY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNtaXNzVG9hc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW3Jvb21JZCwgZGlzbWlzc1RvYXN0XSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBvbiBjbGlja2luZyBqb2luLlxuICAgIGNvbnN0IG9uSm9pbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChlOiBCdXR0b25FdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gVGhlIHRvYXN0IHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNtaXNzZWQgYnkgdGhlIGRpc3BhdGNoZXIgY2FsbGJhY2sgYWJvdmVcbiAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgICAgIHJvb21faWQ6IHJvb20/LnJvb21JZCxcbiAgICAgICAgICAgICAgICB2aWV3X2NhbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgc2tpcExvYmJ5OiBcInNoaWZ0S2V5XCIgaW4gZSA/IGUuc2hpZnRLZXkgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtyb29tXSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBvbiBjbG9zaW5nIHRvYXN0LlxuICAgIGNvbnN0IG9uQ2xvc2VDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoZTogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGRpc21pc3NUb2FzdCgpO1xuICAgICAgICB9LFxuICAgICAgICBbZGlzbWlzc1RvYXN0XSxcbiAgICApO1xuXG4gICAgdXNlRXZlbnRFbWl0dGVyKENhbGxTdG9yZS5pbnN0YW5jZSwgQ2FsbFN0b3JlRXZlbnQuQ2FsbCwgb25DYWxsKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoY2FsbCA/PyB1bmRlZmluZWQsIENhbGxFdmVudC5QYXJ0aWNpcGFudHMsIG9uUGFydGljaXBhbnRDaGFuZ2UpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFRvb2x0aXBQcm92aWRlcj5cbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPFJvb21BdmF0YXIgcm9vbT17cm9vbSA/PyB1bmRlZmluZWR9IHNpemU9XCIyNHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9JbmNvbWluZ0NhbGxUb2FzdF9pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9JbmNvbWluZ0NhbGxUb2FzdF9yb29tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jvb20gPyByb29tLm5hbWUgOiBfdChcInZvaXB8Y2FsbF90b2FzdF91bmtub3duX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X21lc3NhZ2VcIj57X3QoXCJ2b2lwfHZpZGVvX2NhbGxfc3RhcnRlZFwiKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYWxsID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaXZlQ29udGVudFN1bW1hcnlXaXRoQ2FsbCBjYWxsPXtjYWxsfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGl2ZUNvbnRlbnRTdW1tYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9e0xpdmVDb250ZW50VHlwZS5WaWRlb31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17X3QoXCJjb21tb258dmlkZW9cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZT17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50Q291bnQ9ezB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8Sm9pbkNhbGxCdXR0b25XaXRoQ2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25Kb2luQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsPXtjYWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRUb29sdGlwPXtvdGhlckNhbGxJc09uZ29pbmcgPyBcIk9uZ29pbmcgY2FsbFwiIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X2Nsb3NlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25DbG9zZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJhY3Rpb258Y2xvc2VcIil9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICA8L1Rvb2x0aXBQcm92aWRlcj5cbiAgICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBSixzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQVEsUUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsV0FBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsbUJBQUEsR0FBQVYsT0FBQTtBQUtBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGlCQUFBLEdBQUFULHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBYSxjQUFBLEdBQUFiLE9BQUE7QUFFQSxJQUFBYyxLQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxrQkFBQSxHQUFBaEIsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFnQixnQkFBQSxHQUFBaEIsT0FBQTtBQUNBLElBQUFpQixVQUFBLEdBQUFqQixPQUFBO0FBQWdFLFNBQUFrQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBcEIsd0JBQUFvQixDQUFBLEVBQUFFLENBQUEsU0FB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