matrix-react-sdk
Version:
SDK for matrix.org using React
177 lines (174 loc) • 30.1 kB
JavaScript
"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 _fileSaver = _interopRequireDefault(require("file-saver"));
var _react = _interopRequireDefault(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../../languageHandler");
var MegolmExportEncryption = _interopRequireWildcard(require("../../../../utils/MegolmExportEncryption"));
var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog"));
var _PassphraseField = _interopRequireDefault(require("../../../../components/views/auth/PassphraseField"));
var _PassphraseConfirmField = _interopRequireDefault(require("../../../../components/views/auth/PassphraseConfirmField"));
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.
Copyright 2017 Vector Creations Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
var Phase = /*#__PURE__*/function (Phase) {
Phase["Edit"] = "edit";
Phase["Exporting"] = "exporting";
return Phase;
}(Phase || {});
class ExportE2eKeysDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "fieldPassword", null);
(0, _defineProperty2.default)(this, "fieldPasswordConfirm", null);
(0, _defineProperty2.default)(this, "unmounted", false);
(0, _defineProperty2.default)(this, "onPassphraseFormSubmit", async ev => {
ev.preventDefault();
if (!(await this.verifyFieldsBeforeSubmit())) return;
if (this.unmounted) return;
const passphrase = this.state.passphrase1;
this.startExport(passphrase);
});
(0, _defineProperty2.default)(this, "onCancelClick", ev => {
ev.preventDefault();
this.props.onFinished(false);
return false;
});
(0, _defineProperty2.default)(this, "onPassphraseChange", (ev, phrase) => {
this.setState({
[phrase]: ev.target.value
});
});
this.state = {
phase: Phase.Edit,
errStr: null,
passphrase1: "",
passphrase2: ""
};
}
componentWillUnmount() {
this.unmounted = true;
}
async verifyFieldsBeforeSubmit() {
const fieldsInDisplayOrder = [this.fieldPassword, this.fieldPasswordConfirm];
const invalidFields = [];
for (const field of fieldsInDisplayOrder) {
if (!field) continue;
const valid = await field.validate({
allowEmpty: false
});
if (!valid) {
invalidFields.push(field);
}
}
if (invalidFields.length === 0) {
return true;
}
// Focus on the first invalid field, then re-validate,
// which will result in the error tooltip being displayed for that field.
invalidFields[0].focus();
invalidFields[0].validate({
allowEmpty: false,
focused: true
});
return false;
}
startExport(passphrase) {
// extra Promise.resolve() to turn synchronous exceptions into
// asynchronous ones.
Promise.resolve().then(() => {
return this.props.matrixClient.getCrypto().exportRoomKeysAsJson();
}).then(k => {
return MegolmExportEncryption.encryptMegolmKeyFile(k, passphrase);
}).then(f => {
const blob = new Blob([f], {
type: "text/plain;charset=us-ascii"
});
_fileSaver.default.saveAs(blob, "element-keys.txt");
this.props.onFinished(true);
}).catch(e => {
_logger.logger.error("Error exporting e2e keys:", e);
if (this.unmounted) {
return;
}
const msg = e.friendlyText || (0, _languageHandler._t)("error|unknown");
this.setState({
errStr: msg,
phase: Phase.Edit
});
});
this.setState({
errStr: null,
phase: Phase.Exporting
});
}
render() {
const disableForm = this.state.phase === Phase.Exporting;
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_exportE2eKeysDialog",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("settings|key_export_import|export_title")
}, /*#__PURE__*/_react.default.createElement("form", {
onSubmit: this.onPassphraseFormSubmit
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|export_description_1")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|export_description_2")), /*#__PURE__*/_react.default.createElement("div", {
className: "error"
}, this.state.errStr), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_E2eKeysDialog_inputTable"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_E2eKeysDialog_inputRow"
}, /*#__PURE__*/_react.default.createElement(_PassphraseField.default, {
minScore: 3,
label: (0, _languageHandler._td)("settings|key_export_import|enter_passphrase"),
labelEnterPassword: (0, _languageHandler._td)("settings|key_export_import|enter_passphrase"),
labelStrongPassword: (0, _languageHandler._td)("settings|key_export_import|phrase_strong_enough"),
labelAllowedButUnsafe: (0, _languageHandler._td)("settings|key_export_import|phrase_strong_enough"),
value: this.state.passphrase1,
onChange: e => this.onPassphraseChange(e, "passphrase1"),
autoFocus: true,
size: 64,
type: "password",
disabled: disableForm,
autoComplete: "new-password",
fieldRef: field => this.fieldPassword = field
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_E2eKeysDialog_inputRow"
}, /*#__PURE__*/_react.default.createElement(_PassphraseConfirmField.default, {
password: this.state.passphrase1,
label: (0, _languageHandler._td)("settings|key_export_import|confirm_passphrase"),
labelRequired: (0, _languageHandler._td)("settings|key_export_import|phrase_cannot_be_empty"),
labelInvalid: (0, _languageHandler._td)("settings|key_export_import|phrase_must_match"),
value: this.state.passphrase2,
onChange: e => this.onPassphraseChange(e, "passphrase2"),
size: 64,
type: "password",
disabled: disableForm,
autoComplete: "new-password",
fieldRef: field => this.fieldPasswordConfirm = field
})))), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_buttons"
}, /*#__PURE__*/_react.default.createElement("input", {
className: "mx_Dialog_primary",
type: "submit",
value: (0, _languageHandler._t)("action|export"),
disabled: disableForm
}), /*#__PURE__*/_react.default.createElement("button", {
onClick: this.onCancelClick,
disabled: disableForm
}, (0, _languageHandler._t)("action|cancel")))));
}
}
exports.default = ExportE2eKeysDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmlsZVNhdmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIk1lZ29sbUV4cG9ydEVuY3J5cHRpb24iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9CYXNlRGlhbG9nIiwiX1Bhc3NwaHJhc2VGaWVsZCIsIl9QYXNzcGhyYXNlQ29uZmlybUZpZWxkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUGhhc2UiLCJFeHBvcnRFMmVLZXlzRGlhbG9nIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImV2IiwicHJldmVudERlZmF1bHQiLCJ2ZXJpZnlGaWVsZHNCZWZvcmVTdWJtaXQiLCJ1bm1vdW50ZWQiLCJwYXNzcGhyYXNlIiwic3RhdGUiLCJwYXNzcGhyYXNlMSIsInN0YXJ0RXhwb3J0Iiwib25GaW5pc2hlZCIsInBocmFzZSIsInNldFN0YXRlIiwidGFyZ2V0IiwidmFsdWUiLCJwaGFzZSIsIkVkaXQiLCJlcnJTdHIiLCJwYXNzcGhyYXNlMiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZmllbGRzSW5EaXNwbGF5T3JkZXIiLCJmaWVsZFBhc3N3b3JkIiwiZmllbGRQYXNzd29yZENvbmZpcm0iLCJpbnZhbGlkRmllbGRzIiwiZmllbGQiLCJ2YWxpZCIsInZhbGlkYXRlIiwiYWxsb3dFbXB0eSIsInB1c2giLCJsZW5ndGgiLCJmb2N1cyIsImZvY3VzZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJtYXRyaXhDbGllbnQiLCJnZXRDcnlwdG8iLCJleHBvcnRSb29tS2V5c0FzSnNvbiIsImsiLCJlbmNyeXB0TWVnb2xtS2V5RmlsZSIsImYiLCJibG9iIiwiQmxvYiIsInR5cGUiLCJGaWxlU2F2ZXIiLCJzYXZlQXMiLCJjYXRjaCIsImxvZ2dlciIsImVycm9yIiwibXNnIiwiZnJpZW5kbHlUZXh0IiwiX3QiLCJFeHBvcnRpbmciLCJyZW5kZXIiLCJkaXNhYmxlRm9ybSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0aXRsZSIsIm9uU3VibWl0Iiwib25QYXNzcGhyYXNlRm9ybVN1Ym1pdCIsIm1pblNjb3JlIiwibGFiZWwiLCJfdGQiLCJsYWJlbEVudGVyUGFzc3dvcmQiLCJsYWJlbFN0cm9uZ1Bhc3N3b3JkIiwibGFiZWxBbGxvd2VkQnV0VW5zYWZlIiwib25DaGFuZ2UiLCJvblBhc3NwaHJhc2VDaGFuZ2UiLCJhdXRvRm9jdXMiLCJzaXplIiwiZGlzYWJsZWQiLCJhdXRvQ29tcGxldGUiLCJmaWVsZFJlZiIsInBhc3N3b3JkIiwibGFiZWxSZXF1aXJlZCIsImxhYmVsSW52YWxpZCIsIm9uQ2xpY2siLCJvbkNhbmNlbENsaWNrIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hc3luYy1jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3Mvc2VjdXJpdHkvRXhwb3J0RTJlS2V5c0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE3IFZlY3RvciBDcmVhdGlvbnMgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBGaWxlU2F2ZXIgZnJvbSBcImZpbGUtc2F2ZXJcIjtcbmltcG9ydCBSZWFjdCwgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBfdCwgX3RkIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0ICogYXMgTWVnb2xtRXhwb3J0RW5jcnlwdGlvbiBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbHMvTWVnb2xtRXhwb3J0RW5jcnlwdGlvblwiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgeyBLZXlzU3RhcnRpbmdXaXRoIH0gZnJvbSBcIi4uLy4uLy4uLy4uL0B0eXBlcy9jb21tb25cIjtcbmltcG9ydCBQYXNzcGhyYXNlRmllbGQgZnJvbSBcIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdmlld3MvYXV0aC9QYXNzcGhyYXNlRmllbGRcIjtcbmltcG9ydCBQYXNzcGhyYXNlQ29uZmlybUZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2F1dGgvUGFzc3BocmFzZUNvbmZpcm1GaWVsZFwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkXCI7XG5cbmVudW0gUGhhc2Uge1xuICAgIEVkaXQgPSBcImVkaXRcIixcbiAgICBFeHBvcnRpbmcgPSBcImV4cG9ydGluZ1wiLFxufVxuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudDtcbiAgICBvbkZpbmlzaGVkKGRvRXhwb3J0PzogYm9vbGVhbik6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHBoYXNlOiBQaGFzZTtcbiAgICBlcnJTdHI6IHN0cmluZyB8IG51bGw7XG4gICAgcGFzc3BocmFzZTE6IHN0cmluZztcbiAgICBwYXNzcGhyYXNlMjogc3RyaW5nO1xufVxuXG50eXBlIEFueVBhc3NwaHJhc2UgPSBLZXlzU3RhcnRpbmdXaXRoPElTdGF0ZSwgXCJwYXNzcGhyYXNlXCI+O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBvcnRFMmVLZXlzRGlhbG9nIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBmaWVsZFBhc3N3b3JkOiBGaWVsZCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZmllbGRQYXNzd29yZENvbmZpcm06IEZpZWxkIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHVubW91bnRlZCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwaGFzZTogUGhhc2UuRWRpdCxcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIHBhc3NwaHJhc2UxOiBcIlwiLFxuICAgICAgICAgICAgcGFzc3BocmFzZTI6IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlGaWVsZHNCZWZvcmVTdWJtaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkc0luRGlzcGxheU9yZGVyID0gW3RoaXMuZmllbGRQYXNzd29yZCwgdGhpcy5maWVsZFBhc3N3b3JkQ29uZmlybV07XG5cbiAgICAgICAgY29uc3QgaW52YWxpZEZpZWxkczogRmllbGRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzSW5EaXNwbGF5T3JkZXIpIHtcbiAgICAgICAgICAgIGlmICghZmllbGQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IGZpZWxkLnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaW52YWxpZEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZhbGlkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgaW52YWxpZCBmaWVsZCwgdGhlbiByZS12YWxpZGF0ZSxcbiAgICAgICAgLy8gd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGVycm9yIHRvb2x0aXAgYmVpbmcgZGlzcGxheWVkIGZvciB0aGF0IGZpZWxkLlxuICAgICAgICBpbnZhbGlkRmllbGRzWzBdLmZvY3VzKCk7XG4gICAgICAgIGludmFsaWRGaWVsZHNbMF0udmFsaWRhdGUoeyBhbGxvd0VtcHR5OiBmYWxzZSwgZm9jdXNlZDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblBhc3NwaHJhc2VGb3JtU3VibWl0ID0gYXN5bmMgKGV2OiBSZWFjdC5Gb3JtRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnZlcmlmeUZpZWxkc0JlZm9yZVN1Ym1pdCgpKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy51bm1vdW50ZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5zdGF0ZS5wYXNzcGhyYXNlMTtcbiAgICAgICAgdGhpcy5zdGFydEV4cG9ydChwYXNzcGhyYXNlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGFydEV4cG9ydChwYXNzcGhyYXNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gZXh0cmEgUHJvbWlzZS5yZXNvbHZlKCkgdG8gdHVybiBzeW5jaHJvbm91cyBleGNlcHRpb25zIGludG9cbiAgICAgICAgLy8gYXN5bmNocm9ub3VzIG9uZXMuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMubWF0cml4Q2xpZW50LmdldENyeXB0bygpIS5leHBvcnRSb29tS2V5c0FzSnNvbigpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1lZ29sbUV4cG9ydEVuY3J5cHRpb24uZW5jcnlwdE1lZ29sbUtleUZpbGUoaywgcGFzc3BocmFzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKGYpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZdLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXVzLWFzY2lpXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhibG9iLCBcImVsZW1lbnQta2V5cy50eHRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGV4cG9ydGluZyBlMmUga2V5czpcIiwgZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZS5mcmllbmRseVRleHQgfHwgX3QoXCJlcnJvcnx1bmtub3duXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBlcnJTdHI6IG1zZyxcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IFBoYXNlLkVkaXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIHBoYXNlOiBQaGFzZS5FeHBvcnRpbmcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5jZWxDbGljayA9IChldjogUmVhY3QuTW91c2VFdmVudCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25QYXNzcGhyYXNlQ2hhbmdlID0gKGV2OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgcGhyYXNlOiBBbnlQYXNzcGhyYXNlKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgW3BocmFzZV06IGV2LnRhcmdldC52YWx1ZSxcbiAgICAgICAgfSBhcyBQaWNrPElTdGF0ZSwgQW55UGFzc3BocmFzZT4pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVGb3JtID0gdGhpcy5zdGF0ZS5waGFzZSA9PT0gUGhhc2UuRXhwb3J0aW5nO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X2V4cG9ydEUyZUtleXNEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxleHBvcnRfdGl0bGVcIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMub25QYXNzcGhyYXNlRm9ybVN1Ym1pdH0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPntfdChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fGV4cG9ydF9kZXNjcmlwdGlvbl8xXCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPntfdChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fGV4cG9ydF9kZXNjcmlwdGlvbl8yXCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXJyb3JcIj57dGhpcy5zdGF0ZS5lcnJTdHJ9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0UyZUtleXNEaWFsb2dfaW5wdXRUYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGFzc3BocmFzZUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TY29yZT17M31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdGQoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxlbnRlcl9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbnRlclBhc3N3b3JkPXtfdGQoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxlbnRlcl9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxTdHJvbmdQYXNzd29yZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX3N0cm9uZ19lbm91Z2hcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEFsbG93ZWRCdXRVbnNhZmU9e190ZChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fHBocmFzZV9zdHJvbmdfZW5vdWdoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3BocmFzZTF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGU6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYXNzcGhyYXNlQ2hhbmdlKGUsIFwicGFzc3BocmFzZTFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1cz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9ezY0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlRm9ybX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZj17KGZpZWxkKSA9PiAodGhpcy5maWVsZFBhc3N3b3JkID0gZmllbGQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGFzc3BocmFzZUNvbmZpcm1GaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9e3RoaXMuc3RhdGUucGFzc3BocmFzZTF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8Y29uZmlybV9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZXF1aXJlZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX2Nhbm5vdF9iZV9lbXB0eVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsSW52YWxpZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX211c3RfbWF0Y2hcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzcGhyYXNlMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZTogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblBhc3NwaHJhc2VDaGFuZ2UoZSwgXCJwYXNzcGhyYXNlMlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17NjR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVGb3JtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmPXsoZmllbGQpID0+ICh0aGlzLmZpZWxkUGFzc3dvcmRDb25maXJtID0gZmllbGQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0RpYWxvZ19idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EaWFsb2dfcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e190KFwiYWN0aW9ufGV4cG9ydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZUZvcm19XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uQ2FuY2VsQ2xpY2t9IGRpc2FibGVkPXtkaXNhYmxlRm9ybX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiYWN0aW9ufGNhbmNlbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxzQkFBQSxHQUFBQyx1QkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU8sZ0JBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLHVCQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFBOEYsU0FBQVMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEs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