UNPKG

@blueprintjs/core

Version:
118 lines (116 loc) 15 kB
/* * Copyright 2016 Palantir Technologies, Inc. All rights reserved. * Licensed under the BSD-3 License as modified (the “License”); you may obtain a copy * of the license at https://github.com/palantir/blueprint/blob/master/LICENSE * and https://github.com/palantir/blueprint/blob/master/PATENTS */ "use strict"; var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; var classNames = require("classnames"); var React = require("react"); var ReactDOM = require("react-dom"); var common_1 = require("../../common"); var components_1 = require("../../components"); var hotkey_1 = require("./hotkey"); var hotkeys_1 = require("./hotkeys"); var HotkeysDialog = (function () { function HotkeysDialog() { var _this = this; this.hotkeysDialogProps = { globalHotkeysGroup: "Global hotkeys", }; this.showing = false; this.hotkeysQueue = []; this.timeoutToken = 0; this.unmount = function () { _this.showing = false; return ReactDOM.unmountComponentAtNode(_this.getContainer()); }; this.destroy = function () { _this.showing = false; if (_this.container != null) { ReactDOM.unmountComponentAtNode(_this.container); _this.container.remove(); delete _this.container; } }; this.renderHotkeysDialog = function () { _this.showing = true; _this.render(React.createElement(components_1.Dialog, __assign({}, _this.hotkeysDialogProps, {className: classNames(_this.hotkeysDialogProps.className, "pt-hotkey-dialog"), inline: true, isOpen: true, onClose: _this.unmount}), React.createElement("div", {className: common_1.Classes.DIALOG_BODY}, _this.renderHotkeys()) )); }; } HotkeysDialog.prototype.render = function (node) { return ReactDOM.render(node, this.getContainer()); }; /** * Because hotkeys can be registered globally and locally and because * event ordering cannot be guaranteed, we use this debouncing method to * allow all hotkey listeners to fire and add their hotkeys to the dialog. * * 10msec after the last listener adds their hotkeys, we render the dialog * and clear the queue. */ HotkeysDialog.prototype.enqueueHotkeysForDisplay = function (hotkeys) { this.hotkeysQueue.push(hotkeys); // reset timeout for debounce clearTimeout(this.timeoutToken); this.timeoutToken = setTimeout(this.renderHotkeysDialog, 10); }; HotkeysDialog.prototype.getContainer = function () { if (this.container == null) { this.container = document.createElement("div"); this.container.classList.add(common_1.Classes.PORTAL); document.body.appendChild(this.container); } return this.container; }; HotkeysDialog.prototype.renderHotkeys = function () { var _this = this; var hotkeys = this.emptyHotkeyQueue(); var elements = hotkeys.map(function (hotkey, index) { var group = (hotkey.global === true && hotkey.group == null) ? _this.hotkeysDialogProps.globalHotkeysGroup : hotkey.group; return React.createElement(hotkey_1.Hotkey, __assign({key: index}, hotkey, {group: group})); }); return React.createElement(hotkeys_1.Hotkeys, null, elements); }; HotkeysDialog.prototype.emptyHotkeyQueue = function () { // flatten then empty the hotkeys queue var hotkeys = this.hotkeysQueue.reduce((function (arr, queued) { return arr.concat(queued); }), []); this.hotkeysQueue.length = 0; return hotkeys; }; return HotkeysDialog; }()); // singleton instance var HOTKEYS_DIALOG = new HotkeysDialog(); function isHotkeysDialogShowing() { return HOTKEYS_DIALOG.showing; } exports.isHotkeysDialogShowing = isHotkeysDialogShowing; function setHotkeysDialogProps(props) { for (var key in props) { if (props.hasOwnProperty(key)) { HOTKEYS_DIALOG.hotkeysDialogProps[key] = props[key]; } } } exports.setHotkeysDialogProps = setHotkeysDialogProps; function showHotkeysDialog(hotkeys) { HOTKEYS_DIALOG.enqueueHotkeysForDisplay(hotkeys); } exports.showHotkeysDialog = showHotkeysDialog; function hideHotkeysDialog() { HOTKEYS_DIALOG.unmount(); } exports.hideHotkeysDialog = hideHotkeysDialog; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL2hvdGtleXMvaG90a2V5c0RpYWxvZy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7Ozs7Ozs7Ozs7QUFFSCxJQUFZLFVBQVUsV0FBTSxZQUFZLENBQUMsQ0FBQTtBQUN6QyxJQUFZLEtBQUssV0FBTSxPQUFPLENBQUMsQ0FBQTtBQUMvQixJQUFZLFFBQVEsV0FBTSxXQUFXLENBQUMsQ0FBQTtBQUV0Qyx1QkFBd0IsY0FBYyxDQUFDLENBQUE7QUFDdkMsMkJBQXFDLGtCQUFrQixDQUFDLENBQUE7QUFDeEQsdUJBQXFDLFVBQVUsQ0FBQyxDQUFBO0FBQ2hELHdCQUF3QixXQUFXLENBQUMsQ0FBQTtBQVVwQztJQUFBO1FBQUEsaUJBcUZDO1FBcEZVLHVCQUFrQixHQUFHO1lBQ3hCLGtCQUFrQixFQUFFLGdCQUFnQjtTQUNULENBQUM7UUFDekIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNmLGlCQUFZLEdBQUcsRUFBc0IsQ0FBQztRQUN0QyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQU9sQixZQUFPLEdBQUc7WUFDYixLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQTtRQUVNLFlBQU8sR0FBRztZQUNiLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDekIsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDaEQsS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxLQUFJLENBQUMsU0FBUyxDQUFDO1lBQzFCLENBQUM7UUFDTCxDQUFDLENBQUE7UUEyQk8sd0JBQW1CLEdBQUc7WUFDMUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsS0FBSSxDQUFDLE1BQU0sQ0FDUCxvQkFBQyxtQkFBTSxlQUNDLEtBQUksQ0FBQyxrQkFBa0IsR0FDM0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFFLEVBQzdFLE1BQU0sUUFDTixNQUFNLFFBQ04sT0FBTyxFQUFFLEtBQUksQ0FBQyxPQUFRO2dCQUV0QixxQkFBQyxHQUFHLElBQUMsU0FBUyxFQUFFLGdCQUFPLENBQUMsV0FBWSxHQUFFLEtBQUksQ0FBQyxhQUFhLEVBQUcsQ0FBTTthQUM1RCxDQUNaLENBQUM7UUFDTixDQUFDLENBQUE7SUFvQkwsQ0FBQztJQTVFVSw4QkFBTSxHQUFiLFVBQWMsSUFBNkI7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFnQkQ7Ozs7Ozs7T0FPRztJQUNJLGdEQUF3QixHQUEvQixVQUFnQyxPQUF1QjtRQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVoQyw2QkFBNkI7UUFDN0IsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVPLG9DQUFZLEdBQXBCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFpQk8scUNBQWEsR0FBckI7UUFBQSxpQkFVQztRQVRHLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLEVBQUUsS0FBSztZQUN2QyxJQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO2dCQUMxRCxLQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUU5RCxNQUFNLENBQUMsb0JBQUMsZUFBTSxZQUFDLEdBQUcsRUFBRSxLQUFNLEdBQUssTUFBTSxHQUFFLEtBQUssRUFBRSxLQUFNLEdBQUcsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxvQkFBQyxpQkFBTyxRQUFFLFFBQVMsQ0FBVSxDQUFDO0lBQ3pDLENBQUM7SUFFTyx3Q0FBZ0IsR0FBeEI7UUFDSSx1Q0FBdUM7UUFDdkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFDLEdBQUcsRUFBRSxNQUFNLElBQUssT0FBQSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFsQixDQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNMLG9CQUFDO0FBQUQsQ0FyRkEsQUFxRkMsSUFBQTtBQUVELHFCQUFxQjtBQUNyQixJQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBRTNDO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDbEMsQ0FBQztBQUZlLDhCQUFzQix5QkFFckMsQ0FBQTtBQUVELCtCQUFzQyxLQUEwQjtJQUM1RCxHQUFHLENBQUMsQ0FBQyxJQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxrQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBSSxLQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBTmUsNkJBQXFCLHdCQU1wQyxDQUFBO0FBRUQsMkJBQWtDLE9BQXVCO0lBQ3JELGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRmUseUJBQWlCLG9CQUVoQyxDQUFBO0FBRUQ7SUFDSSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUZlLHlCQUFpQixvQkFFaEMsQ0FBQSIsImZpbGUiOiJjb21wb25lbnRzL2hvdGtleXMvaG90a2V5c0RpYWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QtMyBMaWNlbnNlIGFzIG1vZGlmaWVkICh0aGUg4oCcTGljZW5zZeKAnSk7IHlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9QQVRFTlRTXG4gKi9cblxuaW1wb3J0ICogYXMgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5cbmltcG9ydCB7IENsYXNzZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBEaWFsb2csIElEaWFsb2dQcm9wcyB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBIb3RrZXksIElIb3RrZXlQcm9wcyB9IGZyb20gXCIuL2hvdGtleVwiO1xuaW1wb3J0IHsgSG90a2V5cyB9IGZyb20gXCIuL2hvdGtleXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJSG90a2V5c0RpYWxvZ1Byb3BzIGV4dGVuZHMgSURpYWxvZ1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIHN0cmluZyBkaXNwbGF5ZWQgYXMgdGhlIGdyb3VwIG5hbWUgaW4gdGhlIGhvdGtleXMgZGlhbG9nIGZvciBhbGxcbiAgICAgKiBnbG9iYWwgaG90a2V5cy5cbiAgICAgKi9cbiAgICBnbG9iYWxIb3RrZXlzR3JvdXA/OiBzdHJpbmc7XG59XG5cbmNsYXNzIEhvdGtleXNEaWFsb2cge1xuICAgIHB1YmxpYyBob3RrZXlzRGlhbG9nUHJvcHMgPSB7XG4gICAgICAgIGdsb2JhbEhvdGtleXNHcm91cDogXCJHbG9iYWwgaG90a2V5c1wiLFxuICAgIH0gYXMgYW55IGFzIElIb3RrZXlzRGlhbG9nUHJvcHM7XG4gICAgcHVibGljIHNob3dpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGhvdGtleXNRdWV1ZSA9IFtdIGFzIElIb3RrZXlQcm9wc1tdW107XG4gICAgcHJpdmF0ZSB0aW1lb3V0VG9rZW4gPSAwO1xuICAgIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIHB1YmxpYyByZW5kZXIobm9kZTogUmVhY3QuUmVhY3RFbGVtZW50PGFueT4pIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0RE9NLnJlbmRlcihub2RlLCB0aGlzLmdldENvbnRhaW5lcigpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5tb3VudCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuZ2V0Q29udGFpbmVyKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWNhdXNlIGhvdGtleXMgY2FuIGJlIHJlZ2lzdGVyZWQgZ2xvYmFsbHkgYW5kIGxvY2FsbHkgYW5kIGJlY2F1c2VcbiAgICAgKiBldmVudCBvcmRlcmluZyBjYW5ub3QgYmUgZ3VhcmFudGVlZCwgd2UgdXNlIHRoaXMgZGVib3VuY2luZyBtZXRob2QgdG9cbiAgICAgKiBhbGxvdyBhbGwgaG90a2V5IGxpc3RlbmVycyB0byBmaXJlIGFuZCBhZGQgdGhlaXIgaG90a2V5cyB0byB0aGUgZGlhbG9nLlxuICAgICAqXG4gICAgICogMTBtc2VjIGFmdGVyIHRoZSBsYXN0IGxpc3RlbmVyIGFkZHMgdGhlaXIgaG90a2V5cywgd2UgcmVuZGVyIHRoZSBkaWFsb2dcbiAgICAgKiBhbmQgY2xlYXIgdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbnF1ZXVlSG90a2V5c0ZvckRpc3BsYXkoaG90a2V5czogSUhvdGtleVByb3BzW10pIHtcbiAgICAgICAgdGhpcy5ob3RrZXlzUXVldWUucHVzaChob3RrZXlzKTtcblxuICAgICAgICAvLyByZXNldCB0aW1lb3V0IGZvciBkZWJvdW5jZVxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VG9rZW4pO1xuICAgICAgICB0aGlzLnRpbWVvdXRUb2tlbiA9IHNldFRpbWVvdXQodGhpcy5yZW5kZXJIb3RrZXlzRGlhbG9nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKENsYXNzZXMuUE9SVEFMKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckhvdGtleXNEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKFxuICAgICAgICAgICAgPERpYWxvZ1xuICAgICAgICAgICAgICAgIHsuLi50aGlzLmhvdGtleXNEaWFsb2dQcm9wc31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXModGhpcy5ob3RrZXlzRGlhbG9nUHJvcHMuY2xhc3NOYW1lLCBcInB0LWhvdGtleS1kaWFsb2dcIil9XG4gICAgICAgICAgICAgICAgaW5saW5lXG4gICAgICAgICAgICAgICAgaXNPcGVuXG4gICAgICAgICAgICAgICAgb25DbG9zZT17dGhpcy51bm1vdW50fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtDbGFzc2VzLkRJQUxPR19CT0RZfT57dGhpcy5yZW5kZXJIb3RrZXlzKCl9PC9kaXY+XG4gICAgICAgICAgICA8L0RpYWxvZz4sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJIb3RrZXlzKCkge1xuICAgICAgICBjb25zdCBob3RrZXlzID0gdGhpcy5lbXB0eUhvdGtleVF1ZXVlKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaG90a2V5cy5tYXAoKGhvdGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gKGhvdGtleS5nbG9iYWwgPT09IHRydWUgJiYgaG90a2V5Lmdyb3VwID09IG51bGwpID9cbiAgICAgICAgICAgICAgICB0aGlzLmhvdGtleXNEaWFsb2dQcm9wcy5nbG9iYWxIb3RrZXlzR3JvdXAgOiBob3RrZXkuZ3JvdXA7XG5cbiAgICAgICAgICAgIHJldHVybiA8SG90a2V5IGtleT17aW5kZXh9IHsuLi5ob3RrZXl9IGdyb3VwPXtncm91cH0gLz47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiA8SG90a2V5cz57ZWxlbWVudHN9PC9Ib3RrZXlzPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtcHR5SG90a2V5UXVldWUoKSB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlbiBlbXB0eSB0aGUgaG90a2V5cyBxdWV1ZVxuICAgICAgICBjb25zdCBob3RrZXlzID0gdGhpcy5ob3RrZXlzUXVldWUucmVkdWNlKCgoYXJyLCBxdWV1ZWQpID0+IGFyci5jb25jYXQocXVldWVkKSksIFtdKTtcbiAgICAgICAgdGhpcy5ob3RrZXlzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIGhvdGtleXM7XG4gICAgfVxufVxuXG4vLyBzaW5nbGV0b24gaW5zdGFuY2VcbmNvbnN0IEhPVEtFWVNfRElBTE9HID0gbmV3IEhvdGtleXNEaWFsb2coKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSG90a2V5c0RpYWxvZ1Nob3dpbmcoKSB7XG4gICAgcmV0dXJuIEhPVEtFWVNfRElBTE9HLnNob3dpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRIb3RrZXlzRGlhbG9nUHJvcHMocHJvcHM6IElIb3RrZXlzRGlhbG9nUHJvcHMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgKEhPVEtFWVNfRElBTE9HLmhvdGtleXNEaWFsb2dQcm9wcyBhcyBhbnkpW2tleV0gPSAocHJvcHMgYXMgYW55KVtrZXldO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0hvdGtleXNEaWFsb2coaG90a2V5czogSUhvdGtleVByb3BzW10pIHtcbiAgICBIT1RLRVlTX0RJQUxPRy5lbnF1ZXVlSG90a2V5c0ZvckRpc3BsYXkoaG90a2V5cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWRlSG90a2V5c0RpYWxvZygpIHtcbiAgICBIT1RLRVlTX0RJQUxPRy51bm1vdW50KCk7XG59XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=