matrix-react-sdk
Version:
SDK for matrix.org using React
256 lines (253 loc) • 46.9 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 _react = _interopRequireDefault(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../../../languageHandler");
var _SdkConfig = _interopRequireDefault(require("../../../../../SdkConfig"));
var _Mjolnir = require("../../../../../mjolnir/Mjolnir");
var _BanList = require("../../../../../mjolnir/BanList");
var _Modal = _interopRequireDefault(require("../../../../../Modal"));
var _MatrixClientPeg = require("../../../../../MatrixClientPeg");
var _ErrorDialog = _interopRequireDefault(require("../../../dialogs/ErrorDialog"));
var _QuestionDialog = _interopRequireDefault(require("../../../dialogs/QuestionDialog"));
var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton"));
var _Field = _interopRequireDefault(require("../../../elements/Field"));
var _SettingsTab = _interopRequireDefault(require("../SettingsTab"));
var _SettingsSection = require("../../shared/SettingsSection");
var _SettingsSubsection = _interopRequireWildcard(require("../../shared/SettingsSubsection"));
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 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 MjolnirUserSettingsTab extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "onPersonalRuleChanged", e => {
this.setState({
newPersonalRule: e.target.value
});
});
(0, _defineProperty2.default)(this, "onNewListChanged", e => {
this.setState({
newList: e.target.value
});
});
(0, _defineProperty2.default)(this, "onAddPersonalRule", async e => {
e.preventDefault();
e.stopPropagation();
let kind = _BanList.RULE_SERVER;
if (this.state.newPersonalRule.startsWith("@")) {
kind = _BanList.RULE_USER;
}
this.setState({
busy: true
});
try {
const list = await _Mjolnir.Mjolnir.sharedInstance().getOrCreatePersonalList();
await list.banEntity(kind, this.state.newPersonalRule, (0, _languageHandler._t)("labs_mjolnir|ban_reason"));
this.setState({
newPersonalRule: ""
}); // this will also cause the new rule to be rendered
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("labs_mjolnir|error_adding_ignore"),
description: (0, _languageHandler._t)("labs_mjolnir|something_went_wrong")
});
} finally {
this.setState({
busy: false
});
}
});
(0, _defineProperty2.default)(this, "onSubscribeList", async e => {
e.preventDefault();
e.stopPropagation();
this.setState({
busy: true
});
try {
const room = await _MatrixClientPeg.MatrixClientPeg.safeGet().joinRoom(this.state.newList);
await _Mjolnir.Mjolnir.sharedInstance().subscribeToList(room.roomId);
this.setState({
newList: ""
}); // this will also cause the new rule to be rendered
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("labs_mjolnir|error_adding_list_title"),
description: (0, _languageHandler._t)("labs_mjolnir|error_adding_list_description")
});
} finally {
this.setState({
busy: false
});
}
});
this.state = {
busy: false,
newPersonalRule: "",
newList: ""
};
}
async removePersonalRule(rule) {
this.setState({
busy: true
});
try {
const list = _Mjolnir.Mjolnir.sharedInstance().getPersonalList();
await list.unbanEntity(rule.kind, rule.entity);
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("labs_mjolnir|error_removing_ignore"),
description: (0, _languageHandler._t)("labs_mjolnir|something_went_wrong")
});
} finally {
this.setState({
busy: false
});
}
}
async unsubscribeFromList(list) {
this.setState({
busy: true
});
try {
await _Mjolnir.Mjolnir.sharedInstance().unsubscribeFromList(list.roomId);
await _MatrixClientPeg.MatrixClientPeg.safeGet().leave(list.roomId);
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("labs_mjolnir|error_removing_list_title"),
description: (0, _languageHandler._t)("labs_mjolnir|error_removing_list_description")
});
} finally {
this.setState({
busy: false
});
}
}
viewListRules(list) {
const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(list.roomId);
const name = room ? room.name : list.roomId;
const renderRules = rules => {
if (rules.length === 0) return /*#__PURE__*/_react.default.createElement("i", null, (0, _languageHandler._t)("labs_mjolnir|rules_empty"));
const tiles = [];
for (const rule of rules) {
tiles.push( /*#__PURE__*/_react.default.createElement("li", {
key: rule.kind + rule.entity
}, /*#__PURE__*/_react.default.createElement("code", null, rule.entity)));
}
return /*#__PURE__*/_react.default.createElement("ul", null, tiles);
};
_Modal.default.createDialog(_QuestionDialog.default, {
title: (0, _languageHandler._t)("labs_mjolnir|rules_title", {
roomName: name
}),
description: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("labs_mjolnir|rules_server")), renderRules(list.serverRules), /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("labs_mjolnir|rules_user")), renderRules(list.userRules)),
button: (0, _languageHandler._t)("action|close"),
hasCancelButton: false
});
}
renderPersonalBanListRules() {
const list = _Mjolnir.Mjolnir.sharedInstance().getPersonalList();
const rules = list ? [...list.userRules, ...list.serverRules] : [];
if (!list || rules.length <= 0) return /*#__PURE__*/_react.default.createElement("i", null, (0, _languageHandler._t)("labs_mjolnir|personal_empty"));
const tiles = [];
for (const rule of rules) {
tiles.push( /*#__PURE__*/_react.default.createElement("li", {
key: rule.entity,
className: "mx_MjolnirUserSettingsTab_listItem"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "danger_sm",
onClick: () => this.removePersonalRule(rule),
disabled: this.state.busy
}, (0, _languageHandler._t)("action|remove")), "\xA0", /*#__PURE__*/_react.default.createElement("code", null, rule.entity)));
}
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("labs_mjolnir|personal_section")), /*#__PURE__*/_react.default.createElement("ul", null, tiles));
}
renderSubscribedBanLists() {
const personalList = _Mjolnir.Mjolnir.sharedInstance().getPersonalList();
const lists = _Mjolnir.Mjolnir.sharedInstance().lists.filter(b => {
return personalList ? personalList.roomId !== b.roomId : true;
});
if (!lists || lists.length <= 0) return /*#__PURE__*/_react.default.createElement("i", null, (0, _languageHandler._t)("labs_mjolnir|no_lists"));
const tiles = [];
for (const list of lists) {
const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(list.roomId);
const name = room ? /*#__PURE__*/_react.default.createElement("span", null, room.name, " (", /*#__PURE__*/_react.default.createElement("code", null, list.roomId), ")") : /*#__PURE__*/_react.default.createElement("code", null, "list.roomId");
tiles.push( /*#__PURE__*/_react.default.createElement("li", {
key: list.roomId,
className: "mx_MjolnirUserSettingsTab_listItem"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "danger_sm",
onClick: () => this.unsubscribeFromList(list),
disabled: this.state.busy
}, (0, _languageHandler._t)("action|unsubscribe")), "\xA0", /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary_sm",
onClick: () => this.viewListRules(list),
disabled: this.state.busy
}, (0, _languageHandler._t)("labs_mjolnir|view_rules")), "\xA0", name));
}
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("labs_mjolnir|lists")), /*#__PURE__*/_react.default.createElement("ul", null, tiles));
}
render() {
const brand = _SdkConfig.default.get().brand;
return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, null, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, /*#__PURE__*/_react.default.createElement("strong", {
className: "warning"
}, (0, _languageHandler._t)("labs_mjolnir|advanced_warning")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("labs_mjolnir|explainer_1", {
brand
}, {
code: s => /*#__PURE__*/_react.default.createElement("code", null, s)
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("labs_mjolnir|explainer_2"))), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("labs_mjolnir|personal_heading"),
description: (0, _languageHandler._t)("labs_mjolnir|personal_description", {
myBanList: (0, _languageHandler._t)("labs_mjolnir|room_name")
})
}, this.renderPersonalBanListRules(), /*#__PURE__*/_react.default.createElement("form", {
onSubmit: this.onAddPersonalRule,
autoComplete: "off"
}, /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "text",
label: (0, _languageHandler._t)("labs_mjolnir|personal_new_label"),
placeholder: (0, _languageHandler._t)("labs_mjolnir|personal_new_placeholder"),
value: this.state.newPersonalRule,
onChange: this.onPersonalRuleChanged
}), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
type: "submit",
kind: "primary",
onClick: this.onAddPersonalRule,
disabled: this.state.busy
}, (0, _languageHandler._t)("action|ignore")))), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("labs_mjolnir|lists_heading"),
description: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("strong", {
className: "warning"
}, (0, _languageHandler._t)("labs_mjolnir|lists_description_1")), "\xA0", /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("labs_mjolnir|lists_description_2")))
}, this.renderSubscribedBanLists(), /*#__PURE__*/_react.default.createElement("form", {
onSubmit: this.onSubscribeList,
autoComplete: "off"
}, /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "text",
label: (0, _languageHandler._t)("labs_mjolnir|lists_new_label"),
value: this.state.newList,
onChange: this.onNewListChanged
}), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
type: "submit",
kind: "primary",
onClick: this.onSubscribeList,
disabled: this.state.busy
}, (0, _languageHandler._t)("action|subscribe"))))));
}
}
exports.default = MjolnirUserSettingsTab;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1Nka0NvbmZpZyIsIl9Nam9sbmlyIiwiX0Jhbkxpc3QiLCJfTW9kYWwiLCJfTWF0cml4Q2xpZW50UGVnIiwiX0Vycm9yRGlhbG9nIiwiX1F1ZXN0aW9uRGlhbG9nIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfRmllbGQiLCJfU2V0dGluZ3NUYWIiLCJfU2V0dGluZ3NTZWN0aW9uIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiTWpvbG5pclVzZXJTZXR0aW5nc1RhYiIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzZXRTdGF0ZSIsIm5ld1BlcnNvbmFsUnVsZSIsInRhcmdldCIsInZhbHVlIiwibmV3TGlzdCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwia2luZCIsIlJVTEVfU0VSVkVSIiwic3RhdGUiLCJzdGFydHNXaXRoIiwiUlVMRV9VU0VSIiwiYnVzeSIsImxpc3QiLCJNam9sbmlyIiwic2hhcmVkSW5zdGFuY2UiLCJnZXRPckNyZWF0ZVBlcnNvbmFsTGlzdCIsImJhbkVudGl0eSIsIl90IiwibG9nZ2VyIiwiZXJyb3IiLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIkVycm9yRGlhbG9nIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInJvb20iLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0Iiwiam9pblJvb20iLCJzdWJzY3JpYmVUb0xpc3QiLCJyb29tSWQiLCJyZW1vdmVQZXJzb25hbFJ1bGUiLCJydWxlIiwiZ2V0UGVyc29uYWxMaXN0IiwidW5iYW5FbnRpdHkiLCJlbnRpdHkiLCJ1bnN1YnNjcmliZUZyb21MaXN0IiwibGVhdmUiLCJ2aWV3TGlzdFJ1bGVzIiwiZ2V0Um9vbSIsIm5hbWUiLCJyZW5kZXJSdWxlcyIsInJ1bGVzIiwibGVuZ3RoIiwiY3JlYXRlRWxlbWVudCIsInRpbGVzIiwicHVzaCIsImtleSIsIlF1ZXN0aW9uRGlhbG9nIiwicm9vbU5hbWUiLCJzZXJ2ZXJSdWxlcyIsInVzZXJSdWxlcyIsImJ1dHRvbiIsImhhc0NhbmNlbEJ1dHRvbiIsInJlbmRlclBlcnNvbmFsQmFuTGlzdFJ1bGVzIiwiY2xhc3NOYW1lIiwib25DbGljayIsImRpc2FibGVkIiwicmVuZGVyU3Vic2NyaWJlZEJhbkxpc3RzIiwicGVyc29uYWxMaXN0IiwibGlzdHMiLCJmaWx0ZXIiLCJiIiwicmVuZGVyIiwiYnJhbmQiLCJTZGtDb25maWciLCJTZXR0aW5nc1NlY3Rpb24iLCJTZXR0aW5nc1N1YnNlY3Rpb25UZXh0IiwiY29kZSIsInMiLCJoZWFkaW5nIiwibXlCYW5MaXN0Iiwib25TdWJtaXQiLCJvbkFkZFBlcnNvbmFsUnVsZSIsImF1dG9Db21wbGV0ZSIsInR5cGUiLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJvblBlcnNvbmFsUnVsZUNoYW5nZWQiLCJGcmFnbWVudCIsIm9uU3Vic2NyaWJlTGlzdCIsIm9uTmV3TGlzdENoYW5nZWQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvdGFicy91c2VyL01qb2xuaXJVc2VyU2V0dGluZ3NUYWIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LTIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50LCBTeW50aGV0aWNFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IHsgTWpvbG5pciB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9tam9sbmlyL01qb2xuaXJcIjtcbmltcG9ydCB7IExpc3RSdWxlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL21qb2xuaXIvTGlzdFJ1bGVcIjtcbmltcG9ydCB7IEJhbkxpc3QsIFJVTEVfU0VSVkVSLCBSVUxFX1VTRVIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbWpvbG5pci9CYW5MaXN0XCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgRXJyb3JEaWFsb2cgZnJvbSBcIi4uLy4uLy4uL2RpYWxvZ3MvRXJyb3JEaWFsb2dcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi4vLi4vLi4vZGlhbG9ncy9RdWVzdGlvbkRpYWxvZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvRmllbGRcIjtcbmltcG9ydCBTZXR0aW5nc1RhYiBmcm9tIFwiLi4vU2V0dGluZ3NUYWJcIjtcbmltcG9ydCB7IFNldHRpbmdzU2VjdGlvbiB9IGZyb20gXCIuLi8uLi9zaGFyZWQvU2V0dGluZ3NTZWN0aW9uXCI7XG5pbXBvcnQgU2V0dGluZ3NTdWJzZWN0aW9uLCB7IFNldHRpbmdzU3Vic2VjdGlvblRleHQgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL1NldHRpbmdzU3Vic2VjdGlvblwiO1xuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBidXN5OiBib29sZWFuO1xuICAgIG5ld1BlcnNvbmFsUnVsZTogc3RyaW5nO1xuICAgIG5ld0xpc3Q6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWpvbG5pclVzZXJTZXR0aW5nc1RhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7fSwgSVN0YXRlPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiB7fSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICAgICAgbmV3UGVyc29uYWxSdWxlOiBcIlwiLFxuICAgICAgICAgICAgbmV3TGlzdDogXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUGVyc29uYWxSdWxlQ2hhbmdlZCA9IChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgbmV3UGVyc29uYWxSdWxlOiBlLnRhcmdldC52YWx1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk5ld0xpc3RDaGFuZ2VkID0gKGU6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBuZXdMaXN0OiBlLnRhcmdldC52YWx1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkFkZFBlcnNvbmFsUnVsZSA9IGFzeW5jIChlOiBTeW50aGV0aWNFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IGtpbmQgPSBSVUxFX1NFUlZFUjtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUubmV3UGVyc29uYWxSdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICBraW5kID0gUlVMRV9VU0VSO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJ1c3k6IHRydWUgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gYXdhaXQgTWpvbG5pci5zaGFyZWRJbnN0YW5jZSgpLmdldE9yQ3JlYXRlUGVyc29uYWxMaXN0KCk7XG4gICAgICAgICAgICBhd2FpdCBsaXN0LmJhbkVudGl0eShraW5kLCB0aGlzLnN0YXRlLm5ld1BlcnNvbmFsUnVsZSwgX3QoXCJsYWJzX21qb2xuaXJ8YmFuX3JlYXNvblwiKSk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbmV3UGVyc29uYWxSdWxlOiBcIlwiIH0pOyAvLyB0aGlzIHdpbGwgYWxzbyBjYXVzZSB0aGUgbmV3IHJ1bGUgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuXG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJsYWJzX21qb2xuaXJ8ZXJyb3JfYWRkaW5nX2lnbm9yZVwiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJsYWJzX21qb2xuaXJ8c29tZXRoaW5nX3dlbnRfd3JvbmdcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXN5OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uU3Vic2NyaWJlTGlzdCA9IGFzeW5jIChlOiBTeW50aGV0aWNFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJ1c3k6IHRydWUgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByb29tID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5qb2luUm9vbSh0aGlzLnN0YXRlLm5ld0xpc3QpO1xuICAgICAgICAgICAgYXdhaXQgTWpvbG5pci5zaGFyZWRJbnN0YW5jZSgpLnN1YnNjcmliZVRvTGlzdChyb29tLnJvb21JZCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbmV3TGlzdDogXCJcIiB9KTsgLy8gdGhpcyB3aWxsIGFsc28gY2F1c2UgdGhlIG5ldyBydWxlIHRvIGJlIHJlbmRlcmVkXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcblxuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwibGFic19tam9sbmlyfGVycm9yX2FkZGluZ19saXN0X3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcImxhYnNfbWpvbG5pcnxlcnJvcl9hZGRpbmdfbGlzdF9kZXNjcmlwdGlvblwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJ1c3k6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgcmVtb3ZlUGVyc29uYWxSdWxlKHJ1bGU6IExpc3RSdWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXN5OiB0cnVlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IE1qb2xuaXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRQZXJzb25hbExpc3QoKTtcbiAgICAgICAgICAgIGF3YWl0IGxpc3QhLnVuYmFuRW50aXR5KHJ1bGUua2luZCwgcnVsZS5lbnRpdHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG5cbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImxhYnNfbWpvbG5pcnxlcnJvcl9yZW1vdmluZ19pZ25vcmVcIiksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwibGFic19tam9sbmlyfHNvbWV0aGluZ193ZW50X3dyb25nXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgYnVzeTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHVuc3Vic2NyaWJlRnJvbUxpc3QobGlzdDogQmFuTGlzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgYnVzeTogdHJ1ZSB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IE1qb2xuaXIuc2hhcmVkSW5zdGFuY2UoKS51bnN1YnNjcmliZUZyb21MaXN0KGxpc3Qucm9vbUlkKTtcbiAgICAgICAgICAgIGF3YWl0IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkubGVhdmUobGlzdC5yb29tSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG5cbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImxhYnNfbWpvbG5pcnxlcnJvcl9yZW1vdmluZ19saXN0X3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcImxhYnNfbWpvbG5pcnxlcnJvcl9yZW1vdmluZ19saXN0X2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgYnVzeTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZpZXdMaXN0UnVsZXMobGlzdDogQmFuTGlzdCk6IHZvaWQge1xuICAgICAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKGxpc3Qucm9vbUlkKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHJvb20gPyByb29tLm5hbWUgOiBsaXN0LnJvb21JZDtcblxuICAgICAgICBjb25zdCByZW5kZXJSdWxlcyA9IChydWxlczogTGlzdFJ1bGVbXSk6IEpTWC5FbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDApIHJldHVybiA8aT57X3QoXCJsYWJzX21qb2xuaXJ8cnVsZXNfZW1wdHlcIil9PC9pPjtcblxuICAgICAgICAgICAgY29uc3QgdGlsZXM6IEpTWC5FbGVtZW50W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgICAgIHRpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIDxsaSBrZXk9e3J1bGUua2luZCArIHJ1bGUuZW50aXR5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPntydWxlLmVudGl0eX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gPHVsPnt0aWxlc308L3VsPjtcbiAgICAgICAgfTtcblxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coUXVlc3Rpb25EaWFsb2csIHtcbiAgICAgICAgICAgIHRpdGxlOiBfdChcImxhYnNfbWpvbG5pcnxydWxlc190aXRsZVwiLCB7IHJvb21OYW1lOiBuYW1lIH0pLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aDM+e190KFwibGFic19tam9sbmlyfHJ1bGVzX3NlcnZlclwiKX08L2gzPlxuICAgICAgICAgICAgICAgICAgICB7cmVuZGVyUnVsZXMobGlzdC5zZXJ2ZXJSdWxlcyl9XG4gICAgICAgICAgICAgICAgICAgIDxoMz57X3QoXCJsYWJzX21qb2xuaXJ8cnVsZXNfdXNlclwiKX08L2gzPlxuICAgICAgICAgICAgICAgICAgICB7cmVuZGVyUnVsZXMobGlzdC51c2VyUnVsZXMpfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGJ1dHRvbjogX3QoXCJhY3Rpb258Y2xvc2VcIiksXG4gICAgICAgICAgICBoYXNDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBlcnNvbmFsQmFuTGlzdFJ1bGVzKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgY29uc3QgbGlzdCA9IE1qb2xuaXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRQZXJzb25hbExpc3QoKTtcbiAgICAgICAgY29uc3QgcnVsZXMgPSBsaXN0ID8gWy4uLmxpc3QudXNlclJ1bGVzLCAuLi5saXN0LnNlcnZlclJ1bGVzXSA6IFtdO1xuICAgICAgICBpZiAoIWxpc3QgfHwgcnVsZXMubGVuZ3RoIDw9IDApIHJldHVybiA8aT57X3QoXCJsYWJzX21qb2xuaXJ8cGVyc29uYWxfZW1wdHlcIil9PC9pPjtcblxuICAgICAgICBjb25zdCB0aWxlczogSlNYLkVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIHRpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgPGxpIGtleT17cnVsZS5lbnRpdHl9IGNsYXNzTmFtZT1cIm14X01qb2xuaXJVc2VyU2V0dGluZ3NUYWJfbGlzdEl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9XCJkYW5nZXJfc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5yZW1vdmVQZXJzb25hbFJ1bGUocnVsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5idXN5fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258cmVtb3ZlXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8Y29kZT57cnVsZS5lbnRpdHl9PC9jb2RlPlxuICAgICAgICAgICAgICAgIDwvbGk+LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwPntfdChcImxhYnNfbWpvbG5pcnxwZXJzb25hbF9zZWN0aW9uXCIpfTwvcD5cbiAgICAgICAgICAgICAgICA8dWw+e3RpbGVzfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclN1YnNjcmliZWRCYW5MaXN0cygpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHBlcnNvbmFsTGlzdCA9IE1qb2xuaXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRQZXJzb25hbExpc3QoKTtcbiAgICAgICAgY29uc3QgbGlzdHMgPSBNam9sbmlyLnNoYXJlZEluc3RhbmNlKCkubGlzdHMuZmlsdGVyKChiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcGVyc29uYWxMaXN0ID8gcGVyc29uYWxMaXN0LnJvb21JZCAhPT0gYi5yb29tSWQgOiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFsaXN0cyB8fCBsaXN0cy5sZW5ndGggPD0gMCkgcmV0dXJuIDxpPntfdChcImxhYnNfbWpvbG5pcnxub19saXN0c1wiKX08L2k+O1xuXG4gICAgICAgIGNvbnN0IHRpbGVzOiBKU1guRWxlbWVudFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbGlzdCBvZiBsaXN0cykge1xuICAgICAgICAgICAgY29uc3Qgcm9vbSA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0Um9vbShsaXN0LnJvb21JZCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcm9vbSA/IChcbiAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3Jvb20ubmFtZX0gKDxjb2RlPntsaXN0LnJvb21JZH08L2NvZGU+KVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGNvZGU+bGlzdC5yb29tSWQ8L2NvZGU+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGlsZXMucHVzaChcbiAgICAgICAgICAgICAgICA8bGkga2V5PXtsaXN0LnJvb21JZH0gY2xhc3NOYW1lPVwibXhfTWpvbG5pclVzZXJTZXR0aW5nc1RhYl9saXN0SXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cImRhbmdlcl9zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnVuc3Vic2NyaWJlRnJvbUxpc3QobGlzdCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5idXN5fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258dW5zdWJzY3JpYmVcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeV9zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnZpZXdMaXN0UnVsZXMobGlzdCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5idXN5fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJsYWJzX21qb2xuaXJ8dmlld19ydWxlc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAge25hbWV9XG4gICAgICAgICAgICAgICAgPC9saT4sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHA+e190KFwibGFic19tam9sbmlyfGxpc3RzXCIpfTwvcD5cbiAgICAgICAgICAgICAgICA8dWw+e3RpbGVzfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gU2RrQ29uZmlnLmdldCgpLmJyYW5kO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8U2V0dGluZ3NUYWI+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzTmFtZT1cIndhcm5pbmdcIj57X3QoXCJsYWJzX21qb2xuaXJ8YWR2YW5jZWRfd2FybmluZ1wiKX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPntfdChcImxhYnNfbWpvbG5pcnxleHBsYWluZXJfMVwiLCB7IGJyYW5kIH0sIHsgY29kZTogKHMpID0+IDxjb2RlPntzfTwvY29kZT4gfSl9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e190KFwibGFic19tam9sbmlyfGV4cGxhaW5lcl8yXCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb25UZXh0PlxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nPXtfdChcImxhYnNfbWpvbG5pcnxwZXJzb25hbF9oZWFkaW5nXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwibGFic19tam9sbmlyfHBlcnNvbmFsX2Rlc2NyaXB0aW9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUJhbkxpc3Q6IF90KFwibGFic19tam9sbmlyfHJvb21fbmFtZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJQZXJzb25hbEJhbkxpc3RSdWxlcygpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMub25BZGRQZXJzb25hbFJ1bGV9IGF1dG9Db21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImxhYnNfbWpvbG5pcnxwZXJzb25hbF9uZXdfbGFiZWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtfdChcImxhYnNfbWpvbG5pcnxwZXJzb25hbF9uZXdfcGxhY2Vob2xkZXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLm5ld1BlcnNvbmFsUnVsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25QZXJzb25hbFJ1bGVDaGFuZ2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vbkFkZFBlcnNvbmFsUnVsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuYnVzeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxpZ25vcmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZz17X3QoXCJsYWJzX21qb2xuaXJ8bGlzdHNfaGVhZGluZ1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzTmFtZT1cIndhcm5pbmdcIj57X3QoXCJsYWJzX21qb2xuaXJ8bGlzdHNfZGVzY3JpcHRpb25fMVwiKX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntfdChcImxhYnNfbWpvbG5pcnxsaXN0c19kZXNjcmlwdGlvbl8yXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyU3Vic2NyaWJlZEJhbkxpc3RzKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5vblN1YnNjcmliZUxpc3R9IGF1dG9Db21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImxhYnNfbWpvbG5pcnxsaXN0c19uZXdfbGFiZWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLm5ld0xpc3R9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uTmV3TGlzdENoYW5nZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uU3Vic2NyaWJlTGlzdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuYnVzeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxzdWJzY3JpYmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgIDwvU2V0dGluZ3NUYWI+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFB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