UNPKG

matrix-react-sdk

Version:
241 lines (238 loc) 42.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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _LegacyCallContextMenu = _interopRequireDefault(require("../../context_menus/LegacyCallContextMenu")); var _DialpadContextMenu = _interopRequireDefault(require("../../context_menus/DialpadContextMenu")); var _ContextMenu = require("../../../structures/ContextMenu"); var _languageHandler = require("../../../../languageHandler"); var _DeviceContextMenu = _interopRequireDefault(require("../../context_menus/DeviceContextMenu")); var _MediaDeviceHandler = require("../../../../MediaDeviceHandler"); var _AccessibleButton = _interopRequireDefault(require("../../elements/AccessibleButton")); const _excluded = ["children", "state", "className", "onLabel", "offLabel", "forceHide", "onHover"], _excluded2 = ["state", "deviceKinds"]; /* Copyright 2024 New Vector Ltd. Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com> Copyright 2019-2021 The Matrix.org Foundation C.I.C. Copyright 2015, 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ 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; } // Height of the header duplicated from CSS because we need to subtract it from our max // height to get the max height of the video const CONTEXT_MENU_VPADDING = 8; // How far the context menu sits above the button (px) const CONTROLS_HIDE_DELAY = 2000; const LegacyCallViewToggleButton = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => { let { children, state: isOn, className, onLabel, offLabel, forceHide, onHover } = _ref, props = (0, _objectWithoutProperties2.default)(_ref, _excluded); const classes = (0, _classnames.default)("mx_LegacyCallViewButtons_button", className, { mx_LegacyCallViewButtons_button_on: isOn, mx_LegacyCallViewButtons_button_off: !isOn }); const title = forceHide ? undefined : isOn ? onLabel : offLabel; return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({ ref: ref, className: classes, title: title, placement: "top", onTooltipOpenChange: onHover }, props), children); }); const LegacyCallViewDropdownButton = _ref2 => { let { state, deviceKinds } = _ref2, props = (0, _objectWithoutProperties2.default)(_ref2, _excluded2); const [menuDisplayed, buttonRef, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); const [hoveringDropdown, setHoveringDropdown] = (0, _react.useState)(false); const classes = (0, _classnames.default)("mx_LegacyCallViewButtons_button", "mx_LegacyCallViewButtons_dropdownButton", { mx_LegacyCallViewButtons_dropdownButton_collapsed: !menuDisplayed }); const onClick = event => { event.stopPropagation(); openMenu(); }; return /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, (0, _extends2.default)({ ref: buttonRef, forceHide: menuDisplayed || hoveringDropdown, state: state }, props), /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, { className: classes, onClick: onClick, onHover: hovering => setHoveringDropdown(hovering), state: state }), menuDisplayed && buttonRef.current && /*#__PURE__*/_react.default.createElement(_DeviceContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysAboveRightOf)(buttonRef.current.getBoundingClientRect()), { onFinished: closeMenu, deviceKinds: deviceKinds }))); }; class LegacyCallViewButtons extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "dialpadButton", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "contextMenuButton", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "controlsHideTimer", null); (0, _defineProperty2.default)(this, "onControlsHideTimer", () => { if (this.state.hoveringControls || this.state.showDialpad || this.state.showMoreMenu) return; this.controlsHideTimer = null; this.setState({ visible: false }); }); (0, _defineProperty2.default)(this, "onMouseEnter", () => { this.setState({ hoveringControls: true }); }); (0, _defineProperty2.default)(this, "onMouseLeave", () => { this.setState({ hoveringControls: false }); }); (0, _defineProperty2.default)(this, "onDialpadClick", () => { if (!this.state.showDialpad) { this.setState({ showDialpad: true }); this.showControls(); } else { this.setState({ showDialpad: false }); } }); (0, _defineProperty2.default)(this, "onMoreClick", () => { this.setState({ showMoreMenu: true }); this.showControls(); }); (0, _defineProperty2.default)(this, "closeDialpad", () => { this.setState({ showDialpad: false }); }); (0, _defineProperty2.default)(this, "closeContextMenu", () => { this.setState({ showMoreMenu: false }); }); this.state = { showDialpad: false, hoveringControls: false, showMoreMenu: false, visible: true }; } componentDidMount() { this.showControls(); } showControls() { if (this.state.showMoreMenu || this.state.showDialpad) return; if (!this.state.visible) { this.setState({ visible: true }); } if (this.controlsHideTimer !== null) { clearTimeout(this.controlsHideTimer); } this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY); } render() { const callControlsClasses = (0, _classnames.default)("mx_LegacyCallViewButtons", { mx_LegacyCallViewButtons_hidden: !this.state.visible }); let dialPad; if (this.state.showDialpad && this.dialpadButton.current) { dialPad = /*#__PURE__*/_react.default.createElement(_DialpadContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysMenuProps)(this.dialpadButton.current.getBoundingClientRect(), _ContextMenu.ChevronFace.None, CONTEXT_MENU_VPADDING), { // We mount the context menus as a child typically in order to include the // context menus when fullscreening the call content. // However, this does not work as well when the call is embedded in a // picture-in-picture frame. Thus, only mount as child when we are *not* in PiP. mountAsChild: !this.props.pipMode, onFinished: this.closeDialpad, call: this.props.call })); } let contextMenu; if (this.state.showMoreMenu && this.contextMenuButton.current) { contextMenu = /*#__PURE__*/_react.default.createElement(_LegacyCallContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysMenuProps)(this.contextMenuButton.current.getBoundingClientRect(), _ContextMenu.ChevronFace.None, CONTEXT_MENU_VPADDING), { mountAsChild: !this.props.pipMode, onFinished: this.closeContextMenu, call: this.props.call })); } return /*#__PURE__*/_react.default.createElement("div", { className: callControlsClasses, onMouseEnter: this.onMouseEnter, onMouseLeave: this.onMouseLeave }, dialPad, contextMenu, this.props.buttonsVisibility.dialpad && /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_dialpad", ref: this.dialpadButton, onClick: this.onDialpadClick, isExpanded: this.state.showDialpad, title: (0, _languageHandler._t)("voip|dialpad"), placement: "top" }), /*#__PURE__*/_react.default.createElement(LegacyCallViewDropdownButton, { state: !this.props.buttonsState.micMuted, className: "mx_LegacyCallViewButtons_button_mic", onLabel: (0, _languageHandler._t)("voip|disable_microphone"), offLabel: (0, _languageHandler._t)("voip|enable_microphone"), onClick: this.props.handlers.onMicMuteClick, deviceKinds: [_MediaDeviceHandler.MediaDeviceKindEnum.AudioInput, _MediaDeviceHandler.MediaDeviceKindEnum.AudioOutput] }), this.props.buttonsVisibility.vidMute && /*#__PURE__*/_react.default.createElement(LegacyCallViewDropdownButton, { state: !this.props.buttonsState.vidMuted, className: "mx_LegacyCallViewButtons_button_vid", onLabel: (0, _languageHandler._t)("voip|disable_camera"), offLabel: (0, _languageHandler._t)("voip|enable_camera"), onClick: this.props.handlers.onVidMuteClick, deviceKinds: [_MediaDeviceHandler.MediaDeviceKindEnum.VideoInput] }), this.props.buttonsVisibility.screensharing && /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, { state: this.props.buttonsState.screensharing, className: "mx_LegacyCallViewButtons_button_screensharing", onLabel: (0, _languageHandler._t)("voip|stop_screenshare"), offLabel: (0, _languageHandler._t)("voip|start_screenshare"), onClick: this.props.handlers.onScreenshareClick }), this.props.buttonsVisibility.sidebar && /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, { state: this.props.buttonsState.sidebarShown, className: "mx_LegacyCallViewButtons_button_sidebar", onLabel: (0, _languageHandler._t)("voip|hide_sidebar_button"), offLabel: (0, _languageHandler._t)("voip|show_sidebar_button"), onClick: this.props.handlers.onToggleSidebarClick }), this.props.buttonsVisibility.contextMenu && /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_more", onClick: this.onMoreClick, ref: this.contextMenuButton, isExpanded: this.state.showMoreMenu, title: (0, _languageHandler._t)("voip|more_button"), placement: "top" }), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_hangup", onClick: this.props.handlers.onHangupClick, title: (0, _languageHandler._t)("voip|hangup"), placement: "top" })); } } exports.default = LegacyCallViewButtons; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfTGVnYWN5Q2FsbENvbnRleHRNZW51IiwiX0RpYWxwYWRDb250ZXh0TWVudSIsIl9Db250ZXh0TWVudSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRGV2aWNlQ29udGV4dE1lbnUiLCJfTWVkaWFEZXZpY2VIYW5kbGVyIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ09OVEVYVF9NRU5VX1ZQQURESU5HIiwiQ09OVFJPTFNfSElERV9ERUxBWSIsIkxlZ2FjeUNhbGxWaWV3VG9nZ2xlQnV0dG9uIiwiZm9yd2FyZFJlZiIsIl9yZWYiLCJyZWYiLCJjaGlsZHJlbiIsInN0YXRlIiwiaXNPbiIsImNsYXNzTmFtZSIsIm9uTGFiZWwiLCJvZmZMYWJlbCIsImZvcmNlSGlkZSIsIm9uSG92ZXIiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjbGFzc2VzIiwiY2xhc3NOYW1lcyIsIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fb24iLCJteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX29mZiIsInRpdGxlIiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsInBsYWNlbWVudCIsIm9uVG9vbHRpcE9wZW5DaGFuZ2UiLCJMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uIiwiX3JlZjIiLCJkZXZpY2VLaW5kcyIsIm1lbnVEaXNwbGF5ZWQiLCJidXR0b25SZWYiLCJvcGVuTWVudSIsImNsb3NlTWVudSIsInVzZUNvbnRleHRNZW51IiwiaG92ZXJpbmdEcm9wZG93biIsInNldEhvdmVyaW5nRHJvcGRvd24iLCJ1c2VTdGF0ZSIsIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvbl9jb2xsYXBzZWQiLCJvbkNsaWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJob3ZlcmluZyIsImN1cnJlbnQiLCJhbHdheXNBYm92ZVJpZ2h0T2YiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvbkZpbmlzaGVkIiwiTGVnYWN5Q2FsbFZpZXdCdXR0b25zIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJob3ZlcmluZ0NvbnRyb2xzIiwic2hvd0RpYWxwYWQiLCJzaG93TW9yZU1lbnUiLCJjb250cm9sc0hpZGVUaW1lciIsInNldFN0YXRlIiwidmlzaWJsZSIsInNob3dDb250cm9scyIsImNvbXBvbmVudERpZE1vdW50IiwiY2xlYXJUaW1lb3V0Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uQ29udHJvbHNIaWRlVGltZXIiLCJyZW5kZXIiLCJjYWxsQ29udHJvbHNDbGFzc2VzIiwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2hpZGRlbiIsImRpYWxQYWQiLCJkaWFscGFkQnV0dG9uIiwiYWx3YXlzTWVudVByb3BzIiwiQ2hldnJvbkZhY2UiLCJOb25lIiwibW91bnRBc0NoaWxkIiwicGlwTW9kZSIsImNsb3NlRGlhbHBhZCIsImNvbnRleHRNZW51IiwiY29udGV4dE1lbnVCdXR0b24iLCJjbG9zZUNvbnRleHRNZW51Iiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiYnV0dG9uc1Zpc2liaWxpdHkiLCJkaWFscGFkIiwiQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIiwib25EaWFscGFkQ2xpY2siLCJpc0V4cGFuZGVkIiwiX3QiLCJidXR0b25zU3RhdGUiLCJtaWNNdXRlZCIsImhhbmRsZXJzIiwib25NaWNNdXRlQ2xpY2siLCJNZWRpYURldmljZUtpbmRFbnVtIiwiQXVkaW9JbnB1dCIsIkF1ZGlvT3V0cHV0IiwidmlkTXV0ZSIsInZpZE11dGVkIiwib25WaWRNdXRlQ2xpY2siLCJWaWRlb0lucHV0Iiwic2NyZWVuc2hhcmluZyIsIm9uU2NyZWVuc2hhcmVDbGljayIsInNpZGViYXIiLCJzaWRlYmFyU2hvd24iLCJvblRvZ2dsZVNpZGViYXJDbGljayIsIm9uTW9yZUNsaWNrIiwib25IYW5ndXBDbGljayIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy92b2lwL0xlZ2FjeUNhbGxWaWV3L0xlZ2FjeUNhbGxWaWV3QnV0dG9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgxaBpbW9uIEJyYW5kbmVyIDxzaW1vbi5icmEuYWdAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiwgdXNlU3RhdGUsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBNYXRyaXhDYWxsIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3dlYnJ0Yy9jYWxsXCI7XG5cbmltcG9ydCBMZWdhY3lDYWxsQ29udGV4dE1lbnUgZnJvbSBcIi4uLy4uL2NvbnRleHRfbWVudXMvTGVnYWN5Q2FsbENvbnRleHRNZW51XCI7XG5pbXBvcnQgRGlhbHBhZENvbnRleHRNZW51IGZyb20gXCIuLi8uLi9jb250ZXh0X21lbnVzL0RpYWxwYWRDb250ZXh0TWVudVwiO1xuaW1wb3J0IHtcbiAgICBhbHdheXNNZW51UHJvcHMsXG4gICAgYWx3YXlzQWJvdmVSaWdodE9mLFxuICAgIENoZXZyb25GYWNlLFxuICAgIENvbnRleHRNZW51VG9vbHRpcEJ1dHRvbixcbiAgICB1c2VDb250ZXh0TWVudSxcbn0gZnJvbSBcIi4uLy4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IERldmljZUNvbnRleHRNZW51IGZyb20gXCIuLi8uLi9jb250ZXh0X21lbnVzL0RldmljZUNvbnRleHRNZW51XCI7XG5pbXBvcnQgeyBNZWRpYURldmljZUtpbmRFbnVtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL01lZGlhRGV2aWNlSGFuZGxlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQsIEJ1dHRvblByb3BzIGFzIEFjY2Vzc2libGVCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi8uLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5cbi8vIEhlaWdodCBvZiB0aGUgaGVhZGVyIGR1cGxpY2F0ZWQgZnJvbSBDU1MgYmVjYXVzZSB3ZSBuZWVkIHRvIHN1YnRyYWN0IGl0IGZyb20gb3VyIG1heFxuLy8gaGVpZ2h0IHRvIGdldCB0aGUgbWF4IGhlaWdodCBvZiB0aGUgdmlkZW9cbmNvbnN0IENPTlRFWFRfTUVOVV9WUEFERElORyA9IDg7IC8vIEhvdyBmYXIgdGhlIGNvbnRleHQgbWVudSBzaXRzIGFib3ZlIHRoZSBidXR0b24gKHB4KVxuXG5jb25zdCBDT05UUk9MU19ISURFX0RFTEFZID0gMjAwMDtcblxudHlwZSBCdXR0b25Qcm9wcyA9IE9taXQ8QWNjZXNzaWJsZUJ1dHRvblByb3BzPFwiZGl2XCI+LCBcInRpdGxlXCIgfCBcImVsZW1lbnRcIj4gJiB7XG4gICAgc3RhdGU6IGJvb2xlYW47XG4gICAgb25MYWJlbD86IHN0cmluZztcbiAgICBvZmZMYWJlbD86IHN0cmluZztcbiAgICBmb3JjZUhpZGU/OiBib29sZWFuO1xuICAgIG9uSG92ZXI/OiAoaG92ZXJpbmc6IGJvb2xlYW4pID0+IHZvaWQ7XG59O1xuXG5jb25zdCBMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvbiA9IGZvcndhcmRSZWY8SFRNTEVsZW1lbnQsIEJ1dHRvblByb3BzPihcbiAgICAoeyBjaGlsZHJlbiwgc3RhdGU6IGlzT24sIGNsYXNzTmFtZSwgb25MYWJlbCwgb2ZmTGFiZWwsIGZvcmNlSGlkZSwgb25Ib3ZlciwgLi4ucHJvcHMgfSwgcmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvblwiLCBjbGFzc05hbWUsIHtcbiAgICAgICAgICAgIG14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fb246IGlzT24sXG4gICAgICAgICAgICBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX29mZjogIWlzT24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZm9yY2VIaWRlID8gdW5kZWZpbmVkIDogaXNPbiA/IG9uTGFiZWwgOiBvZmZMYWJlbDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgb25Ub29sdGlwT3BlbkNoYW5nZT17b25Ib3Zlcn1cbiAgICAgICAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICApO1xuICAgIH0sXG4pO1xuXG5pbnRlcmZhY2UgSURyb3Bkb3duQnV0dG9uUHJvcHMgZXh0ZW5kcyBCdXR0b25Qcm9wcyB7XG4gICAgZGV2aWNlS2luZHM6IE1lZGlhRGV2aWNlS2luZEVudW1bXTtcbn1cblxuY29uc3QgTGVnYWN5Q2FsbFZpZXdEcm9wZG93bkJ1dHRvbjogUmVhY3QuRkM8SURyb3Bkb3duQnV0dG9uUHJvcHM+ID0gKHsgc3RhdGUsIGRldmljZUtpbmRzLCAuLi5wcm9wcyB9KSA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGJ1dHRvblJlZiwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudSgpO1xuICAgIGNvbnN0IFtob3ZlcmluZ0Ryb3Bkb3duLCBzZXRIb3ZlcmluZ0Ryb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvblwiLCBcIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvblwiLCB7XG4gICAgICAgIG14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvbl9jb2xsYXBzZWQ6ICFtZW51RGlzcGxheWVkLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb25DbGljayA9IChldmVudDogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9wZW5NZW51KCk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgcmVmPXtidXR0b25SZWZ9XG4gICAgICAgICAgICBmb3JjZUhpZGU9e21lbnVEaXNwbGF5ZWQgfHwgaG92ZXJpbmdEcm9wZG93bn1cbiAgICAgICAgICAgIHN0YXRlPXtzdGF0ZX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgPlxuICAgICAgICAgICAgPExlZ2FjeUNhbGxWaWV3VG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICAgICAgb25Ib3Zlcj17KGhvdmVyaW5nKSA9PiBzZXRIb3ZlcmluZ0Ryb3Bkb3duKGhvdmVyaW5nKX1cbiAgICAgICAgICAgICAgICBzdGF0ZT17c3RhdGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge21lbnVEaXNwbGF5ZWQgJiYgYnV0dG9uUmVmLmN1cnJlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxEZXZpY2VDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgICAgICB7Li4uYWx3YXlzQWJvdmVSaWdodE9mKGJ1dHRvblJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1cbiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VLaW5kcz17ZGV2aWNlS2luZHN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvTGVnYWN5Q2FsbFZpZXdUb2dnbGVCdXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGNhbGw6IE1hdHJpeENhbGw7XG4gICAgcGlwTW9kZT86IGJvb2xlYW47XG4gICAgaGFuZGxlcnM6IHtcbiAgICAgICAgb25IYW5ndXBDbGljazogKCkgPT4gdm9pZDtcbiAgICAgICAgb25TY3JlZW5zaGFyZUNsaWNrOiAoKSA9PiB2b2lkO1xuICAgICAgICBvblRvZ2dsZVNpZGViYXJDbGljazogKCkgPT4gdm9pZDtcbiAgICAgICAgb25NaWNNdXRlQ2xpY2s6ICgpID0+IHZvaWQ7XG4gICAgICAgIG9uVmlkTXV0ZUNsaWNrOiAoKSA9PiB2b2lkO1xuICAgIH07XG4gICAgYnV0dG9uc1N0YXRlOiB7XG4gICAgICAgIG1pY011dGVkOiBib29sZWFuO1xuICAgICAgICB2aWRNdXRlZDogYm9vbGVhbjtcbiAgICAgICAgc2lkZWJhclNob3duOiBib29sZWFuO1xuICAgICAgICBzY3JlZW5zaGFyaW5nOiBib29sZWFuO1xuICAgIH07XG4gICAgYnV0dG9uc1Zpc2liaWxpdHk6IHtcbiAgICAgICAgc2NyZWVuc2hhcmluZzogYm9vbGVhbjtcbiAgICAgICAgdmlkTXV0ZTogYm9vbGVhbjtcbiAgICAgICAgc2lkZWJhcjogYm9vbGVhbjtcbiAgICAgICAgZGlhbHBhZDogYm9vbGVhbjtcbiAgICAgICAgY29udGV4dE1lbnU6IGJvb2xlYW47XG4gICAgfTtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgdmlzaWJsZTogYm9vbGVhbjtcbiAgICBzaG93RGlhbHBhZDogYm9vbGVhbjtcbiAgICBob3ZlcmluZ0NvbnRyb2xzOiBib29sZWFuO1xuICAgIHNob3dNb3JlTWVudTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGVnYWN5Q2FsbFZpZXdCdXR0b25zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBkaWFscGFkQnV0dG9uID0gY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICAgIHByaXZhdGUgY29udGV4dE1lbnVCdXR0b24gPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSBjb250cm9sc0hpZGVUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNob3dEaWFscGFkOiBmYWxzZSxcbiAgICAgICAgICAgIGhvdmVyaW5nQ29udHJvbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd01vcmVNZW51OiBmYWxzZSxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93Q29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNob3dNb3JlTWVudSB8fCB0aGlzLnN0YXRlLnNob3dEaWFscGFkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250cm9sc0hpZGVUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29udHJvbHNIaWRlVGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbHNIaWRlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9uQ29udHJvbHNIaWRlVGltZXIsIENPTlRST0xTX0hJREVfREVMQVkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Db250cm9sc0hpZGVUaW1lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaG92ZXJpbmdDb250cm9scyB8fCB0aGlzLnN0YXRlLnNob3dEaWFscGFkIHx8IHRoaXMuc3RhdGUuc2hvd01vcmVNZW51KSByZXR1cm47XG4gICAgICAgIHRoaXMuY29udHJvbHNIaWRlVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Nb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaG92ZXJpbmdDb250cm9sczogdHJ1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBob3ZlcmluZ0NvbnRyb2xzOiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkRpYWxwYWRDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNob3dEaWFscGFkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0RpYWxwYWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dEaWFscGFkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTW9yZUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd01vcmVNZW51OiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGNsb3NlRGlhbHBhZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dEaWFscGFkOiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjbG9zZUNvbnRleHRNZW51ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd01vcmVNZW51OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBjYWxsQ29udHJvbHNDbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc1wiLCB7XG4gICAgICAgICAgICBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfaGlkZGVuOiAhdGhpcy5zdGF0ZS52aXNpYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZGlhbFBhZDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2hvd0RpYWxwYWQgJiYgdGhpcy5kaWFscGFkQnV0dG9uLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGRpYWxQYWQgPSAoXG4gICAgICAgICAgICAgICAgPERpYWxwYWRDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgICAgICB7Li4uYWx3YXlzTWVudVByb3BzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFscGFkQnV0dG9uLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGV2cm9uRmFjZS5Ob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9NRU5VX1ZQQURESU5HLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBtb3VudCB0aGUgY29udGV4dCBtZW51cyBhcyBhIGNoaWxkIHR5cGljYWxseSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0IG1lbnVzIHdoZW4gZnVsbHNjcmVlbmluZyB0aGUgY2FsbCBjb250ZW50LlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHdvcmsgYXMgd2VsbCB3aGVuIHRoZSBjYWxsIGlzIGVtYmVkZGVkIGluIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZS1pbi1waWN0dXJlIGZyYW1lLiBUaHVzLCBvbmx5IG1vdW50IGFzIGNoaWxkIHdoZW4gd2UgYXJlICpub3QqIGluIFBpUC5cbiAgICAgICAgICAgICAgICAgICAgbW91bnRBc0NoaWxkPXshdGhpcy5wcm9wcy5waXBNb2RlfVxuICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXt0aGlzLmNsb3NlRGlhbHBhZH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbD17dGhpcy5wcm9wcy5jYWxsfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRleHRNZW51O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zaG93TW9yZU1lbnUgJiYgdGhpcy5jb250ZXh0TWVudUJ1dHRvbi5jdXJyZW50KSB7XG4gICAgICAgICAgICBjb250ZXh0TWVudSA9IChcbiAgICAgICAgICAgICAgICA8TGVnYWN5Q2FsbENvbnRleHRNZW51XG4gICAgICAgICAgICAgICAgICAgIHsuLi5hbHdheXNNZW51UHJvcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51QnV0dG9uLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGV2cm9uRmFjZS5Ob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9NRU5VX1ZQQURESU5HLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBtb3VudEFzQ2hpbGQ9eyF0aGlzLnByb3BzLnBpcE1vZGV9XG4gICAgICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMuY2xvc2VDb250ZXh0TWVudX1cbiAgICAgICAgICAgICAgICAgICAgY2FsbD17dGhpcy5wcm9wcy5jYWxsfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYWxsQ29udHJvbHNDbGFzc2VzfSBvbk1vdXNlRW50ZXI9e3RoaXMub25Nb3VzZUVudGVyfSBvbk1vdXNlTGVhdmU9e3RoaXMub25Nb3VzZUxlYXZlfT5cbiAgICAgICAgICAgICAgICB7ZGlhbFBhZH1cbiAgICAgICAgICAgICAgICB7Y29udGV4dE1lbnV9XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5idXR0b25zVmlzaWJpbGl0eS5kaWFscGFkICYmIChcbiAgICAgICAgICAgICAgICAgICAgPENvbnRleHRNZW51VG9vbHRpcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbiBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfZGlhbHBhZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuZGlhbHBhZEJ1dHRvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25EaWFscGFkQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXt0aGlzLnN0YXRlLnNob3dEaWFscGFkfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwidm9pcHxkaWFscGFkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlPXshdGhpcy5wcm9wcy5idXR0b25zU3RhdGUubWljTXV0ZWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fbWljXCJcbiAgICAgICAgICAgICAgICAgICAgb25MYWJlbD17X3QoXCJ2b2lwfGRpc2FibGVfbWljcm9waG9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxlbmFibGVfbWljcm9waG9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5oYW5kbGVycy5vbk1pY011dGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlS2luZHM9e1tNZWRpYURldmljZUtpbmRFbnVtLkF1ZGlvSW5wdXQsIE1lZGlhRGV2aWNlS2luZEVudW0uQXVkaW9PdXRwdXRdfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYnV0dG9uc1Zpc2liaWxpdHkudmlkTXV0ZSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT17IXRoaXMucHJvcHMuYnV0dG9uc1N0YXRlLnZpZE11dGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl92aWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25MYWJlbD17X3QoXCJ2b2lwfGRpc2FibGVfY2FtZXJhXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxlbmFibGVfY2FtZXJhXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5oYW5kbGVycy5vblZpZE11dGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUtpbmRzPXtbTWVkaWFEZXZpY2VLaW5kRW51bS5WaWRlb0lucHV0XX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmJ1dHRvbnNWaXNpYmlsaXR5LnNjcmVlbnNoYXJpbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8TGVnYWN5Q2FsbFZpZXdUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPXt0aGlzLnByb3BzLmJ1dHRvbnNTdGF0ZS5zY3JlZW5zaGFyaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl9zY3JlZW5zaGFyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTGFiZWw9e190KFwidm9pcHxzdG9wX3NjcmVlbnNoYXJlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxzdGFydF9zY3JlZW5zaGFyZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25TY3JlZW5zaGFyZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYnV0dG9uc1Zpc2liaWxpdHkuc2lkZWJhciAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9e3RoaXMucHJvcHMuYnV0dG9uc1N0YXRlLnNpZGViYXJTaG93bn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fc2lkZWJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkxhYmVsPXtfdChcInZvaXB8aGlkZV9zaWRlYmFyX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZkxhYmVsPXtfdChcInZvaXB8c2hvd19zaWRlYmFyX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25Ub2dnbGVTaWRlYmFyQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5idXR0b25zVmlzaWJpbGl0eS5jb250ZXh0TWVudSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxDb250ZXh0TWVudVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b24gbXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl9tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25Nb3JlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuY29udGV4dE1lbnVCdXR0b259XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXt0aGlzLnN0YXRlLnNob3dNb3JlTWVudX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInZvaXB8bW9yZV9idXR0b25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbiBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX2hhbmd1cFwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25IYW5ndXBDbGlja31cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwidm9pcHxoYW5ndXBcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAg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