@pie-lib/math-rendering 3.4.0-beta.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +1 -672
- package/CHANGELOG.md +143 -27
- package/package.json +4 -3
- package/src/__tests__/mml-to-latex.test.js +0 -1
- package/src/__tests__/normalization.test.js +0 -1
- package/lib/__tests__/mml-to-latex.test.js +0 -18
- package/lib/__tests__/normalization.test.js +0 -54
- package/lib/__tests__/render-math.test.js +0 -170
- package/lib/index.js +0 -38
- package/lib/mml-to-latex.js +0 -15
- package/lib/mstack/__tests__/chtml.test.js +0 -151
- package/lib/mstack/chtml.js +0 -296
- package/lib/mstack/index.js +0 -23
- package/lib/mstack/mml.js +0 -109
- package/lib/normalization.js +0 -95
- package/lib/render-math.js +0 -438
package/lib/normalization.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.wrapMath = exports.unWrapMath = exports.BracketTypes = void 0;
|
|
9
|
-
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
-
|
|
12
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
|
-
var _PAIRS;
|
|
15
|
-
|
|
16
|
-
var BracketTypes = {};
|
|
17
|
-
exports.BracketTypes = BracketTypes;
|
|
18
|
-
BracketTypes.ROUND_BRACKETS = 'round_brackets';
|
|
19
|
-
BracketTypes.SQUARE_BRACKETS = 'square_brackets';
|
|
20
|
-
BracketTypes.DOLLAR = 'dollar';
|
|
21
|
-
BracketTypes.DOUBLE_DOLLAR = 'double_dollar';
|
|
22
|
-
var PAIRS = (_PAIRS = {}, (0, _defineProperty2["default"])(_PAIRS, BracketTypes.ROUND_BRACKETS, ['\\(', '\\)']), (0, _defineProperty2["default"])(_PAIRS, BracketTypes.SQUARE_BRACKETS, ['\\[', '\\]']), (0, _defineProperty2["default"])(_PAIRS, BracketTypes.DOLLAR, ['$', '$']), (0, _defineProperty2["default"])(_PAIRS, BracketTypes.DOUBLE_DOLLAR, ['$$', '$$']), _PAIRS);
|
|
23
|
-
|
|
24
|
-
var wrapMath = function wrapMath(content, wrapType) {
|
|
25
|
-
if (wrapType === BracketTypes.SQUARE_BRACKETS) {
|
|
26
|
-
console.warn('\\[...\\] is not supported yet'); // eslint-disable-line
|
|
27
|
-
|
|
28
|
-
wrapType = BracketTypes.ROUND_BRACKETS;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (wrapType === BracketTypes.DOUBLE_DOLLAR) {
|
|
32
|
-
console.warn('$$...$$ is not supported yet'); // eslint-disable-line
|
|
33
|
-
|
|
34
|
-
wrapType = BracketTypes.DOLLAR;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
var _ref = PAIRS[wrapType] || PAIRS[BracketTypes.ROUND_BRACKETS],
|
|
38
|
-
_ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
39
|
-
start = _ref2[0],
|
|
40
|
-
end = _ref2[1];
|
|
41
|
-
|
|
42
|
-
return "".concat(start).concat(content).concat(end);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
exports.wrapMath = wrapMath;
|
|
46
|
-
|
|
47
|
-
var unWrapMath = function unWrapMath(content) {
|
|
48
|
-
var displayStyleIndex = content.indexOf('\\displaystyle');
|
|
49
|
-
|
|
50
|
-
if (displayStyleIndex !== -1) {
|
|
51
|
-
console.warn('\\displaystyle is not supported - removing'); // eslint-disable-line
|
|
52
|
-
|
|
53
|
-
content = content.replace('\\displaystyle', '').trim();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (content.startsWith('$$') && content.endsWith('$$')) {
|
|
57
|
-
console.warn('$$ syntax is not yet supported'); // eslint-disable-line
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
unwrapped: content.substring(2, content.length - 2),
|
|
61
|
-
wrapType: BracketTypes.DOLLAR
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (content.startsWith('$') && content.endsWith('$')) {
|
|
66
|
-
return {
|
|
67
|
-
unwrapped: content.substring(1, content.length - 1),
|
|
68
|
-
wrapType: BracketTypes.DOLLAR
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (content.startsWith('\\[') && content.endsWith('\\]')) {
|
|
73
|
-
console.warn('\\[..\\] syntax is not yet supported'); // eslint-disable-line
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
unwrapped: content.substring(2, content.length - 2),
|
|
77
|
-
wrapType: BracketTypes.ROUND_BRACKETS
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (content.startsWith('\\(') && content.endsWith('\\)')) {
|
|
82
|
-
return {
|
|
83
|
-
unwrapped: content.substring(2, content.length - 2),
|
|
84
|
-
wrapType: BracketTypes.ROUND_BRACKETS
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
unwrapped: content,
|
|
90
|
-
wrapType: BracketTypes.ROUND_BRACKETS
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
exports.unWrapMath = unWrapMath;
|
|
95
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub3JtYWxpemF0aW9uLmpzIl0sIm5hbWVzIjpbIkJyYWNrZXRUeXBlcyIsIlJPVU5EX0JSQUNLRVRTIiwiU1FVQVJFX0JSQUNLRVRTIiwiRE9MTEFSIiwiRE9VQkxFX0RPTExBUiIsIlBBSVJTIiwid3JhcE1hdGgiLCJjb250ZW50Iiwid3JhcFR5cGUiLCJjb25zb2xlIiwid2FybiIsInN0YXJ0IiwiZW5kIiwidW5XcmFwTWF0aCIsImRpc3BsYXlTdHlsZUluZGV4IiwiaW5kZXhPZiIsInJlcGxhY2UiLCJ0cmltIiwic3RhcnRzV2l0aCIsImVuZHNXaXRoIiwidW53cmFwcGVkIiwic3Vic3RyaW5nIiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBTyxJQUFNQSxZQUFZLEdBQUcsRUFBckI7O0FBRVBBLFlBQVksQ0FBQ0MsY0FBYixHQUE4QixnQkFBOUI7QUFDQUQsWUFBWSxDQUFDRSxlQUFiLEdBQStCLGlCQUEvQjtBQUNBRixZQUFZLENBQUNHLE1BQWIsR0FBc0IsUUFBdEI7QUFDQUgsWUFBWSxDQUFDSSxhQUFiLEdBQTZCLGVBQTdCO0FBRUEsSUFBTUMsS0FBSywwREFDUkwsWUFBWSxDQUFDQyxjQURMLEVBQ3NCLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FEdEIsNENBRVJELFlBQVksQ0FBQ0UsZUFGTCxFQUV1QixDQUFDLEtBQUQsRUFBUSxLQUFSLENBRnZCLDRDQUdSRixZQUFZLENBQUNHLE1BSEwsRUFHYyxDQUFDLEdBQUQsRUFBTSxHQUFOLENBSGQsNENBSVJILFlBQVksQ0FBQ0ksYUFKTCxFQUlxQixDQUFDLElBQUQsRUFBTyxJQUFQLENBSnJCLFVBQVg7O0FBT08sSUFBTUUsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ0MsT0FBRCxFQUFVQyxRQUFWLEVBQXVCO0FBQzdDLE1BQUlBLFFBQVEsS0FBS1IsWUFBWSxDQUFDRSxlQUE5QixFQUErQztBQUM3Q08sSUFBQUEsT0FBTyxDQUFDQyxJQUFSLENBQWEsZ0NB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bEIsR0FBUDtBQUlELENBeENNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEJyYWNrZXRUeXBlcyA9IHt9O1xuXG5CcmFja2V0VHlwZXMuUk9VTkRfQlJBQ0tFVFMgPSAncm91bmRfYnJhY2tldHMnO1xuQnJhY2tldFR5cGVzLlNRVUFSRV9CUkFDS0VUUyA9ICdzcXVhcmVfYnJhY2tldHMnO1xuQnJhY2tldFR5cGVzLkRPTExBUiA9ICdkb2xsYXInO1xuQnJhY2tldFR5cGVzLkRPVUJMRV9ET0xMQVIgPSAnZG91YmxlX2RvbGxhcic7XG5cbmNvbnN0IFBBSVJTID0ge1xuICBbQnJhY2tldFR5cGVzLlJPVU5EX0JSQUNLRVRTXTogWydcXFxcKCcsICdcXFxcKSddLFxuICBbQnJhY2tldFR5cGVzLlNRVUFSRV9CUkFDS0VUU106IFsnXFxcXFsnLCAnXFxcXF0nXSxcbiAgW0JyYWNrZXRUeXBlcy5ET0xMQVJdOiBbJyQnLCAnJCddLFxuICBbQnJhY2tldFR5cGVzLkRPVUJMRV9ET0xMQVJdOiBbJyQkJywgJyQkJ10sXG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcE1hdGggPSAoY29udGVudCwgd3JhcFR5cGUpID0+IHtcbiAgaWYgKHdyYXBUeXBlID09PSBCcmFja2V0VHlwZXMuU1FVQVJFX0JSQUNLRVRTKSB7XG4gICAgY29uc29sZS53YXJuKCdcXFxcWy4uLlxcXFxdIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICB3cmFwVHlwZSA9IEJyYWNrZXRUeXBlcy5ST1VORF9CUkFDS0VUUztcbiAgfVxuICBpZiAod3JhcFR5cGUgPT09IEJyYWNrZXRUeXBlcy5ET1VCTEVfRE9MTEFSKSB7XG4gICAgY29uc29sZS53YXJuKCckJC4uLiQkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICB3cmFwVHlwZSA9IEJyYWNrZXRUeXBlcy5ET0xMQVI7XG4gIH1cblxuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBQQUlSU1t3cmFwVHlwZV0gfHwgUEFJUlNbQnJhY2tldFR5cGVzLlJPVU5EX0JSQUNLRVRTXTtcbiAgcmV0dXJuIGAke3N0YXJ0fSR7Y29udGVudH0ke2VuZH1gO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuV3JhcE1hdGggPSAoY29udGVudCkgPT4ge1xuICBjb25zdCBkaXNwbGF5U3R5bGVJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignXFxcXGRpc3BsYXlzdHlsZScpO1xuICBpZiAoZGlzcGxheVN0eWxlSW5kZXggIT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdcXFxcZGlzcGxheXN0eWxlIGlzIG5vdCBzdXBwb3J0ZWQgLSByZW1vdmluZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgnXFxcXGRpc3BsYXlzdHlsZScsICcnKS50cmltKCk7XG4gIH1cblxuICBpZiAoY29udGVudC5zdGFydHNXaXRoKCckJCcpICYmIGNvbnRlbnQuZW5kc1dpdGgoJyQkJykpIHtcbiAgICBjb25zb2xlLndhcm4oJyQkIHN5bnRheCBpcyBub3QgeWV0IHN1cHBvcnRlZCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIHtcbiAgICAgIHVud3JhcHBlZDogY29udGVudC5zdWJzdHJpbmcoMiwgY29udGVudC5sZW5ndGggLSAyKSxcbiAgICAgIHdyYXBUeXBlOiBCcmFja2V0VHlwZXMuRE9MTEFSLFxuICAgIH07XG4gIH1cbiAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgnJCcpICYmIGNvbnRlbnQuZW5kc1dpdGgoJyQnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB1bndyYXBwZWQ6IGNvbnRlbnQuc3Vic3RyaW5nKDEsIGNvbnRlbnQubGVuZ3RoIC0gMSksXG4gICAgICB3cmFwVHlwZTogQnJhY2tldFR5cGVzLkRPTExBUixcbiAgICB9O1xuICB9XG5cbiAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgnXFxcXFsnKSAmJiBjb250ZW50LmVuZHNXaXRoKCdcXFxcXScpKSB7XG4gICAgY29uc29sZS53YXJuKCdcXFxcWy4uXFxcXF0gc3ludGF4IGlzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICByZXR1cm4ge1xuICAgICAgdW53cmFwcGVkOiBjb250ZW50LnN1YnN0cmluZygyLCBjb250ZW50Lmxlbmd0aCAtIDIpLFxuICAgICAgd3JhcFR5cGU6IEJyYWNrZXRUeXBlcy5ST1VORF9CUkFDS0VUUyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgnXFxcXCgnKSAmJiBjb250ZW50LmVuZHNXaXRoKCdcXFxcKScpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVud3JhcHBlZDogY29udGVudC5zdWJzdHJpbmcoMiwgY29udGVudC5sZW5ndGggLSAyKSxcbiAgICAgIHdyYXBUeXBlOiBCcmFja2V0VHlwZXMuUk9VTkRfQlJBQ0tFVFMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdW53cmFwcGVkOiBjb250ZW50LFxuICAgIHdyYXBUeXBlOiBCcmFja2V0VHlwZXMuUk9VTkRfQlJBQ0tFVFMsXG4gIH07XG59O1xuIl19
|
package/lib/render-math.js
DELETED
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.fixMathElements = exports.fixMathElement = exports["default"] = void 0;
|
|
9
|
-
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
|
|
12
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
13
|
-
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
|
|
16
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
-
|
|
18
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
-
|
|
20
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
21
|
-
|
|
22
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
23
|
-
|
|
24
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
25
|
-
|
|
26
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
27
|
-
|
|
28
|
-
var _mathjax = require("mathjax-full/js/mathjax");
|
|
29
|
-
|
|
30
|
-
var _global = require("mathjax-full/js/components/global");
|
|
31
|
-
|
|
32
|
-
var _assistiveMml = require("mathjax-full/js/a11y/assistive-mml");
|
|
33
|
-
|
|
34
|
-
var _semanticEnrich = require("mathjax-full/js/a11y/semantic-enrich");
|
|
35
|
-
|
|
36
|
-
var _MenuHandler = require("mathjax-full/js/ui/menu/MenuHandler");
|
|
37
|
-
|
|
38
|
-
var _FindMathML2 = require("mathjax-full/js/input/mathml/FindMathML");
|
|
39
|
-
|
|
40
|
-
var _mathml = require("mathjax-full/js/input/mathml");
|
|
41
|
-
|
|
42
|
-
var _tex = require("mathjax-full/js/input/tex");
|
|
43
|
-
|
|
44
|
-
var _chtml = require("mathjax-full/js/output/chtml");
|
|
45
|
-
|
|
46
|
-
var _html = require("mathjax-full/js/handlers/html");
|
|
47
|
-
|
|
48
|
-
var _browserAdaptor = require("mathjax-full/js/adaptors/browserAdaptor");
|
|
49
|
-
|
|
50
|
-
var _AllPackages = require("mathjax-full/js/input/tex/AllPackages");
|
|
51
|
-
|
|
52
|
-
var _system = require("speech-rule-engine/js/common/system");
|
|
53
|
-
|
|
54
|
-
var _mstack = require("./mstack");
|
|
55
|
-
|
|
56
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
57
|
-
|
|
58
|
-
var _normalization = require("./normalization");
|
|
59
|
-
|
|
60
|
-
var _MmlFactory = require("mathjax-full/js/core/MmlTree/MmlFactory");
|
|
61
|
-
|
|
62
|
-
var _SerializedMmlVisitor = require("mathjax-full/js/core/MmlTree/SerializedMmlVisitor");
|
|
63
|
-
|
|
64
|
-
var _WrapperFactory = require("mathjax-full/js/output/chtml/WrapperFactory");
|
|
65
|
-
|
|
66
|
-
var _mspace = require("mathjax-full/js/output/chtml/Wrappers/mspace");
|
|
67
|
-
|
|
68
|
-
var _HTMLDomStrings = require("mathjax-full/js/handlers/html/HTMLDomStrings");
|
|
69
|
-
|
|
70
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
71
|
-
|
|
72
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
73
|
-
|
|
74
|
-
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); }; }
|
|
75
|
-
|
|
76
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
77
|
-
|
|
78
|
-
if (typeof window !== 'undefined') {
|
|
79
|
-
(0, _html.RegisterHTMLHandler)((0, _browserAdaptor.browserAdaptor)());
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
var sreReady = false;
|
|
83
|
-
(0, _system.engineReady)().then(function () {
|
|
84
|
-
sreReady = true;
|
|
85
|
-
}); // import pkg from '../../package.json';
|
|
86
|
-
|
|
87
|
-
var visitor = new _SerializedMmlVisitor.SerializedMmlVisitor();
|
|
88
|
-
|
|
89
|
-
var toMMl = function toMMl(node) {
|
|
90
|
-
return visitor.visitTree(node);
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
var log = (0, _debug["default"])('pie-lib:math-rendering');
|
|
94
|
-
var NEWLINE_BLOCK_REGEX = /\\embed\{newLine\}\[\]/g;
|
|
95
|
-
var NEWLINE_LATEX = '\\newline ';
|
|
96
|
-
|
|
97
|
-
var getGlobal = function getGlobal() {
|
|
98
|
-
// TODO does it make sense to use version?
|
|
99
|
-
// const key = `${pkg.name}@${pkg.version.split('.')[0]}`;
|
|
100
|
-
// It looks like Ed made this change when he switched from mathjax3 to mathjax-full
|
|
101
|
-
// I think it was supposed to make sure version 1 (using mathjax3) is not used
|
|
102
|
-
// in combination with version 2 (using mathjax-full)
|
|
103
|
-
// TODO higher level wrappers use this instance of math-rendering, and if 2 different instances are used, math rendering is not working
|
|
104
|
-
// so I will hardcode this for now until a better solution is found
|
|
105
|
-
var key = '@pie-lib/math-rendering@2';
|
|
106
|
-
|
|
107
|
-
if (typeof window !== 'undefined') {
|
|
108
|
-
if (!window[key]) {
|
|
109
|
-
window[key] = {};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return window[key];
|
|
113
|
-
} else {
|
|
114
|
-
return {};
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
/** Add temporary support for a global singleDollar override
|
|
118
|
-
* <code>
|
|
119
|
-
* // This will enable single dollar rendering
|
|
120
|
-
* window.pie = window.pie || {};
|
|
121
|
-
* window.pie.mathRendering = {useSingleDollar: true };
|
|
122
|
-
* </code>
|
|
123
|
-
*/
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
var defaultOpts = function defaultOpts() {
|
|
127
|
-
return getGlobal().opts || {};
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
var fixMathElement = function fixMathElement(element) {
|
|
131
|
-
if (element.dataset.mathHandled) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
var property = 'innerText';
|
|
136
|
-
|
|
137
|
-
if (element.textContent) {
|
|
138
|
-
property = 'textContent';
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (element[property]) {
|
|
142
|
-
element[property] = (0, _normalization.wrapMath)((0, _normalization.unWrapMath)(element[property]).unwrapped); // because mathquill doesn't understand line breaks, sometimes we end up with custom elements on prompts/rationale/etc.
|
|
143
|
-
// we need to replace the custom embedded elements with valid latex that Mathjax can understand
|
|
144
|
-
|
|
145
|
-
element[property] = element[property].replace(NEWLINE_BLOCK_REGEX, NEWLINE_LATEX);
|
|
146
|
-
element.dataset.mathHandled = true;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
exports.fixMathElement = fixMathElement;
|
|
151
|
-
|
|
152
|
-
var fixMathElements = function fixMathElements() {
|
|
153
|
-
var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
|
|
154
|
-
var mathElements = el.querySelectorAll('[data-latex]');
|
|
155
|
-
mathElements.forEach(function (item) {
|
|
156
|
-
return fixMathElement(item);
|
|
157
|
-
});
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
exports.fixMathElements = fixMathElements;
|
|
161
|
-
|
|
162
|
-
var adjustMathMLStyle = function adjustMathMLStyle() {
|
|
163
|
-
var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
|
|
164
|
-
var nodes = el.querySelectorAll('math');
|
|
165
|
-
nodes.forEach(function (node) {
|
|
166
|
-
return node.setAttribute('displaystyle', 'true');
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
var myFindMathML = /*#__PURE__*/function (_FindMathML) {
|
|
171
|
-
(0, _inherits2["default"])(myFindMathML, _FindMathML);
|
|
172
|
-
|
|
173
|
-
var _super = _createSuper(myFindMathML);
|
|
174
|
-
|
|
175
|
-
function myFindMathML() {
|
|
176
|
-
(0, _classCallCheck2["default"])(this, myFindMathML);
|
|
177
|
-
return _super.apply(this, arguments);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
(0, _createClass2["default"])(myFindMathML, [{
|
|
181
|
-
key: "processMath",
|
|
182
|
-
value: function processMath(set) {
|
|
183
|
-
var adaptor = this.adaptor;
|
|
184
|
-
|
|
185
|
-
for (var _i = 0, _Array$from = Array.from(set); _i < _Array$from.length; _i++) {
|
|
186
|
-
var mml = _Array$from[_i];
|
|
187
|
-
|
|
188
|
-
if (adaptor.kind(adaptor.parent(mml)) === 'mjx-assistive-mml') {
|
|
189
|
-
set["delete"](mml);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return (0, _get2["default"])((0, _getPrototypeOf2["default"])(myFindMathML.prototype), "processMath", this).call(this, set);
|
|
194
|
-
}
|
|
195
|
-
}]);
|
|
196
|
-
return myFindMathML;
|
|
197
|
-
}(_FindMathML2.FindMathML);
|
|
198
|
-
|
|
199
|
-
var createMathMLInstance = function createMathMLInstance(opts) {
|
|
200
|
-
var docProvided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
|
|
201
|
-
opts = opts || defaultOpts();
|
|
202
|
-
|
|
203
|
-
if (opts.useSingleDollar) {
|
|
204
|
-
// eslint-disable-next-line
|
|
205
|
-
console.warn('[math-rendering] using $ is not advisable, please use $$..$$ or \\(...\\)');
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
var packages = _AllPackages.AllPackages.filter(function (name) {
|
|
209
|
-
return name !== 'bussproofs';
|
|
210
|
-
}); // Bussproofs needs an output jax
|
|
211
|
-
// The autoload extension predefines all the macros from the extensions that haven't been loaded already
|
|
212
|
-
// so that they automatically load the needed extension when they are first used
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
packages.push('autoload');
|
|
216
|
-
var macros = {
|
|
217
|
-
parallelogram: "\\lower.2em{\\Huge\\unicode{x25B1}}",
|
|
218
|
-
overarc: '\\overparen',
|
|
219
|
-
napprox: '\\not\\approx',
|
|
220
|
-
longdiv: '\\enclose{longdiv}'
|
|
221
|
-
};
|
|
222
|
-
var texConfig = opts.useSingleDollar ? {
|
|
223
|
-
packages: packages,
|
|
224
|
-
macros: macros,
|
|
225
|
-
inlineMath: [['$', '$'], ['\\(', '\\)']],
|
|
226
|
-
processEscapes: true
|
|
227
|
-
} : {
|
|
228
|
-
packages: packages,
|
|
229
|
-
macros: macros
|
|
230
|
-
};
|
|
231
|
-
var mmlConfig = {
|
|
232
|
-
parseError: function parseError(node) {
|
|
233
|
-
// function to process parsing errors
|
|
234
|
-
// eslint-disable-next-line no-console
|
|
235
|
-
console.log('error:', node);
|
|
236
|
-
this.error(this.adaptor.textContent(node).replace(/\n.*/g, ''));
|
|
237
|
-
},
|
|
238
|
-
FindMathML: new myFindMathML()
|
|
239
|
-
};
|
|
240
|
-
var cachedMathjax;
|
|
241
|
-
|
|
242
|
-
if (_global.MathJax && _global.MathJax.version !== _mathjax.mathjax.version) {
|
|
243
|
-
// handling other MathJax version on the page
|
|
244
|
-
// replacing it temporarily with the version we have
|
|
245
|
-
window.MathJax._ = window.MathJax._ || {};
|
|
246
|
-
window.MathJax.config = window.MathJax.config || {};
|
|
247
|
-
cachedMathjax = window.MathJax;
|
|
248
|
-
Object.assign(_global.MathJax, _mathjax.mathjax);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
var fontURL = "https://unpkg.com/mathjax-full@".concat(_mathjax.mathjax.version, "/ts/output/chtml/fonts/tex-woff-v2");
|
|
252
|
-
var htmlConfig = {
|
|
253
|
-
fontURL: fontURL,
|
|
254
|
-
wrapperFactory: new _WrapperFactory.CHTMLWrapperFactory(_objectSpread(_objectSpread({}, _WrapperFactory.CHTMLWrapperFactory.defaultNodes), _mstack.chtmlNodes))
|
|
255
|
-
};
|
|
256
|
-
var mml = new _mathml.MathML(mmlConfig);
|
|
257
|
-
var customMmlFactory = new _MmlFactory.MmlFactory(_objectSpread(_objectSpread({}, _MmlFactory.MmlFactory.defaultNodes), _mstack.mmlNodes));
|
|
258
|
-
var classFactory = (0, _semanticEnrich.EnrichHandler)((0, _MenuHandler.MenuHandler)((0, _assistiveMml.AssistiveMmlHandler)(_mathjax.mathjax.handlers.handlesDocument(docProvided))), mml);
|
|
259
|
-
var html = classFactory.create(docProvided, {
|
|
260
|
-
compileError: function compileError(mj, math, err) {
|
|
261
|
-
// eslint-disable-next-line no-console
|
|
262
|
-
console.log('bad math?:', math); // eslint-disable-next-line no-console
|
|
263
|
-
|
|
264
|
-
console.error(err);
|
|
265
|
-
},
|
|
266
|
-
typesetError: function typesetError(doc, math, err) {
|
|
267
|
-
// eslint-disable-next-line no-console
|
|
268
|
-
console.log('typeset error'); // eslint-disable-next-line no-console
|
|
269
|
-
|
|
270
|
-
console.error(err);
|
|
271
|
-
doc.typesetError(math, err);
|
|
272
|
-
},
|
|
273
|
-
sre: {
|
|
274
|
-
speech: 'deep'
|
|
275
|
-
},
|
|
276
|
-
enrichSpeech: 'deep',
|
|
277
|
-
InputJax: [new _tex.TeX(texConfig), mml],
|
|
278
|
-
OutputJax: new _chtml.CHTML(htmlConfig),
|
|
279
|
-
DomStrings: new _HTMLDomStrings.HTMLDomStrings({
|
|
280
|
-
skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'annotation', 'annotation-xml', 'mjx-assistive-mml', 'mjx-container']
|
|
281
|
-
})
|
|
282
|
-
}); // Note: we must set this *after* mathjax.document (no idea why)
|
|
283
|
-
|
|
284
|
-
mml.setMmlFactory(customMmlFactory);
|
|
285
|
-
|
|
286
|
-
if (cachedMathjax) {
|
|
287
|
-
// if we have a cached version, we replace it here
|
|
288
|
-
window.MathJax = cachedMathjax;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
return html;
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
var enrichSpeechInitialized = false;
|
|
295
|
-
|
|
296
|
-
var bootstrap = function bootstrap(opts) {
|
|
297
|
-
if (typeof window === 'undefined') {
|
|
298
|
-
return {
|
|
299
|
-
Typeset: function Typeset() {
|
|
300
|
-
return {};
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
var html = createMathMLInstance(opts);
|
|
306
|
-
return {
|
|
307
|
-
version: _mathjax.mathjax.version,
|
|
308
|
-
html: html,
|
|
309
|
-
Typeset: function Typeset() {
|
|
310
|
-
var _this = this;
|
|
311
|
-
|
|
312
|
-
for (var _len = arguments.length, elements = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
313
|
-
elements[_key] = arguments[_key];
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
var attemptRender = function attemptRender() {
|
|
317
|
-
var _updatedDocument$math, _updatedDocument$math2;
|
|
318
|
-
|
|
319
|
-
var temporary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
320
|
-
|
|
321
|
-
var updatedDocument = _this.html.findMath(elements.length ? {
|
|
322
|
-
elements: elements
|
|
323
|
-
} : {}).compile();
|
|
324
|
-
|
|
325
|
-
if (!temporary && sreReady) {
|
|
326
|
-
updatedDocument = updatedDocument.enrich();
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
updatedDocument = updatedDocument.getMetrics().typeset().assistiveMml().attachSpeech().addMenu().updateDocument();
|
|
330
|
-
|
|
331
|
-
if (!enrichSpeechInitialized && (0, _typeof2["default"])((_updatedDocument$math = updatedDocument.math.list) === null || _updatedDocument$math === void 0 ? void 0 : (_updatedDocument$math2 = _updatedDocument$math.next) === null || _updatedDocument$math2 === void 0 ? void 0 : _updatedDocument$math2.data) === 'object') {
|
|
332
|
-
enrichSpeechInitialized = true;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
try {
|
|
336
|
-
var list = updatedDocument.math.list;
|
|
337
|
-
|
|
338
|
-
if (list) {
|
|
339
|
-
for (var item = list.next; (0, _typeof2["default"])(item.data) !== 'symbol'; item = item.next) {
|
|
340
|
-
var mathMl = toMMl(item.data.root);
|
|
341
|
-
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
342
|
-
item.data.typesetRoot.setAttribute('data-mathml', parsedMathMl);
|
|
343
|
-
item.data.typesetRoot.setAttribute('tabindex', '-1');
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
} catch (e) {
|
|
347
|
-
// eslint-disable-next-line no-console
|
|
348
|
-
console.error(e.toString());
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
updatedDocument.clear();
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
if (!enrichSpeechInitialized) {
|
|
355
|
-
attemptRender(true);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
_mathjax.mathjax.handleRetriesFor(function () {
|
|
359
|
-
attemptRender();
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
var renderMath = function renderMath(el, renderOpts) {
|
|
366
|
-
var _getGlobal$instance, _getGlobal$instance2;
|
|
367
|
-
|
|
368
|
-
if (window && window.MathJax && window.MathJax.customKey && window.MathJax.customKey == '@pie-lib/math-rendering-accessible@1') {
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
var isString = typeof el === 'string';
|
|
373
|
-
var executeOn = document.body;
|
|
374
|
-
|
|
375
|
-
if (isString) {
|
|
376
|
-
var div = document.createElement('div');
|
|
377
|
-
div.innerHTML = el;
|
|
378
|
-
executeOn = div;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
fixMathElements(executeOn);
|
|
382
|
-
adjustMathMLStyle(executeOn);
|
|
383
|
-
|
|
384
|
-
if (isString) {
|
|
385
|
-
var html = createMathMLInstance(undefined, executeOn);
|
|
386
|
-
var updatedDocument = html.findMath().compile().getMetrics().typeset().updateDocument();
|
|
387
|
-
var list = updatedDocument.math.list;
|
|
388
|
-
var item = list.next;
|
|
389
|
-
|
|
390
|
-
if (!item) {
|
|
391
|
-
return '';
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
var mathMl = toMMl(item.data.root);
|
|
395
|
-
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
396
|
-
return parsedMathMl;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
if (!getGlobal().instance) {
|
|
400
|
-
getGlobal().instance = bootstrap(renderOpts);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
if (!el) {
|
|
404
|
-
log('el is undefined');
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (el instanceof Element && (_getGlobal$instance = getGlobal().instance) !== null && _getGlobal$instance !== void 0 && _getGlobal$instance.Typeset) {
|
|
409
|
-
getGlobal().instance.Typeset(el);
|
|
410
|
-
} else if (el.length && (_getGlobal$instance2 = getGlobal().instance) !== null && _getGlobal$instance2 !== void 0 && _getGlobal$instance2.Typeset) {
|
|
411
|
-
var _getGlobal$instance3;
|
|
412
|
-
|
|
413
|
-
var arr = Array.from(el);
|
|
414
|
-
|
|
415
|
-
(_getGlobal$instance3 = getGlobal().instance).Typeset.apply(_getGlobal$instance3, (0, _toConsumableArray2["default"])(arr));
|
|
416
|
-
}
|
|
417
|
-
};
|
|
418
|
-
/**
|
|
419
|
-
* This style is added to overried default styling of mjx-mspace Mathjax tag
|
|
420
|
-
* In mathjax src code \newline latex gets parsed to <mjx-mspace></mjx-mspace>,
|
|
421
|
-
* but has the default style
|
|
422
|
-
* 'mjx-mspace': {
|
|
423
|
-
"display": 'in-line',
|
|
424
|
-
"text-align": 'left'
|
|
425
|
-
} which prevents it from showing as a newline value
|
|
426
|
-
*/
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
_mspace.CHTMLmspace.styles = {
|
|
430
|
-
'mjx-mspace': {
|
|
431
|
-
display: 'block',
|
|
432
|
-
'text-align': 'center',
|
|
433
|
-
height: '5px'
|
|
434
|
-
}
|
|
435
|
-
};
|
|
436
|
-
var _default = renderMath;
|
|
437
|
-
exports["default"] = _default;
|
|
438
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZW5kZXItbWF0aC5qcyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJzcmVSZWFkeSIsInRoZW4iLCJ2aXNpdG9yIiwiU2VyaWFsaXplZE1tbFZpc2l0b3IiLCJ0b01NbCIsIm5vZGUiLCJ2aXNpdFRyZWUiLCJsb2ciLCJORVdMSU5FX0JMT0NLX1JFR0VYIiwiTkVXTElORV9MQVRFWCIsImdldEdsb2JhbCIsImtleSIsImRlZmF1bHRPcHRzIiwib3B0cyIsImZpeE1hdGhFbGVtZW50IiwiZWxlbWVudCIsImRhdGFzZXQiLCJtYXRoSGFuZGxlZCIsInByb3BlcnR5IiwidGV4dENvbnRlbnQiLCJ1bndyYXBwZWQiLCJyZXBsYWNlIiwiZml4TWF0aEVsZW1lbnRzIiwiZWwiLCJkb2N1bWVudCIsIm1hdGhFbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiaXRlbSIsImFkanVzdE1hdGhNTFN0eWxlIiwibm9kZXMiLCJzZXRBdHRyaWJ1dGUiLCJteUZpbmRNYXRoTUwiLCJzZXQiLCJhZGFwdG9yIiwiQXJyYXkiLCJmcm9tIiwibW1sIiwia2luZCIsInBhcmVudCIsIkZpbmRNYXRoTUwiLCJjcmVhdGVNYXRoTUxJbnN0YW5jZSIsImRvY1Byb3ZpZGVkIiwidXNlU2luZ2xlRG9sbGFyIiwiY29uc29sZSIsIndhcm4iLCJwYWNrYWdlcyIsIkFsbFBhY2thZ2VzIiwiZmlsdGVyIiwibmFtZSIsInB1c2giLCJtYWNyb3MiLCJwYXJhbGxlbG9ncmFtIiwib3ZlcmFyYyIsIm5hcHByb3giLCJsb25nZGl2IiwidGV4Q29uZmlnIiwiaW5saW5lTWF0aCIsInByb2Nlc3NFc2NhcGVzIiwibW1sQ29uZmlnIiwicGFyc2VFcnJvciIsImVycm9yIiwiY2FjaGVkTWF0aGpheCIsImdsb2JhbE1hdGhqYXgiLCJ2ZXJzaW9uIiwibWF0aGpheCIsIk1hdGhKYXgiLCJfIiwiY29uZmlnIiwiT2JqZWN0IiwiYXNzaWduIiwiZm9udFVSTCIsImh0bWxDb25maWciLCJ3cmFwcGVyRmFjdG9yeSIsIkNIVE1MV3JhcHBlckZhY3RvcnkiLCJkZWZhdWx0Tm9kZXMiLCJjaHRtbE5vZGVzIiwiTWF0aE1MIiwiY3VzdG9tTW1sRmFjdG9yeSIsIk1tbEZhY3RvcnkiLCJtbWxOb2RlcyIsImNsYXNzRmFjdG9yeSIsImhhbmRsZXJzIiwiaGFuZGxlc0RvY3VtZW50IiwiaHRtbCIsImNyZWF0ZSIsImNvbXBpbGVFcnJvciIsIm1qIiwibWF0aCIsImVyciIsInR5cGVzZXRFcnJvciIsImRvYyIsInNyZSIsInNwZWVjaCIsImVucmljaFNwZWVjaCIsIklucHV0SmF4IiwiVGVYIiwiT3V0cHV0SmF4IiwiQ0hUTUwiLCJEb21TdHJpbmdzIiwiSFRNTERvbVN0cmluZ3MiLCJza2lwSHRtbFRhZ3MiLCJzZXRNbWxGYWN0b3J5IiwiZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQiLCJib290c3RyYXAiLCJUeXBlc2V0IiwiZWxlbWVudHMiLCJhdHRlbXB0UmVuZGVyIiwidGVtcG9yYXJ5IiwidXBkYXRlZERvY3VtZW50IiwiZmluZE1hdGgiLCJsZW5ndGgiLCJjb21waWxlIiwiZW5yaWNoIiwiZ2V0TWV0cmljcyIsInR5cGVzZXQiLCJhc3Npc3RpdmVNbWwiLCJhdHRhY2hTcGVlY2giLCJhZGRNZW51IiwidXBkYXRlRG9jdW1lbnQiLCJsaXN0IiwibmV4dCIsImRhdGEiLCJtYXRoTWwiLCJyb290IiwicGFyc2VkTWF0aE1sIiwicmVwbGFjZUFsbCIsInR5cGVzZXRSb290IiwiZSIsInRvU3RyaW5nIiwiY2xlYXIiLCJoYW5kbGVSZXRyaWVzRm9yIiwicmVuZGVyTWF0aCIsInJlbmRlck9wdHMiLCJjdXN0b21LZXkiLCJpc1N0cmluZyIsImV4ZWN1dGVPbiIsImJvZHkiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidW5kZWZpbmVkIiwiaW5zdGFuY2UiLCJFbGVtZW50IiwiYXJyIiwiQ0hUTUxtc3BhY2UiLCJzdHlsZXMiLCJkaXNwbGF5IiwiaGVpZ2h0Il0sIm1hcHBpbmdz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LFNBQVMsR0FBR29JLFFBQWpCLEVBQTJCO0FBQ3pCcEksSUFBQUEsU0FBUyxHQUFHb0ksUUFBWixHQUF1QnRDLFNBQVMsQ0FBQzZCLFVBQUQsQ0FBaEM7QUFDRDs7QUFFRCxNQUFJLENBQUM5RyxFQUFMLEVBQVM7QUFDUGhCLElBQUFBLEdBQUcsQ0FBQyxpQkFBRCxDQUFIO0FBQ0E7QUFDRDs7QUFFRCxNQUFJZ0IsRUFBRSxZQUFZd0gsT0FBZCwyQkFBeUJySSxTQUFTLEdBQUdvSSxRQUFyQyxnREFBeUIsb0JBQXNCckMsT0FBbkQsRUFBNEQ7QUFDMUQvRixJQUFBQSxTQUFTLEdBQUdvSSxRQUFaLENBQXFCckMsT0FBckIsQ0FBNkJsRixFQUE3QjtBQUNELEdBRkQsTUFFTyxJQUFJQSxFQUFFLENBQUN3RixNQUFILDRCQUFhckcsU0FBUyxHQUFHb0ksUUFBekIsaURBQWEscUJBQXNCckMsT0FBdkMsRUFBZ0Q7QUFBQTs7QUFDckQsUUFBTXVDLEdBQUcsR0FBRzdHLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLENBQVo7O0FBQ0EsNEJBQUFiLFNBQVMsR0FBR29JLFFBQVosRUFBcUJyQyxPQUFyQixpRUFBZ0N1QyxHQUFoQztBQUNEO0FBQ0YsQ0E3REQ7QUErREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQUMsb0JBQVlDLE1BQVosR0FBcUI7QUFDbkIsZ0JBQWM7QUFDWkMsSUFBQUEsT0FBTyxFQUFFLE9BREc7QUFFWixrQkFBYyxRQUZGO0FBR1pDLElBQUFBLE1BQU0sRUFBRTtBQUhJO0FBREssQ0FBckI7ZUFRZWhCLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYXRoamF4IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL21hdGhqYXgnO1xuaW1wb3J0IHsgTWF0aEpheCBhcyBnbG9iYWxNYXRoamF4IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvbXBvbmVudHMvZ2xvYmFsJztcbmltcG9ydCB7IEFzc2lzdGl2ZU1tbEhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYTExeS9hc3Npc3RpdmUtbW1sJztcbmltcG9ydCB7IEVucmljaEhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYTExeS9zZW1hbnRpYy1lbnJpY2gnO1xuaW1wb3J0IHsgTWVudUhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvdWkvbWVudS9NZW51SGFuZGxlcic7XG5pbXBvcnQgeyBGaW5kTWF0aE1MIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2lucHV0L21hdGhtbC9GaW5kTWF0aE1MJztcbmltcG9ydCB7IE1hdGhNTCB9IGZyb20gJ21hdGhqYXgtZnVsbC9qcy9pbnB1dC9tYXRobWwnO1xuaW1wb3J0IHsgVGVYIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2lucHV0L3RleCc7XG5cbmltcG9ydCB7IENIVE1MIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL291dHB1dC9jaHRtbCc7XG5pbXBvcnQgeyBSZWdpc3RlckhUTUxIYW5kbGVyIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2hhbmRsZXJzL2h0bWwnO1xuaW1wb3J0IHsgYnJvd3NlckFkYXB0b3IgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYWRhcHRvcnMvYnJvd3NlckFkYXB0b3InO1xuaW1wb3J0IHsgQWxsUGFja2FnZXMgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvaW5wdXQvdGV4L0FsbFBhY2thZ2VzJztcbmltcG9ydCB7IGVuZ2luZVJlYWR5IH0gZnJvbSAnc3BlZWNoLXJ1bGUtZW5naW5lL2pzL2NvbW1vbi9zeXN0ZW0nO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgUmVnaXN0ZXJIVE1MSGFuZGxlcihicm93c2VyQWRhcHRvcigpKTtcbn1cblxubGV0IHNyZVJlYWR5ID0gZmFsc2U7XG5cbmVuZ2luZVJlYWR5KCkudGhlbigoKSA9PiB7XG4gIHNyZVJlYWR5ID0gdHJ1ZTtcbn0pO1xuXG4vLyBpbXBvcnQgcGtnIGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBtbWxOb2RlcywgY2h0bWxOb2RlcyB9IGZyb20gJy4vbXN0YWNrJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyB3cmFwTWF0aCwgdW5XcmFwTWF0aCB9IGZyb20gJy4vbm9ybWFsaXphdGlvbic7XG5pbXBvcnQgeyBNbWxGYWN0b3J5IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvcmUvTW1sVHJlZS9NbWxGYWN0b3J5JztcbmltcG9ydCB7IFNlcmlhbGl6ZWRNbWxWaXNpdG9yIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvcmUvTW1sVHJlZS9TZXJpYWxpemVkTW1sVmlzaXRvcic7XG5pbXBvcnQgeyBDSFRNTFdyYXBwZXJGYWN0b3J5IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL291dHB1dC9jaHRtbC9XcmFwcGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBDSFRNTG1zcGFjZSB9IGZyb20gJ21hdGhqYXgtZnVsbC9qcy9vdXRwdXQvY2h0bWwvV3JhcHBlcnMvbXNwYWNlJztcbmltcG9ydCB7IEhUTUxEb21TdHJpbmdzIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2hhbmRsZXJzL2h0bWwvSFRNTERvbVN0cmluZ3MnO1xuXG5jb25zdCB2aXNpdG9yID0gbmV3IFNlcmlhbGl6ZWRNbWxWaXNpdG9yKCk7XG5jb25zdCB0b01NbCA9IChub2RlKSA9PiB2aXNpdG9yLnZpc2l0VHJlZShub2RlKTtcblxuY29uc3QgbG9nID0gZGVidWcoJ3BpZS1saWI6bWF0aC1yZW5kZXJpbmcnKTtcblxuY29uc3QgTkVXTElORV9CTE9DS19SRUdFWCA9IC9cXFxcZW1iZWRcXHtuZXdMaW5lXFx9XFxbXFxdL2c7XG5jb25zdCBORVdMSU5FX0xBVEVYID0gJ1xcXFxuZXdsaW5lICc7XG5cbmNvbnN0IGdldEdsb2JhbCA9ICgpID0+IHtcbiAgLy8gVE9ETyBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gdXNlIHZlcnNpb24/XG4gIC8vIGNvbnN0IGtleSA9IGAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9uLnNwbGl0KCcuJylbMF19YDtcbiAgLy8gSXQgbG9va3MgbGlrZSBFZCBtYWRlIHRoaXMgY2hhbmdlIHdoZW4gaGUgc3dpdGNoZWQgZnJvbSBtYXRoamF4MyB0byBtYXRoamF4LWZ1bGxcbiAgLy8gSSB0aGluayBpdCB3YXMgc3VwcG9zZWQgdG8gbWFrZSBzdXJlIHZlcnNpb24gMSAodXNpbmcgbWF0aGpheDMpIGlzIG5vdCB1c2VkXG4gIC8vIGluIGNvbWJpbmF0aW9uIHdpdGggdmVyc2lvbiAyICh1c2luZyBtYXRoamF4LWZ1bGwpXG5cbiAgLy8gVE9ETyBoaWdoZXIgbGV2ZWwgd3JhcHBlcnMgdXNlIHRoaXMgaW5zdGFuY2Ugb2YgbWF0aC1yZW5kZXJpbmcsIGFuZCBpZiAyIGRpZmZlcmVudCBpbnN0YW5jZXMgYXJlIHVzZWQsIG1hdGggcmVuZGVyaW5nIGlzIG5vdCB3b3JraW5nXG4gIC8vICBzbyBJIHdpbGwgaGFyZGNvZGUgdGhpcyBmb3Igbm93IHVudGlsIGEgYmV0dGVyIHNvbHV0aW9uIGlzIGZvdW5kXG4gIGNvbnN0IGtleSA9ICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZ0AyJztcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoIXdpbmRvd1trZXldKSB7XG4gICAgICB3aW5kb3dba2V5XSA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gd2luZG93W2tleV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG4vKiogQWRkIHRlbXBvcmFyeSBzdXBwb3J0IGZvciBhIGdsb2JhbCBzaW5nbGVEb2xsYXIgb3ZlcnJpZGVcbiAqICA8Y29kZT5cbiAqICAgLy8gVGhpcyB3aWxsIGVuYWJsZSBzaW5nbGUgZG9sbGFyIHJlbmRlcmluZ1xuICogICB3aW5kb3cucGllID0gd2luZG93LnBpZSB8fCB7fTtcbiAqICAgd2luZG93LnBpZS5tYXRoUmVuZGVyaW5nID0gIHt1c2VTaW5nbGVEb2xsYXI6IHRydWUgfTtcbiAqICA8L2NvZGU+XG4gKi9cbmNvbnN0IGRlZmF1bHRPcHRzID0gKCkgPT4gZ2V0R2xvYmFsKCkub3B0cyB8fCB7fTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgaWYgKGVsZW1lbnQuZGF0YXNldC5tYXRoSGFuZGxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwcm9wZXJ0eSA9ICdpbm5lclRleHQnO1xuXG4gIGlmIChlbGVtZW50LnRleHRDb250ZW50KSB7XG4gICAgcHJvcGVydHkgPSAndGV4dENvbnRlbnQnO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRbcHJvcGVydHldKSB7XG4gICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB3cmFwTWF0aCh1bldyYXBNYXRoKGVsZW1lbnRbcHJvcGVydHldKS51bndyYXBwZWQpO1xuICAgIC8vIGJlY2F1c2UgbWF0aHF1aWxsIGRvZXNuJ3QgdW5kZXJzdGFuZCBsaW5lIGJyZWFrcywgc29tZXRpbWVzIHdlIGVuZCB1cCB3aXRoIGN1c3RvbSBlbGVtZW50cyBvbiBwcm9tcHRzL3JhdGlvbmFsZS9ldGMuXG4gICAgLy8gd2UgbmVlZCB0byByZXBsYWNlIHRoZSBjdXN0b20gZW1iZWRkZWQgZWxlbWVudHMgd2l0aCB2YWxpZCBsYXRleCB0aGF0IE1hdGhqYXggY2FuIHVuZGVyc3RhbmRcbiAgICBlbGVtZW50W3Byb3BlcnR5XSA9IGVsZW1lbnRbcHJvcGVydHldLnJlcGxhY2UoTkVXTElORV9CTE9DS19SRUdFWCwgTkVXTElORV9MQVRFWCk7XG4gICAgZWxlbWVudC5kYXRhc2V0Lm1hdGhIYW5kbGVkID0gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50cyA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG1hdGhFbGVtZW50cyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhdGV4XScpO1xuXG4gIG1hdGhFbGVtZW50cy5mb3JFYWNoKChpdGVtKSA9PiBmaXhNYXRoRWxlbWVudChpdGVtKSk7XG59O1xuXG5jb25zdCBhZGp1c3RNYXRoTUxTdHlsZSA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG5vZGVzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnbWF0aCcpO1xuICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiBub2RlLnNldEF0dHJpYnV0ZSgnZGlzcGxheXN0eWxlJywgJ3RydWUnKSk7XG59O1xuXG5jbGFzcyBteUZpbmRNYXRoTUwgZXh0ZW5kcyBGaW5kTWF0aE1MIHtcbiAgcHJvY2Vzc01hdGgoc2V0KSB7XG4gICAgY29uc3QgYWRhcHRvciA9IHRoaXMuYWRhcHRvcjtcbiAgICBmb3IgKGNvbnN0IG1tbCBvZiBBcnJheS5mcm9tKHNldCkpIHtcbiAgICAgIGlmIChhZGFwdG9yLmtpbmQoYWRhcHRvci5wYXJlbnQobW1sKSkgPT09ICdtangtYXNzaXN0aXZlLW1tbCcpIHtcbiAgICAgICAgc2V0LmRlbGV0ZShtbWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc01hdGgoc2V0KTtcbiAgfVxufVxuXG5jb25zdCBjcmVhdGVNYXRoTUxJbnN0YW5jZSA9IChvcHRzLCBkb2NQcm92aWRlZCA9IGRvY3VtZW50KSA9PiB7XG4gIG9wdHMgPSBvcHRzIHx8IGRlZmF1bHRPcHRzKCk7XG5cbiAgaWYgKG9wdHMudXNlU2luZ2xlRG9sbGFyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc29sZS53YXJuKCdbbWF0aC1yZW5kZXJpbmddIHVzaW5nICQgaXMgbm90IGFkdmlzYWJsZSwgcGxlYXNlIHVzZSAkJC4uJCQgb3IgXFxcXCguLi5cXFxcKScpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZXMgPSBBbGxQYWNrYWdlcy5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09ICdidXNzcHJvb2ZzJyk7IC8vIEJ1c3Nwcm9vZnMgbmVlZHMgYW4gb3V0cHV0IGpheFxuXG4gIC8vIFRoZSBhdXRvbG9hZCBleHRlbnNpb24gcHJlZGVmaW5lcyBhbGwgdGhlIG1hY3JvcyBmcm9tIHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGxvYWRlZCBhbHJlYWR5XG4gIC8vIHNvIHRoYXQgdGhleSBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIG5lZWRlZCBleHRlbnNpb24gd2hlbiB0aGV5IGFyZSBmaXJzdCB1c2VkXG4gIHBhY2thZ2VzLnB1c2goJ2F1dG9sb2FkJyk7XG5cbiAgY29uc3QgbWFjcm9zID0ge1xuICAgIHBhcmFsbGVsb2dyYW06ICdcXFxcbG93ZXIuMmVte1xcXFxIdWdlXFxcXHVuaWNvZGV7eDI1QjF9fScsXG4gICAgb3ZlcmFyYzogJ1xcXFxvdmVycGFyZW4nLFxuICAgIG5hcHByb3g6ICdcXFxcbm90XFxcXGFwcHJveCcsXG4gICAgbG9uZ2RpdjogJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9JyxcbiAgfTtcblxuICBjb25zdCB0ZXhDb25maWcgPSBvcHRzLnVzZVNpbmdsZURvbGxhclxuICAgID8ge1xuICAgICAgICBwYWNrYWdlcyxcbiAgICAgICAgbWFjcm9zLFxuICAgICAgICBpbmxpbmVNYXRoOiBbXG4gICAgICAgICAgWyckJywgJyQnXSxcbiAgICAgICAgICBbJ1xcXFwoJywgJ1xcXFwpJ10sXG4gICAgICAgIF0sXG4gICAgICAgIHByb2Nlc3NFc2NhcGVzOiB0cnVlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICBwYWNrYWdlcyxcbiAgICAgICAgbWFjcm9zLFxuICAgICAgfTtcblxuICBjb25zdCBtbWxDb25maWcgPSB7XG4gICAgcGFyc2VFcnJvcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gZnVuY3Rpb24gdG8gcHJvY2VzcyBwYXJzaW5nIGVycm9yc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvcjonLCBub2RlKTtcbiAgICAgIHRoaXMuZXJyb3IodGhpcy5hZGFwdG9yLnRleHRDb250ZW50KG5vZGUpLnJlcGxhY2UoL1xcbi4qL2csICcnKSk7XG4gICAgfSxcbiAgICBGaW5kTWF0aE1MOiBuZXcgbXlGaW5kTWF0aE1MKCksXG4gIH07XG5cbiAgbGV0IGNhY2hlZE1hdGhqYXg7XG5cbiAgaWYgKGdsb2JhbE1hdGhqYXggJiYgZ2xvYmFsTWF0aGpheC52ZXJzaW9uICE9PSBtYXRoamF4LnZlcnNpb24pIHtcbiAgICAvLyBoYW5kbGluZyBvdGhlciBNYXRoSmF4IHZlcnNpb24gb24gdGhlIHBhZ2VcbiAgICAvLyByZXBsYWNpbmcgaXQgdGVtcG9yYXJpbHkgd2l0aCB0aGUgdmVyc2lvbiB3ZSBoYXZlXG4gICAgd2luZG93Lk1hdGhKYXguXyA9IHdpbmRvdy5NYXRoSmF4Ll8gfHwge307XG4gICAgd2luZG93Lk1hdGhKYXguY29uZmlnID0gd2luZG93Lk1hdGhKYXguY29uZmlnIHx8IHt9O1xuICAgIGNhY2hlZE1hdGhqYXggPSB3aW5kb3cuTWF0aEpheDtcbiAgICBPYmplY3QuYXNzaWduKGdsb2JhbE1hdGhqYXgsIG1hdGhqYXgpO1xuICB9XG5cbiAgY29uc3QgZm9udFVSTCA9IGBodHRwczovL3VucGtnLmNvbS9tYXRoamF4LWZ1bGxAJHttYXRoamF4LnZlcnNpb259L3RzL291dHB1dC9jaHRtbC9mb250cy90ZXgtd29mZi12MmA7XG4gIGNvbnN0IGh0bWxDb25maWcgPSB7XG4gICAgZm9udFVSTCxcblxuICAgIHdyYXBwZXJGYWN0b3J5OiBuZXcgQ0hUTUxXcmFwcGVyRmFjdG9yeSh7XG4gICAgICAuLi5DSFRNTFdyYXBwZXJGYWN0b3J5LmRlZmF1bHROb2RlcyxcbiAgICAgIC4uLmNodG1sTm9kZXMsXG4gICAgfSksXG4gIH07XG5cbiAgY29uc3QgbW1sID0gbmV3IE1hdGhNTChtbWxDb25maWcpO1xuXG4gIGNvbnN0IGN1c3RvbU1tbEZhY3RvcnkgPSBuZXcgTW1sRmFjdG9yeSh7XG4gICAgLi4uTW1sRmFjdG9yeS5kZWZhdWx0Tm9kZXMsXG4gICAgLi4ubW1sTm9kZXMsXG4gIH0pO1xuICBjb25zdCBjbGFzc0ZhY3RvcnkgPSBFbnJpY2hIYW5kbGVyKFxuICAgIE1lbnVIYW5kbGVyKEFzc2lzdGl2ZU1tbEhhbmRsZXIobWF0aGpheC5oYW5kbGVycy5oYW5kbGVzRG9jdW1lbnQoZG9jUHJvdmlkZWQpKSksXG4gICAgbW1sLFxuICApO1xuXG4gIGNvbnN0IGh0bWwgPSBjbGFzc0ZhY3RvcnkuY3JlYXRlKGRvY1Byb3ZpZGVkLCB7XG4gICAgY29tcGlsZUVycm9yOiAobWosIG1hdGgsIGVycikgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdiYWQgbWF0aD86JywgbWF0aCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0sXG4gICAgdHlwZXNldEVycm9yOiBmdW5jdGlvbihkb2MsIG1hdGgsIGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCd0eXBlc2V0IGVycm9yJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgZG9jLnR5cGVzZXRFcnJvcihtYXRoLCBlcnIpO1xuICAgIH0sXG5cbiAgICBzcmU6IHtcbiAgICAgIHNwZWVjaDogJ2RlZXAnLFxuICAgIH0sXG4gICAgZW5yaWNoU3BlZWNoOiAnZGVlcCcsXG5cbiAgICBJbnB1dEpheDogW25ldyBUZVgodGV4Q29uZmlnKSwgbW1sXSxcbiAgICBPdXRwdXRKYXg6IG5ldyBDSFRNTChodG1sQ29uZmlnKSxcbiAgICBEb21TdHJpbmdzOiBuZXcgSFRNTERvbVN0cmluZ3Moe1xuICAgICAgc2tpcEh0bWxUYWdzOiBbXG4gICAgICAgICdzY3JpcHQnLFxuICAgICAgICAnbm9zY3JpcHQnLFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAncHJlJyxcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICAnYW5ub3RhdGlvbicsXG4gICAgICAgICdhbm5vdGF0aW9uLXhtbCcsXG4gICAgICAgICdtangtYXNzaXN0aXZlLW1tbCcsXG4gICAgICAgICdtangtY29udGFpbmVyJyxcbiAgICAgIF0sXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIE5vdGU6IHdlIG11c3Qgc2V0IHRoaXMgKmFmdGVyKiBtYXRoamF4LmRvY3VtZW50IChubyBpZGVhIHdoeSlcbiAgbW1sLnNldE1tbEZhY3RvcnkoY3VzdG9tTW1sRmFjdG9yeSk7XG5cbiAgaWYgKGNhY2hlZE1hdGhqYXgpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY2FjaGVkIHZlcnNpb24sIHdlIHJlcGxhY2UgaXQgaGVyZVxuICAgIHdpbmRvdy5NYXRoSmF4ID0gY2FjaGVkTWF0aGpheDtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufTtcblxubGV0IGVucmljaFNwZWVjaEluaXRpYWxpemVkID0gZmFsc2U7XG5cbmNvbnN0IGJvb3RzdHJhcCA9IChvcHRzKSA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB7IFR5cGVzZXQ6ICgpID0+ICh7fSkgfTtcbiAgfVxuXG4gIGNvbnN0IGh0bWwgPSBjcmVhdGVNYXRoTUxJbnN0YW5jZShvcHRzKTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IG1hdGhqYXgudmVyc2lvbixcbiAgICBodG1sOiBodG1sLFxuICAgIFR5cGVzZXQ6IGZ1bmN0aW9uKC4uLmVsZW1lbnRzKSB7XG4gICAgICBjb25zdCBhdHRlbXB0UmVuZGVyID0gKHRlbXBvcmFyeSA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGxldCB1cGRhdGVkRG9jdW1lbnQgPSB0aGlzLmh0bWwuZmluZE1hdGgoZWxlbWVudHMubGVuZ3RoID8geyBlbGVtZW50cyB9IDoge30pLmNvbXBpbGUoKTtcblxuICAgICAgICBpZiAoIXRlbXBvcmFyeSAmJiBzcmVSZWFkeSkge1xuICAgICAgICAgIHVwZGF0ZWREb2N1bWVudCA9IHVwZGF0ZWREb2N1bWVudC5lbnJpY2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZWREb2N1bWVudCA9IHVwZGF0ZWREb2N1bWVudFxuICAgICAgICAgIC5nZXRNZXRyaWNzKClcbiAgICAgICAgICAudHlwZXNldCgpXG4gICAgICAgICAgLmFzc2lzdGl2ZU1tbCgpXG4gICAgICAgICAgLmF0dGFjaFNwZWVjaCgpXG4gICAgICAgICAgLmFkZE1lbnUoKVxuICAgICAgICAgIC51cGRhdGVEb2N1bWVudCgpO1xuXG4gICAgICAgIGlmICghZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQgJiYgdHlwZW9mIHVwZGF0ZWREb2N1bWVudC5tYXRoLmxpc3Q/Lm5leHQ/LmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsaXN0ID0gdXBkYXRlZERvY3VtZW50Lm1hdGgubGlzdDtcblxuICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtID0gbGlzdC5uZXh0OyB0eXBlb2YgaXRlbS5kYXRhICE9PSAnc3ltYm9sJzsgaXRlbSA9IGl0ZW0ubmV4dCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXRoTWwgPSB0b01NbChpdGVtLmRhdGEucm9vdCk7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE1hdGhNbCA9IG1hdGhNbC5yZXBsYWNlQWxsKCdcXG4nLCAnJyk7XG5cbiAgICAgICAgICAgICAgaXRlbS5kYXRhLnR5cGVzZXRSb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tYXRobWwnLCBwYXJzZWRNYXRoTWwpO1xuICAgICAgICAgICAgICBpdGVtLmRhdGEudHlwZXNldFJvb3Quc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlZERvY3VtZW50LmNsZWFyKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWVucmljaFNwZWVjaEluaXRpYWxpemVkKSB7XG4gICAgICAgIGF0dGVtcHRSZW5kZXIodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIG1hdGhqYXguaGFuZGxlUmV0cmllc0ZvcigoKSA9PiB7XG4gICAgICAgIGF0dGVtcHRSZW5kZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCByZW5kZXJNYXRoID0gKGVsLCByZW5kZXJPcHRzKSA9PiB7XG4gIGlmIChcbiAgICB3aW5kb3cgJiZcbiAgICB3aW5kb3cuTWF0aEpheCAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LmN1c3RvbUtleSAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LmN1c3RvbUtleSA9PSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmctYWNjZXNzaWJsZUAxJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBlbCA9PT0gJ3N0cmluZyc7XG4gIGxldCBleGVjdXRlT24gPSBkb2N1bWVudC5ib2R5O1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGVsO1xuICAgIGV4ZWN1dGVPbiA9IGRpdjtcbiAgfVxuXG4gIGZpeE1hdGhFbGVtZW50cyhleGVjdXRlT24pO1xuICBhZGp1c3RNYXRoTUxTdHlsZShleGVjdXRlT24pO1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGNvbnN0IGh0bWwgPSBjcmVhdGVNYXRoTUxJbnN0YW5jZSh1bmRlZmluZWQsIGV4ZWN1dGVPbik7XG5cbiAgICBjb25zdCB1cGRhdGVkRG9jdW1lbnQgPSBodG1sXG4gICAgICAuZmluZE1hdGgoKVxuICAgICAgLmNvbXBpbGUoKVxuICAgICAgLmdldE1ldHJpY3MoKVxuICAgICAgLnR5cGVzZXQoKVxuICAgICAgLnVwZGF0ZURvY3VtZW50KCk7XG5cbiAgICBjb25zdCBsaXN0ID0gdXBkYXRlZERvY3VtZW50Lm1hdGgubGlzdDtcbiAgICBjb25zdCBpdGVtID0gbGlzdC5uZXh0O1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0aE1sID0gdG9NTWwoaXRlbS5kYXRhLnJvb3QpO1xuICAgIGNvbnN0IHBhcnNlZE1hdGhNbCA9IG1hdGhNbC5yZXBsYWNlQWxsKCdcXG4nLCAnJyk7XG5cbiAgICByZXR1cm4gcGFyc2VkTWF0aE1sO1xuICB9XG5cbiAgaWYgKCFnZXRHbG9iYWwoKS5pbnN0YW5jZSkge1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlID0gYm9vdHN0cmFwKHJlbmRlck9wdHMpO1xuICB9XG5cbiAgaWYgKCFlbCkge1xuICAgIGxvZygnZWwgaXMgdW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGVsIGluc3RhbmNlb2YgRWxlbWVudCAmJiBnZXRHbG9iYWwoKS5pbnN0YW5jZT8uVHlwZXNldCkge1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlLlR5cGVzZXQoZWwpO1xuICB9IGVsc2UgaWYgKGVsLmxlbmd0aCAmJiBnZXRHbG9iYWwoKS5pbnN0YW5jZT8uVHlwZXNldCkge1xuICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20oZWwpO1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlLlR5cGVzZXQoLi4uYXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIHN0eWxlIGlzIGFkZGVkIHRvIG92ZXJyaWVkIGRlZmF1bHQgc3R5bGluZyBvZiBtangtbXNwYWNlIE1hdGhqYXggdGFnXG4gKiBJbiBtYXRoamF4IHNyYyBjb2RlIFxcbmV3bGluZSBsYXRleCBnZXRzIHBhcnNlZCB0byA8bWp4LW1zcGFjZT48L21qeC1tc3BhY2U+LFxuICogYnV0IGhhcyB0aGUgZGVmYXVsdCBzdHlsZVxuICogJ21qeC1tc3BhY2UnOiB7XG4gIFwiZGlzcGxheVwiOiAnaW4tbGluZScsXG4gIFwidGV4dC1hbGlnblwiOiAnbGVmdCdcbn0gd2hpY2ggcHJldmVudHMgaXQgZnJvbSBzaG93aW5nIGFzIGEgbmV3bGluZSB2YWx1ZVxuICovXG5DSFRNTG1zcGFjZS5zdHlsZXMgPSB7XG4gICdtangtbXNwYWNlJzoge1xuICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyxcbiAgICBoZWlnaHQ6ICc1cHgnLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVuZGVyTWF0aDtcbiJdfQ==
|