UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

324 lines (276 loc) 33.8 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.generateWordLexiconDetails = generateWordLexiconDetails; exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var lexiconHelpers = _interopRequireWildcard(require("../ScripturePane/helpers/lexiconHelpers")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } /** * lookup translations and convert to morph description * @param {string} morph - morph code to convert * @param {Function} translate * @return {Array} morph description for each part */ function getWordParts(morph, translate) { var morphKeysForParts = lexiconHelpers.getMorphKeys(morph); var morphStrs = []; morphKeysForParts.forEach(function (morphKeys) { var translatedMorphs = []; morphKeys.forEach(function (key) { if (key.startsWith('*')) { translatedMorphs.push(key.substr(1)); } else { translatedMorphs.push(translate(key)); } }); morphStrs.push(translatedMorphs.join(', ')); }); return morphStrs; } /** * creates span with formatted html * @param html * @return {*} */ function getFormatted(html) { var props = { dangerouslySetInnerHTML: { __html: html } }; return /*#__PURE__*/_react["default"].createElement("span", props); } /** * creates a data line with label, text and optionally text can be formatted html * @param {string} label * @param {string} text * @param {boolean} isFormatted - if true then text contains html formatting * @param {string} fontSize - font size to use for text * @return {*} */ function generateDataSegment(label, text) { var isFormatted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var fontSize = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '1.0em'; return isFormatted ? /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, label), " ", /*#__PURE__*/_react["default"].createElement("span", { style: { fontSize: fontSize } }, text && getFormatted(text) || '')) : /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, label), " ", /*#__PURE__*/_react["default"].createElement("span", { style: { fontSize: fontSize } }, text)); } /** * draws line between word parts * @param {Number} pos - order of part on screen (0 is top) * @return {*} */ function generateLine(pos) { return pos > 0 ? /*#__PURE__*/_react["default"].createElement("hr", { style: { 'height': '6px', 'borderBottom': '1px solid gray', 'marginBottom': '5px', 'marginTop': '0px' } }) : ''; } /** * creates an html word * @param {boolean} multipart - if true then this is a multipart word * @param {string} word * @param {string} fontSize - font size to use for word * @return {*} */ function generateWordEntry(multipart, word) { var fontSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '1.2em'; return multipart ? /*#__PURE__*/_react["default"].createElement("div", { style: { margin: '0', padding: '0' } }, /*#__PURE__*/_react["default"].createElement("strong", { style: { fontSize: fontSize } }, word), /*#__PURE__*/_react["default"].createElement("br", null)) : ''; } /** * creates an entry for a word part * @param {function} translate * @param {string} lemma * @param {string} morphStr * @param {Number} strongsNum * @param {string} strongs * @param {string} lexicon * @param {string} word * @param {Number} itemNum - number of part in word * @param {Number} pos - order of part on screen (0 is top) * @param {Number} count - total number of parts to show * @param {boolean} isHebrew - if true then we adjust font size for Original language * @return {*} */ function generateWordPart(translate, lemma, morphStr, strongsNum, strongs, lexicon, word, itemNum, pos, count) { var isHebrew = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : false; morphStr = morphStr || translate('morph_missing'); var multipart = count > 1; var key = 'lexicon_details_' + pos; var origLangFontSize = isHebrew ? '1.7em' : '1.2em'; if (strongsNum) { return /*#__PURE__*/_react["default"].createElement("div", { key: key, style: { margin: '0px 10px 0px 10px', maxWidth: '400px' } }, generateLine(pos), generateWordEntry(multipart, word, origLangFontSize), generateDataSegment(translate('lemma'), lemma, false, origLangFontSize), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('morphology'), morphStr), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('strongs'), strongs), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('lexicon'), lexicon, true), /*#__PURE__*/_react["default"].createElement("br", null)); } else { // not main word return /*#__PURE__*/_react["default"].createElement("div", { key: key, style: { margin: '0px 0px 0px 10px', maxWidth: '400px' } }, generateLine(pos), generateWordEntry(multipart, word, origLangFontSize), generateDataSegment(translate('morphology'), morphStr), /*#__PURE__*/_react["default"].createElement("br", null)); } } /** * find the major part of the word and move to top * @param {Number} partCount - actual part count * @param {Array} wordParts - word split into parts * @return {number[]} */ function movePrimaryWordToTop(partCount, wordParts) { var majorHighest = 0; var majorPos = 0; var indices = Array.from({ length: partCount }).map(function (u, i) { return i; }); indices.forEach(function (i) { // sort by part length, longest first var partLen = (wordParts && wordParts.length > i && wordParts[i] || '').length; if (partLen > majorHighest) { majorHighest = partLen; majorPos = i; } }); if (majorPos > 0) { // move indices.splice(majorPos, 1); indices.unshift(majorPos); } return indices; } /** * get the strongs and lexicon for position * checks for formats such as `c:d:H0776` or 'H123:H7225' and extracts the actual strongs number(s) * @param {String} strong - parse the strongs numbers for part * @param {Object} lexiconData * @param {number} pos - position of part to get strongs and lexicon * @return {strongNumber, lexicon} */ function getStrongsAndLexicon(strong, lexiconData, pos) { var lexicon = ''; var strongNumber = 0; var strongsParts = lexiconHelpers.getStrongsParts(strong); if (strongsParts.length > pos) { strong = strongsParts[pos]; } else { strong = ''; } var lexiconId = lexiconHelpers.lexiconIdFromStrongs(strong); strongNumber = lexiconHelpers.lexiconEntryIdFromStrongs(strong); if (lexiconData && lexiconData[lexiconId] && lexiconData[lexiconId][strongNumber]) { lexicon = lexiconData[lexiconId][strongNumber]["long"]; } return { strongNumber: strongNumber, lexicon: lexicon, strong: strong }; } /** * * @param {Object} wordObject - word to display in lexicon * @param {String} lexiconData - contains lexicon for strongs * @param {Function} translate * @param {Function} generateWordPart * @param {boolean} isHebrew - if true then we adjust font size for Original language * @return {*[]} */ function generateWordLexiconDetails(wordObject, lexiconData, translate, generateWordPart, isHebrew) { var wordLexiconDetails; var wordParts = lexiconHelpers.getWordParts(wordObject.text); var morphStrs = getWordParts(wordObject.morph, translate); var strongsParts = lexiconHelpers.getStrongsParts(wordObject.strong); var partCount = Math.max(morphStrs.length, strongsParts.length, wordParts.length); // since there may be inconsistancies, use largest count if (partCount < 2) { var _getStrongsAndLexicon = getStrongsAndLexicon(wordObject.strong, lexiconData, 0), strongNumber = _getStrongsAndLexicon.strongNumber, lexicon = _getStrongsAndLexicon.lexicon, strongs = _getStrongsAndLexicon.strong; wordLexiconDetails = generateWordPart(translate, wordObject.lemma, morphStrs[0], strongNumber, strongs, lexicon, wordParts[0], 0, 0, partCount, isHebrew); } else { var indices = movePrimaryWordToTop(partCount, wordParts); wordLexiconDetails = indices.map(function (pos, index) { var morphStr = morphStrs.length > pos && morphStrs[pos] || ''; var word = wordParts.length > pos && wordParts[pos] || ''; var _getStrongsAndLexicon2 = getStrongsAndLexicon(wordObject.strong, lexiconData, pos), strongNumber = _getStrongsAndLexicon2.strongNumber, lexicon = _getStrongsAndLexicon2.lexicon, strongs = _getStrongsAndLexicon2.strong; var lemmaStr = index === 0 ? wordObject.lemma : ''; return generateWordPart(translate, lemmaStr, morphStr, strongNumber, strongs, lexicon, word, pos, index, partCount, isHebrew); }); } return wordLexiconDetails; } var WordLexiconDetails = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(WordLexiconDetails, _React$Component); var _super = _createSuper(WordLexiconDetails); function WordLexiconDetails() { (0, _classCallCheck2["default"])(this, WordLexiconDetails); return _super.apply(this, arguments); } (0, _createClass2["default"])(WordLexiconDetails, [{ key: "render", value: function render() { var _this$props = this.props, wordObject = _this$props.wordObject, translate = _this$props.translate, lexiconData = _this$props.lexiconData, isHebrew = _this$props.isHebrew; var wordLexiconDetails = generateWordLexiconDetails(wordObject, lexiconData, translate, generateWordPart, isHebrew); return wordLexiconDetails; } }]); return WordLexiconDetails; }(_react["default"].Component); WordLexiconDetails.propTypes = { translate: _propTypes["default"].func.isRequired, wordObject: _propTypes["default"].shape({ lemma: _propTypes["default"].string.isRequired, morph: _propTypes["default"].string.isRequired, strong: _propTypes["default"].string.isRequired }).isRequired, lexiconData: _propTypes["default"].object.isRequired, isHebrew: _propTypes["default"].bool.isRequired }; var _default = WordLexiconDetails; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Xb3JkTGV4aWNvbkRldGFpbHMvV29yZExleGljb25EZXRhaWxzLmpzIl0sIm5hbWVzIjpbImdldFdvcmRQYXJ0cyIsIm1vcnBoIiwidHJhbnNsYXRlIiwibW9ycGhLZXlzRm9yUGFydHMiLCJsZXhpY29uSGVscGVycyIsImdldE1vcnBoS2V5cyIsIm1vcnBoU3RycyIsImZvckVhY2giLCJtb3JwaEtleXMiLCJ0cmFuc2xhdGVkTW9ycGhzIiwia2V5Iiwic3RhcnRzV2l0aCIsInB1c2giLCJzdWJzdHIiLCJqb2luIiwiZ2V0Rm9ybWF0dGVkIiwiaHRtbCIsInByb3BzIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJnZW5lcmF0ZURhdGFTZWdtZW50IiwibGFiZWwiLCJ0ZXh0IiwiaXNGb3JtYXR0ZWQiLCJmb250U2l6ZSIsImdlbmVyYXRlTGluZSIsInBvcyIsImdlbmVyYXRlV29yZEVudHJ5IiwibXVsdGlwYXJ0Iiwid29yZCIsIm1hcmdpbiIsInBhZGRpbmciLCJnZW5lcmF0ZVdvcmRQYXJ0IiwibGVtbWEiLCJtb3JwaFN0ciIsInN0cm9uZ3NOdW0iLCJzdHJvbmdzIiwibGV4aWNvbiIsIml0ZW1OdW0iLCJjb3VudCIsImlzSGVicmV3Iiwib3JpZ0xhbmdGb250U2l6ZSIsIm1heFdpZHRoIiwibW92ZVByaW1hcnlXb3JkVG9Ub3AiLCJwYXJ0Q291bnQiLCJ3b3JkUGFydHMiLCJtYWpvckhpZ2hlc3QiLCJtYWpvclBvcyIsImluZGljZXMiLCJBcnJheSIsImZyb20iLCJsZW5ndGgiLCJtYXAiLCJ1IiwiaSIsInBhcnRMZW4iLCJzcGxpY2UiLCJ1bnNoaWZ0IiwiZ2V0U3Ryb25nc0FuZExleGljb24iLCJzdHJvbmciLCJsZXhpY29uRGF0YSIsInN0cm9uZ051bWJlciIsInN0cm9uZ3NQYXJ0cyIsImdldFN0cm9uZ3NQYXJ0cyIsImxleGljb25JZCIsImxleGljb25JZEZyb21TdHJvbmdzIiwibGV4aWNvbkVudHJ5SWRGcm9tU3Ryb25ncyIsImdlbmVyYXRlV29yZExleGljb25EZXRhaWxzIiwid29yZE9iamVjdCIsIndvcmRMZXhpY29uRGV0YWlscyIsIk1hdGgiLCJtYXgiLCJpbmRleCIsImxlbW1hU3RyIiwiV29yZExleGljb25EZXRhaWxzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsInNoYXBlIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOzs7Ozs7QUFFQTs7Ozs7O0FBTUEsU0FBU0EsWUFBVCxDQUFzQkMsS0FBdEIsRUFBNkJDLFNBQTdCLEVBQXdDO0FBQ3RDLE1BQU1DLGlCQUFpQixHQUFHQyxjQUFjLENBQUNDLFlBQWYsQ0FBNEJKLEtBQTVCLENBQTFCO0FBQ0EsTUFBTUssU0FBUyxHQUFHLEVBQWxCO0FBRUFILEVBQUFBLGlCQUFpQixDQUFDSSxPQUFsQixDQUEwQixVQUFBQyxTQUFTLEVBQUk7QUFDckMsUUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFFQUQsSUFBQUEsU0FBUyxDQUFDRCxPQUFWLENBQWtCLFVBQUFHLEdBQUcsRUFBSTtBQUN2QixVQUFJQSxHQUFHLENBQUNDLFVBQUosQ0FBZSxHQUFmLENBQUosRUFBeUI7QUFDdkJGLFFBQUFBLGdCQUFnQixDQUFDRyxJQUFqQixDQUFzQkYsR0FBRyxDQUFDRyxNQUFKLENBQVcsQ0FBWCxDQUF0QjtBQUNELE9BRkQsTUFFTztBQUNMSixRQUFBQSxnQkFBZ0IsQ0FBQ0csSUFBakIsQ0FBc0JWLFNBQVMsQ0FBQ1EsR0FBRCxDQUEvQjtBQUNEO0FBQ0YsS0FORDtBQU9BSixJQUFBQSxTQUFTLENBQUNNLElBQVYsQ0FBZUgsZ0JBQWdCLENBQUNLLElBQWpCLENBQXNCLElBQXRCLENBQWY7QUFDRCxHQVhEO0FBWUEsU0FBT1IsU0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7QUFLQSxTQUFTUyxZQUFULENB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QjtBQUdELEtBVm9CLENBQXJCO0FBV0Q7O0FBQ0QsU0FBTzZCLGtCQUFQO0FBQ0Q7O0lBRUtLLGtCOzs7Ozs7Ozs7Ozs7NkJBQ0s7QUFBQSx3QkFHSCxLQUFLekQsS0FIRjtBQUFBLFVBRUxtRCxVQUZLLGVBRUxBLFVBRks7QUFBQSxVQUVPbEUsU0FGUCxlQUVPQSxTQUZQO0FBQUEsVUFFa0IwRCxXQUZsQixlQUVrQkEsV0FGbEI7QUFBQSxVQUUrQnBCLFFBRi9CLGVBRStCQSxRQUYvQjtBQUlQLFVBQUk2QixrQkFBa0IsR0FBR0YsMEJBQTBCLENBQUNDLFVBQUQsRUFBYVIsV0FBYixFQUEwQjFELFNBQTFCLEVBQXFDOEIsZ0JBQXJDLEVBQXVEUSxRQUF2RCxDQUFuRDtBQUNBLGFBQU82QixrQkFBUDtBQUNEOzs7RUFQOEJNLGtCQUFNQyxTOztBQVV2Q0Ysa0JBQWtCLENBQUNHLFNBQW5CLEdBQStCO0FBQzdCM0UsRUFBQUEsU0FBUyxFQUFFNEUsc0JBQVVDLElBQVYsQ0FBZUMsVUFERztBQUU3QlosRUFBQUEsVUFBVSxFQUFFVSxzQkFBVUcsS0FBVixDQUFnQjtBQUMxQmhELElBQUFBLEtBQUssRUFBRTZDLHNCQUFVSSxNQUFWLENBQWlCRixVQURFO0FBRTFCL0UsSUFBQUEsS0FBSyxFQUFFNkUsc0JBQVVJLE1BQVYsQ0FBaUJGLFVBRkU7QUFHMUJyQixJQUFBQSxNQUFNLEVBQUVtQixzQkFBVUksTUFBVixDQUFpQkY7QUFIQyxHQUFoQixFQUlUQSxVQU4wQjtBQU83QnBCLEVBQUFBLFdBQVcsRUFBRWtCLHNCQUFVSyxNQUFWLENBQWlCSCxVQVBEO0FBUTdCeEMsRUFBQUEsUUFBUSxFQUFFc0Msc0JBQVVNLElBQVYsQ0FBZUo7QUFSSSxDQUEvQjtlQVdlTixrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuLy8gaGVscGVyc1xuaW1wb3J0ICogYXMgbGV4aWNvbkhlbHBlcnMgZnJvbSAnLi4vU2NyaXB0dXJlUGFuZS9oZWxwZXJzL2xleGljb25IZWxwZXJzJztcblxuLyoqXG4gKiBsb29rdXAgdHJhbnNsYXRpb25zIGFuZCBjb252ZXJ0IHRvIG1vcnBoIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9ycGggLSBtb3JwaCBjb2RlIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHJldHVybiB7QXJyYXl9IG1vcnBoIGRlc2NyaXB0aW9uIGZvciBlYWNoIHBhcnRcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZFBhcnRzKG1vcnBoLCB0cmFuc2xhdGUpIHtcbiAgY29uc3QgbW9ycGhLZXlzRm9yUGFydHMgPSBsZXhpY29uSGVscGVycy5nZXRNb3JwaEtleXMobW9ycGgpO1xuICBjb25zdCBtb3JwaFN0cnMgPSBbXTtcblxuICBtb3JwaEtleXNGb3JQYXJ0cy5mb3JFYWNoKG1vcnBoS2V5cyA9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRlZE1vcnBocyA9IFtdO1xuXG4gICAgbW9ycGhLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICAgIHRyYW5zbGF0ZWRNb3JwaHMucHVzaChrZXkuc3Vic3RyKDEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zbGF0ZWRNb3JwaHMucHVzaCh0cmFuc2xhdGUoa2V5KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9ycGhTdHJzLnB1c2godHJhbnNsYXRlZE1vcnBocy5qb2luKCcsICcpKTtcbiAgfSk7XG4gIHJldHVybiBtb3JwaFN0cnM7XG59XG5cbi8qKlxuICogY3JlYXRlcyBzcGFuIHdpdGggZm9ybWF0dGVkIGh0bWxcbiAqIEBwYXJhbSBodG1sXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWQoaHRtbCkge1xuICBjb25zdCBwcm9wcyA9IHsgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBodG1sIH0gfTtcbiAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+PC9zcGFuPjtcbn1cblxuLyoqXG4gKiBjcmVhdGVzIGEgZGF0YSBsaW5lIHdpdGggbGFiZWwsIHRleHQgYW5kIG9wdGlvbmFsbHkgdGV4dCBjYW4gYmUgZm9ybWF0dGVkIGh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGb3JtYXR0ZWQgLSBpZiB0cnVlIHRoZW4gdGV4dCBjb250YWlucyBodG1sIGZvcm1hdHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250U2l6ZSAtIGZvbnQgc2l6ZSB0byB1c2UgZm9yIHRleHRcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRGF0YVNlZ21lbnQobGFiZWwsIHRleHQsIGlzRm9ybWF0dGVkID0gZmFsc2UsIGZvbnRTaXplID0gJzEuMGVtJykge1xuICByZXR1cm4gKGlzRm9ybWF0dGVkID9cbiAgICA8c3Bhbj48c3Ryb25nPntsYWJlbH08L3N0cm9uZz4gPHNwYW4gc3R5bGU9e3sgZm9udFNpemUgfX0+eyh0ZXh0ICYmIGdldEZvcm1hdHRlZCh0ZXh0KSkgfHwgJyd9PC9zcGFuPjwvc3Bhbj5cbiAgICA6XG4gICAgPHNwYW4+PHN0cm9uZz57bGFiZWx9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplIH19Pnt0ZXh0fTwvc3Bhbj48L3NwYW4+XG4gICk7XG59XG5cbi8qKlxuICogZHJhd3MgbGluZSBiZXR3ZWVuIHdvcmQgcGFydHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgLSBvcmRlciBvZiBwYXJ0IG9uIHNjcmVlbiAoMCBpcyB0b3ApXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxpbmUocG9zKSB7XG4gIHJldHVybiAocG9zID4gMCkgP1xuICAgIDxociBzdHlsZT17e1xuICAgICAgJ2hlaWdodCc6ICc2cHgnLCAnYm9yZGVyQm90dG9tJzogJzFweCBzb2xpZCBncmF5JywgJ21hcmdpbkJvdHRvbSc6ICc1cHgnLCAnbWFyZ2luVG9wJzogJzBweCcsXG4gICAgfX0vPlxuICAgIDogJyc7XG59XG5cbi8qKlxuICogY3JlYXRlcyBhbiBodG1sIHdvcmRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwYXJ0IC0gaWYgdHJ1ZSB0aGVuIHRoaXMgaXMgYSBtdWx0aXBhcnQgd29yZFxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250U2l6ZSAtIGZvbnQgc2l6ZSB0byB1c2UgZm9yIHdvcmRcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlV29yZEVudHJ5KG11bHRpcGFydCwgd29yZCwgZm9udFNpemUgPSAnMS4yZW0nKSB7XG4gIHJldHVybiBtdWx0aXBhcnQgP1xuICAgIDxkaXYgc3R5bGU9e3sgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJyB9fT5cbiAgICAgIDxzdHJvbmcgc3R5bGU9e3sgZm9udFNpemUgfX0+e3dvcmR9PC9zdHJvbmc+XG4gICAgICA8YnIvPlxuICAgIDwvZGl2PlxuICAgIDogJyc7XG59XG5cbi8qKlxuICogY3JlYXRlcyBhbiBlbnRyeSBmb3IgYSB3b3JkIHBhcnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGxlbW1hXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9ycGhTdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJvbmdzTnVtXG4gKiBAcGFyYW0ge3N0cmluZ30gc3Ryb25nc1xuICogQHBhcmFtIHtzdHJpbmd9IGxleGljb25cbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcGFyYW0ge051bWJlcn0gaXRlbU51bSAtIG51bWJlciBvZiBwYXJ0IGluIHdvcmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgLSBvcmRlciBvZiBwYXJ0IG9uIHNjcmVlbiAoMCBpcyB0b3ApXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgLSB0b3RhbCBudW1iZXIgb2YgcGFydHMgdG8gc2hvd1xuICogQHBhcmFtIHtib29sZWFufSBpc0hlYnJldyAtIGlmIHRydWUgdGhlbiB3ZSBhZGp1c3QgZm9udCBzaXplIGZvciBPcmlnaW5hbCBsYW5ndWFnZVxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVXb3JkUGFydCh0cmFuc2xhdGUsIGxlbW1hLCBtb3JwaFN0ciwgc3Ryb25nc051bSwgc3Ryb25ncywgbGV4aWNvbiwgd29yZCwgaXRlbU51bSwgcG9zLCBjb3VudCxcbiAgaXNIZWJyZXcgPSBmYWxzZSkge1xuICBtb3JwaFN0ciA9IG1vcnBoU3RyIHx8IHRyYW5zbGF0ZSgnbW9ycGhfbWlzc2luZycpO1xuICBjb25zdCBtdWx0aXBhcnQgPSBjb3VudCA+IDE7XG4gIGNvbnN0IGtleSA9ICdsZXhpY29uX2RldGFpbHNfJyArIHBvcztcbiAgY29uc3Qgb3JpZ0xhbmdGb250U2l6ZSA9IGlzSGVicmV3ID8gJzEuN2VtJyA6ICcxLjJlbSc7XG5cbiAgaWYgKHN0cm9uZ3NOdW0pIHtcbiAgICByZXR1cm4gPGRpdiBrZXk9e2tleX0gc3R5bGU9e3sgbWFyZ2luOiAnMHB4IDEwcHggMHB4IDEwcHgnLCBtYXhXaWR0aDogJzQwMHB4JyB9fT5cbiAgICAgIHtnZW5lcmF0ZUxpbmUocG9zKX1cbiAgICAgIHtnZW5lcmF0ZVdvcmRFbnRyeShtdWx0aXBhcnQsIHdvcmQsIG9yaWdMYW5nRm9udFNpemUpfVxuICAgICAge2dlbmVyYXRlRGF0YVNlZ21lbnQodHJhbnNsYXRlKCdsZW1tYScpLCBsZW1tYSwgZmFsc2UsIG9yaWdMYW5nRm9udFNpemUpfTxici8+XG4gICAgICB7Z2VuZXJhdGVEYXRhU2VnbWVudCh0cmFuc2xhdGUoJ21vcnBob2xvZ3knKSwgbW9ycGhTdHIpfTxici8+XG4gICAgICB7Z2VuZXJhdGVEYXRhU2VnbWVudCh0cmFuc2xhdGUoJ3N0cm9uZ3MnKSwgc3Ryb25ncyl9PGJyLz5cbiAgICAgIHtnZW5lcmF0ZURhdGFTZWdtZW50KHRyYW5zbGF0ZSgnbGV4aWNvbicpLCBsZXhpY29uLCB0cnVlKX08YnIvPlxuICAgIDwvZGl2PjtcbiAgfSBlbHNlIHsgLy8gbm90IG1haW4gd29yZFxuICAgIHJldHVybiA8ZGl2IGtleT17a2V5fSBzdHlsZT17eyBtYXJnaW46ICcwcHggMHB4IDBweCAxMHB4JywgbWF4V2lkdGg6ICc0MDBweCcgfX0+XG4gICAgICB7Z2VuZXJhdGVMaW5lKHBvcyl9XG4gICAgICB7Z2VuZXJhdGVXb3JkRW50cnkobXVsdGlwYXJ0LCB3b3JkLCBvcmlnTGFuZ0ZvbnRTaXplKX1cbiAgICAgIHtnZW5lcmF0ZURhdGFTZWdtZW50KHRyYW5zbGF0ZSgnbW9ycGhvbG9neScpLCBtb3JwaFN0cil9PGJyLz5cbiAgICA8L2Rpdj47XG4gIH1cbn1cblxuLyoqXG4gKiBmaW5kIHRoZSBtYWpvciBwYXJ0IG9mIHRoZSB3b3JkIGFuZCBtb3ZlIHRvIHRvcFxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcnRDb3VudCAtIGFjdHVhbCBwYXJ0IGNvdW50XG4gKiBAcGFyYW0ge0FycmF5fSB3b3JkUGFydHMgLSB3b3JkIHNwbGl0IGludG8gcGFydHNcbiAqIEByZXR1cm4ge251bWJlcltdfVxuICovXG5mdW5jdGlvbiBtb3ZlUHJpbWFyeVdvcmRUb1RvcChwYXJ0Q291bnQsIHdvcmRQYXJ0cykge1xuICBsZXQgbWFqb3JIaWdoZXN0ID0gMDtcbiAgbGV0IG1ham9yUG9zID0gMDtcbiAgbGV0IGluZGljZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBwYXJ0Q291bnQgfSkubWFwKCh1LCBpKSA9PiBpKTtcblxuICBpbmRpY2VzLmZvckVhY2goaSA9PiB7XG4gICAgLy8gc29ydCBieSBwYXJ0IGxlbmd0aCwgbG9uZ2VzdCBmaXJzdFxuICAgIGNvbnN0IHBhcnRMZW4gPSAoKHdvcmRQYXJ0cyAmJiAod29yZFBhcnRzLmxlbmd0aCA+IGkpICYmIHdvcmRQYXJ0c1tpXSkgfHwgJycpLmxlbmd0aDtcblxuICAgIGlmIChwYXJ0TGVuID4gbWFqb3JIaWdoZXN0KSB7XG4gICAgICBtYWpvckhpZ2hlc3QgPSBwYXJ0TGVuO1xuICAgICAgbWFqb3JQb3MgPSBpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG1ham9yUG9zID4gMCkgeyAvLyBtb3ZlXG4gICAgaW5kaWNlcy5zcGxpY2UobWFqb3JQb3MsIDEpO1xuICAgIGluZGljZXMudW5zaGlmdChtYWpvclBvcyk7XG4gIH1cbiAgcmV0dXJuIGluZGljZXM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBzdHJvbmdzIGFuZCBsZXhpY29uIGZvciBwb3NpdGlvblxuICogY2hlY2tzIGZvciBmb3JtYXRzIHN1Y2ggYXMgYGM6ZDpIMDc3NmAgb3IgJ0gxMjM6SDcyMjUnIGFuZCBleHRyYWN0cyB0aGUgYWN0dWFsIHN0cm9uZ3MgbnVtYmVyKHMpXG4gKiBAcGFyYW0ge1N0cmluZ30gc3Ryb25nIC0gcGFyc2UgdGhlIHN0cm9uZ3MgbnVtYmVycyBmb3IgcGFydFxuICogQHBhcmFtIHtPYmplY3R9IGxleGljb25EYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIC0gcG9zaXRpb24gb2YgcGFydCB0byBnZXQgc3Ryb25ncyBhbmQgbGV4aWNvblxuICogQHJldHVybiB7c3Ryb25nTnVtYmVyLCBsZXhpY29ufVxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdzQW5kTGV4aWNvbihzdHJvbmcsIGxleGljb25EYXRhLCBwb3MpIHtcbiAgbGV0IGxleGljb24gPSAnJztcbiAgbGV0IHN0cm9uZ051bWJlciA9IDA7XG4gIGNvbnN0IHN0cm9uZ3NQYXJ0cyA9IGxleGljb25IZWxwZXJzLmdldFN0cm9uZ3NQYXJ0cyhzdHJvbmcpO1xuXG4gIGlmIChzdHJvbmdzUGFydHMubGVuZ3RoID4gcG9zKSB7XG4gICAgc3Ryb25nID0gc3Ryb25nc1BhcnRzW3Bvc107XG4gIH0gZWxzZSB7XG4gICAgc3Ryb25nID0gJyc7XG4gIH1cblxuICBjb25zdCBsZXhpY29uSWQgPSBsZXhpY29uSGVscGVycy5sZXhpY29uSWRGcm9tU3Ryb25ncyhzdHJvbmcpO1xuICBzdHJvbmdOdW1iZXIgPSBsZXhpY29uSGVscGVycy5sZXhpY29uRW50cnlJZEZyb21TdHJvbmdzKHN0cm9uZyk7XG5cbiAgaWYgKGxleGljb25EYXRhICYmIGxleGljb25EYXRhW2xleGljb25JZF0gJiYgbGV4aWNvbkRhdGFbbGV4aWNvbklkXVtzdHJvbmdOdW1iZXJdKSB7XG4gICAgbGV4aWNvbiA9IGxleGljb25EYXRhW2xleGljb25JZF1bc3Ryb25nTnVtYmVyXS5sb25nO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3Ryb25nTnVtYmVyLCBsZXhpY29uLCBzdHJvbmcsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB3b3JkT2JqZWN0IC0gd29yZCB0byBkaXNwbGF5IGluIGxleGljb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBsZXhpY29uRGF0YSAtIGNvbnRhaW5zIGxleGljb24gZm9yIHN0cm9uZ3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2VuZXJhdGVXb3JkUGFydFxuICogQHBhcmFtIHtib29sZWFufSBpc0hlYnJldyAtIGlmIHRydWUgdGhlbiB3ZSBhZGp1c3QgZm9udCBzaXplIGZvciBPcmlnaW5hbCBsYW5ndWFnZVxuICogQHJldHVybiB7KltdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVXb3JkTGV4aWNvbkRldGFpbHMod29yZE9iamVjdCwgbGV4aWNvbkRhdGEsIHRyYW5zbGF0ZSwgZ2VuZXJhdGVXb3JkUGFydCwgaXNIZWJyZXcpIHtcbiAgbGV0IHdvcmRMZXhpY29uRGV0YWlscztcbiAgY29uc3Qgd29yZFBhcnRzID0gbGV4aWNvbkhlbHBlcnMuZ2V0V29yZFBhcnRzKHdvcmRPYmplY3QudGV4dCk7XG4gIGNvbnN0IG1vcnBoU3RycyA9IGdldFdvcmRQYXJ0cyh3b3JkT2JqZWN0Lm1vcnBoLCB0cmFuc2xhdGUpO1xuICBjb25zdCBzdHJvbmdzUGFydHMgPSBsZXhpY29uSGVscGVycy5nZXRTdHJvbmdzUGFydHMod29yZE9iamVjdC5zdHJvbmcpO1xuICBjb25zdCBwYXJ0Q291bnQgPSBNYXRoLm1heChtb3JwaFN0cnMubGVuZ3RoLCBzdHJvbmdzUGFydHMubGVuZ3RoLCB3b3JkUGFydHMubGVuZ3RoKTsgLy8gc2luY2UgdGhlcmUgbWF5IGJlIGluY29uc2lzdGFuY2llcywgdXNlIGxhcmdlc3QgY291bnRcblxuICBpZiAocGFydENvdW50IDwgMikge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0cm9uZ051bWJlciwgbGV4aWNvbiwgc3Ryb25nOiBzdHJvbmdzLFxuICAgIH0gPSBnZXRTdHJvbmdzQW5kTGV4aWNvbih3b3JkT2JqZWN0LnN0cm9uZywgbGV4aWNvbkRhdGEsIDApO1xuICAgIHdvcmRMZXhpY29uRGV0YWlscyA9IGdlbmVyYXRlV29yZFBhcnQodHJhbnNsYXRlLCB3b3JkT2JqZWN0LmxlbW1hLCBtb3JwaFN0cnNbMF0sIHN0cm9uZ051bWJlciwgc3Ryb25ncywgbGV4aWNvbiwgd29yZFBhcnRzWzBdLCAwLCAwLCBwYXJ0Q291bnQsIGlzSGVicmV3KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbmRpY2VzID0gbW92ZVByaW1hcnlXb3JkVG9Ub3AocGFydENvdW50LCB3b3JkUGFydHMpO1xuXG4gICAgd29yZExleGljb25EZXRhaWxzID0gaW5kaWNlcy5tYXAoKHBvcywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1vcnBoU3RyID0gKChtb3JwaFN0cnMubGVuZ3RoID4gcG9zKSAmJiBtb3JwaFN0cnNbcG9zXSkgfHwgJyc7XG4gICAgICBjb25zdCB3b3JkID0gKCh3b3JkUGFydHMubGVuZ3RoID4gcG9zKSAmJiB3b3JkUGFydHNbcG9zXSkgfHwgJyc7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0cm9uZ051bWJlciwgbGV4aWNvbiwgc3Ryb25nOiBzdHJvbmdzLFxuICAgICAgfSA9IGdldFN0cm9uZ3NBbmRMZXhpY29uKHdvcmRPYmplY3Quc3Ryb25nLCBsZXhpY29uRGF0YSwgcG9zKTtcbiAgICAgIGNvbnN0IGxlbW1hU3RyID0gKGluZGV4ID09PSAwKSA/IHdvcmRPYmplY3QubGVtbWEgOiAnJztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGdlbmVyYXRlV29yZFBhcnQodHJhbnNsYXRlLCBsZW1tYVN0ciwgbW9ycGhTdHIsIHN0cm9uZ051bWJlciwgc3Ryb25ncywgbGV4aWNvbiwgd29yZCwgcG9zLCBpbmRleCwgcGFydENvdW50LCBpc0hlYnJldylcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHdvcmRMZXhpY29uRGV0YWlscztcbn1cblxuY2xhc3MgV29yZExleGljb25EZXRhaWxzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmRPYmplY3QsIHRyYW5zbGF0ZSwgbGV4aWNvbkRhdGEsIGlzSGVicmV3LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB3b3JkTGV4aWNvbkRldGFpbHMgPSBnZW5lcmF0ZVdvcmRMZXhpY29uRGV0YWlscyh3b3JkT2JqZWN0LCBsZXhpY29uRGF0YSwgdHJhbnNsYXRlLCBnZW5lcmF0ZVdvcmRQYXJ0LCBpc0hlYnJldyk7XG4gICAgcmV0dXJuIHdvcmRMZXhpY29uRGV0YWlscztcbiAgfVxufVxuXG5Xb3JkTGV4aWNvbkRldGFpbHMucHJvcFR5cGVzID0ge1xuICB0cmFuc2xhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHdvcmRPYmplY3Q6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgbGVtbWE6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBtb3JwaDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHN0cm9uZzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB9KS5pc1JlcXVpcmVkLFxuICBsZXhpY29uRGF0YTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBpc0hlYnJldzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFdvcmRMZXhpY29uRGV0YWlscztcbiJdfQ==