UNPKG

matrix-react-sdk

Version:
283 lines (234 loc) 28.8 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9LZXlCaW5kaW5nc01hbmFnZXIudHMiXSwibmFtZXMiOlsiTWVzc2FnZUNvbXBvc2VyQWN0aW9uIiwiQXV0b2NvbXBsZXRlQWN0aW9uIiwiUm9vbUxpc3RBY3Rpb24iLCJSb29tQWN0aW9uIiwiTmF2aWdhdGlvbkFjdGlvbiIsImlzS2V5Q29tYm9NYXRjaCIsImV2IiwiY29tYm8iLCJvbk1hYyIsImtleSIsInVuZGVmaW5lZCIsInNoaWZ0S2V5IiwidG9Mb3dlckNhc2UiLCJjb21ib0N0cmwiLCJjdHJsS2V5IiwiY29tYm9BbHQiLCJhbHRLZXkiLCJjb21ib1NoaWZ0IiwiY29tYm9NZXRhIiwibWV0YUtleSIsImV2Q3RybCIsImV2QWx0IiwiZXZTaGlmdCIsImV2TWV0YSIsImN0cmxPckNtZCIsIktleUJpbmRpbmdzTWFuYWdlciIsImRlZmF1bHRCaW5kaW5nc1Byb3ZpZGVyIiwiZ2V0QWN0aW9uIiwiZ2V0dGVycyIsImdldHRlciIsImJpbmRpbmdzIiwiYmluZGluZyIsImZpbmQiLCJpdCIsImtleUNvbWJvIiwiaXNNYWMiLCJhY3Rpb24iLCJnZXRNZXNzYWdlQ29tcG9zZXJBY3Rpb24iLCJiaW5kaW5nc1Byb3ZpZGVycyIsIm1hcCIsImdldE1lc3NhZ2VDb21wb3NlckJpbmRpbmdzIiwiZ2V0QXV0b2NvbXBsZXRlQWN0aW9uIiwiZ2V0QXV0b2NvbXBsZXRlQmluZGluZ3MiLCJnZXRSb29tTGlzdEFjdGlvbiIsImdldFJvb21MaXN0QmluZGluZ3MiLCJnZXRSb29tQWN0aW9uIiwiZ2V0Um9vbUJpbmRpbmdzIiwiZ2V0TmF2aWdhdGlvbkFjdGlvbiIsImdldE5hdmlnYXRpb25CaW5kaW5ncyIsIm1hbmFnZXIiLCJnZXRLZXlCaW5kaW5nc01hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFLQTtJQUNZQSxxQjtBQWdDWjs7OztXQWhDWUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7QUFBQUEsRUFBQUEscUI7R0FBQUEscUIscUNBQUFBLHFCOztJQWlDQUMsa0I7QUFnQlo7Ozs7V0FoQllBLGtCO0FBQUFBLEVBQUFBLGtCO0FBQUFBLEVBQUFBLGtCO0FBQUFBLEVBQUFBLGtCO0FBQUFBLEVBQUFBLGtCO0FBQUFBLEVBQUFBLGtCO0dBQUFBLGtCLGtDQUFBQSxrQjs7SUFpQkFDLGM7QUFlWjs7OztXQWZZQSxjO0FBQUFBLEVBQUFBLGM7QUFBQUEsRUFBQUEsYztBQUFBQSxFQUFBQSxjO0FBQUFBLEVBQUFBLGM7QUFBQUEsRUFBQUEsYztBQUFBQSxFQUFBQSxjO0dBQUFBLGMsOEJBQUFBLGM7O0lBZ0JBQyxVO0FBbUJaOzs7O1dBbkJZQSxVO0FBQUFBLEVBQUFBLFU7QUFBQUEsRUFBQUEsVTtBQUFBQSxFQUFBQSxVO0FBQUFBLEVBQUFBLFU7QUFBQUEsRUFBQUEsVTtBQUFBQSxFQUFBQSxVO0FBQUFBLEVBQUFBLFU7QUFBQUEsRUFBQUEsVTtHQUFBQSxVLDBCQUFBQSxVOztJQW9CQUMsZ0I7QUFxQlo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztXQXpCWUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7R0FBQUEsZ0IsZ0NBQUFBLGdCOztBQTFHWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBVEE7QUFDQTtBQUNBOzs7QUFtSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGVBQVQsQ0FBeUJDO0FBQXpCO0FBQUEsRUFBa0VDO0FBQWxFO0FBQUEsRUFBbUZDO0FBQW5GO0FBQUE7QUFBQTtBQUE0RztBQUMvRyxNQUFJRCxLQUFLLENBQUNFLEdBQU4sS0FBY0MsU0FBbEIsRUFBNkI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsUUFBSUosRUFBRSxDQUFDSyxRQUFQLEVBQWlCO0FBQ2IsVUFBSUwsRUFBRSxDQUFDRyxHQUFILENBQU9HLFdBQVAsT0FBeUJMLEtBQUssQ0FBQ0UsR0FBTixDQUFVRyxXQUFWLEVBQTdCLEVBQXNEO0FBQ2xELGVBQU8sS0FBUDtBQUNIO0FBQ0osS0FKRCxNQUlPLElBQUlOLEVBQUUsQ0FBQ0csR0FBSCxLQUFXRixLQUFLLENBQUNFLEdBQXJCLEVBQTBCO0FBQzdCLGFBQU8sS0FBUDtBQUNIO0FBQ0o7O0FBRUQsUUFBTUksU0FBUyxHQUFHTixLQUFLLENBQUNPLE9BQU4sSUFBaUIsS0FBbkM7QUFDQSxRQUFNQyxRQUFRLEdBQUdSLEtBQUssQ0FBQ1MsTUFBTixJQUFnQixLQUFqQztBQUNBLFFBQU1DLFVBQVUsR0FBR1YsS0FBSyxDQUFDSSxRQUFOLElBQWtCLEtBQXJDO0FBQ0EsUUFBTU8sU0FBUyxHQUFHWCxLQUFLLENBQUNZLE9BQU4sSUFBaUIsS0FBbkMsQ0FqQitHLENBa0IvRzs7QUFDQSxRQUFNQyxNQUFNLEdBQUdkLEVBQUUsQ0FBQ1EsT0FBSCxJQUFjLEtBQTdCO0FBQ0EsUUFBTU8sS0FBSyxHQUFHZixFQUFFLENBQUNVLE1BQUgsSUFBYSxLQUEzQjtBQUNBLFFBQU1NLE9BQU8sR0FBR2hCLEVBQUUsQ0FBQ0ssUUFBSCxJQUFlLEtBQS9CO0FBQ0EsUUFBTVksTUFBTSxHQUFHakIsRUFBRSxDQUFDYSxPQUFILElBQWMsS0FBN0IsQ0F0QitHLENBdUIvRzs7QUFDQSxNQUFJWixLQUFLLENBQUNpQixTQUFWLEVBQXFCO0FBQ2pCLFFBQUloQixLQUFKLEVBQVc7QUFDUCxVQUFJLENBQUNlLE1BQUQsSUFDR0gsTUFBTSxLQUFLUCxTQURkLElBRUdRLEtBQUssS0FBS04sUUFGYixJQUdHTyxPQUFPLEtBQUtMLFVBSG5CLEVBRytCO0FBQzNCLGVBQU8sS0FBUDtBQUNIO0FBQ0osS0FQRCxNQU9PO0FBQ0gsVUFBSSxDQUFDRyxNQUFELElBQ0dHLE1BQU0sS0FBS0wsU0FEZCxJQUVHRyxLQUFLLEtBQUtOLFFBRmIsSUFHR08sT0FBTyxLQUFLTCxVQUhuQixFQUcrQjtBQUMzQixlQUFPLEtBQVA7QUFDSDtBQUNKOztBQUNELFdBQU8sSUFBUDtBQUNIOztBQUVELE1BQUlNLE1BQU0sS0FBS0wsU0FBWCxJQUNHRSxNQUFNLEtBQUtQLFNBRGQsSUFFR1EsS0FBSyxLQUFLTixRQUZiLElBR0dPLE9BQU8sS0FBS0wsVUFIbkIsRUFHK0I7QUFDM0IsV0FBTyxLQUFQO0FBQ0g7O0FBRUQsU0FBTyxJQUFQO0FBQ0g7Ozs7QUE3TUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFvTk8sTUFBTVEsa0JBQU4sQ0FBeUI7QUFBQTtBQUFBLDZEQVNnQixDQUN4Q0MsNENBRHdDLENBVGhCO0FBQUE7O0FBYTVCO0FBQ0o7QUFDQTtBQUNZQyxFQUFBQSxTQUFSLENBQ0lDO0FBREo7QUFBQSxJQUVJdEI7QUFGSjtBQUFBO0FBQUE7QUFHaUI7QUFDYixTQUFLLE1BQU11QixNQUFYLElBQXFCRCxPQUFyQixFQUE4QjtBQUMxQixZQUFNRSxRQUFRLEdBQUdELE1BQU0sRUFBdkI7QUFDQSxZQUFNRSxPQUFPLEdBQUdELFFBQVEsQ0FBQ0UsSUFBVCxDQUFjQyxFQUFFLElBQUk1QixlQUFlLENBQUNDLEVBQUQsRUFBSzJCLEVBQUUsQ0FBQ0MsUUFBUixFQUFrQkMsZUFBbEIsQ0FBbkMsQ0FBaEI7O0FBQ0EsVUFBSUosT0FBSixFQUFhO0FBQ1QsZUFBT0EsT0FBTyxDQUFDSyxNQUFmO0FBQ0g7QUFDSjs7QUFDRCxXQUFPMUIsU0FBUDtBQUNIOztBQUVEMkIsRUFBQUEsd0JBQXdCLENBQUMvQjtBQUFEO0FBQUE7QUFBQTtBQUE2RTtBQUNqRyxXQUFPLEtBQUtxQixTQUFMLENBQWUsS0FBS1csaUJBQUwsQ0FBdUJDLEdBQXZCLENBQTJCTixFQUFFLElBQUlBLEVBQUUsQ0FBQ08sMEJBQXBDLENBQWYsRUFBZ0ZsQyxFQUFoRixDQUFQO0FBQ0g7O0FBRURtQyxFQUFBQSxxQkFBcUIsQ0FBQ25DO0FBQUQ7QUFBQTtBQUFBO0FBQTBFO0FBQzNGLFdBQU8sS0FBS3FCLFNBQUwsQ0FBZSxLQUFLVyxpQkFBTCxDQUF1QkMsR0FBdkIsQ0FBMkJOLEVBQUUsSUFBSUEsRUFBRSxDQUFDUyx1QkFBcEMsQ0FBZixFQUE2RXBDLEVBQTdFLENBQVA7QUFDSDs7QUFFRHFDLEVBQUFBLGlCQUFpQixDQUFDckM7QUFBRDtBQUFBO0FBQUE7QUFBc0U7QUFDbkYsV0FBTyxLQUFLcUIsU0FBTCxDQUFlLEtBQUtXLGlCQUFMLENBQXVCQyxHQUF2QixDQUEyQk4sRUFBRSxJQUFJQSxFQUFFLENBQUNXLG1CQUFwQyxDQUFmLEVBQXlFdEMsRUFBekUsQ0FBUDtBQUNIOztBQUVEdUMsRUFBQUEsYUFBYSxDQUFDdkM7QUFBRDtBQUFBO0FBQUE7QUFBa0U7QUFDM0UsV0FBTyxLQUFLcUIsU0FBTCxDQUFlLEtBQUtXLGlCQUFMLENBQXVCQyxHQUF2QixDQUEyQk4sRUFBRSxJQUFJQSxFQUFFLENBQUNhLGVBQXBDLENBQWYsRUFBcUV4QyxFQUFyRSxDQUFQO0FBQ0g7O0FBRUR5QyxFQUFBQSxtQkFBbUIsQ0FBQ3pDO0FBQUQ7QUFBQTtBQUFBO0FBQXdFO0FBQ3ZGLFdBQU8sS0FBS3FCLFNBQUwsQ0FBZSxLQUFLVyxpQkFBTCxDQUF1QkMsR0FBdkIsQ0FBMkJOLEVBQUUsSUFBSUEsRUFBRSxDQUFDZSxxQkFBcEMsQ0FBZixFQUEyRTFDLEVBQTNFLENBQVA7QUFDSDs7QUFoRDJCOzs7QUFtRGhDLE1BQU0yQyxPQUFPLEdBQUcsSUFBSXhCLGtCQUFKLEVBQWhCOztBQUVPLFNBQVN5QixxQkFBVDtBQUFBO0FBQXFEO0FBQ3hELFNBQU9ELE9BQVA7QUFDSCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMSBDbGVtZW5zIFplaWRsZXJcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBkZWZhdWx0QmluZGluZ3NQcm92aWRlciB9IGZyb20gJy4vS2V5QmluZGluZ3NEZWZhdWx0cyc7XG5pbXBvcnQgeyBpc01hYyB9IGZyb20gJy4vS2V5Ym9hcmQnO1xuXG4vKiogQWN0aW9ucyBmb3IgdGhlIGNoYXQgbWVzc2FnZSBjb21wb3NlciBjb21wb25lbnQgKi9cbmV4cG9ydCBlbnVtIE1lc3NhZ2VDb21wb3NlckFjdGlvbiB7XG4gICAgLyoqIFNlbmQgYSBtZXNzYWdlICovXG4gICAgU2VuZCA9ICdTZW5kJyxcbiAgICAvKiogR28gYmFja3dhcmRzIHRocm91Z2ggdGhlIHNlbmQgaGlzdG9yeSBhbmQgdXNlIHRoZSBtZXNzYWdlIGluIGNvbXBvc2VyIHZpZXcgKi9cbiAgICBTZWxlY3RQcmV2U2VuZEhpc3RvcnkgPSAnU2VsZWN0UHJldlNlbmRIaXN0b3J5JyxcbiAgICAvKiogR28gZm9yd2FyZHMgdGhyb3VnaCB0aGUgc2VuZCBoaXN0b3J5ICovXG4gICAgU2VsZWN0TmV4dFNlbmRIaXN0b3J5ID0gJ1NlbGVjdE5leHRTZW5kSGlzdG9yeScsXG4gICAgLyoqIFN0YXJ0IGVkaXRpbmcgdGhlIHVzZXIncyBsYXN0IHNlbnQgbWVzc2FnZSAqL1xuICAgIEVkaXRQcmV2TWVzc2FnZSA9ICdFZGl0UHJldk1lc3NhZ2UnLFxuICAgIC8qKiBTdGFydCBlZGl0aW5nIHRoZSB1c2VyJ3MgbmV4dCBzZW50IG1lc3NhZ2UgKi9cbiAgICBFZGl0TmV4dE1lc3NhZ2UgPSAnRWRpdE5leHRNZXNzYWdlJyxcbiAgICAvKiogQ2FuY2VsIGVkaXRpbmcgYSBtZXNzYWdlIG9yIGNhbmNlbCByZXBseWluZyB0byBhIG1lc3NhZ2UgKi9cbiAgICBDYW5jZWxFZGl0aW5nID0gJ0NhbmNlbEVkaXRpbmcnLFxuXG4gICAgLyoqIFNldCBib2xkIGZvcm1hdCB0aGUgY3VycmVudCBzZWxlY3Rpb24gKi9cbiAgICBGb3JtYXRCb2xkID0gJ0Zvcm1hdEJvbGQnLFxuICAgIC8qKiBTZXQgaXRhbGljcyBmb3JtYXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uICovXG4gICAgRm9ybWF0SXRhbGljcyA9ICdGb3JtYXRJdGFsaWNzJyxcbiAgICAvKiogRm9ybWF0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyBxdW90ZSAqL1xuICAgIEZvcm1hdFF1b3RlID0gJ0Zvcm1hdFF1b3RlJyxcbiAgICAvKiogVW5kbyB0aGUgbGFzdCBlZGl0aW5nICovXG4gICAgRWRpdFVuZG8gPSAnRWRpdFVuZG8nLFxuICAgIC8qKiBSZWRvIGVkaXRpbmcgKi9cbiAgICBFZGl0UmVkbyA9ICdFZGl0UmVkbycsXG4gICAgLyoqIEluc2VydCBuZXcgbGluZSAqL1xuICAgIE5ld0xpbmUgPSAnTmV3TGluZScsXG4gICAgLyoqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UgKi9cbiAgICBNb3ZlQ3Vyc29yVG9TdGFydCA9ICdNb3ZlQ3Vyc29yVG9TdGFydCcsXG4gICAgLyoqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovXG4gICAgTW92ZUN1cnNvclRvRW5kID0gJ01vdmVDdXJzb3JUb0VuZCcsXG59XG5cbi8qKiBBY3Rpb25zIGZvciB0ZXh0IGVkaXRpbmcgYXV0b2NvbXBsZXRpb24gKi9cbmV4cG9ydCBlbnVtIEF1dG9jb21wbGV0ZUFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogU2VsZWN0IHByZXZpb3VzIHNlbGVjdGlvbiBvciwgaWYgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyBpcyBub3Qgc2hvd24sIG9wZW4gdGhlIHdpbmRvdyBhbmQgc2VsZWN0IHRoZSBmaXJzdFxuICAgICAqIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBDb21wbGV0ZU9yUHJldlNlbGVjdGlvbiA9ICdBcHBseVNlbGVjdGlvbicsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHNlbGVjdGlvbiBvciwgaWYgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyBpcyBub3Qgc2hvd24sIG9wZW4gaXQgYW5kIHNlbGVjdCB0aGUgZmlyc3Qgc2VsZWN0aW9uICovXG4gICAgQ29tcGxldGVPck5leHRTZWxlY3Rpb24gPSAnQ29tcGxldGVPck5leHRTZWxlY3Rpb24nLFxuICAgIC8qKiBNb3ZlIHRvIHRoZSBwcmV2aW91cyBhdXRvY29tcGxldGUgc2VsZWN0aW9uICovXG4gICAgUHJldlNlbGVjdGlvbiA9ICdQcmV2U2VsZWN0aW9uJyxcbiAgICAvKiogTW92ZSB0byB0aGUgbmV4dCBhdXRvY29tcGxldGUgc2VsZWN0aW9uICovXG4gICAgTmV4dFNlbGVjdGlvbiA9ICdOZXh0U2VsZWN0aW9uJyxcbiAgICAvKiogQ2xvc2UgdGhlIGF1dG9jb21wbGV0aW9uIHdpbmRvdyAqL1xuICAgIENhbmNlbCA9ICdDYW5jZWwnLFxufVxuXG4vKiogQWN0aW9ucyBmb3IgdGhlIHJvb20gbGlzdCBzaWRlYmFyICovXG5leHBvcnQgZW51bSBSb29tTGlzdEFjdGlvbiB7XG4gICAgLyoqIENsZWFyIHJvb20gbGlzdCBmaWx0ZXIgZmllbGQgKi9cbiAgICBDbGVhclNlYXJjaCA9ICdDbGVhclNlYXJjaCcsXG4gICAgLyoqIE5hdmlnYXRlIHVwL2Rvd24gaW4gdGhlIHJvb20gbGlzdCAqL1xuICAgIFByZXZSb29tID0gJ1ByZXZSb29tJyxcbiAgICAvKiogTmF2aWdhdGUgZG93biBpbiB0aGUgcm9vbSBsaXN0ICovXG4gICAgTmV4dFJvb20gPSAnTmV4dFJvb20nLFxuICAgIC8qKiBTZWxlY3Qgcm9vbSBmcm9tIHRoZSByb29tIGxpc3QgKi9cbiAgICBTZWxlY3RSb29tID0gJ1NlbGVjdFJvb20nLFxuICAgIC8qKiBDb2xsYXBzZSByb29tIGxpc3Qgc2VjdGlvbiAqL1xuICAgIENvbGxhcHNlU2VjdGlvbiA9ICdDb2xsYXBzZVNlY3Rpb24nLFxuICAgIC8qKiBFeHBhbmQgcm9vbSBsaXN0IHNlY3Rpb24sIGlmIGFscmVhZHkgZXhwYW5kZWQsIGp1bXAgdG8gZmlyc3Qgcm9vbSBpbiB0aGUgc2VsZWN0aW9uICovXG4gICAgRXhwYW5kU2VjdGlvbiA9ICdFeHBhbmRTZWN0aW9uJyxcbn1cblxuLyoqIEFjdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvb20gdmlldyAqL1xuZXhwb3J0IGVudW0gUm9vbUFjdGlvbiB7XG4gICAgLyoqIFNjcm9sbCB1cCBpbiB0aGUgdGltZWxpbmUgKi9cbiAgICBTY3JvbGxVcCA9ICdTY3JvbGxVcCcsXG4gICAgLyoqIFNjcm9sbCBkb3duIGluIHRoZSB0aW1lbGluZSAqL1xuICAgIFJvb21TY3JvbGxEb3duID0gJ1Jvb21TY3JvbGxEb3duJyxcbiAgICAvKiogRGlzbWlzcyByZWFkIG1hcmtlciBhbmQganVtcCB0byBib3R0b20gKi9cbiAgICBEaXNtaXNzUmVhZE1hcmtlciA9ICdEaXNtaXNzUmVhZE1hcmtlcicsXG4gICAgLyoqIEp1bXAgdG8gb2xkZXN0IHVucmVhZCBtZXNzYWdlICovXG4gICAgSnVtcFRvT2xkZXN0VW5yZWFkID0gJ0p1bXBUb09sZGVzdFVucmVhZCcsXG4gICAgLyoqIFVwbG9hZCBhIGZpbGUgKi9cbiAgICBVcGxvYWRGaWxlID0gJ1VwbG9hZEZpbGUnLFxuICAgIC8qKiBGb2N1cyBzZWFyY2ggbWVzc2FnZSBpbiBhIHJvb20gKG11c3QgYmUgZW5hYmxlZCkgKi9cbiAgICBGb2N1c1NlYXJjaCA9ICdGb2N1c1NlYXJjaCcsXG4gICAgLyoqIEp1bXAgdG8gdGhlIGZpcnN0IChkb3dubG9hZGVkKSBtZXNzYWdlIGluIHRoZSByb29tICovXG4gICAgSnVtcFRvRmlyc3RNZXNzYWdlID0gJ0p1bXBUb0ZpcnN0TWVzc2FnZScsXG4gICAgLyoqIEp1bXAgdG8gdGhlIGxhdGVzdCBtZXNzYWdlIGluIHRoZSByb29tICovXG4gICAgSnVtcFRvTGF0ZXN0TWVzc2FnZSA9ICdKdW1wVG9MYXRlc3RNZXNzYWdlJyxcbn1cblxuLyoqIEFjdGlvbnMgZm9yIG5hdmlnYXRpbmcgZG8gdmFyaW91cyBtZW51cywgZGlhbG9ncyBvciBzY3JlZW5zICovXG5leHBvcnQgZW51bSBOYXZpZ2F0aW9uQWN0aW9uIHtcbiAgICAvKiogSnVtcCB0byByb29tIHNlYXJjaCAoc2VhcmNoIGZvciBhIHJvb20pICovXG4gICAgRm9jdXNSb29tU2VhcmNoID0gJ0ZvY3VzUm9vbVNlYXJjaCcsXG4gICAgLyoqIFRvZ2dsZSB0aGUgcm9vbSBzaWRlIHBhbmVsICovXG4gICAgVG9nZ2xlUm9vbVNpZGVQYW5lbCA9ICdUb2dnbGVSb29tU2lkZVBhbmVsJyxcbiAgICAvKiogVG9nZ2xlIHRoZSB1c2VyIG1lbnUgKi9cbiAgICBUb2dnbGVVc2VyTWVudSA9ICdUb2dnbGVVc2VyTWVudScsXG4gICAgLyoqIFRvZ2dsZSB0aGUgc2hvcnQgY3V0IGhlbHAgZGlhbG9nICovXG4gICAgVG9nZ2xlU2hvcnRDdXREaWFsb2cgPSAnVG9nZ2xlU2hvcnRDdXREaWFsb2cnLFxuICAgIC8qKiBHb3QgdG8gdGhlIEVsZW1lbnQgaG9tZSBzY3JlZW4gKi9cbiAgICBHb1RvSG9tZSA9ICdHb1RvSG9tZScsXG4gICAgLyoqIFNlbGVjdCBwcmV2IHJvb20gKi9cbiAgICBTZWxlY3RQcmV2Um9vbSA9ICdTZWxlY3RQcmV2Um9vbScsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHJvb20gKi9cbiAgICBTZWxlY3ROZXh0Um9vbSA9ICdTZWxlY3ROZXh0Um9vbScsXG4gICAgLyoqIFNlbGVjdCBwcmV2IHJvb20gd2l0aCB1bnJlYWQgbWVzc2FnZXMgKi9cbiAgICBTZWxlY3RQcmV2VW5yZWFkUm9vbSA9ICdTZWxlY3RQcmV2VW5yZWFkUm9vbScsXG4gICAgLyoqIFNlbGVjdCBuZXh0IHJvb20gd2l0aCB1bnJlYWQgbWVzc2FnZXMgKi9cbiAgICBTZWxlY3ROZXh0VW5yZWFkUm9vbSA9ICdTZWxlY3ROZXh0VW5yZWFkUm9vbScsXG59XG5cbi8qKlxuICogUmVwcmVzZW50IGEga2V5IGNvbWJpbmF0aW9uLlxuICpcbiAqIFRoZSBjb21ibyBpcyBldmFsdWF0ZWQgc3RyaWN0bHksIGkuZS4gdGhlIEtleWJvYXJkRXZlbnQgbXVzdCBtYXRjaCBleGFjdGx5IHdoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBLZXlDb21iby5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5Q29tYm8gPSB7XG4gICAga2V5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9uIFBDOiBjdHJsIGlzIHByZXNzZWQ7IG9uIE1hYzogbWV0YSBpcyBwcmVzc2VkICovXG4gICAgY3RybE9yQ21kPzogYm9vbGVhbjtcblxuICAgIGFsdEtleT86IGJvb2xlYW47XG4gICAgY3RybEtleT86IGJvb2xlYW47XG4gICAgbWV0YUtleT86IGJvb2xlYW47XG4gICAgc2hpZnRLZXk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBLZXlCaW5kaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICAgIGFjdGlvbjogVDtcbiAgICBrZXlDb21ibzogS2V5Q29tYm87XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIEtleWJvYXJkRXZlbnQgbWF0Y2hlcyBhIEtleUNvbWJvXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2QgaXMgb25seSBleHBvcnRlZCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5Q29tYm9NYXRjaChldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQsIGNvbWJvOiBLZXlDb21ibywgb25NYWM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoY29tYm8ua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2hlbiBzaGlmdCBpcyBwcmVzc2VkLCBsZXR0ZXJzIGFyZSByZXR1cm5lZCBhcyB1cHBlciBjYXNlIGNoYXJzLiBJbiB0aGlzIGNhc2UgZG8gYSBsb3dlciBjYXNlIGNvbXBhcmlzb24uXG4gICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGxldHRlciBjb21ib3Mgc3VjaCBhcyBzaGlmdCArIFUgYXMgd2VsbCBmb3Igbm9uZSBsZXR0ZXIgY29tYm9zIHN1Y2ggYXMgc2hpZnQgKyBFc2NhcGUuXG4gICAgICAgIC8vIElmIHNoaWZ0IGlzIG5vdCBwcmVzc2VkLCB0aGUgdG9Mb3dlckNhc2UgY29udmVyc2lvbiBjYW4gYmUgYXZvaWRlZC5cbiAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5LnRvTG93ZXJDYXNlKCkgIT09IGNvbWJvLmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleSAhPT0gY29tYm8ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21ib0N0cmwgPSBjb21iby5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvQWx0ID0gY29tYm8uYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvU2hpZnQgPSBjb21iby5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBjb21ib01ldGEgPSBjb21iby5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFRlc3RzIG1vY2sgZXZlbnRzIG1heSBrZWVwIHRoZSBtb2RpZmllcnMgdW5kZWZpbmVkOyBjb252ZXJ0IHRoZW0gdG8gYm9vbGVhbnNcbiAgICBjb25zdCBldkN0cmwgPSBldi5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2QWx0ID0gZXYuYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2U2hpZnQgPSBldi5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBldk1ldGEgPSBldi5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFdoZW4gY3RybE9yQ21kIGlzIHNldCwgdGhlIGtleXMgbmVlZCBkbyBldmFsdWF0ZWQgZGlmZmVyZW50bHkgb24gUEMgYW5kIE1hY1xuICAgIGlmIChjb21iby5jdHJsT3JDbWQpIHtcbiAgICAgICAgaWYgKG9uTWFjKSB7XG4gICAgICAgICAgICBpZiAoIWV2TWV0YVxuICAgICAgICAgICAgICAgIHx8IGV2Q3RybCAhPT0gY29tYm9DdHJsXG4gICAgICAgICAgICAgICAgfHwgZXZBbHQgIT09IGNvbWJvQWx0XG4gICAgICAgICAgICAgICAgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZXZDdHJsXG4gICAgICAgICAgICAgICAgfHwgZXZNZXRhICE9PSBjb21ib01ldGFcbiAgICAgICAgICAgICAgICB8fCBldkFsdCAhPT0gY29tYm9BbHRcbiAgICAgICAgICAgICAgICB8fCBldlNoaWZ0ICE9PSBjb21ib1NoaWZ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChldk1ldGEgIT09IGNvbWJvTWV0YVxuICAgICAgICB8fCBldkN0cmwgIT09IGNvbWJvQ3RybFxuICAgICAgICB8fCBldkFsdCAhPT0gY29tYm9BbHRcbiAgICAgICAgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIEtleUJpbmRpbmdHZXR0ZXI8VCBleHRlbmRzIHN0cmluZz4gPSAoKSA9PiBLZXlCaW5kaW5nPFQ+W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUtleUJpbmRpbmdzUHJvdmlkZXIge1xuICAgIGdldE1lc3NhZ2VDb21wb3NlckJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPE1lc3NhZ2VDb21wb3NlckFjdGlvbj47XG4gICAgZ2V0QXV0b2NvbXBsZXRlQmluZGluZ3M6IEtleUJpbmRpbmdHZXR0ZXI8QXV0b2NvbXBsZXRlQWN0aW9uPjtcbiAgICBnZXRSb29tTGlzdEJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPFJvb21MaXN0QWN0aW9uPjtcbiAgICBnZXRSb29tQmluZGluZ3M6IEtleUJpbmRpbmdHZXR0ZXI8Um9vbUFjdGlvbj47XG4gICAgZ2V0TmF2aWdhdGlvbkJpbmRpbmdzOiBLZXlCaW5kaW5nR2V0dGVyPE5hdmlnYXRpb25BY3Rpb24+O1xufVxuXG5leHBvcnQgY2xhc3MgS2V5QmluZGluZ3NNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGtleSBiaW5kaW5ncyBwcm92aWRlcnMuXG4gICAgICpcbiAgICAgKiBLZXkgYmluZGluZ3MgZnJvbSB0aGUgZmlyc3QgcHJvdmlkZXIocykgaW4gdGhlIGxpc3Qgd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciBrZXkgYmluZGluZ3MgZnJvbSBsYXRlciBwcm92aWRlcnMuXG4gICAgICpcbiAgICAgKiBUbyBvdmVyd3JpdGUgdGhlIGRlZmF1bHQga2V5IGJpbmRpbmdzIGFkZCBhIG5ldyBwcm92aWRlcnMgYmVmb3JlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBlLmcuIGEgcHJvdmlkZXIgZm9yXG4gICAgICogY3VzdG9taXplZCBrZXkgYmluZGluZ3MuXG4gICAgICovXG4gICAgYmluZGluZ3NQcm92aWRlcnM6IElLZXlCaW5kaW5nc1Byb3ZpZGVyW10gPSBbXG4gICAgICAgIGRlZmF1bHRCaW5kaW5nc1Byb3ZpZGVyLFxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhIG1hdGNoaW5nIEtleUFjdGlvbiBmb3IgYSBnaXZlbiBLZXlib2FyZEV2ZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBY3Rpb248VCBleHRlbmRzIHN0cmluZz4oXG4gICAgICAgIGdldHRlcnM6IEtleUJpbmRpbmdHZXR0ZXI8VD5bXSxcbiAgICAgICAgZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50LFxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGNvbnN0IGdldHRlciBvZiBnZXR0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5ncyA9IGdldHRlcigpO1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzLmZpbmQoaXQgPT4gaXNLZXlDb21ib01hdGNoKGV2LCBpdC5rZXlDb21ibywgaXNNYWMpKTtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuYWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZUNvbXBvc2VyQWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IE1lc3NhZ2VDb21wb3NlckFjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbih0aGlzLmJpbmRpbmdzUHJvdmlkZXJzLm1hcChpdCA9PiBpdC5nZXRNZXNzYWdlQ29tcG9zZXJCaW5kaW5ncyksIGV2KTtcbiAgICB9XG5cbiAgICBnZXRBdXRvY29tcGxldGVBY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogQXV0b2NvbXBsZXRlQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldEF1dG9jb21wbGV0ZUJpbmRpbmdzKSwgZXYpO1xuICAgIH1cblxuICAgIGdldFJvb21MaXN0QWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IFJvb21MaXN0QWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldFJvb21MaXN0QmluZGluZ3MpLCBldik7XG4gICAgfVxuXG4gICAgZ2V0Um9vbUFjdGlvbihldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQpOiBSb29tQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKGl0ID0+IGl0LmdldFJvb21CaW5kaW5ncyksIGV2KTtcbiAgICB9XG5cbiAgICBnZXROYXZpZ2F0aW9uQWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IE5hdmlnYXRpb25BY3Rpb24gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3Rpb24odGhpcy5iaW5kaW5nc1Byb3ZpZGVycy5tYXAoaXQgPT4gaXQuZ2V0TmF2aWdhdGlvbkJpbmRpbmdzKSwgZXYpO1xuICAgIH1cbn1cblxuY29uc3QgbWFuYWdlciA9IG5ldyBLZXlCaW5kaW5nc01hbmFnZXIoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleUJpbmRpbmdzTWFuYWdlcigpOiBLZXlCaW5kaW5nc01hbmFnZXIge1xuICAgIHJldHVybiBtYW5hZ2VyO1xufVxuIl19