UNPKG

matrix-react-sdk

Version:
183 lines (180 loc) 26.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _cryptoApi = require("matrix-js-sdk/src/crypto-api"); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../languageHandler"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _RightPanelStorePhases = require("../../../stores/right-panel/RightPanelStorePhases"); var _KeyVerificationStateObserver = require("../../../utils/KeyVerificationStateObserver"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _ToastStore = _interopRequireDefault(require("../../../stores/ToastStore")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _GenericToast = _interopRequireDefault(require("./GenericToast")); var _actions = require("../../../dispatcher/actions"); var _VerificationRequestDialog = _interopRequireDefault(require("../dialogs/VerificationRequestDialog")); var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore")); var _deviceInfo = require("../../../utils/crypto/deviceInfo"); /* Copyright 2024 New Vector Ltd. Copyright 2019-2021 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. */ class VerificationRequestToast extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "intervalHandle", void 0); (0, _defineProperty2.default)(this, "checkRequestIsPending", () => { const { request } = this.props; if (!(0, _cryptoApi.canAcceptVerificationRequest)(request)) { _ToastStore.default.sharedInstance().dismissToast(this.props.toastKey); } }); (0, _defineProperty2.default)(this, "cancel", () => { _ToastStore.default.sharedInstance().dismissToast(this.props.toastKey); try { this.props.request.cancel(); } catch (err) { _logger.logger.error("Error while cancelling verification request", err); } }); (0, _defineProperty2.default)(this, "accept", async () => { _ToastStore.default.sharedInstance().dismissToast(this.props.toastKey); const { request } = this.props; // no room id for to_device requests const cli = _MatrixClientPeg.MatrixClientPeg.safeGet(); try { if (request.roomId) { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: request.roomId, should_peek: false, metricsTrigger: "VerificationRequest" }); const member = cli.getUser(request.otherUserId) ?? undefined; _RightPanelStore.default.instance.setCards([{ phase: _RightPanelStorePhases.RightPanelPhases.RoomSummary }, { phase: _RightPanelStorePhases.RightPanelPhases.RoomMemberInfo, state: { member } }, { phase: _RightPanelStorePhases.RightPanelPhases.EncryptionPanel, state: { verificationRequest: request, member } }], undefined, request.roomId); } else { _Modal.default.createDialog(_VerificationRequestDialog.default, { verificationRequest: request, onFinished: () => { request.cancel(); } }, undefined, /* priority = */false, /* static = */true); } await request.accept(); } catch (err) { _logger.logger.error("Failed to accept verification request", err); } }); this.state = { counter: Math.ceil((props.request.timeout ?? 0) / 1000) }; } async componentDidMount() { const { request } = this.props; if (request.timeout && request.timeout > 0) { this.intervalHandle = window.setInterval(() => { let { counter } = this.state; counter = Math.max(0, counter - 1); this.setState({ counter }); }, 1000); } request.on(_cryptoApi.VerificationRequestEvent.Change, this.checkRequestIsPending); // We should probably have a separate class managing the active verification toasts, // rather than monitoring this in the toast component itself, since we'll get problems // like the toast not going away when the verification is cancelled unless it's the // one on the top (ie. the one that's mounted). // As a quick & dirty fix, check the toast is still relevant when it mounts (this prevents // a toast hanging around after logging in if you did a verification as part of login). this.checkRequestIsPending(); const otherDeviceId = request.otherDeviceId; if (request.isSelfVerification && !!otherDeviceId) { const cli = _MatrixClientPeg.MatrixClientPeg.safeGet(); const device = await cli.getDevice(otherDeviceId); this.setState({ ip: device.last_seen_ip, device: await (0, _deviceInfo.getDeviceCryptoInfo)(cli, cli.getSafeUserId(), otherDeviceId) }); } } componentWillUnmount() { clearInterval(this.intervalHandle); const { request } = this.props; request.off(_cryptoApi.VerificationRequestEvent.Change, this.checkRequestIsPending); } render() { const { request } = this.props; let description; let detail; if (request.isSelfVerification) { if (this.state.device) { description = this.state.device.displayName; detail = (0, _languageHandler._t)("encryption|verification|request_toast_detail", { deviceId: this.state.device.deviceId, ip: this.state.ip }); } } else { const client = _MatrixClientPeg.MatrixClientPeg.safeGet(); const userId = request.otherUserId; const roomId = request.roomId; description = roomId ? (0, _KeyVerificationStateObserver.userLabelForEventRoom)(client, userId, roomId) : userId; // for legacy to_device verification requests if (description === userId) { const user = client.getUser(userId); if (user && user.displayName) { description = (0, _languageHandler._t)("name_and_id", { name: user.displayName, userId }); } } } const declineLabel = this.state.counter === 0 ? (0, _languageHandler._t)("action|ignore") : (0, _languageHandler._t)("encryption|verification|request_toast_decline_counter", { counter: this.state.counter }); return /*#__PURE__*/_react.default.createElement(_GenericToast.default, { description: description, detail: detail, primaryLabel: request.isSelfVerification || !request.roomId ? (0, _languageHandler._t)("encryption|verification|request_toast_accept") : (0, _languageHandler._t)("encryption|verification|request_toast_accept_user"), onPrimaryClick: this.accept, secondaryLabel: declineLabel, onSecondaryClick: this.cancel }); } } exports.default = VerificationRequestToast; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jcnlwdG9BcGkiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9NYXRyaXhDbGllbnRQZWciLCJfUmlnaHRQYW5lbFN0b3JlUGhhc2VzIiwiX0tleVZlcmlmaWNhdGlvblN0YXRlT2JzZXJ2ZXIiLCJfZGlzcGF0Y2hlciIsIl9Ub2FzdFN0b3JlIiwiX01vZGFsIiwiX0dlbmVyaWNUb2FzdCIsIl9hY3Rpb25zIiwiX1ZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2ciLCJfUmlnaHRQYW5lbFN0b3JlIiwiX2RldmljZUluZm8iLCJWZXJpZmljYXRpb25SZXF1ZXN0VG9hc3QiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJyZXF1ZXN0IiwiY2FuQWNjZXB0VmVyaWZpY2F0aW9uUmVxdWVzdCIsIlRvYXN0U3RvcmUiLCJzaGFyZWRJbnN0YW5jZSIsImRpc21pc3NUb2FzdCIsInRvYXN0S2V5IiwiY2FuY2VsIiwiZXJyIiwibG9nZ2VyIiwiZXJyb3IiLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0Iiwicm9vbUlkIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3Um9vbSIsInJvb21faWQiLCJzaG91bGRfcGVlayIsIm1ldHJpY3NUcmlnZ2VyIiwibWVtYmVyIiwiZ2V0VXNlciIsIm90aGVyVXNlcklkIiwidW5kZWZpbmVkIiwiUmlnaHRQYW5lbFN0b3JlIiwiaW5zdGFuY2UiLCJzZXRDYXJkcyIsInBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsIlJvb21TdW1tYXJ5IiwiUm9vbU1lbWJlckluZm8iLCJzdGF0ZSIsIkVuY3J5cHRpb25QYW5lbCIsInZlcmlmaWNhdGlvblJlcXVlc3QiLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIlZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2ciLCJvbkZpbmlzaGVkIiwiYWNjZXB0IiwiY291bnRlciIsIk1hdGgiLCJjZWlsIiwidGltZW91dCIsImNvbXBvbmVudERpZE1vdW50IiwiaW50ZXJ2YWxIYW5kbGUiLCJ3aW5kb3ciLCJzZXRJbnRlcnZhbCIsIm1heCIsInNldFN0YXRlIiwib24iLCJWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQiLCJDaGFuZ2UiLCJjaGVja1JlcXVlc3RJc1BlbmRpbmciLCJvdGhlckRldmljZUlkIiwiaXNTZWxmVmVyaWZpY2F0aW9uIiwiZGV2aWNlIiwiZ2V0RGV2aWNlIiwiaXAiLCJsYXN0X3NlZW5faXAiLCJnZXREZXZpY2VDcnlwdG9JbmZvIiwiZ2V0U2FmZVVzZXJJZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiY2xlYXJJbnRlcnZhbCIsIm9mZiIsInJlbmRlciIsImRlc2NyaXB0aW9uIiwiZGV0YWlsIiwiZGlzcGxheU5hbWUiLCJfdCIsImRldmljZUlkIiwiY2xpZW50IiwidXNlcklkIiwidXNlckxhYmVsRm9yRXZlbnRSb29tIiwidXNlciIsIm5hbWUiLCJkZWNsaW5lTGFiZWwiLCJjcmVhdGVFbGVtZW50IiwicHJpbWFyeUxhYmVsIiwib25QcmltYXJ5Q2xpY2siLCJzZWNvbmRhcnlMYWJlbCIsIm9uU2Vjb25kYXJ5Q2xpY2siLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvdG9hc3RzL1ZlcmlmaWNhdGlvblJlcXVlc3RUb2FzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICAgIGNhbkFjY2VwdFZlcmlmaWNhdGlvblJlcXVlc3QsXG4gICAgVmVyaWZpY2F0aW9uUmVxdWVzdCxcbiAgICBWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQsXG59IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9jcnlwdG8tYXBpXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBEZXZpY2UgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgUmlnaHRQYW5lbFBoYXNlcyB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlUGhhc2VzXCI7XG5pbXBvcnQgeyB1c2VyTGFiZWxGb3JFdmVudFJvb20gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvS2V5VmVyaWZpY2F0aW9uU3RhdGVPYnNlcnZlclwiO1xuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgVG9hc3RTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1RvYXN0U3RvcmVcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCBHZW5lcmljVG9hc3QgZnJvbSBcIi4vR2VuZXJpY1RvYXN0XCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgVmVyaWZpY2F0aW9uUmVxdWVzdERpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9WZXJpZmljYXRpb25SZXF1ZXN0RGlhbG9nXCI7XG5pbXBvcnQgUmlnaHRQYW5lbFN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlXCI7XG5pbXBvcnQgeyBWaWV3Um9vbVBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9WaWV3Um9vbVBheWxvYWRcIjtcbmltcG9ydCB7IGdldERldmljZUNyeXB0b0luZm8gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY3J5cHRvL2RldmljZUluZm9cIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgdG9hc3RLZXk6IHN0cmluZztcbiAgICByZXF1ZXN0OiBWZXJpZmljYXRpb25SZXF1ZXN0O1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICAvKiogbnVtYmVyIG9mIHNlY29uZHMgbGVmdCBpbiB0aGUgdGltZW91dCBjb3VudGVyLiBaZXJvIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQuICovXG4gICAgY291bnRlcjogbnVtYmVyO1xuICAgIGRldmljZT86IERldmljZTtcbiAgICBpcD86IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVyaWZpY2F0aW9uUmVxdWVzdFRvYXN0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgaW50ZXJ2YWxIYW5kbGU/OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50ZXI6IE1hdGguY2VpbCgocHJvcHMucmVxdWVzdC50aW1lb3V0ID8/IDApIC8gMTAwMCkgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHJlcXVlc3QudGltZW91dCAmJiByZXF1ZXN0LnRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgeyBjb3VudGVyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIgPSBNYXRoLm1heCgwLCBjb3VudGVyIC0gMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNvdW50ZXIgfSk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Lm9uKFZlcmlmaWNhdGlvblJlcXVlc3RFdmVudC5DaGFuZ2UsIHRoaXMuY2hlY2tSZXF1ZXN0SXNQZW5kaW5nKTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5IGhhdmUgYSBzZXBhcmF0ZSBjbGFzcyBtYW5hZ2luZyB0aGUgYWN0aXZlIHZlcmlmaWNhdGlvbiB0b2FzdHMsXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIG1vbml0b3JpbmcgdGhpcyBpbiB0aGUgdG9hc3QgY29tcG9uZW50IGl0c2VsZiwgc2luY2Ugd2UnbGwgZ2V0IHByb2JsZW1zXG4gICAgICAgIC8vIGxpa2UgdGhlIHRvYXN0IG5vdCBnb2luZyBhd2F5IHdoZW4gdGhlIHZlcmlmaWNhdGlvbiBpcyBjYW5jZWxsZWQgdW5sZXNzIGl0J3MgdGhlXG4gICAgICAgIC8vIG9uZSBvbiB0aGUgdG9wIChpZS4gdGhlIG9uZSB0aGF0J3MgbW91bnRlZCkuXG4gICAgICAgIC8vIEFzIGEgcXVpY2sgJiBkaXJ0eSBmaXgsIGNoZWNrIHRoZSB0b2FzdCBpcyBzdGlsbCByZWxldmFudCB3aGVuIGl0IG1vdW50cyAodGhpcyBwcmV2ZW50c1xuICAgICAgICAvLyBhIHRvYXN0IGhhbmdpbmcgYXJvdW5kIGFmdGVyIGxvZ2dpbmcgaW4gaWYgeW91IGRpZCBhIHZlcmlmaWNhdGlvbiBhcyBwYXJ0IG9mIGxvZ2luKS5cbiAgICAgICAgdGhpcy5jaGVja1JlcXVlc3RJc1BlbmRpbmcoKTtcblxuICAgICAgICBjb25zdCBvdGhlckRldmljZUlkID0gcmVxdWVzdC5vdGhlckRldmljZUlkO1xuICAgICAgICBpZiAocmVxdWVzdC5pc1NlbGZWZXJpZmljYXRpb24gJiYgISFvdGhlckRldmljZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlID0gYXdhaXQgY2xpLmdldERldmljZShvdGhlckRldmljZUlkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGlwOiBkZXZpY2UubGFzdF9zZWVuX2lwLFxuICAgICAgICAgICAgICAgIGRldmljZTogYXdhaXQgZ2V0RGV2aWNlQ3J5cHRvSW5mbyhjbGksIGNsaS5nZXRTYWZlVXNlcklkKCksIG90aGVyRGV2aWNlSWQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgcmVxdWVzdC5vZmYoVmVyaWZpY2F0aW9uUmVxdWVzdEV2ZW50LkNoYW5nZSwgdGhpcy5jaGVja1JlcXVlc3RJc1BlbmRpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tSZXF1ZXN0SXNQZW5kaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGlmICghY2FuQWNjZXB0VmVyaWZpY2F0aW9uUmVxdWVzdChyZXF1ZXN0KSkge1xuICAgICAgICAgICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmRpc21pc3NUb2FzdCh0aGlzLnByb3BzLnRvYXN0S2V5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgY2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBUb2FzdFN0b3JlLnNoYXJlZEluc3RhbmNlKCkuZGlzbWlzc1RvYXN0KHRoaXMucHJvcHMudG9hc3RLZXkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGxpbmcgdmVyaWZpY2F0aW9uIHJlcXVlc3RcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgYWNjZXB0ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBUb2FzdFN0b3JlLnNoYXJlZEluc3RhbmNlKCkuZGlzbWlzc1RvYXN0KHRoaXMucHJvcHMudG9hc3RLZXkpO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIG5vIHJvb20gaWQgZm9yIHRvX2RldmljZSByZXF1ZXN0c1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Qucm9vbUlkKSB7XG4gICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogcmVxdWVzdC5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZF9wZWVrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljc1RyaWdnZXI6IFwiVmVyaWZpY2F0aW9uUmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IGNsaS5nZXRVc2VyKHJlcXVlc3Qub3RoZXJVc2VySWQpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2Uuc2V0Q2FyZHMoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbVN1bW1hcnkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckluZm8sIHN0YXRlOiB7IG1lbWJlciB9IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkVuY3J5cHRpb25QYW5lbCwgc3RhdGU6IHsgdmVyaWZpY2F0aW9uUmVxdWVzdDogcmVxdWVzdCwgbWVtYmVyIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJvb21JZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2csXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvblJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgPSAqLyBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgLyogc3RhdGljID0gKi8gdHJ1ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgcmVxdWVzdC5hY2NlcHQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gYWNjZXB0IHZlcmlmaWNhdGlvbiByZXF1ZXN0XCIsIGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjtcbiAgICAgICAgbGV0IGRldGFpbDtcbiAgICAgICAgaWYgKHJlcXVlc3QuaXNTZWxmVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5kZXZpY2UpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZGV2aWNlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgICAgIGRldGFpbCA9IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9kZXRhaWxcIiwge1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5zdGF0ZS5kZXZpY2UuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGlwOiB0aGlzLnN0YXRlLmlwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IHJlcXVlc3Qub3RoZXJVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCByb29tSWQgPSByZXF1ZXN0LnJvb21JZDtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcm9vbUlkID8gdXNlckxhYmVsRm9yRXZlbnRSb29tKGNsaWVudCwgdXNlcklkLCByb29tSWQpIDogdXNlcklkO1xuICAgICAgICAgICAgLy8gZm9yIGxlZ2FjeSB0b19kZXZpY2UgdmVyaWZpY2F0aW9uIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBjbGllbnQuZ2V0VXNlcih1c2VySWQpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyICYmIHVzZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfdChcIm5hbWVfYW5kX2lkXCIsIHsgbmFtZTogdXNlci5kaXNwbGF5TmFtZSwgdXNlcklkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNsaW5lTGFiZWwgPVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb3VudGVyID09PSAwXG4gICAgICAgICAgICAgICAgPyBfdChcImFjdGlvbnxpZ25vcmVcIilcbiAgICAgICAgICAgICAgICA6IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9kZWNsaW5lX2NvdW50ZXJcIiwgeyBjb3VudGVyOiB0aGlzLnN0YXRlLmNvdW50ZXIgfSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxHZW5lcmljVG9hc3RcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgZGV0YWlsPXtkZXRhaWx9XG4gICAgICAgICAgICAgICAgcHJpbWFyeUxhYmVsPXtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5pc1NlbGZWZXJpZmljYXRpb24gfHwgIXJlcXVlc3Qucm9vbUlkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9hY2NlcHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxyZXF1ZXN0X3RvYXN0X2FjY2VwdF91c2VyXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uUHJpbWFyeUNsaWNrPXt0aGlzLmFjY2VwdH1cbiAgICAgICAgICAgICAgICBzZWNvbmRhcnlMYWJlbD17ZGVjbGluZUxhYmVsfVxuICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5Q2xpY2s9e3RoaXMuY2FuY2VsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBS0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBR0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxzQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sNkJBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLDBCQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYSxnQkFBQSxHQUFBZCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEs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