UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

261 lines (212 loc) 23.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getGroupData = getGroupData; exports.scrollIntoView = scrollIntoView; exports.scrollIntoViewEnd = scrollIntoViewEnd; exports.inView = inView; exports.isInViewport = isInViewport; exports.getStatusBadges = getStatusBadges; exports.makeStatusBadgeComponents = makeStatusBadgeComponents; exports.getGlyphIcons = getGlyphIcons; exports.groupIsVisible = exports.groupItemIsVisible = exports.getFilterCount = exports.MENU_ITEM_HEIGHT = exports.MENU_BAR_HEIGHT = void 0; var _react = _interopRequireDefault(require("react")); var _server = _interopRequireDefault(require("react-dom/server")); var _reactBootstrap = require("react-bootstrap"); var _InvalidatedIcon = _interopRequireDefault(require("../GroupsMenuFilter/InvalidatedIcon")); var MENU_BAR_HEIGHT = 30; exports.MENU_BAR_HEIGHT = MENU_BAR_HEIGHT; var MENU_ITEM_HEIGHT = 38; exports.MENU_ITEM_HEIGHT = MENU_ITEM_HEIGHT; function getGroupData(groupsData, groupId) { var groupData; if (groupsData !== undefined) { groupData = groupsData[groupId]; } return groupData; } var getFilterCount = function getFilterCount(filters) { return Object.keys(filters).filter(function (k) { return filters[k]; }).length; }; /** * @description - Determines if the item should be navigatable * @param {object} groupItemData * @returns {boolean} */ exports.getFilterCount = getFilterCount; var groupItemIsVisible = function groupItemIsVisible(groupItemData, filters) { return !getFilterCount(filters) || filters.invalidated && groupItemData.invalidated || filters.reminders && groupItemData.reminders || filters.selections && groupItemData.selections || filters.noSelections && !groupItemData.selections || filters.verseEdits && groupItemData.verseEdits || filters.comments && groupItemData.comments; }; /** * @description - Determines if the group is navigatable based on filters * @param {object} groupData * @returns {boolean} */ exports.groupItemIsVisible = groupItemIsVisible; var groupIsVisible = function groupIsVisible(groupData, filters) { if (!getFilterCount(filters)) { return true; } for (var i = 0, len = groupData.length; i < len; i++) { var groupItemData = groupData[i]; if (groupItemIsVisible(groupItemData, filters)) { return true; } } return false; }; /** * scrolls into view, but will be toward top * @param {object} current */ exports.groupIsVisible = groupIsVisible; function scrollIntoView(_ref) { var current = _ref.current; if (current && current.scrollIntoView) { current.scrollIntoView({ block: 'start', behavior: 'smooth' }); } } /** * scrolls into view, but will be toward bottom * @param {object} item */ function scrollIntoViewEnd(_ref2) { var current = _ref2.current; if (current && current.scrollIntoView) { current.scrollIntoView(false); // must use boolean value here because we are using an older chromium that does not yet support scrollIntoViewOptions } } /** * * @description - Tests if the the two elements are in the scope of the window (scroll bar) * The consts MENU_BAR_HEIGHT & MENU_ITEM_HEIGHT are set to account for the static window avialablity * @param {object} currentGroupMenu - The current group menu header that is extended/actived (i.e. Metaphors) * @param {object} currentGroupItem - The current group check item that is active (i.e. Luke 1:1) */ function inView(_ref3, _ref4) { var currentGroupMenu = _ref3.current; var currentGroupItem = _ref4.current; if (currentGroupMenu && currentGroupItem) { var rectGroup = currentGroupMenu.getBoundingClientRect(); var rectItem = currentGroupItem.getBoundingClientRect(); var viewHeight = Math.min(document.documentElement.clientHeight, window.innerHeight); return Math.abs(rectGroup.top - rectItem.top) + (MENU_BAR_HEIGHT + MENU_ITEM_HEIGHT * 2) <= viewHeight; } } /** * Checks if the react ref is vertically within the viewport. * @param ref - the react ref * @return {boolean} */ function isInViewport(ref) { if (ref && ref.current) { var offset = MENU_BAR_HEIGHT + MENU_ITEM_HEIGHT; var top = ref.current.getBoundingClientRect().top; return top >= 0 && top + offset <= window.innerHeight; } else { return false; } } /** * @description - gets the status badge component for the group menu row * @param {object} groupItemData * @param verseFinished * @param verseIsValid */ function getStatusBadges(groupItemData, verseFinished, verseIsValid) { var glyphs = []; if (groupItemData && groupItemData.contextId && groupItemData.contextId.reference) { // The below ifs are in order of precedence of the status badges we show if (groupItemData.invalidated || !verseIsValid) { glyphs.push('invalidated'); } if (groupItemData.reminders) { glyphs.push('bookmark'); } if (groupItemData.selections || verseFinished) { glyphs.push('ok'); } if (groupItemData.verseEdits) { glyphs.push('pencil'); } if (groupItemData.comments) { glyphs.push('comment'); } } return makeStatusBadgeComponents(glyphs); } /** * @description - Takes an array of glyph names, gets their React components and then renders the status badge * with the first icon and then a mouse-over tooltip with the rest of the icons and a chip to say how many icons there are. * @param {*} glyphs */ function makeStatusBadgeComponents(glyphs) { var statusGlyphs = getGlyphIcons(glyphs); var mainGlyph = statusGlyphs[0]; if (statusGlyphs.length > 1) { var tooltip = _server["default"].renderToString(statusGlyphs); return /*#__PURE__*/_react["default"].createElement("div", { className: "status-badge-wrapper" }, /*#__PURE__*/_react["default"].createElement("div", { className: "status-badge", "data-for": "groups-tooltip", "data-tip": tooltip, "data-html": "true", "data-place": "bottom", "data-effect": "float", "data-type": "light", "data-class": "group-menu-status-tooltip", "data-delay-hide": "100" }, mainGlyph, /*#__PURE__*/_react["default"].createElement("div", { className: "badge" }, statusGlyphs.length))); } else { return /*#__PURE__*/_react["default"].createElement("div", { className: "status-badge-wrapper" }, /*#__PURE__*/_react["default"].createElement("div", { className: "status-badge" }, mainGlyph)); } } /** * @description - Takes an array of strings that are glyph names and gets the proper React component to render them * @param {array} glyphs */ function getGlyphIcons(glyphs) { var glyphicons = []; if (glyphs && glyphs.length) { for (var i = 0, len = glyphs.length; i < len; i++) { var glyph = glyphs[i]; if (glyph === 'invalidated') { glyphicons.push( /*#__PURE__*/_react["default"].createElement("div", { key: glyph, className: 'glyphicon glyphicon-invalidated' }, /*#__PURE__*/_react["default"].createElement(_InvalidatedIcon["default"], { height: 16, width: 16 }))); } else { var className = 'status-icon-' + glyph; glyphicons.push( /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, { key: glyph, glyph: glyph, className: className })); } } } else { glyphicons.push( /*#__PURE__*/_react["default"].createElement("div", { key: "blank", className: "glyphicon glyphicon-blank status-icon-blank" })); } return glyphicons; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cE1lbnUvaGVscGVycy9pbmRleC5qcyJdLCJuYW1lcyI6WyJNRU5VX0JBUl9IRUlHSFQiLCJNRU5VX0lURU1fSEVJR0hUIiwiZ2V0R3JvdXBEYXRhIiwiZ3JvdXBzRGF0YSIsImdyb3VwSWQiLCJncm91cERhdGEiLCJ1bmRlZmluZWQiLCJnZXRGaWx0ZXJDb3VudCIsImZpbHRlcnMiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiayIsImxlbmd0aCIsImdyb3VwSXRlbUlzVmlzaWJsZSIsImdyb3VwSXRlbURhdGEiLCJpbnZhbGlkYXRlZCIsInJlbWluZGVycyIsInNlbGVjdGlvbnMiLCJub1NlbGVjdGlvbnMiLCJ2ZXJzZUVkaXRzIiwiY29tbWVudHMiLCJncm91cElzVmlzaWJsZSIsImkiLCJsZW4iLCJzY3JvbGxJbnRvVmlldyIsImN1cnJlbnQiLCJibG9jayIsImJlaGF2aW9yIiwic2Nyb2xsSW50b1ZpZXdFbmQiLCJpblZpZXciLCJjdXJyZW50R3JvdXBNZW51IiwiY3VycmVudEdyb3VwSXRlbSIsInJlY3RHcm91cCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJlY3RJdGVtIiwidmlld0hlaWdodCIsIk1hdGgiLCJtaW4iLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudEhlaWdodCIsIndpbmRvdyIsImlubmVySGVpZ2h0IiwiYWJzIiwidG9wIiwiaXNJblZpZXdwb3J0IiwicmVmIiwib2Zmc2V0IiwiZ2V0U3RhdHVzQmFkZ2VzIiwidmVyc2VGaW5pc2hlZCIsInZlcnNlSXNWYWxpZCIsImdseXBocyIsImNvbnRleHRJZCIsInJlZmVyZW5jZSIsInB1c2giLCJtYWtlU3RhdHVzQmFkZ2VDb21wb25lbnRzIiwic3RhdHVzR2x5cGhzIiwiZ2V0R2x5cGhJY29ucyIsIm1haW5HbHlwaCIsInRvb2x0aXAiLCJSZWFjdERPTVNlcnZlciIsInJlbmRlclRvU3RyaW5nIiwiZ2x5cGhpY29ucyIsImdseXBo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WCxlQUFnQjtBQUFLLE1BQUEsR0FBRyxFQUFDLE9BQVQ7QUFBaUIsTUFBQSxTQUFTLEVBQUM7QUFBM0IsTUFBaEI7QUFDRDs7QUFDRCxTQUFPUSxVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NU2VydmVyIGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuaW1wb3J0IHsgR2x5cGhpY29uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbmltcG9ydCBJbnZhbGlkYXRlZEljb24gZnJvbSAnLi4vR3JvdXBzTWVudUZpbHRlci9JbnZhbGlkYXRlZEljb24nO1xuZXhwb3J0IGNvbnN0IE1FTlVfQkFSX0hFSUdIVCA9IDMwO1xuZXhwb3J0IGNvbnN0IE1FTlVfSVRFTV9IRUlHSFQgPSAzODtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyb3VwRGF0YShncm91cHNEYXRhLCBncm91cElkKSB7XG4gIGxldCBncm91cERhdGE7XG5cbiAgaWYgKGdyb3Vwc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGdyb3VwRGF0YSA9IGdyb3Vwc0RhdGFbZ3JvdXBJZF07XG4gIH1cbiAgcmV0dXJuIGdyb3VwRGF0YTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlckNvdW50ID0gKGZpbHRlcnMpID0+IE9iamVjdC5rZXlzKGZpbHRlcnMpLmZpbHRlcihrID0+IGZpbHRlcnNba10pLmxlbmd0aDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gLSBEZXRlcm1pbmVzIGlmIHRoZSBpdGVtIHNob3VsZCBiZSBuYXZpZ2F0YWJsZVxuICogQHBhcmFtIHtvYmplY3R9IGdyb3VwSXRlbURhdGFcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBJdGVtSXNWaXNpYmxlID0gKGdyb3VwSXRlbURhdGEsIGZpbHRlcnMpID0+ICghZ2V0RmlsdGVyQ291bnQoZmlsdGVycykgfHxcbiAgICAoKGZpbHRlcnMuaW52YWxpZGF0ZWQgJiYgZ3JvdXBJdGVtRGF0YS5pbnZhbGlkYXRlZClcbiAgICAgIHx8IChmaWx0ZXJzLnJlbWluZGVycyAmJiBncm91cEl0ZW1EYXRhLnJlbWluZGVycylcbiAgICAgIHx8IChmaWx0ZXJzLnNlbGVjdGlvbnMgJiYgZ3JvdXBJdGVtRGF0YS5zZWxlY3Rpb25zKVxuICAgICAgfHwgKGZpbHRlcnMubm9TZWxlY3Rpb25zICYmICFncm91cEl0ZW1EYXRhLnNlbGVjdGlvbnMpXG4gICAgICB8fCAoZmlsdGVycy52ZXJzZUVkaXRzICYmIGdyb3VwSXRlbURhdGEudmVyc2VFZGl0cylcbiAgICAgIHx8IChmaWx0ZXJzLmNvbW1lbnRzICYmIGdyb3VwSXRlbURhdGEuY29tbWVudHMpXG4gICAgKSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIC0gRGV0ZXJtaW5lcyBpZiB0aGUgZ3JvdXAgaXMgbmF2aWdhdGFibGUgYmFzZWQgb24gZmlsdGVyc1xuICogQHBhcmFtIHtvYmplY3R9IGdyb3VwRGF0YVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBjb25zdCBncm91cElzVmlzaWJsZSA9IChncm91cERhdGEsIGZpbHRlcnMpID0+IHtcbiAgaWYgKCFnZXRGaWx0ZXJDb3VudChmaWx0ZXJzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGdyb3VwRGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGdyb3VwSXRlbURhdGEgPSBncm91cERhdGFbaV07XG5cbiAgICBpZiAoZ3JvdXBJdGVtSXNWaXNpYmxlKGdyb3VwSXRlbURhdGEsIGZpbHRlcnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIHNjcm9sbHMgaW50byB2aWV3LCBidXQgd2lsbCBiZSB0b3dhcmQgdG9wXG4gKiBAcGFyYW0ge29iamVjdH0gY3VycmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoeyBjdXJyZW50IH0pIHtcbiAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5zY3JvbGxJbnRvVmlldykge1xuICAgIGN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG59XG5cbi8qKlxuICogc2Nyb2xscyBpbnRvIHZpZXcsIGJ1dCB3aWxsIGJlIHRvd2FyZCBib3R0b21cbiAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxJbnRvVmlld0VuZCh7IGN1cnJlbnQgfSkge1xuICBpZiAoY3VycmVudCAmJiBjdXJyZW50LnNjcm9sbEludG9WaWV3KSB7XG4gICAgY3VycmVudC5zY3JvbGxJbnRvVmlldyhmYWxzZSk7IC8vIG11c3QgdXNlIGJvb2xlYW4gdmFsdWUgaGVyZSBiZWNhdXNlIHdlIGFyZSB1c2luZyBhbiBvbGRlciBjaHJvbWl1bSB0aGF0IGRvZXMgbm90IHlldCBzdXBwb3J0IHNjcm9sbEludG9WaWV3T3B0aW9uc1xuICB9XG59XG5cbi8qKlxuICpcbiogQGRlc2NyaXB0aW9uIC0gVGVzdHMgaWYgdGhlIHRoZSB0d28gZWxlbWVudHMgYXJlIGluIHRoZSBzY29wZSBvZiB0aGUgd2luZG93IChzY3JvbGwgYmFyKVxuKiBUaGUgY29uc3RzIE1FTlVfQkFSX0hFSUdIVCAmIE1FTlVfSVRFTV9IRUlHSFQgYXJlIHNldCB0byBhY2NvdW50IGZvciB0aGUgc3RhdGljIHdpbmRvdyBhdmlhbGFibGl0eVxuKiBAcGFyYW0ge29iamVjdH0gY3VycmVudEdyb3VwTWVudSAtIFRoZSBjdXJyZW50IGdyb3VwIG1lbnUgaGVhZGVyIHRoYXQgaXMgZXh0ZW5kZWQvYWN0aXZlZCAoaS5lLiBNZXRhcGhvcnMpXG4qIEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50R3JvdXBJdGVtIC0gVGhlIGN1cnJlbnQgZ3JvdXAgY2hlY2sgaXRlbSB0aGF0IGlzIGFjdGl2ZSAoaS5lLiBMdWtlIDE6MSlcbiovXG5leHBvcnQgZnVuY3Rpb24gaW5WaWV3KHsgY3VycmVudDogY3VycmVudEdyb3VwTWVudSB9LCB7IGN1cnJlbnQ6IGN1cnJlbnRHcm91cEl0ZW0gfSkge1xuICBpZiAoY3VycmVudEdyb3VwTWVudSAmJiBjdXJyZW50R3JvdXBJdGVtKSB7XG4gICAgY29uc3QgcmVjdEdyb3VwID0gY3VycmVudEdyb3VwTWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByZWN0SXRlbSA9IGN1cnJlbnRHcm91cEl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgdmlld0hlaWdodCA9IE1hdGgubWluKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgcmV0dXJuIE1hdGguYWJzKHJlY3RHcm91cC50b3AgLSByZWN0SXRlbS50b3ApICsgKE1FTlVfQkFSX0hFSUdIVCArIE1FTlVfSVRFTV9IRUlHSFQgKiAyKSA8PSB2aWV3SGVpZ2h0O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZWFjdCByZWYgaXMgdmVydGljYWxseSB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICogQHBhcmFtIHJlZiAtIHRoZSByZWFjdCByZWZcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luVmlld3BvcnQocmVmKSB7XG4gIGlmIChyZWYgJiYgcmVmLmN1cnJlbnQpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBNRU5VX0JBUl9IRUlHSFQgKyBNRU5VX0lURU1fSEVJR0hUO1xuICAgIGNvbnN0IHRvcCA9IHJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICByZXR1cm4gKHRvcCA+PSAwKSAmJiAodG9wICsgb2Zmc2V0IDw9IHdpbmRvdy5pbm5lckhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIC0gZ2V0cyB0aGUgc3RhdHVzIGJhZGdlIGNvbXBvbmVudCBmb3IgdGhlIGdyb3VwIG1lbnUgcm93XG4gKiBAcGFyYW0ge29iamVjdH0gZ3JvdXBJdGVtRGF0YVxuICogQHBhcmFtIHZlcnNlRmluaXNoZWRcbiAqIEBwYXJhbSB2ZXJzZUlzVmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0JhZGdlcyhncm91cEl0ZW1EYXRhLCB2ZXJzZUZpbmlzaGVkLCB2ZXJzZUlzVmFsaWQpIHtcbiAgY29uc3QgZ2x5cGhzID0gW107XG5cbiAgaWYgKGdyb3VwSXRlbURhdGEgJiYgZ3JvdXBJdGVtRGF0YS5jb250ZXh0SWQgJiYgZ3JvdXBJdGVtRGF0YS5jb250ZXh0SWQucmVmZXJlbmNlKSB7XG4gICAgLy8gVGhlIGJlbG93IGlmcyBhcmUgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZSBvZiB0aGUgc3RhdHVzIGJhZGdlcyB3ZSBzaG93XG4gICAgaWYgKGdyb3VwSXRlbURhdGEuaW52YWxpZGF0ZWQgfHwgIXZlcnNlSXNWYWxpZCkge1xuICAgICAgZ2x5cGhzLnB1c2goJ2ludmFsaWRhdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwSXRlbURhdGEucmVtaW5kZXJzKSB7XG4gICAgICBnbHlwaHMucHVzaCgnYm9va21hcmsnKTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBJdGVtRGF0YS5zZWxlY3Rpb25zIHx8IHZlcnNlRmluaXNoZWQpIHtcbiAgICAgIGdseXBocy5wdXNoKCdvaycpO1xuICAgIH1cblxuICAgIGlmIChncm91cEl0ZW1EYXRhLnZlcnNlRWRpdHMpIHtcbiAgICAgIGdseXBocy5wdXNoKCdwZW5jaWwnKTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBJdGVtRGF0YS5jb21tZW50cykge1xuICAgICAgZ2x5cGhzLnB1c2goJ2NvbW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFrZVN0YXR1c0JhZGdlQ29tcG9uZW50cyhnbHlwaHMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiAtIFRha2VzIGFuIGFycmF5IG9mIGdseXBoIG5hbWVzLCBnZXRzIHRoZWlyIFJlYWN0IGNvbXBvbmVudHMgYW5kIHRoZW4gcmVuZGVycyB0aGUgc3RhdHVzIGJhZGdlXG4gKiB3aXRoIHRoZSBmaXJzdCBpY29uIGFuZCB0aGVuIGEgbW91c2Utb3ZlciB0b29sdGlwIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGljb25zIGFuZCBhIGNoaXAgdG8gc2F5IGhvdyBtYW55IGljb25zIHRoZXJlIGFyZS5cbiAqIEBwYXJhbSB7Kn0gZ2x5cGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU3RhdHVzQmFkZ2VDb21wb25lbnRzKGdseXBocykge1xuICBjb25zdCBzdGF0dXNHbHlwaHMgPSBnZXRHbHlwaEljb25zKGdseXBocyk7XG4gIGNvbnN0IG1haW5HbHlwaCA9IHN0YXR1c0dseXBoc1swXTtcblxuICBpZiAoc3RhdHVzR2x5cGhzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCB0b29sdGlwID0gUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoc3RhdHVzR2x5cGhzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtYmFkZ2Utd3JhcHBlclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwic3RhdHVzLWJhZGdlXCJcbiAgICAgICAgICBkYXRhLWZvcj1cImdyb3Vwcy10b29sdGlwXCJcbiAgICAgICAgICBkYXRhLXRpcD17dG9vbHRpcH1cbiAgICAgICAgICBkYXRhLWh0bWw9XCJ0cnVlXCJcbiAgICAgICAgICBkYXRhLXBsYWNlPVwiYm90dG9tXCJcbiAgICAgICAgICBkYXRhLWVmZmVjdD1cImZsb2F0XCJcbiAgICAgICAgICBkYXRhLXR5cGU9XCJsaWdodFwiXG4gICAgICAgICAgZGF0YS1jbGFzcz1cImdyb3VwLW1lbnUtc3RhdHVzLXRvb2x0aXBcIlxuICAgICAgICAgIGRhdGEtZGVsYXktaGlkZT1cIjEwMFwiPlxuICAgICAgICAgIHttYWluR2x5cGh9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYWRnZVwiPlxuICAgICAgICAgICAge3N0YXR1c0dseXBocy5sZW5ndGh9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtYmFkZ2Utd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0YXR1cy1iYWRnZVwiPlxuICAgICAgICAgIHttYWluR2x5cGh9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIC0gVGFrZXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGFyZSBnbHlwaCBuYW1lcyBhbmQgZ2V0cyB0aGUgcHJvcGVyIFJlYWN0IGNvbXBvbmVudCB0byByZW5kZXIgdGhlbVxuICogQHBhcmFtIHthcnJheX0gZ2x5cGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbHlwaEljb25zKGdseXBocykge1xuICBjb25zdCBnbHlwaGljb25zID0gW107XG5cbiAgaWYgKGdseXBocyAmJiBnbHlwaHMubGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07XG5cbiAgICAgIGlmIChnbHlwaCA9PT0gJ2ludmFsaWRhdGVkJykge1xuICAgICAgICBnbHlwaGljb25zLnB1c2goPGRpdiBrZXk9e2dseXBofSBjbGFzc05hbWU9eydnbHlwaGljb24gZ2x5cGhpY29uLWludmFsaWRhdGVkJ30+PEludmFsaWRhdGVkSWNvbiBoZWlnaHQ9ezE2fSB3aWR0aD17MTZ9IC8+PC9kaXY+KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSAnc3RhdHVzLWljb24tJyArIGdseXBoO1xuICAgICAgICBnbHlwaGljb25zLnB1c2goPEdseXBoaWNvbiBrZXk9e2dseXBofSBnbHlwaD17Z2x5cGh9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSAvPik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGdseXBoaWNvbnMucHVzaCg8ZGl2IGtleT1cImJsYW5rXCIgY2xhc3NOYW1lPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1ibGFuayBzdGF0dXMtaWNvbi1ibGFua1wiIC8+KTtcbiAgfVxuICByZXR1cm4gZ2x5cGhpY29ucztcbn1cbiJdfQ==