matrix-react-sdk
Version:
SDK for matrix.org using React
283 lines (234 loc) • 28.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isKeyComboMatch = isKeyComboMatch;
exports.getKeyBindingsManager = getKeyBindingsManager;
exports.KeyBindingsManager = exports.NavigationAction = exports.RoomAction = exports.RoomListAction = exports.AutocompleteAction = exports.MessageComposerAction = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _KeyBindingsDefaults = require("./KeyBindingsDefaults");
var _Keyboard = require("./Keyboard");
/*
Copyright 2021 Clemens Zeidler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/** Actions for the chat message composer component */
let MessageComposerAction;
/** Actions for text editing autocompletion */
exports.MessageComposerAction = MessageComposerAction;
(function (MessageComposerAction) {
MessageComposerAction["Send"] = "Send";
MessageComposerAction["SelectPrevSendHistory"] = "SelectPrevSendHistory";
MessageComposerAction["SelectNextSendHistory"] = "SelectNextSendHistory";
MessageComposerAction["EditPrevMessage"] = "EditPrevMessage";
MessageComposerAction["EditNextMessage"] = "EditNextMessage";
MessageComposerAction["CancelEditing"] = "CancelEditing";
MessageComposerAction["FormatBold"] = "FormatBold";
MessageComposerAction["FormatItalics"] = "FormatItalics";
MessageComposerAction["FormatQuote"] = "FormatQuote";
MessageComposerAction["EditUndo"] = "EditUndo";
MessageComposerAction["EditRedo"] = "EditRedo";
MessageComposerAction["NewLine"] = "NewLine";
MessageComposerAction["MoveCursorToStart"] = "MoveCursorToStart";
MessageComposerAction["MoveCursorToEnd"] = "MoveCursorToEnd";
})(MessageComposerAction || (exports.MessageComposerAction = MessageComposerAction = {}));
let AutocompleteAction;
/** Actions for the room list sidebar */
exports.AutocompleteAction = AutocompleteAction;
(function (AutocompleteAction) {
AutocompleteAction["CompleteOrPrevSelection"] = "ApplySelection";
AutocompleteAction["CompleteOrNextSelection"] = "CompleteOrNextSelection";
AutocompleteAction["PrevSelection"] = "PrevSelection";
AutocompleteAction["NextSelection"] = "NextSelection";
AutocompleteAction["Cancel"] = "Cancel";
})(AutocompleteAction || (exports.AutocompleteAction = AutocompleteAction = {}));
let RoomListAction;
/** Actions for the current room view */
exports.RoomListAction = RoomListAction;
(function (RoomListAction) {
RoomListAction["ClearSearch"] = "ClearSearch";
RoomListAction["PrevRoom"] = "PrevRoom";
RoomListAction["NextRoom"] = "NextRoom";
RoomListAction["SelectRoom"] = "SelectRoom";
RoomListAction["CollapseSection"] = "CollapseSection";
RoomListAction["ExpandSection"] = "ExpandSection";
})(RoomListAction || (exports.RoomListAction = RoomListAction = {}));
let RoomAction;
/** Actions for navigating do various menus, dialogs or screens */
exports.RoomAction = RoomAction;
(function (RoomAction) {
RoomAction["ScrollUp"] = "ScrollUp";
RoomAction["RoomScrollDown"] = "RoomScrollDown";
RoomAction["DismissReadMarker"] = "DismissReadMarker";
RoomAction["JumpToOldestUnread"] = "JumpToOldestUnread";
RoomAction["UploadFile"] = "UploadFile";
RoomAction["FocusSearch"] = "FocusSearch";
RoomAction["JumpToFirstMessage"] = "JumpToFirstMessage";
RoomAction["JumpToLatestMessage"] = "JumpToLatestMessage";
})(RoomAction || (exports.RoomAction = RoomAction = {}));
let NavigationAction;
/**
* Represent a key combination.
*
* The combo is evaluated strictly, i.e. the KeyboardEvent must match exactly what is specified in the KeyCombo.
*/
exports.NavigationAction = NavigationAction;
(function (NavigationAction) {
NavigationAction["FocusRoomSearch"] = "FocusRoomSearch";
NavigationAction["ToggleRoomSidePanel"] = "ToggleRoomSidePanel";
NavigationAction["ToggleUserMenu"] = "ToggleUserMenu";
NavigationAction["ToggleShortCutDialog"] = "ToggleShortCutDialog";
NavigationAction["GoToHome"] = "GoToHome";
NavigationAction["SelectPrevRoom"] = "SelectPrevRoom";
NavigationAction["SelectNextRoom"] = "SelectNextRoom";
NavigationAction["SelectPrevUnreadRoom"] = "SelectPrevUnreadRoom";
NavigationAction["SelectNextUnreadRoom"] = "SelectNextUnreadRoom";
})(NavigationAction || (exports.NavigationAction = NavigationAction = {}));
/*:: export type KeyCombo = {
key?: string;
/** On PC: ctrl is pressed; on Mac: meta is pressed *-/
ctrlOrCmd?: boolean;
altKey?: boolean;
ctrlKey?: boolean;
metaKey?: boolean;
shiftKey?: boolean;
}*/
/*:: export type KeyBinding<T extends string> = {
action: T;
keyCombo: KeyCombo;
}*/
/**
* Helper method to check if a KeyboardEvent matches a KeyCombo
*
* Note, this method is only exported for testing.
*/
function isKeyComboMatch(ev
/*: KeyboardEvent | React.KeyboardEvent*/
, combo
/*: KeyCombo*/
, onMac
/*: boolean*/
)
/*: boolean*/
{
if (combo.key !== undefined) {
// When shift is pressed, letters are returned as upper case chars. In this case do a lower case comparison.
// This works for letter combos such as shift + U as well for none letter combos such as shift + Escape.
// If shift is not pressed, the toLowerCase conversion can be avoided.
if (ev.shiftKey) {
if (ev.key.toLowerCase() !== combo.key.toLowerCase()) {
return false;
}
} else if (ev.key !== combo.key) {
return false;
}
}
const comboCtrl = combo.ctrlKey ?? false;
const comboAlt = combo.altKey ?? false;
const comboShift = combo.shiftKey ?? false;
const comboMeta = combo.metaKey ?? false; // Tests mock events may keep the modifiers undefined; convert them to booleans
const evCtrl = ev.ctrlKey ?? false;
const evAlt = ev.altKey ?? false;
const evShift = ev.shiftKey ?? false;
const evMeta = ev.metaKey ?? false; // When ctrlOrCmd is set, the keys need do evaluated differently on PC and Mac
if (combo.ctrlOrCmd) {
if (onMac) {
if (!evMeta || evCtrl !== comboCtrl || evAlt !== comboAlt || evShift !== comboShift) {
return false;
}
} else {
if (!evCtrl || evMeta !== comboMeta || evAlt !== comboAlt || evShift !== comboShift) {
return false;
}
}
return true;
}
if (evMeta !== comboMeta || evCtrl !== comboCtrl || evAlt !== comboAlt || evShift !== comboShift) {
return false;
}
return true;
}
/*:: export type KeyBindingGetter<T extends string> = () => KeyBinding<T>[];*/
/*:: export interface IKeyBindingsProvider {
getMessageComposerBindings: KeyBindingGetter<MessageComposerAction>;
getAutocompleteBindings: KeyBindingGetter<AutocompleteAction>;
getRoomListBindings: KeyBindingGetter<RoomListAction>;
getRoomBindings: KeyBindingGetter<RoomAction>;
getNavigationBindings: KeyBindingGetter<NavigationAction>;
}*/
class KeyBindingsManager {
constructor() {
(0, _defineProperty2.default)(this, "bindingsProviders", [_KeyBindingsDefaults.defaultBindingsProvider]);
}
/**
* Finds a matching KeyAction for a given KeyboardEvent
*/
getAction(getters
/*: KeyBindingGetter<T>[]*/
, ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: T | undefined*/
{
for (const getter of getters) {
const bindings = getter();
const binding = bindings.find(it => isKeyComboMatch(ev, it.keyCombo, _Keyboard.isMac));
if (binding) {
return binding.action;
}
}
return undefined;
}
getMessageComposerAction(ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: MessageComposerAction | undefined*/
{
return this.getAction(this.bindingsProviders.map(it => it.getMessageComposerBindings), ev);
}
getAutocompleteAction(ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: AutocompleteAction | undefined*/
{
return this.getAction(this.bindingsProviders.map(it => it.getAutocompleteBindings), ev);
}
getRoomListAction(ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: RoomListAction | undefined*/
{
return this.getAction(this.bindingsProviders.map(it => it.getRoomListBindings), ev);
}
getRoomAction(ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: RoomAction | undefined*/
{
return this.getAction(this.bindingsProviders.map(it => it.getRoomBindings), ev);
}
getNavigationAction(ev
/*: KeyboardEvent | React.KeyboardEvent*/
)
/*: NavigationAction | undefined*/
{
return this.getAction(this.bindingsProviders.map(it => it.getNavigationBindings), ev);
}
}
exports.KeyBindingsManager = KeyBindingsManager;
const manager = new KeyBindingsManager();
function getKeyBindingsManager()
/*: KeyBindingsManager*/
{
return manager;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9LZXlCaW5kaW5nc01hbmFnZXIudHMiXSwibmFtZXMiOlsiTWVzc2FnZUNvbXBvc2VyQWN0aW9uIiwiQXV0b2NvbXBsZXRlQWN0aW9uIiwiUm9vbUxpc3RBY3Rpb24iLCJSb29tQWN0aW9uIiwiTmF2aWdhdGlvbkFjdGlvbiIsImlzS2V5Q29tYm9NYXRjaCIsImV2IiwiY29tYm8iLCJvbk1hYyIsImtleSIsInVuZGVmaW5lZCIsInNoaWZ0S2V5IiwidG9Mb3dlckNhc2UiLCJjb21ib0N0cmwiLCJjdHJsS2V5IiwiY29tYm9BbHQiLCJhbHRLZXkiLCJjb21ib1NoaWZ0IiwiY29tYm9NZXRhIiwibWV0YUtleSIsImV2Q3RybCIsImV2QWx0IiwiZXZTaGlmdCIsImV2TWV0YSIsImN0cmxPckNtZCIsIktleUJpbmRpbmdzTWFuYWdlciIsImRlZmF1bHRCaW5kaW5nc1Byb3ZpZGVyIiwiZ2V0QWN0aW9uIiwiZ2V0dGVycyIsImdldHRlciIsImJpbmRpbmdzIiwiYmluZGluZyIsImZpbmQiLCJpdCIsImtleUNvbWJvIiwiaXNNYWMiLCJhY3Rpb24iLCJnZXRNZXNzYWdlQ29tcG9zZXJBY3Rpb24iLCJiaW5kaW5nc1Byb3ZpZGVycyIsIm1hcCIsImdldE1lc3NhZ2VDb21wb3NlckJpbmRpbmdzIiwiZ2V0QXV0b2NvbXBsZXRlQWN0aW9uIiwiZ2V0QXV0b2NvbXBsZXRlQmluZGluZ3MiLCJnZXRSb29tTGlzdEFjdGlvbiIsImdldFJvb21MaXN0QmluZGluZ3MiLCJnZXRSb29tQWN0aW9uIiwiZ2V0Um9vbUJpbmRpbmdzIiwiZ2V0TmF2aWdhdGlvbkFjdGlvbiIsImdldE5hdmlnYXRpb25CaW5kaW5ncyIsIm1hbmFnZXIiLCJnZXRLZXlCaW5kaW5nc01hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LFNBQVN5QixxQkFBVDtBQUFBO0FBQXFEO0FBQ3hELFNBQU9ELE9BQVA7QUFDSCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMSBDbGVtZW5zIFplaWRsZXJcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBkZWZhdWx0QmluZGluZ3NQcm92aWRlciB9IGZyb20gJy4vS2V5QmluZGluZ3NEZWZhdWx0cyc7XG5pbXBvcnQgeyBpc01hYyB9IGZyb20gJy4vS2V5Ym9hcmQnO1xuXG4vKiogQWN0aW9ucyBmb3IgdGhlIGNoYXQgbWVzc2FnZSBjb21wb3NlciBjb21wb25lbnQgKi9cbmV4cG9ydCBlbnVtIE1lc3NhZ2VDb21wb3NlckFjdGlvbiB7XG4gICAgLyoqIFNlbmQgYSBtZXNzYWdlICovXG4gICAgU2VuZCA9ICdTZW5kJyxcbiAgICAvKiogR28gYmFja3dhcmRzIHRocm91Z2ggdGhlIHNlbmQgaGlzdG9yeSBhbmQgdXNlIHRoZSBtZXNzYWdlIGluIGNvbXBvc2VyIHZpZXcgKi9cbiAgICBTZWxlY3RQcmV2U2VuZEhpc3RvcnkgPSAnU2VsZWN0UHJldlNlbmRIaXN0b3J5JyxcbiAgICAvKiogR28gZm9yd2FyZHMgdGhyb3VnaCB0aGUgc2VuZCBoaXN0b3J5ICovXG4gICAgU2VsZWN0TmV4dFNlbmRIaXN0b3J5ID0gJ1NlbGVjdE5leHRTZW5kSGlzdG9yeScsXG4gICAgLyoqIFN0YXJ0IGVkaXRpbmcgdGhlIHVzZXIncyBsYXN0IHNlbnQgbWVzc2FnZSAqL1xuICAgIEVkaXRQcmV2TWVzc2FnZSA9ICdFZGl0UHJldk1lc3NhZ2UnLFxuICAgIC8qKiBTdGFydCBlZGl0aW5nIHRoZSB1c2VyJ3MgbmV4dCBzZW50IG1lc3NhZ2UgKi9cbiAgICBFZGl0TmV4dE1lc3NhZ2UgPSAnRWRpdE5leHRNZXNzYWdlJyxcbiAgICAvKiogQ2FuY2VsIGVkaXRpbmcgYSBtZXNzYWdlIG9yIGNhbmNlbCByZXBseWluZyB0byBhIG1lc3NhZ2UgKi9cbiAgICBDYW5jZWxFZGl0aW5nID0gJ0NhbmNlbEVkaXRpbmcnLFxuXG4gICAgLyoqIFNldCBib2xkIGZvcm1hdCB0aGUgY3VycmVudCBzZWxlY3Rpb24gKi9cbiAgICBGb3JtYXRCb2xkID0gJ0Zvcm1hdEJvbGQnLFxuICAgIC8qKiBTZXQgaXRhbGljcyBmb3JtYXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uICovXG4gICAgRm9ybWF0SXRhbGljcyA9ICdGb3JtYXRJdGFsaWNzJyxcbiAgICAvKiogRm9ybWF0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyBxdW90ZSAqL1xuICAgIEZvcm1hdFF1b3RlID0gJ0Zvcm1hdFF1b3RlJyxcbiAgICAvKiogVW5kbyB0aGUgbGFzdCBlZGl0aW5nICovXG4gICAgRWRpdFVuZG8gPSAnRWRpdFVuZG8nLFxuICAgIC8qKiBSZWRvIGVkaXRpbmcgKi9cbiAgICBFZGl0UmVkbyA9ICdFZGl0UmVkbycsXG4gICAgLyoqIEluc2VydCBuZXcgbGluZSAqL1xuICAgIE5ld0xpbmUgPSAnTmV3TGluZScsXG4gICAgLyoqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UgKi9cbiAgICBNb3ZlQ3Vyc29yVG9TdGFydCA9ICdNb3ZlQ3Vyc29yVG9TdGFydCcsXG4gICAgLyoqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovXG4gICAgTW92ZUN1cnNvclRvRW5kID0gJ01vdmVDdXJzb3JUb0VuZCcsXG59XG5cbi8qKiBBY3Rpb25zIGZvciB0ZXh0IGVkaXRpbmcgYXV0b2NvbXBsZXRpb24gKi9cbmV4cG9ydCBlbnVtIEF1dG9jb21wbGV0ZUFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogU2VsZWN0IHByZXZpb3VzIHNlbGVjdGlvbiBvciwgaWYgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyBpcyBub3Qgc2hvd24sIG9wZW4gdGhlIHdpbmRvdyBhbmQgc2VsZWN0IHRoZSBmaXJzdFxuICAgICAqIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBDb21wbGV0ZU9yUHJldlNlbGVjdGlvbiA9ICdBcHBseVNlbGVjdGlvbicsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHNlbGVjdGlvbiBvciwgaWYgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyBpcyBub3Qgc2hvd24sIG9wZW4gaXQgYW5kIHNlbGVjdCB0aGUgZmlyc3Qgc2VsZWN0aW9uICovXG4gICAgQ29tcGxldGVPck5leHRTZWxlY3Rpb24gPSAnQ29tcGxldGVPck5leHRTZWxlY3Rpb24nLFxuICAgIC8qKiBNb3ZlIHRvIHRoZSBwcmV2aW91cyBhdXRvY29tcGxldGUgc2VsZWN0aW9uICovXG4gICAgUHJldlNlbGVjdGlvbiA9ICdQcmV2U2VsZWN0aW9uJyxcbiAgICAvKiogTW92ZSB0byB0aGUgbmV4dCBhdXRvY29tcGxldGUgc2VsZWN0aW9uICovXG4gICAgTmV4dFNlbGVjdGlvbiA9ICdOZXh0U2VsZWN0aW9uJyxcbiAgICAvKiogQ2xvc2UgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyAqL1xuICAgIENhbmNlbCA9ICdDYW5jZWwnLFxufVxuXG4vKiogQWN0aW9ucyBmb3IgdGhlIHJvb20gbGlzdCBzaWRlYmFyICovXG5leHBvcnQgZW51bSBSb29tTGlzdEFjdGlvbiB7XG4gICAgLyoqIENsZWFyIHJvb20gbGlzdCBmaWx0ZXIgZmllbGQgKi9cbiAgICBDbGVhclNlYXJjaCA9ICdDbGVhclNlYXJjaCcsXG4gICAgLyoqIE5hdmlnYXRlIHVwL2Rvd24gaW4gdGhlIHJvb20gbGlzdCAqL1xuICAgIFByZXZSb29tID0gJ1ByZXZSb29tJyxcbiAgICAvKiogTmF2aWdhdGUgZG93biBpbiB0aGUgcm9vbSBsaXN0ICovXG4gICAgTmV4dFJvb20gPSAnTmV4dFJvb20nLFxuICAgIC8qKiBTZWxlY3Qgcm9vbSBmcm9tIHRoZSByb29tIGxpc3QgKi9cbiAgICBTZWxlY3RSb29tID0gJ1NlbGVjdFJvb20nLFxuICAgIC8qKiBDb2xsYXBzZSByb29tIGxpc3Qgc2VjdGlvbiAqL1xuICAgIENvbGxhcHNlU2VjdGlvbiA9ICdDb2xsYXBzZVNlY3Rpb24nLFxuICAgIC8qKiBFeHBhbmQgcm9vbSBsaXN0IHNlY3Rpb24sIGlmIGFscmVhZHkgZXhwYW5kZWQsIGp1bXAgdG8gZmlyc3Qgcm9vbSBpbiB0aGUgc2VsZWN0aW9uICovXG4gICAgRXhwYW5kU2VjdGlvbiA9ICdFeHBhbmRTZWN0aW9uJyxcbn1cblxuLyoqIEFjdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvb20gdmlldyAqL1xuZXhwb3J0IGVudW0gUm9vbUFjdGlvbiB7XG4gICAgLyoqIFNjcm9sbCB1cCBpbiB0aGUgdGltZWxpbmUgKi9cbiAgICBTY3JvbGxVcCA9ICdTY3JvbGxVcCcsXG4gICAgLyoqIFNjcm9sbCBkb3duIGluIHRoZSB0aW1lbGluZSAqL1xuICAgIFJvb21TY3JvbGxEb3duID0gJ1Jvb21TY3JvbGxEb3duJyxcbiAgICAvKiogRGlzbWlzcyByZWFkIG1hcmtlciBhbmQganVtcCB0byBib3R0b20gKi9cbiAgICBEaXNtaXNzUmVhZE1hcmtlciA9ICdEaXNtaXNzUmVhZE1hcmtlcicsXG4gICAgLyoqIEp1bXAgdG8gb2xkZXN0IHVucmVhZCBtZXNzYWdlICovXG4gICAgSnVtcFRvT2xkZXN0VW5yZWFkID0gJ0p1bXBUb09sZGVzdFVucmVhZCcsXG4gICAgLyoqIFVwbG9hZCBhIGZpbGUgKi9cbiAgICBVcGxvYWRGaWxlID0gJ1VwbG9hZEZpbGUnLFxuICAgIC8qKiBGb2N1cyBzZWFyY2ggbWVzc2FnZSBpbiBhIHJvb20gKG11c3QgYmUgZW5hYmxlZCkgKi9cbiAgICBGb2N1c1NlYXJjaCA9ICdGb2N1c1NlYXJjaCcsXG4gICAgLyoqIEp1bXAgdG8gdGhlIGZpcnN0IChkb3dubG9hZGVkKSBtZXNzYWdlIGluIHRoZSByb29tICovXG4gICAgSnVtcFRvRmlyc3RNZXNzYWdlID0gJ0p1bXBUb0ZpcnN0TWVzc2FnZScsXG4gICAgLyoqIEp1bXAgdG8gdGhlIGxhdGVzdCBtZXNzYWdlIGluIHRoZSByb29tICovXG4gICAgSnVtcFRvTGF0ZXN0TWVzc2FnZSA9ICdKdW1wVG9MYXRlc3RNZXNzYWdlJyxcbn1cblxuLyoqIEFjdGlvbnMgZm9yIG5hdmlnYXRpbmcgZG8gdmFyaW91cyBtZW51cywgZGlhbG9ncyBvciBzY3JlZW5zICovXG5leHBvcnQgZW51bSBOYXZpZ2F0aW9uQWN0aW9uIHtcbiAgICAvKiogSnVtcCB0byByb29tIHNlYXJjaCAoc2VhcmNoIGZvciBhIHJvb20pICovXG4gICAgRm9jdXNSb29tU2VhcmNoID0gJ0ZvY3VzUm9vbVNlYXJjaCcsXG4gICAgLyoqIFRvZ2dsZSB0aGUgcm9vbSBzaWRlIHBhbmVsICovXG4gICAgVG9nZ2xlUm9vbVNpZGVQYW5lbCA9ICdUb2dnbGVSb29tU2lkZVBhbmVsJyxcbiAgICAvKiogVG9nZ2xlIHRoZSB1c2VyIG1lbnUgKi9cbiAgICBUb2dnbGVVc2VyTWVudSA9ICdUb2dnbGVVc2VyTWVudScsXG4gICAgLyoqIFRvZ2dsZSB0aGUgc2hvcnQgY3V0IGhlbHAgZGlhbG9nICovXG4gICAgVG9nZ2xlU2hvcnRDdXREaWFsb2cgPSAnVG9nZ2xlU2hvcnRDdXREaWFsb2cnLFxuICAgIC8qKiBHb3QgdG8gdGhlIEVsZW1lbnQgaG9tZSBzY3JlZW4gKi9cbiAgICBHb1RvSG9tZSA9ICdHb1RvSG9tZScsXG4gICAgLyoqIFNlbGVjdCBwcmV2IHJvb20gKi9cbiAgICBTZWxlY3RQcmV2Um9vbSA9ICdTZWxlY3RQcmV2Um9vbScsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHJvb20gKi9cbiAgICBTZWxlY3ROZXh0Um9vbSA9ICdTZWxlY3ROZXh0Um9vbScsXG4gICAgLyoqIFNlbGVjdCBwcmV2IHJvb20gd2l0aCB1bnJlYWQgbWVzc2FnZXMgKi9cbiAgICBTZWxlY3RQcmV2VW5yZWFkUm9vbSA9ICdTZWxlY3RQcmV2VW5yZWFkUm9vbScsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHJvb20gd2l0aCB1bnJlYWQgbWVzc2FnZXMgKi9cbiAgICBTZWxlY3ROZXh0VW5yZWFkUm9vbSA9ICdTZWxlY3ROZXh0VW5yZWFkUm9vbScsXG59XG5cbi8qKlxuICogUmVwcmVzZW50IGEga2V5IGNvbWJpbmF0aW9uLlxuICpcbiAqIFRoZSBjb21ibyBpcyBldmFsdWF0ZWQgc3RyaWN0bHksIGkuZS4gdGhlIEtleWJvYXJkRXZlbnQgbXVzdCBtYXRjaCBleGFjdGx5IHdoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBLZXlDb21iby5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5Q29tYm8gPSB7XG4gICAga2V5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9uIFBDOiBjdHJsIGlzIHByZXNzZWQ7IG9uIE1hYzogbWV0YSBpcyBwcmVzc2VkICovXG4gICAgY3RybE9yQ21kPzogYm9vbGVhbjtcblxuICAgIGFsdEtleT86IGJvb2xlYW47XG4gICAgY3RybEtleT86IGJvb2xlYW47XG4gICAgbWV0YUtleT86IGJvb2xlYW47XG4gICAgc2hpZnRLZXk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBLZXlCaW5kaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICAgIGFjdGlvbjogVDtcbiAgICBrZXlDb21ibzogS2V5Q29tYm87XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIEtleWJvYXJkRXZlbnQgbWF0Y2hlcyBhIEtleUNvbWJvXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2QgaXMgb25seSBleHBvcnRlZCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5Q29tYm9NYXRjaChldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQsIGNvbWJvOiBLZXlDb21ibywgb25NYWM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoY29tYm8ua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2hlbiBzaGlmdCBpcyBwcmVzc2VkLCBsZXR0ZXJzIGFyZSByZXR1cm5lZCBhcyB1cHBlciBjYXNlIGNoYXJzLiBJbiB0aGlzIGNhc2UgZG8gYSBsb3dlciBjYXNlIGNvbXBhcmlzb24uXG4gICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGxldHRlciBjb21ib3Mgc3VjaCBhcyBzaGlmdCArIFUgYXMgd2VsbCBmb3Igbm9uZSBsZXR0ZXIgY29tYm9zIHN1Y2ggYXMgc2hpZnQgKyBFc2NhcGUuXG4gICAgICAgIC8vIElmIHNoaWZ0IGlzIG5vdCBwcmVzc2VkLCB0aGUgdG9Mb3dlckNhc2UgY29udmVyc2lvbiBjYW4gYmUgYXZvaWRlZC5cbiAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5LnRvTG93ZXJDYXNlKCkgIT09IGNvbWJvLmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleSAhPT0gY29tYm8ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21ib0N0cmwgPSBjb21iby5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvQWx0ID0gY29tYm8uYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvU2hpZnQgPSBjb21iby5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBjb21ib01ldGEgPSBjb21iby5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFRlc3RzIG1vY2sgZXZlbnRzIG1heSBrZWVwIHRoZSBtb2RpZmllcnMgdW5kZWZpbmVkOyBjb252ZXJ0IHRoZW0gdG8gYm9vbGVhbnNcbiAgICBjb25zdCBldkN0cmwgPSBldi5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2QWx0ID0gZXYuYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2U2hpZnQgPSBldi5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBldk1ldGEgPSBldi5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFdoZW4gY3RybE9yQ21kIGlzIHNldCwgdGhlIGtleXMgbmVlZCBkbyBldmFsdWF0ZWQgZGlmZmVyZW50bHkgb24gUEMgYW5kIE1hY1xuICAgIGlmIChjb21iby5jdHJsT3JDbWQpIHtcbiAgICAgICAgaWYgKG9uTWFjKSB7XG4gICAgICAgICAgICBpZiAoIWV2TWV0YVxuICAgICAgICAgICAgICAgIHx8IGV2Q3RybCAhPT0gY29tYm9DdHJsXG4gICAgICAgICAgICAgICAgfHwgZXZBbHQgIT09IGNvbWJvQWx0XG4gICAgICAgICAgICAgICAgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZXZDdHJsXG4gICAgICAgICAgICAgICAgfHwgZXZNZXRhICE9PSBjb21ib01ldGFcbiAgICAgICAgICAgICAgICB8fCBldkFsdCAhPT0gY29tYm9BbHRcbiAgICAgICAgICAgICAgICB8fCBldlNoaWZ0ICE9PSBjb21ib1NoaWZ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChldk1ldGEgIT09IGNvbWJvTWV0YVxuICAgICAgICB8fCBldkN0cmwgIT09IGNvbWJvQ3RybFxuICAgICAgICB8fCBldkFsdCAhPT0gY29tYm9BbHRcbiAgICAgICAgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIEtleUJpbmRpbmdHZXR0ZXI8VCBleHRlbmRzIHN0cmluZz4gPSAoKSA9PiBLZXlCaW5kaW5nPFQ+W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUtleUJpbmRpbmdzUHJvdmlkZXIge1xuICAgIGdldE1lc3NhZ2VDb21wb3NlckJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPE1lc3NhZ2VDb21wb3NlckFjdGlvbj47XG4gICAgZ2V0QXV0b2NvbXBsZXRlQmluZGluZ3M6IEtleUJpbmRpbmdHZXR0ZXI8QXV0b2NvbXBsZXRlQWN0aW9uPjtcbiAgICBnZXRSb29tTGlzdEJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPFJvb21MaXN0QWN0aW9uPjtcbiAgICBnZXRSb29tQmluZGluZ3M6IEtleUJpbmRpbmdHZXR0ZXI8Um9vbUFjdGlvbj47XG4gICAgZ2V0TmF2aWdhdGlvbkJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPE5hdmlnYXRpb25BY3Rpb24+O1xufVxuXG5leHBvcnQgY2xhc3MgS2V5QmluZGluZ3NNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGtleSBiaW5kaW5ncyBwcm92aWRlcnMuXG4gICAgICpcbiAgICAgKiBLZXkgYmluZGluZ3MgZnJvbSB0aGUgZmlyc3QgcHJvdmlkZXIocykgaW4gdGhlIGxpc3Qgd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciBrZXkgYmluZGluZ3MgZnJvbSBsYXRlciBwcm92aWRlcnMuXG4gICAgICpcbiAgICAgKiBUbyBvdmVyd3JpdGUgdGhlIGRlZmF1bHQga2V5IGJpbmRpbmdzIGFkZCBhIG5ldyBwcm92aWRlcnMgYmVmb3JlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBlLmcuIGEgcHJvdmlkZXIgZm9yXG4gICAgICogY3VzdG9taXplZCBrZXkgYmluZGluZ3MuXG4gICAgICovXG4gICAgYmluZGluZ3NQcm92aWRlcnM6IElLZXlCaW5kaW5nc1Byb3ZpZGVyW10gPSBbXG4gICAgICAgIGRlZmF1bHRCaW5kaW5nc1Byb3ZpZGVyLFxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhIG1hdGNoaW5nIEtleUFjdGlvbiBmb3IgYSBnaXZlbiBLZXlib2FyZEV2ZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBY3Rpb248VCBleHRlbmRzIHN0cmluZz4oXG4gICAgICAgIGdldHRlcnM6IEtleUJpbmRpbmdHZXR0ZXI8VD5bXSxcbiAgICAgICAgZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50LFxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGNvbnN0IGdldHRlciBvZiBnZXR0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5ncyA9IGdldHRlcigpO1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzLmZpbmQoaXQgPT4gaXNLZXlDb21ib01hdGNoKGV2LCBpdC5rZXlDb21ibywgaXNNYWMpKTtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuYWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZUNvbXBvc2VyQWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IE1lc3NhZ2VDb21wb3NlckFjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbih0aGlzLmJpbmRpbmdzUHJvdmlkZXJzLm1hcChpdCA9PiBpdC5nZXRNZXNzYWdlQ29tcG9zZXJCaW5kaW5ncyksIGV2KTtcbiAgICB9XG5cbiAgICBnZXRBdXRvY29tcGxldGVBY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogQXV0b2NvbXBsZXRlQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldEF1dG9jb21wbGV0ZUJpbmRpbmdzKSwgZXYpO1xuICAgIH1cblxuICAgIGdldFJvb21MaXN0QWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IFJvb21MaXN0QWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldFJvb21MaXN0QmluZGluZ3MpLCBldik7XG4gICAgfVxuXG4gICAgZ2V0Um9vbUFjdGlvbihldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQpOiBSb29tQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldFJvb21CaW5kaW5ncyksIGV2KTtcbiAgICB9XG5cbiAgICBnZXROYXZpZ2F0aW9uQWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IE5hdmlnYXRpb25BY3Rpb24gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3Rpb24odGhpcy5iaW5kaW5nc1Byb3ZpZGVycy5tYXAoaXQgPT4gaXQuZ2V0TmF2aWdhdGlvbkJpbmRpbmdzKSwgZXYpO1xuICAgIH1cbn1cblxuY29uc3QgbWFuYWdlciA9IG5ldyBLZXlCaW5kaW5nc01hbmFnZXIoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleUJpbmRpbmdzTWFuYWdlcigpOiBLZXlCaW5kaW5nc01hbmFnZXIge1xuICAgIHJldHVybiBtYW5hZ2VyO1xufVxuIl19