UNPKG

matrix-react-sdk

Version:
239 lines (202 loc) 29.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var sdk = _interopRequireWildcard(require("../../../index")); var _languageHandler = require("../../../languageHandler"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _Media = require("../../../customisations/Media"); var _dec, _class, _class2, _temp; const PHASE_START = 0; const PHASE_SHOW_SAS = 1; const PHASE_WAIT_FOR_PARTNER_TO_CONFIRM = 2; const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; let IncomingSasDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.IncomingSasDialog"), _dec(_class = (_temp = _class2 = class IncomingSasDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "_onFinished", () => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); }); (0, _defineProperty2.default)(this, "_onCancelClick", () => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); }); (0, _defineProperty2.default)(this, "_onContinueClick", () => { this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM }); this.props.verifier.verify().then(() => { this.setState({ phase: PHASE_VERIFIED }); }).catch(e => { console.log("Verification failed", e); }); }); (0, _defineProperty2.default)(this, "_onVerifierShowSas", e => { this._showSasEvent = e; this.setState({ phase: PHASE_SHOW_SAS, sas: e.sas }); }); (0, _defineProperty2.default)(this, "_onVerifierCancel", e => { this.setState({ phase: PHASE_CANCELLED }); }); (0, _defineProperty2.default)(this, "_onSasMatchesClick", () => { this._showSasEvent.confirm(); this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM }); }); (0, _defineProperty2.default)(this, "_onVerifiedDoneClick", () => { this.props.onFinished(true); }); let phase = PHASE_START; if (this.props.verifier.cancelled) { console.log("Verifier was cancelled in the background."); phase = PHASE_CANCELLED; } this._showSasEvent = null; this.state = { phase: phase, sasVerified: false, opponentProfile: null, opponentProfileError: null }; this.props.verifier.on('show_sas', this._onVerifierShowSas); this.props.verifier.on('cancel', this._onVerifierCancel); this._fetchOpponentProfile(); } componentWillUnmount() { if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) { this.props.verifier.cancel('User cancel'); } this.props.verifier.removeListener('show_sas', this._onVerifierShowSas); } async _fetchOpponentProfile() { try { const prof = await _MatrixClientPeg.MatrixClientPeg.get().getProfileInfo(this.props.verifier.userId); this.setState({ opponentProfile: prof }); } catch (e) { this.setState({ opponentProfileError: e }); } } _renderPhaseStart() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const Spinner = sdk.getComponent("views.elements.Spinner"); const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); const isSelf = this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.get().getUserId(); let profile; const oppProfile = this.state.opponentProfile; if (oppProfile) { const url = oppProfile.avatar_url ? (0, _Media.mediaFromMxc)(oppProfile.avatar_url).getSquareThumbnailHttp(48) : null; profile = /*#__PURE__*/_react.default.createElement("div", { className: "mx_IncomingSasDialog_opponentProfile" }, /*#__PURE__*/_react.default.createElement(BaseAvatar, { name: oppProfile.displayname, idName: this.props.verifier.userId, url: url, width: 48, height: 48, resizeMethod: "crop" }), /*#__PURE__*/_react.default.createElement("h2", null, oppProfile.displayname)); } else if (this.state.opponentProfileError) { profile = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(BaseAvatar, { name: this.props.verifier.userId.slice(1), idName: this.props.verifier.userId, width: 48, height: 48 }), /*#__PURE__*/_react.default.createElement("h2", null, this.props.verifier.userId)); } else { profile = /*#__PURE__*/_react.default.createElement(Spinner, null); } const userDetailText = [/*#__PURE__*/_react.default.createElement("p", { key: "p1" }, (0, _languageHandler._t)("Verify this user to mark them as trusted. " + "Trusting users gives you extra peace of mind when using " + "end-to-end encrypted messages.")), /*#__PURE__*/_react.default.createElement("p", { key: "p2" }, (0, _languageHandler._t)( // NB. Below wording adjusted to singular 'session' until we have // cross-signing "Verifying this user will mark their session as trusted, and " + "also mark your session as trusted to them."))]; const selfDetailText = [/*#__PURE__*/_react.default.createElement("p", { key: "p1" }, (0, _languageHandler._t)("Verify this device to mark it as trusted. " + "Trusting this device gives you and other users extra peace of mind when using " + "end-to-end encrypted messages.")), /*#__PURE__*/_react.default.createElement("p", { key: "p2" }, (0, _languageHandler._t)("Verifying this device will mark it as trusted, and users who have verified with " + "you will trust this device."))]; return /*#__PURE__*/_react.default.createElement("div", null, profile, isSelf ? selfDetailText : userDetailText, /*#__PURE__*/_react.default.createElement(DialogButtons, { primaryButton: (0, _languageHandler._t)('Continue'), hasCancel: true, onPrimaryButtonClick: this._onContinueClick, onCancel: this._onCancelClick })); } _renderPhaseShowSas() { const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); return /*#__PURE__*/_react.default.createElement(VerificationShowSas, { sas: this._showSasEvent.sas, onCancel: this._onCancelClick, onDone: this._onSasMatchesClick, isSelf: this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.get().getUserId(), inDialog: true }); } _renderPhaseWaitForPartnerToConfirm() { const Spinner = sdk.getComponent("views.elements.Spinner"); return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(Spinner, null), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Waiting for partner to confirm..."))); } _renderPhaseVerified() { const VerificationComplete = sdk.getComponent('views.verification.VerificationComplete'); return /*#__PURE__*/_react.default.createElement(VerificationComplete, { onDone: this._onVerifiedDoneClick }); } _renderPhaseCancelled() { const VerificationCancelled = sdk.getComponent('views.verification.VerificationCancelled'); return /*#__PURE__*/_react.default.createElement(VerificationCancelled, { onDone: this._onCancelClick }); } render() { let body; switch (this.state.phase) { case PHASE_START: body = this._renderPhaseStart(); break; case PHASE_SHOW_SAS: body = this._renderPhaseShowSas(); break; case PHASE_WAIT_FOR_PARTNER_TO_CONFIRM: body = this._renderPhaseWaitForPartnerToConfirm(); break; case PHASE_VERIFIED: body = this._renderPhaseVerified(); break; case PHASE_CANCELLED: body = this._renderPhaseCancelled(); break; } const BaseDialog = sdk.getComponent("dialogs.BaseDialog"); return /*#__PURE__*/_react.default.createElement(BaseDialog, { title: (0, _languageHandler._t)("Incoming Verification Request"), onFinished: this._onFinished, fixedWidth: false }, body); } }, (0, _defineProperty2.default)(_class2, "propTypes", { verifier: _propTypes.default.object.isRequired }), _temp)) || _class); exports.default = IncomingSasDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvSW5jb21pbmdTYXNEaWFsb2cuanMiXSwibmFtZXMiOlsiUEhBU0VfU1RBUlQiLCJQSEFTRV9TSE9XX1NBUyIsIlBIQVNFX1dBSVRfRk9SX1BBUlRORVJfVE9fQ09ORklSTSIsIlBIQVNFX1ZFUklGSUVEIiwiUEhBU0VfQ0FOQ0VMTEVEIiwiSW5jb21pbmdTYXNEaWFsb2ciLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJvbkZpbmlzaGVkIiwic3RhdGUiLCJwaGFzZSIsInNldFN0YXRlIiwidmVyaWZpZXIiLCJ2ZXJpZnkiLCJ0aGVuIiwiY2F0Y2giLCJlIiwiY29uc29sZSIsImxvZyIsIl9zaG93U2FzRXZlbnQiLCJzYXMiLCJjb25maXJtIiwiY2FuY2VsbGVkIiwic2FzVmVyaWZpZWQiLCJvcHBvbmVudFByb2ZpbGUiLCJvcHBvbmVudFByb2ZpbGVFcnJvciIsIm9uIiwiX29uVmVyaWZpZXJTaG93U2FzIiwiX29uVmVyaWZpZXJDYW5jZWwiLCJfZmV0Y2hPcHBvbmVudFByb2ZpbGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImNhbmNlbCIsInJlbW92ZUxpc3RlbmVyIiwicHJvZiIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFByb2ZpbGVJbmZvIiwidXNlcklkIiwiX3JlbmRlclBoYXNlU3RhcnQiLCJEaWFsb2dCdXR0b25zIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiU3Bpbm5lciIsIkJhc2VBdmF0YXIiLCJpc1NlbGYiLCJnZXRVc2VySWQiLCJwcm9maWxlIiwib3BwUHJvZmlsZSIsInVybCIsImF2YXRhcl91cmwiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiZGlzcGxheW5hbWUiLCJzbGljZSIsInVzZXJEZXRhaWxUZXh0Iiwic2VsZkRldGFpbFRleHQiLCJfb25Db250aW51ZUNsaWNrIiwiX29uQ2FuY2VsQ2xpY2siLCJfcmVuZGVyUGhhc2VTaG93U2FzIiwiVmVyaWZpY2F0aW9uU2hvd1NhcyIsIl9vblNhc01hdGNoZXNDbGljayIsIl9yZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtIiwiX3JlbmRlclBoYXNlVmVyaWZpZWQiLCJWZXJpZmljYXRpb25Db21wbGV0ZSIsIl9vblZlcmlmaWVkRG9uZUNsaWNrIiwiX3JlbmRlclBoYXNlQ2FuY2VsbGVkIiwiVmVyaWZpY2F0aW9uQ2FuY2VsbGVkIiwicmVuZGVyIiwiYm9keSIsIkJhc2VEaWFsb2ciLCJfb25GaW5pc2hlZCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBcEI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsQ0FBdkI7QUFDQSxNQUFNQyxpQ0FBaUMsR0FBRyxDQUExQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxDQUF2QjtBQUNBLE1BQU1DLGVBQWUsR0FBRyxDQUF4QjtJQUdxQkMsaUIsV0FEcEIsZ0RBQXFCLGlDQUFyQixDLG1DQUFELE1BQ3FCQSxpQkFEckIsU0FDK0NDLGVBQU1DLFNBRHJELENBQytEO0FBSzNEQyxFQUFBQSxXQUFXLENBQUNDLEtBQUQsRUFBUTtBQUNmLFVBQU1BLEtBQU47QUFEZSx1REEyQ0wsTUFBTTtBQUNoQixXQUFLQSxLQUFMLENBQVdDLFVBQVgsQ0FBc0IsS0FBS0MsS0FBTCxDQUFXQyxLQUFYLEtBQXFCVCxjQUEzQztBQUNILEtBN0NrQjtBQUFBLDBEQStDRixNQUFNO0FBQ25CLFdBQUtNLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQixLQUFLQyxLQUFMLENBQVdDLEtBQVgsS0FBcUJULGNBQTNDO0FBQ0gsS0FqRGtCO0FBQUEsNERBbURBLE1BQU07QUFDckIsV0FBS1UsUUFBTCxDQUFjO0FBQUNELFFBQUFBLEtBQUssRUFBRVY7QUFBUixPQUFkO0FBQ0EsV0FB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SW1FLFFBQUFBLElBQUksR0FBRyxLQUFLUCxtQ0FBTCxFQUFQO0FBQ0E7O0FBQ0osV0FBSzNELGNBQUw7QUFDSWtFLFFBQUFBLElBQUksR0FBRyxLQUFLTixvQkFBTCxFQUFQO0FBQ0E7O0FBQ0osV0FBSzNELGVBQUw7QUFDSWlFLFFBQUFBLElBQUksR0FBRyxLQUFLSCxxQkFBTCxFQUFQO0FBQ0E7QUFmUjs7QUFrQkEsVUFBTUksVUFBVSxHQUFHNUIsR0FBRyxDQUFDQyxZQUFKLENBQWlCLG9CQUFqQixDQUFuQjtBQUNBLHdCQUNJLDZCQUFDLFVBQUQ7QUFDSSxNQUFBLEtBQUssRUFBRSx5QkFBRywrQkFBSCxDQURYO0FBRUksTUFBQSxVQUFVLEVBQUUsS0FBSzRCLFdBRnJCO0FBR0ksTUFBQSxVQUFVLEVBQUU7QUFIaEIsT0FLS0YsSUFMTCxDQURKO0FBU0g7O0FBak8wRCxDLHNEQUN4QztBQUNmdkQsRUFBQUEsUUFBUSxFQUFFMEQsbUJBQVVDLE1BQVYsQ0FBaUJDO0FBRFosQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxOSBOZXcgVmVjdG9yIEx0ZFxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtNYXRyaXhDbGllbnRQZWd9IGZyb20gJy4uLy4uLy4uL01hdHJpeENsaWVudFBlZyc7XG5pbXBvcnQgKiBhcyBzZGsgZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5pbXBvcnQge21lZGlhRnJvbU14Y30gZnJvbSBcIi4uLy4uLy4uL2N1c3RvbWlzYXRpb25zL01lZGlhXCI7XG5cbmNvbnN0IFBIQVNFX1NUQVJUID0gMDtcbmNvbnN0IFBIQVNFX1NIT1dfU0FTID0gMTtcbmNvbnN0IFBIQVNFX1dBSVRfRk9SX1BBUlRORVJfVE9fQ09ORklSTSA9IDI7XG5jb25zdCBQSEFTRV9WRVJJRklFRCA9IDM7XG5jb25zdCBQSEFTRV9DQU5DRUxMRUQgPSA0O1xuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5kaWFsb2dzLkluY29taW5nU2FzRGlhbG9nXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmNvbWluZ1Nhc0RpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgdmVyaWZpZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIGxldCBwaGFzZSA9IFBIQVNFX1NUQVJUO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy52ZXJpZmllci5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZpZXIgd2FzIGNhbmNlbGxlZCBpbiB0aGUgYmFja2dyb3VuZC5cIik7XG4gICAgICAgICAgICBwaGFzZSA9IFBIQVNFX0NBTkNFTExFRDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Nob3dTYXNFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwaGFzZTogcGhhc2UsXG4gICAgICAgICAgICBzYXNWZXJpZmllZDogZmFsc2UsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGU6IG51bGwsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGVFcnJvcjogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9wcy52ZXJpZmllci5vbignc2hvd19zYXMnLCB0aGlzLl9vblZlcmlmaWVyU2hvd1Nhcyk7XG4gICAgICAgIHRoaXMucHJvcHMudmVyaWZpZXIub24oJ2NhbmNlbCcsIHRoaXMuX29uVmVyaWZpZXJDYW5jZWwpO1xuICAgICAgICB0aGlzLl9mZXRjaE9wcG9uZW50UHJvZmlsZSgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5waGFzZSAhPT0gUEhBU0VfQ0FOQ0VMTEVEICYmIHRoaXMuc3RhdGUucGhhc2UgIT09IFBIQVNFX1ZFUklGSUVEKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLmNhbmNlbCgnVXNlciBjYW5jZWwnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLnJlbW92ZUxpc3RlbmVyKCdzaG93X3NhcycsIHRoaXMuX29uVmVyaWZpZXJTaG93U2FzKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZmV0Y2hPcHBvbmVudFByb2ZpbGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9mID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFByb2ZpbGVJbmZvKFxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudmVyaWZpZXIudXNlcklkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIG9wcG9uZW50UHJvZmlsZTogcHJvZixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvcHBvbmVudFByb2ZpbGVFcnJvcjogZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0aGlzLnN0YXRlLnBoYXNlID09PSBQSEFTRV9WRVJJRklFRCk7XG4gICAgfVxuXG4gICAgX29uQ2FuY2VsQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0aGlzLnN0YXRlLnBoYXNlID09PSBQSEFTRV9WRVJJRklFRCk7XG4gICAgfVxuXG4gICAgX29uQ29udGludWVDbGljayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cGhhc2U6IFBIQVNFX1dBSVRfRk9SX1BBUlRORVJfVE9fQ09ORklSTX0pO1xuICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLnZlcmlmeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cGhhc2U6IFBIQVNFX1ZFUklGSUVEfSk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZlcmlmaWNhdGlvbiBmYWlsZWRcIiwgZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblZlcmlmaWVyU2hvd1NhcyA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuX3Nob3dTYXNFdmVudCA9IGU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcGhhc2U6IFBIQVNFX1NIT1dfU0FTLFxuICAgICAgICAgICAgc2FzOiBlLnNhcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uVmVyaWZpZXJDYW5jZWwgPSAoZSkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBQSEFTRV9DQU5DRUxMRUQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblNhc01hdGNoZXNDbGljayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fc2hvd1Nhc0V2ZW50LmNvbmZpcm0oKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwaGFzZTogUEhBU0VfV0FJVF9GT1JfUEFSVE5FUl9UT19DT05GSVJNLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25WZXJpZmllZERvbmVDbGljayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgIH1cblxuICAgIF9yZW5kZXJQaGFzZVN0YXJ0KCkge1xuICAgICAgICBjb25zdCBEaWFsb2dCdXR0b25zID0gc2RrLmdldENvbXBvbmVudCgndmlld3MuZWxlbWVudHMuRGlhbG9nQnV0dG9ucycpO1xuICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcInZpZXdzLmVsZW1lbnRzLlNwaW5uZXJcIik7XG4gICAgICAgIGNvbnN0IEJhc2VBdmF0YXIgPSBzZGsuZ2V0Q29tcG9uZW50KFwiYXZhdGFycy5CYXNlQXZhdGFyXCIpO1xuXG4gICAgICAgIGNvbnN0IGlzU2VsZiA9IHRoaXMucHJvcHMudmVyaWZpZXIudXNlcklkID09PSBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0VXNlcklkKCk7XG5cbiAgICAgICAgbGV0IHByb2ZpbGU7XG4gICAgICAgIGNvbnN0IG9wcFByb2ZpbGUgPSB0aGlzLnN0YXRlLm9wcG9uZW50UHJvZmlsZTtcbiAgICAgICAgaWYgKG9wcFByb2ZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG9wcFByb2ZpbGUuYXZhdGFyX3VybFxuICAgICAgICAgICAgICAgID8gbWVkaWFGcm9tTXhjKG9wcFByb2ZpbGUuYXZhdGFyX3VybCkuZ2V0U3F1YXJlVGh1bWJuYWlsSHR0cCg0OClcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBwcm9maWxlID0gPGRpdiBjbGFzc05hbWU9XCJteF9JbmNvbWluZ1Nhc0RpYWxvZ19vcHBvbmVudFByb2ZpbGVcIj5cbiAgICAgICAgICAgICAgICA8QmFzZUF2YXRhciBuYW1lPXtvcHBQcm9maWxlLmRpc3BsYXluYW1lfVxuICAgICAgICAgICAgICAgICAgICBpZE5hbWU9e3RoaXMucHJvcHMudmVyaWZpZXIudXNlcklkfVxuICAgICAgICAgICAgICAgICAgICB1cmw9e3VybH1cbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezQ4fSBoZWlnaHQ9ezQ4fSByZXNpemVNZXRob2Q9J2Nyb3AnXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8aDI+e29wcFByb2ZpbGUuZGlzcGxheW5hbWV9PC9oMj5cbiAgICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLm9wcG9uZW50UHJvZmlsZUVycm9yKSB7XG4gICAgICAgICAgICBwcm9maWxlID0gPGRpdj5cbiAgICAgICAgICAgICAgICA8QmFzZUF2YXRhciBuYW1lPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZC5zbGljZSgxKX1cbiAgICAgICAgICAgICAgICAgICAgaWROYW1lPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezQ4fSBoZWlnaHQ9ezQ4fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGgyPnt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZH08L2gyPlxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvZmlsZSA9IDxTcGlubmVyIC8+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlckRldGFpbFRleHQgPSBbXG4gICAgICAgICAgICA8cCBrZXk9XCJwMVwiPntfdChcbiAgICAgICAgICAgICAgICBcIlZlcmlmeSB0aGlzIHVzZXIgdG8gbWFyayB0aGVtIGFzIHRydXN0ZWQuIFwiICtcbiAgICAgICAgICAgICAgICBcIlRydXN0aW5nIHVzZXJzIGdpdmVzIHlvdSBleHRyYSBwZWFjZSBvZiBtaW5kIHdoZW4gdXNpbmcgXCIgK1xuICAgICAgICAgICAgICAgIFwiZW5kLXRvLWVuZCBlbmNyeXB0ZWQgbWVzc2FnZXMuXCIsXG4gICAgICAgICAgICApfTwvcD4sXG4gICAgICAgICAgICA8cCBrZXk9XCJwMlwiPntfdChcbiAgICAgICAgICAgICAgICAvLyBOQi4gQmVsb3cgd29yZGluZyBhZGp1c3RlZCB0byBzaW5ndWxhciAnc2Vzc2lvbicgdW50aWwgd2UgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIGNyb3NzLXNpZ25pbmdcbiAgICAgICAgICAgICAgICBcIlZlcmlmeWluZyB0aGlzIHVzZXIgd2lsbCBtYXJrIHRoZWlyIHNlc3Npb24gYXMgdHJ1c3RlZCwgYW5kIFwiICtcbiAgICAgICAgICAgICAgICBcImFsc28gbWFyayB5b3VyIHNlc3Npb24gYXMgdHJ1c3RlZCB0byB0aGVtLlwiLFxuICAgICAgICAgICAgKX08L3A+LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHNlbGZEZXRhaWxUZXh0ID0gW1xuICAgICAgICAgICAgPHAga2V5PVwicDFcIj57X3QoXG4gICAgICAgICAgICAgICAgXCJWZXJpZnkgdGhpcyBkZXZpY2UgdG8gbWFyayBpdCBhcyB0cnVzdGVkLiBcIiArXG4gICAgICAgICAgICAgICAgXCJUcnVzdGluZyB0aGlzIGRldmljZSBnaXZlcyB5b3UgYW5kIG90aGVyIHVzZXJzIGV4dHJhIHBlYWNlIG9mIG1pbmQgd2hlbiB1c2luZyBcIiArXG4gICAgICAgICAgICAgICAgXCJlbmQtdG8tZW5kIGVuY3J5cHRlZCBtZXNzYWdlcy5cIixcbiAgICAgICAgICAgICl9PC9wPixcbiAgICAgICAgICAgIDxwIGtleT1cInAyXCI+e190KFxuICAgICAgICAgICAgICAgIFwiVmVyaWZ5aW5nIHRoaXMgZGV2aWNlIHdpbGwgbWFyayBpdCBhcyB0cnVzdGVkLCBhbmQgdXNlcnMgd2hvIGhhdmUgdmVyaWZpZWQgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgXCJ5b3Ugd2lsbCB0cnVzdCB0aGlzIGRldmljZS5cIixcbiAgICAgICAgICAgICl9PC9wPixcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7cHJvZmlsZX1cbiAgICAgICAgICAgICAgICB7aXNTZWxmID8gc2VsZkRldGFpbFRleHQgOiB1c2VyRGV0YWlsVGV4dH1cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdCgnQ29udGludWUnKX1cbiAgICAgICAgICAgICAgICAgICAgaGFzQ2FuY2VsPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBvblByaW1hcnlCdXR0b25DbGljaz17dGhpcy5fb25Db250aW51ZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5fb25DYW5jZWxDbGlja31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX3JlbmRlclBoYXNlU2hvd1NhcygpIHtcbiAgICAgICAgY29uc3QgVmVyaWZpY2F0aW9uU2hvd1NhcyA9IHNkay5nZXRDb21wb25lbnQoJ3ZpZXdzLnZlcmlmaWNhdGlvbi5WZXJpZmljYXRpb25TaG93U2FzJyk7XG4gICAgICAgIHJldHVybiA8VmVyaWZpY2F0aW9uU2hvd1Nhc1xuICAgICAgICAgICAgc2FzPXt0aGlzLl9zaG93U2FzRXZlbnQuc2FzfVxuICAgICAgICAgICAgb25DYW5jZWw9e3RoaXMuX29uQ2FuY2VsQ2xpY2t9XG4gICAgICAgICAgICBvbkRvbmU9e3RoaXMuX29uU2FzTWF0Y2hlc0NsaWNrfVxuICAgICAgICAgICAgaXNTZWxmPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFVzZXJJZCgpfVxuICAgICAgICAgICAgaW5EaWFsb2c9e3RydWV9XG4gICAgICAgIC8+O1xuICAgIH1cblxuICAgIF9yZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtKCkge1xuICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcInZpZXdzLmVsZW1lbnRzLlNwaW5uZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPFNwaW5uZXIgLz5cbiAgICAgICAgICAgICAgICA8cD57X3QoXCJXYWl0aW5nIGZvciBwYXJ0bmVyIHRvIGNvbmZpcm0uLi5cIil9PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX3JlbmRlclBoYXNlVmVyaWZpZWQoKSB7XG4gICAgICAgIGNvbnN0IFZlcmlmaWNhdGlvbkNvbXBsZXRlID0gc2RrLmdldENvbXBvbmVudCgndmlld3MudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbkNvbXBsZXRlJyk7XG4gICAgICAgIHJldHVybiA8VmVyaWZpY2F0aW9uQ29tcGxldGUgb25Eb25lPXt0aGlzLl9vblZlcmlmaWVkRG9uZUNsaWNrfSAvPjtcbiAgICB9XG5cbiAgICBfcmVuZGVyUGhhc2VDYW5jZWxsZWQoKSB7XG4gICAgICAgIGNvbnN0IFZlcmlmaWNhdGlvbkNhbmNlbGxlZCA9IHNkay5nZXRDb21wb25lbnQoJ3ZpZXdzLnZlcmlmaWNhdGlvbi5WZXJpZmljYXRpb25DYW5jZWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIDxWZXJpZmljYXRpb25DYW5jZWxsZWQgb25Eb25lPXt0aGlzLl9vbkNhbmNlbENsaWNrfSAvPjtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBib2R5O1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUucGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfU1RBUlQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuX3JlbmRlclBoYXNlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfU0hPV19TQVM6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuX3JlbmRlclBoYXNlU2hvd1NhcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk06XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuX3JlbmRlclBoYXNlV2FpdEZvclBhcnRuZXJUb0NvbmZpcm0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfVkVSSUZJRUQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuX3JlbmRlclBoYXNlVmVyaWZpZWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfQ0FOQ0VMTEVEOlxuICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLl9yZW5kZXJQaGFzZUNhbmNlbGxlZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQmFzZURpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoXCJkaWFsb2dzLkJhc2VEaWFsb2dcIik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcIkluY29taW5nIFZlcmlmaWNhdGlvbiBSZXF1ZXN0XCIpfVxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMuX29uRmluaXNoZWR9XG4gICAgICAgICAgICAgICAgZml4ZWRXaWR0aD17ZmFsc2V9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2JvZHl9XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG4iXX0=