@pie-lib/math-input-mathlive 1.1.5-beta.11 → 1.1.5-beta.13

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.
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
7
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
8
+ var _input = _interopRequireDefault(require("../mf/input"));
9
+ var _static = _interopRequireDefault(require("../mf/static"));
10
+ var _keypad = require("../keypad");
11
+ var _longdiv = require("../longdiv");
12
+ /**
13
+ * Every place that draws MathLive output must apply the long-division
14
+ * correction (see longdiv.js): live fields after every render, static markup
15
+ * after it is written into the DOM.
16
+ */
17
+ jest.mock('../mathlive-instance', function () {
18
+ var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
19
+ (0, _classCallCheck2["default"])(this, FakeMathfieldElement);
20
+ var el = global.document.createElement('math-field');
21
+ el.value = '';
22
+ el.getValue = function () {
23
+ return el.value;
24
+ };
25
+ return el;
26
+ });
27
+ return {
28
+ loadMathLive: function loadMathLive() {
29
+ return Promise.resolve({
30
+ MathfieldElement: FakeMathfieldElement
31
+ });
32
+ },
33
+ getMacros: function getMacros() {
34
+ return {};
35
+ },
36
+ MATH_MODE_SPACE: '\\ ',
37
+ applyShadowStyles: function applyShadowStyles() {},
38
+ trackPlaceholderCaret: function trackPlaceholderCaret() {
39
+ return function () {};
40
+ },
41
+ latexToMarkup: function latexToMarkup(l) {
42
+ return "<span>".concat(l, "</span>");
43
+ }
44
+ };
45
+ });
46
+ var mockUntrack = jest.fn();
47
+ jest.mock('../longdiv', function () {
48
+ return {
49
+ trackLongDivision: jest.fn(function () {
50
+ return mockUntrack;
51
+ }),
52
+ fixLongDivisionWhenReady: jest.fn(),
53
+ fixLongDivision: jest.fn()
54
+ };
55
+ });
56
+
57
+ /* eslint-disable import/first */
58
+
59
+ /* eslint-enable import/first */
60
+
61
+ beforeEach(function () {
62
+ _longdiv.trackLongDivision.mockClear();
63
+ _longdiv.fixLongDivisionWhenReady.mockClear();
64
+ mockUntrack.mockClear();
65
+ });
66
+ describe('Input (the editor)', function () {
67
+ it('tracks the mathfield on mount and stops on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
68
+ var input;
69
+ return _regenerator["default"].wrap(function (_context) {
70
+ while (1) switch (_context.prev = _context.next) {
71
+ case 0:
72
+ input = new _input["default"]({});
73
+ input.holderRef = {
74
+ current: document.createElement('span')
75
+ };
76
+ _context.next = 1;
77
+ return input.componentDidMount();
78
+ case 1:
79
+ expect(_longdiv.trackLongDivision).toHaveBeenCalledWith(input.mathField);
80
+ input.componentWillUnmount();
81
+ expect(mockUntrack).toHaveBeenCalledTimes(1);
82
+ expect(input.untrackLongDivision).toBeUndefined();
83
+ case 2:
84
+ case "end":
85
+ return _context.stop();
86
+ }
87
+ }, _callee);
88
+ })));
89
+ });
90
+ describe('Static', function () {
91
+ it('tracks the answer-block field on mount and stops on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
92
+ var s;
93
+ return _regenerator["default"].wrap(function (_context2) {
94
+ while (1) switch (_context2.prev = _context2.next) {
95
+ case 0:
96
+ s = new _static["default"]({
97
+ latex: 'x=\\MathQuillMathField[r1]{}'
98
+ });
99
+ s.holderRef = {
100
+ current: document.createElement('span')
101
+ };
102
+ s.createLiveRegion = function () {};
103
+ _context2.next = 1;
104
+ return s.componentDidMount();
105
+ case 1:
106
+ expect(_longdiv.trackLongDivision).toHaveBeenCalledWith(s.mathField);
107
+ s.componentWillUnmount();
108
+ expect(mockUntrack).toHaveBeenCalledTimes(1);
109
+ case 2:
110
+ case "end":
111
+ return _context2.stop();
112
+ }
113
+ }, _callee2);
114
+ })));
115
+
116
+ // Display mode: the markup reaches the DOM through state, so it is corrected
117
+ // once React has written it.
118
+ it('corrects static markup after it is rendered', function () {
119
+ var s = new _static["default"]({
120
+ latex: '5\\longdiv{144}'
121
+ });
122
+ var holder = document.createElement('span');
123
+ s.holderRef = {
124
+ current: holder
125
+ };
126
+ s.state = {
127
+ markup: '<span>new</span>'
128
+ };
129
+ s.componentDidUpdate({
130
+ latex: '5\\longdiv{144}'
131
+ }, {
132
+ markup: ''
133
+ });
134
+ expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(holder);
135
+ });
136
+ it('does not redo it when the markup did not change', function () {
137
+ var s = new _static["default"]({
138
+ latex: 'x'
139
+ });
140
+ s.holderRef = {
141
+ current: document.createElement('span')
142
+ };
143
+ s.state = {
144
+ markup: '<span>same</span>'
145
+ };
146
+ s.componentDidUpdate({
147
+ latex: 'x'
148
+ }, {
149
+ markup: '<span>same</span>'
150
+ });
151
+ expect(_longdiv.fixLongDivisionWhenReady).not.toHaveBeenCalled();
152
+ });
153
+ it('leaves a live field to the tracker', function () {
154
+ var s = new _static["default"]({
155
+ latex: 'x'
156
+ });
157
+ s.holderRef = {
158
+ current: document.createElement('span')
159
+ };
160
+ s.mathField = document.createElement('math-field');
161
+ s.state = {
162
+ markup: '<span>new</span>'
163
+ };
164
+ s.componentDidUpdate({
165
+ latex: 'x'
166
+ }, {
167
+ markup: ''
168
+ });
169
+ expect(_longdiv.fixLongDivisionWhenReady).not.toHaveBeenCalled();
170
+ });
171
+ });
172
+ describe('keypad label', function () {
173
+ it('corrects the label once mounted', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
174
+ var label, el;
175
+ return _regenerator["default"].wrap(function (_context3) {
176
+ while (1) switch (_context3.prev = _context3.next) {
177
+ case 0:
178
+ label = new _keypad.LatexLabel({
179
+ latex: '\\longdiv{}'
180
+ });
181
+ el = document.createElement('span');
182
+ label.labelRef = {
183
+ current: el
184
+ };
185
+ _context3.next = 1;
186
+ return label.componentDidMount();
187
+ case 1:
188
+ expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(el);
189
+ case 2:
190
+ case "end":
191
+ return _context3.stop();
192
+ }
193
+ }, _callee3);
194
+ })));
195
+ it('corrects it again when the label changes', function () {
196
+ var label = new _keypad.LatexLabel({
197
+ latex: '\\longdiv{}'
198
+ });
199
+ var el = document.createElement('span');
200
+ label.labelRef = {
201
+ current: el
202
+ };
203
+ label.setState = function () {};
204
+ label.state = {
205
+ markup: '<span>other</span>'
206
+ };
207
+ label.componentDidUpdate({
208
+ latex: '\\longdiv{}'
209
+ }, {
210
+ markup: '<span>first</span>'
211
+ });
212
+ expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(el);
213
+ });
214
+ });
215
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdGF0aWMiLCJfa2V5cGFkIiwiX2xvbmdkaXYiLCJqZXN0IiwibW9jayIsIkZha2VNYXRoZmllbGRFbGVtZW50IiwiX2NyZWF0ZUNsYXNzMiIsIl9jbGFzc0NhbGxDaGVjazIiLCJlbCIsImdsb2JhbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwiZ2V0VmFsdWUiLCJsb2FkTWF0aExpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1hdGhmaWVsZEVsZW1lbnQiLCJnZXRNYWNyb3MiLCJNQVRIX01PREVfU1BBQ0UiLCJhcHBseVNoYWRvd1N0eWxlcyIsInRyYWNrUGxhY2Vob2xkZXJDYXJldCIsImxhdGV4VG9NYXJrdXAiLCJsIiwiY29uY2F0IiwibW9ja1VudHJhY2siLCJmbiIsInRyYWNrTG9uZ0RpdmlzaW9uIiwiZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5IiwiZml4TG9uZ0RpdmlzaW9uIiwiYmVmb3JlRWFjaCIsIm1vY2tDbGVhciIsImRlc2NyaWJlIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJJbnB1dCIsImhvbGRlclJlZiIsImN1cnJlbnQiLCJjb21wb25lbnREaWRNb3VudCIsImV4cGVjdCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibWF0aEZpZWxkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ1bnRyYWNrTG9uZ0RpdmlzaW9uIiwidG9CZVVuZGVmaW5lZCIsInN0b3AiLCJfY2FsbGVlMiIsInMiLCJfY29udGV4dDIiLCJTdGF0aWMiLCJsYXRleCIsImNyZWF0ZUxpdmVSZWdpb24iLCJob2xkZXIiLCJzdGF0ZSIsIm1hcmt1cCIsImNvbXBvbmVudERpZFVwZGF0ZSIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfY2FsbGVlMyIsImxhYmVsIiwiX2NvbnRleHQzIiwiTGF0ZXhMYWJlbCIsImxhYmVsUmVmIiwic2V0U3RhdGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xvbmdkaXYtd2lyaW5nLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXZlcnkgcGxhY2UgdGhhdCBkcmF3cyBNYXRoTGl2ZSBvdXRwdXQgbXVzdCBhcHBseSB0aGUgbG9uZy1kaXZpc2lvblxuICogY29ycmVjdGlvbiAoc2VlIGxvbmdkaXYuanMpOiBsaXZlIGZpZWxkcyBhZnRlciBldmVyeSByZW5kZXIsIHN0YXRpYyBtYXJrdXBcbiAqIGFmdGVyIGl0IGlzIHdyaXR0ZW4gaW50byB0aGUgRE9NLlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBlbCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG5cbiAgICAgIGVsLnZhbHVlID0gJyc7XG4gICAgICBlbC5nZXRWYWx1ZSA9ICgpID0+IGVsLnZhbHVlO1xuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkTWF0aExpdmU6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IE1hdGhmaWVsZEVsZW1lbnQ6IEZha2VNYXRoZmllbGRFbGVtZW50IH0pLFxuICAgIGdldE1hY3JvczogKCkgPT4gKHt9KSxcbiAgICBNQVRIX01PREVfU1BBQ0U6ICdcXFxcICcsXG4gICAgYXBwbHlTaGFkb3dTdHlsZXM6ICgpID0+IHt9LFxuICAgIHRyYWNrUGxhY2Vob2xkZXJDYXJldDogKCkgPT4gKCkgPT4ge30sXG4gICAgbGF0ZXhUb01hcmt1cDogKGwpID0+IGA8c3Bhbj4ke2x9PC9zcGFuPmAsXG4gIH07XG59KTtcblxuY29uc3QgbW9ja1VudHJhY2sgPSBqZXN0LmZuKCk7XG5cbmplc3QubW9jaygnLi4vbG9uZ2RpdicsICgpID0+ICh7XG4gIHRyYWNrTG9uZ0RpdmlzaW9uOiBqZXN0LmZuKCgpID0+IG1vY2tVbnRyYWNrKSxcbiAgZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5OiBqZXN0LmZuKCksXG4gIGZpeExvbmdEaXZpc2lvbjogamVzdC5mbigpLFxufSkpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvZmlyc3QgKi9cbmltcG9ydCBJbnB1dCBmcm9tICcuLi9tZi9pbnB1dCc7XG5pbXBvcnQgU3RhdGljIGZyb20gJy4uL21mL3N0YXRpYyc7XG5pbXBvcnQgeyBMYXRleExhYmVsIH0gZnJvbSAnLi4va2V5cGFkJztcbmltcG9ydCB7IHRyYWNrTG9uZ0RpdmlzaW9uLCBmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkgfSBmcm9tICcuLi9sb25nZGl2Jztcbi8qIGVzbGludC1lbmFibGUgaW1wb3J0L2ZpcnN0ICovXG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICB0cmFja0xvbmdEaXZpc2lvbi5tb2NrQ2xlYXIoKTtcbiAgZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5Lm1vY2tDbGVhcigpO1xuICBtb2NrVW50cmFjay5tb2NrQ2xlYXIoKTtcbn0pO1xuXG5kZXNjcmliZSgnSW5wdXQgKHRoZSBlZGl0b3IpJywgKCkgPT4ge1xuICBpdCgndHJhY2tzIHRoZSBtYXRoZmllbGQgb24gbW91bnQgYW5kIHN0b3BzIG9uIHVubW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgaW5wdXQuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KHRyYWNrTG9uZ0RpdmlzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dC5tYXRoRmllbGQpO1xuXG4gICAgaW5wdXQuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGV4cGVjdChtb2NrVW50cmFjaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIGV4cGVjdChpbnB1dC51bnRyYWNrTG9uZ0RpdmlzaW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdTdGF0aWMnLCAoKSA9PiB7XG4gIGl0KCd0cmFja3MgdGhlIGFuc3dlci1ibG9jayBmaWVsZCBvbiBtb3VudCBhbmQgc3RvcHMgb24gdW5tb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAneD1cXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JyB9KTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBzLmNyZWF0ZUxpdmVSZWdpb24gPSAoKSA9PiB7fTtcbiAgICBhd2FpdCBzLmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBleHBlY3QodHJhY2tMb25nRGl2aXNpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHMubWF0aEZpZWxkKTtcblxuICAgIHMuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGV4cGVjdChtb2NrVW50cmFjaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICAvLyBEaXNwbGF5IG1vZGU6IHRoZSBtYXJrdXAgcmVhY2hlcyB0aGUgRE9NIHRocm91Z2ggc3RhdGUsIHNvIGl0IGlzIGNvcnJlY3RlZFxuICAvLyBvbmNlIFJlYWN0IGhhcyB3cml0dGVuIGl0LlxuICBpdCgnY29ycmVjdHMgc3RhdGljIG1hcmt1cCBhZnRlciBpdCBpcyByZW5kZXJlZCcsICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAnNVxcXFxsb25nZGl2ezE0NH0nIH0pO1xuICAgIGNvbnN0IGhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBob2xkZXIgfTtcbiAgICBzLnN0YXRlID0geyBtYXJrdXA6ICc8c3Bhbj5uZXc8L3NwYW4+JyB9O1xuICAgIHMuY29tcG9uZW50RGlkVXBkYXRlKHsgbGF0ZXg6ICc1XFxcXGxvbmdkaXZ7MTQ0fScgfSwgeyBtYXJrdXA6ICcnIH0pO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoaG9sZGVyKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHJlZG8gaXQgd2hlbiB0aGUgbWFya3VwIGRpZCBub3QgY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IHMgPSBuZXcgU3RhdGljKHsgbGF0ZXg6ICd4JyB9KTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBzLnN0YXRlID0geyBtYXJrdXA6ICc8c3Bhbj5zYW1lPC9zcGFuPicgfTtcbiAgICBzLmNvbXBvbmVudERpZFVwZGF0ZSh7IGxhdGV4OiAneCcgfSwgeyBtYXJrdXA6ICc8c3Bhbj5zYW1lPC9zcGFuPicgfSk7XG5cbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGEgbGl2ZSBmaWVsZCB0byB0aGUgdHJhY2tlcicsICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAneCcgfSk7XG5cbiAgICBzLmhvbGRlclJlZiA9IHsgY3VycmVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpIH07XG4gICAgcy5tYXRoRmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG4gICAgcy5zdGF0ZSA9IHsgbWFya3VwOiAnPHNwYW4+bmV3PC9zcGFuPicgfTtcbiAgICBzLmNvbXBvbmVudERpZFVwZGF0ZSh7IGxhdGV4OiAneCcgfSwgeyBtYXJrdXA6ICcnIH0pO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCcsICgpID0+IHtcbiAgaXQoJ2NvcnJlY3RzIHRoZSBsYWJlbCBvbmNlIG1vdW50ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPSBuZXcgTGF0ZXhMYWJlbCh7IGxhdGV4OiAnXFxcXGxvbmdkaXZ7fScgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICBsYWJlbC5sYWJlbFJlZiA9IHsgY3VycmVudDogZWwgfTtcbiAgICBhd2FpdCBsYWJlbC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZWwpO1xuICB9KTtcblxuICBpdCgnY29ycmVjdHMgaXQgYWdhaW4gd2hlbiB0aGUgbGFiZWwgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBMYXRleExhYmVsKHsgbGF0ZXg6ICdcXFxcbG9uZ2Rpdnt9JyB9KTtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGxhYmVsLmxhYmVsUmVmID0geyBjdXJyZW50OiBlbCB9O1xuICAgIGxhYmVsLnNldFN0YXRlID0gKCkgPT4ge307XG4gICAgbGFiZWwuc3RhdGUgPSB7IG1hcmt1cDogJzxzcGFuPm90aGVyPC9zcGFuPicgfTtcbiAgICBsYWJlbC5jb21wb25lbnREaWRVcGRhdGUoeyBsYXRleDogJ1xcXFxsb25nZGl2e30nIH0sIHsgbWFya3VwOiAnPHNwYW4+Zmlyc3Q8L3NwYW4+JyB9KTtcblxuICAgIGV4cGVjdChmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVsKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQW9DQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUF2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBSSxJQUFJLENBQUNDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxZQUFNO0VBQUEsSUFDaENDLG9CQUFvQixvQkFBQUMsYUFBQSxhQUN4QixTQUFBRCxxQkFBQSxFQUFjO0lBQUEsSUFBQUUsZ0JBQUEsbUJBQUFGLG9CQUFBO0lBQ1osSUFBTUcsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUV0REgsRUFBRSxDQUFDSSxLQUFLLEdBQUcsRUFBRTtJQUNiSixFQUFFLENBQUNLLFFBQVEsR0FBRztNQUFBLE9BQU1MLEVBQUUsQ0FBQ0ksS0FBSztJQUFBO0lBRTVCLE9BQU9KLEVBQUU7RUFDWCxDQUFDO0VBR0gsT0FBTztJQUNMTSxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBQTtNQUFBLE9BQVFDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDO1FBQUVDLGdCQUFnQixFQUFFWjtNQUFxQixDQUFDLENBQUM7SUFBQTtJQUMvRWEsU0FBUyxFQUFFLFNBQVhBLFNBQVNBLENBQUE7TUFBQSxPQUFTLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDckJDLGVBQWUsRUFBRSxLQUFLO0lBQ3RCQyxpQkFBaUIsRUFBRSxTQUFuQkEsaUJBQWlCQSxDQUFBLEVBQVEsQ0FBQyxDQUFDO0lBQzNCQyxxQkFBcUIsRUFBRSxTQUF2QkEscUJBQXFCQSxDQUFBO01BQUEsT0FBUSxZQUFNLENBQUMs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
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _longdiv = require("../longdiv");
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ /**
13
+ * Markup captured verbatim from MathLive 0.110.0 `convertLatexToMarkup` in
14
+ * Chrome. In `12\enclose{longdiv}{144}` MathLive drops the dividend 0.45em
15
+ * (`top:0.45em`), sizes the box 2.1em wide while the viewBox is 2.54 wide, and
16
+ * ends the bar at 1.8 although the dividend runs to 0.3 + 0.45 + 1.5 = 2.25.
17
+ */
18
+ var LONGDIV = '<span class="ML__latex"><span class="ML__strut" style="height:0.8em"></span><span class="ML__strut--bottom" style="height:1.25em;vertical-align:-0.44em"></span><span class="ML__base"><span class="ML__cmr">12</span><span style="position:relative;height:1.24em;display:inline-block;margin-left:0.3em;margin-right:0.3em;width:1.95em"><span class="ML__notation" style="box-sizing:border-box;left:calc(-1 * 1px - 0.3em);height:calc( 1.24444em + 1px);top:0em;width:calc(2.1em + 1px);background-color:transparent"><span style="display: inline-block;height:1.24em;vertical-align:0.44em;"></span><svg style="position:absolute;overflow:visible;height:1.24em;top:0;left:0;width:100%;z-index:2;" stroke-width="0.06em" stroke="currentColor" stroke-linecap="round" viewBox="0 0 2.54 1.24"><line x1="0.3" y1="0.3" x2="1.8" y2="0.3" vector-effect="non-scaling-stroke"></line><path d="M 0.3 0.3 a0.3 0.46997, 0, 1, 1, 0 0.93994 " stroke-width="0.004em" stroke="currentColor" fill="none"/></svg></span><span style="position:relative;display:inline-block;height:0.65em;width:1.5em;margin-left:0.45em;top:0.45em"><span class="ML__cmr">144</span></span></span></span></span>';
19
+
20
+ // \enclose{box}{x}: another notation, which must be left alone
21
+ var BOX = '<span class="ML__latex"><span class="ML__strut" style="height:1.04em"></span><span class="ML__base"><span style="position:relative;height:1.03em;display:inline-block;margin-left:0.3em;margin-right:0.3em;width:0.58em"><span class="ML__notation" style="box-sizing:border-box;left:calc(-1 * 1px - 0.3em);height:calc( 1.03056em + 1px);top:0em;width:calc(1.17153em + 1px);background-color:transparent;border:1px solid red"></span><span style="position:relative;display:inline-block;height:0.44em;width:0.58em"><span class="ML__mathit">x</span></span></span></span></span>';
22
+ var mount = function mount(html) {
23
+ var el = document.createElement('div');
24
+ el.innerHTML = html;
25
+ document.body.appendChild(el);
26
+ return el;
27
+ };
28
+ var parts = function parts(el) {
29
+ var notation = el.querySelector('.ML__notation');
30
+ return {
31
+ notation: notation,
32
+ box: notation.parentElement,
33
+ dividend: notation.nextElementSibling,
34
+ line: notation.querySelector('line')
35
+ };
36
+ };
37
+ afterEach(function () {
38
+ document.body.innerHTML = '';
39
+ });
40
+ describe('fixLongDivision', function () {
41
+ it('puts the dividend back on the baseline', function () {
42
+ var el = mount(LONGDIV);
43
+ (0, _longdiv.fixLongDivision)(el);
44
+ var _parts = parts(el),
45
+ dividend = _parts.dividend,
46
+ box = _parts.box;
47
+ expect(dividend.style.top).toEqual('0px');
48
+ // the drawing keeps its place relative to the dividend, and the line grows
49
+ // so the field does not clip the bar
50
+ expect(box.style.paddingTop).toEqual('0.45em');
51
+ });
52
+ it('sizes the box to the viewBox, so the drawing is not scaled down', function () {
53
+ var el = mount(LONGDIV);
54
+ (0, _longdiv.fixLongDivision)(el);
55
+ expect(parts(el).notation.style.width).toEqual('calc(2.54em + 1px)');
56
+ });
57
+ it('runs the bar to the end of the dividend', function () {
58
+ var el = mount(LONGDIV);
59
+ (0, _longdiv.fixLongDivision)(el);
60
+
61
+ // no layout under jsdom, so from MathLive's numbers: start + gap + width
62
+ expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(0.3 + 0.45 + 1.5, 6);
63
+ });
64
+
65
+ // MathLive's width leaves out the spacing around `,` and `+`, so when the
66
+ // markup is laid out the end is measured instead.
67
+ it('measures the bar end from the rendered dividend when laid out', function () {
68
+ var el = mount(LONGDIV);
69
+ var _parts2 = parts(el),
70
+ notation = _parts2.notation,
71
+ dividend = _parts2.dividend;
72
+ var svg = notation.querySelector('svg');
73
+ var glyph = dividend.querySelector('.ML__cmr');
74
+
75
+ // the svg is 254px wide for a 2.54-unit viewBox: 100px per unit
76
+ svg.getBoundingClientRect = function () {
77
+ return {
78
+ left: 100,
79
+ width: 254,
80
+ right: 354
81
+ };
82
+ };
83
+ glyph.getBoundingClientRect = function () {
84
+ return {
85
+ left: 145,
86
+ right: 340,
87
+ width: 195
88
+ };
89
+ };
90
+ (0, _longdiv.fixLongDivision)(el);
91
+ expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(2.4, 6);
92
+ });
93
+ it('ignores the caret when measuring', function () {
94
+ var el = mount(LONGDIV);
95
+ var _parts3 = parts(el),
96
+ notation = _parts3.notation,
97
+ dividend = _parts3.dividend;
98
+ var caret = document.createElement('span');
99
+ caret.className = 'ML__caret';
100
+ dividend.appendChild(caret);
101
+ notation.querySelector('svg').getBoundingClientRect = function () {
102
+ return {
103
+ left: 100,
104
+ width: 254,
105
+ right: 354
106
+ };
107
+ };
108
+ dividend.querySelector('.ML__cmr').getBoundingClientRect = function () {
109
+ return {
110
+ left: 145,
111
+ right: 340,
112
+ width: 195
113
+ };
114
+ };
115
+ caret.getBoundingClientRect = function () {
116
+ return {
117
+ left: 400,
118
+ right: 402,
119
+ width: 2
120
+ };
121
+ };
122
+ (0, _longdiv.fixLongDivision)(el);
123
+ expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(2.4, 6);
124
+ });
125
+ it('can run again without drifting', function () {
126
+ var el = mount(LONGDIV);
127
+ (0, _longdiv.fixLongDivision)(el);
128
+ var first = _objectSpread(_objectSpread({}, parts(el)), {}, {
129
+ x2: parts(el).line.getAttribute('x2')
130
+ });
131
+ (0, _longdiv.fixLongDivision)(el);
132
+ var second = parts(el);
133
+ expect(second.line.getAttribute('x2')).toEqual(first.x2);
134
+ expect(second.box.style.paddingTop).toEqual('0.45em');
135
+ expect(second.notation.style.width).toEqual('calc(2.54em + 1px)');
136
+ });
137
+ it('leaves other enclose notations alone', function () {
138
+ var el = mount(BOX);
139
+ var before = el.innerHTML;
140
+ expect((0, _longdiv.fixLongDivision)(el)).toBe(0);
141
+ expect(el.innerHTML).toEqual(before);
142
+ });
143
+ it('counts what it corrected', function () {
144
+ expect((0, _longdiv.fixLongDivision)(mount(LONGDIV + LONGDIV))).toBe(2);
145
+ });
146
+ it('is safe on nothing', function () {
147
+ expect((0, _longdiv.fixLongDivision)(null)).toBe(0);
148
+ expect((0, _longdiv.fixLongDivision)(mount('<span>plain</span>'))).toBe(0);
149
+ });
150
+ });
151
+ describe('fixLongDivisionWhenReady', function () {
152
+ it('corrects now, and again once the fonts have loaded', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
153
+ var fontsLoaded, original, el;
154
+ return _regenerator["default"].wrap(function (_context) {
155
+ while (1) switch (_context.prev = _context.next) {
156
+ case 0:
157
+ original = document.fonts;
158
+ Object.defineProperty(document, 'fonts', {
159
+ configurable: true,
160
+ value: {
161
+ ready: new Promise(function (resolve) {
162
+ return fontsLoaded = resolve;
163
+ })
164
+ }
165
+ });
166
+ _context.prev = 1;
167
+ el = mount(LONGDIV);
168
+ (0, _longdiv.fixLongDivisionWhenReady)(el);
169
+ expect(parts(el).dividend.style.top).toEqual('0px');
170
+
171
+ // a re-render before the fonts arrive...
172
+ el.innerHTML = LONGDIV;
173
+ fontsLoaded();
174
+ _context.next = 2;
175
+ return Promise.resolve();
176
+ case 2:
177
+ _context.next = 3;
178
+ return Promise.resolve();
179
+ case 3:
180
+ // ...is corrected once they do
181
+ expect(parts(el).dividend.style.top).toEqual('0px');
182
+ case 4:
183
+ _context.prev = 4;
184
+ Object.defineProperty(document, 'fonts', {
185
+ configurable: true,
186
+ value: original
187
+ });
188
+ return _context.finish(4);
189
+ case 5:
190
+ case "end":
191
+ return _context.stop();
192
+ }
193
+ }, _callee, null, [[1,, 4, 5]]);
194
+ })));
195
+ });
196
+ describe('trackLongDivision', function () {
197
+ var field = function field() {
198
+ var host = document.createElement('div');
199
+ host.attachShadow({
200
+ mode: 'open'
201
+ });
202
+ host.shadowRoot.innerHTML = LONGDIV;
203
+ document.body.appendChild(host);
204
+ return host;
205
+ };
206
+ it('corrects the field straight away', function () {
207
+ var host = field();
208
+ (0, _longdiv.trackLongDivision)(host);
209
+ expect(parts(host.shadowRoot).dividend.style.top).toEqual('0px');
210
+ });
211
+
212
+ // jest.setup.js replaces MutationObserver with a no-op for every test, so this
213
+ // installs one that records what it was asked to observe and can be fired.
214
+ describe('re-rendering', function () {
215
+ var observers;
216
+ var RealObserver = global.MutationObserver;
217
+ beforeEach(function () {
218
+ observers = [];
219
+ global.MutationObserver = /*#__PURE__*/function () {
220
+ function _class(callback) {
221
+ (0, _classCallCheck2["default"])(this, _class);
222
+ this.callback = callback;
223
+ this.disconnected = false;
224
+ observers.push(this);
225
+ }
226
+ return (0, _createClass2["default"])(_class, [{
227
+ key: "observe",
228
+ value: function observe(target, options) {
229
+ this.target = target;
230
+ this.options = options;
231
+ }
232
+ }, {
233
+ key: "disconnect",
234
+ value: function disconnect() {
235
+ this.disconnected = true;
236
+ }
237
+ }]);
238
+ }();
239
+ });
240
+ afterEach(function () {
241
+ global.MutationObserver = RealObserver;
242
+ });
243
+ it('watches the whole shadow tree for MathLive rebuilding it', function () {
244
+ var host = field();
245
+ (0, _longdiv.trackLongDivision)(host);
246
+ expect(observers).toHaveLength(1);
247
+ expect(observers[0].target).toBe(host.shadowRoot);
248
+ expect(observers[0].options).toEqual({
249
+ childList: true,
250
+ subtree: true
251
+ });
252
+ });
253
+
254
+ // MathLive rebuilds its shadow DOM on every keystroke, resize and font load.
255
+ it('re-corrects after MathLive re-renders', function () {
256
+ var host = field();
257
+ (0, _longdiv.trackLongDivision)(host);
258
+ host.shadowRoot.innerHTML = LONGDIV;
259
+ expect(parts(host.shadowRoot).dividend.style.top).toEqual('0.45em');
260
+ observers[0].callback([]);
261
+ expect(parts(host.shadowRoot).dividend.style.top).toEqual('0px');
262
+ });
263
+
264
+ // The corrections change attributes only, so observing childList alone
265
+ // cannot loop.
266
+ it('does not observe attributes', function () {
267
+ (0, _longdiv.trackLongDivision)(field());
268
+ expect(observers[0].options.attributes).toBeUndefined();
269
+ });
270
+ it('stops after teardown', function () {
271
+ var untrack = (0, _longdiv.trackLongDivision)(field());
272
+ untrack();
273
+ expect(observers[0].disconnected).toBe(true);
274
+ });
275
+ });
276
+ it('is a no-op without a shadow root', function () {
277
+ expect((0, _longdiv.trackLongDivision)(undefined)).toBeUndefined();
278
+ expect((0, _longdiv.trackLongDivision)(document.createElement('div'))).toBeUndefined();
279
+ });
280
+ });
281
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9uZ2RpdiIsInJlcXVpcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkxPTkdESVYiLCJCT1giLCJtb3VudCIsImh0bWwiLCJlbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsInBhcnRzIiwibm90YXRpb24iLCJxdWVyeVNlbGVjdG9yIiwiYm94IiwicGFyZW50RWxlbWVudCIsImRpdmlkZW5kIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwibGluZSIsImFmdGVyRWFjaCIsImRlc2NyaWJlIiwiaXQiLCJmaXhMb25nRGl2aXNpb24iLCJfcGFydHMiLCJleHBlY3QiLCJzdHlsZSIsInRvcCIsInRvRXF1YWwiLCJwYWRkaW5nVG9wIiwid2lkdGgiLCJwYXJzZUZsb2F0IiwiZ2V0QXR0cmlidXRlIiwidG9CZUNsb3NlVG8iLCJfcGFydHMyIiwic3ZnIiwiZ2x5cGgiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsZWZ0IiwicmlnaHQiLCJfcGFydHMzIiwiY2FyZXQiLCJjbGFzc05hbWUiLCJmaXJzdCIsIngyIiwic2Vjb25kIiwiYmVmb3JlIiwidG9CZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZm9udHNMb2FkZWQiLCJvcmlnaW5hbCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZm9udHMiLCJjb25maWd1cmFibGUiLCJ2YWx1ZSIsInJlYWR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkiLCJmaW5pc2giLCJzdG9wIiwiZmllbGQiLCJob3N0IiwiYXR0YWNoU2hhZG93IiwibW9kZSIsInNoYWRvd1Jvb3QiLCJ0cmFja0xvbmdEaXZpc2lvbiIsIm9ic2VydmVycyIsIlJlYWxPYnNlcnZlciIsImdsb2JhbCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJiZWZvcmVFYWNoIiwiX2NsYXNzIiwiY2FsbGJhY2siLCJfY2xhc3NDYWxsQ2hlY2syIiwiZGlzY29ubmVjdGVkIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsIm9ic2VydmUiLCJ0YXJnZXQiLCJvcHRpb25zIiwiZGlzY29ubmVjdCIsInRvSGF2ZUxlbmd0aCIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJhdHRyaWJ1dGVzIiwidG9CZVVuZGVmaW5lZCIsInVudHJhY2siLCJ1bmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xvbmdkaXYudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXhMb25nRGl2aXNpb24sIGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSwgdHJhY2tMb25nRGl2aXNpb24gfSBmcm9tICcuLi9sb25nZGl2JztcblxuLyoqXG4gKiBNYXJrdXAgY2FwdHVyZWQgdmVyYmF0aW0gZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBjb252ZXJ0TGF0ZXhUb01hcmt1cGAgaW5cbiAqIENocm9tZS4gSW4gYDEyXFxlbmNsb3Nle2xvbmdkaXZ9ezE0NH1gIE1hdGhMaXZlIGRyb3BzIHRoZSBkaXZpZGVuZCAwLjQ1ZW1cbiAqIChgdG9wOjAuNDVlbWApLCBzaXplcyB0aGUgYm94IDIuMWVtIHdpZGUgd2hpbGUgdGhlIHZpZXdCb3ggaXMgMi41NCB3aWRlLCBhbmRcbiAqIGVuZHMgdGhlIGJhciBhdCAxLjggYWx0aG91Z2ggdGhlIGRpdmlkZW5kIHJ1bnMgdG8gMC4zICsgMC40NSArIDEuNSA9IDIuMjUuXG4gKi9cbmNvbnN0IExPTkdESVYgPVxuICAnPHNwYW4gY2xhc3M9XCJNTF9fbGF0ZXhcIj48c3BhbiBjbGFzcz1cIk1MX19zdHJ1dFwiIHN0eWxlPVwiaGVpZ2h0OjAuOGVtXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiTUxfX3N0cnV0LS1ib3R0b21cIiBzdHlsZT1cImhlaWdodDoxLjI1ZW07dmVydGljYWwtYWxpZ246LTAuNDRlbVwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cIk1MX19iYXNlXCI+PHNwYW4gY2xhc3M9XCJNTF9fY21yXCI+MTI8L3NwYW4+PHNwYW4gc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MS4yNGVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjAuM2VtO21hcmdpbi1yaWdodDowLjNlbTt3aWR0aDoxLjk1ZW1cIj48c3BhbiBjbGFzcz1cIk1MX19ub3RhdGlvblwiIHN0eWxlPVwiYm94LXNpemluZzpib3JkZXItYm94O2xlZnQ6Y2FsYygtMSAqIDFweCAtIDAuM2VtKTtoZWlnaHQ6Y2FsYyggMS4yNDQ0NGVtICsgMXB4KTt0b3A6MGVtO3dpZHRoOmNhbGMoMi4xZW0gKyAxcHgpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnRcIj48c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jaztoZWlnaHQ6MS4yNGVtO3ZlcnRpY2FsLWFsaWduOjAuNDRlbTtcIj48L3NwYW4+PHN2ZyBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO292ZXJmbG93OnZpc2libGU7aGVpZ2h0OjEuMjRlbTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTt6LWluZGV4OjI7XCIgc3Ryb2tlLXdpZHRoPVwiMC4wNmVtXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHZpZXdCb3g9XCIwIDAgMi41NCAxLjI0XCI+PGxpbmUgeDE9XCIwLjNcIiAgeTE9XCIwLjNcIiB4Mj1cIjEuOFwiIHkyPVwiMC4zXCIgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiPjwvbGluZT48cGF0aCBkPVwiTSAwLjMgMC4zICBhMC4zIDAuNDY5OTcsIDAsIDEsIDEsIDAgMC45Mzk5NCBcIiBzdHJva2Utd2lkdGg9XCIwLjAwNGVtXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZmlsbD1cIm5vbmVcIi8+PC9zdmc+PC9zcGFuPjxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjAuNjVlbTt3aWR0aDoxLjVlbTttYXJnaW4tbGVmdDowLjQ1ZW07dG9wOjAuNDVlbVwiPjxzcGFuIGNsYXNzPVwiTUxfX2NtclwiPjE0NDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+JztcblxuLy8gXFxlbmNsb3Nle2JveH17eH06IGFub3RoZXIgbm90YXRpb24sIHdoaWNoIG11c3QgYmUgbGVmdCBhbG9uZVxuY29uc3QgQk9YID1cbiAgJzxzcGFuIGNsYXNzPVwiTUxfX2xhdGV4XCI+PHNwYW4gY2xhc3M9XCJNTF9fc3RydXRcIiBzdHlsZT1cImhlaWdodDoxLjA0ZW1cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJNTF9fYmFzZVwiPjxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjEuMDNlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDowLjNlbTttYXJnaW4tcmlnaHQ6MC4zZW07d2lkdGg6MC41OGVtXCI+PHNwYW4gY2xhc3M9XCJNTF9fbm90YXRpb25cIiBzdHlsZT1cImJveC1zaXppbmc6Ym9yZGVyLWJveDtsZWZ0OmNhbGMoLTEgKiAxcHggLSAwLjNlbSk7aGVpZ2h0OmNhbGMoIDEuMDMwNTZlbSArIDFweCk7dG9wOjBlbTt3aWR0aDpjYWxjKDEuMTcxNTNlbSArIDFweCk7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MXB4IHNvbGlkIHJlZFwiPjwvc3Bhbj48c3BhbiBzdHlsZT1cInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDowLjQ0ZW07d2lkdGg6MC41OGVtXCI+PHNwYW4gY2xhc3M9XCJNTF9fbWF0aGl0XCI+eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+JztcblxuY29uc3QgbW91bnQgPSAoaHRtbCkgPT4ge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuXG4gIHJldHVybiBlbDtcbn07XG5cbmNvbnN0IHBhcnRzID0gKGVsKSA9PiB7XG4gIGNvbnN0IG5vdGF0aW9uID0gZWwucXVlcnlTZWxlY3RvcignLk1MX19ub3RhdGlvbicpO1xuXG4gIHJldHVybiB7XG4gICAgbm90YXRpb24sXG4gICAgYm94OiBub3RhdGlvbi5wYXJlbnRFbGVtZW50LFxuICAgIGRpdmlkZW5kOiBub3RhdGlvbi5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgbGluZTogbm90YXRpb24ucXVlcnlTZWxlY3RvcignbGluZScpLFxuICB9O1xufTtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbn0pO1xuXG5kZXNjcmliZSgnZml4TG9uZ0RpdmlzaW9uJywgKCkgPT4ge1xuICBpdCgncHV0cyB0aGUgZGl2aWRlbmQgYmFjayBvbiB0aGUgYmFzZWxpbmUnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChMT05HRElWKTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICBjb25zdCB7IGRpdmlkZW5kLCBib3ggfSA9IHBhcnRzKGVsKTtcblxuICAgIGV4cGVjdChkaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuICAgIC8vIHRoZSBkcmF3aW5nIGtlZXBzIGl0cyBwbGFjZSByZWxhdGl2ZSB0byB0aGUgZGl2aWRlbmQsIGFuZCB0aGUgbGluZSBncm93c1xuICAgIC8vIHNvIHRoZSBmaWVsZCBkb2VzIG5vdCBjbGlwIHRoZSBiYXJcbiAgICBleHBlY3QoYm94LnN0eWxlLnBhZGRpbmdUb3ApLnRvRXF1YWwoJzAuNDVlbScpO1xuICB9KTtcblxuICBpdCgnc2l6ZXMgdGhlIGJveCB0byB0aGUgdmlld0JveCwgc28gdGhlIGRyYXdpbmcgaXMgbm90IHNjYWxlZCBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuXG4gICAgZXhwZWN0KHBhcnRzKGVsKS5ub3RhdGlvbi5zdHlsZS53aWR0aCkudG9FcXVhbCgnY2FsYygyLjU0ZW0gKyAxcHgpJyk7XG4gIH0pO1xuXG4gIGl0KCdydW5zIHRoZSBiYXIgdG8gdGhlIGVuZCBvZiB0aGUgZGl2aWRlbmQnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChMT05HRElWKTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICAvLyBubyBsYXlvdXQgdW5kZXIganNkb20sIHNvIGZyb20gTWF0aExpdmUncyBudW1iZXJzOiBzdGFydCArIGdhcCArIHdpZHRoXG4gICAgZXhwZWN0KHBhcnNlRmxvYXQocGFydHMoZWwpLmxpbmUuZ2V0QXR0cmlidXRlKCd4MicpKSkudG9CZUNsb3NlVG8oMC4zICsgMC40NSArIDEuNSwgNik7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlJ3Mgd2lkdGggbGVhdmVzIG91dCB0aGUgc3BhY2luZyBhcm91bmQgYCxgIGFuZCBgK2AsIHNvIHdoZW4gdGhlXG4gIC8vIG1hcmt1cCBpcyBsYWlkIG91dCB0aGUgZW5kIGlzIG1lYXN1cmVkIGluc3RlYWQuXG4gIGl0KCdtZWFzdXJlcyB0aGUgYmFyIGVuZCBmcm9tIHRoZSByZW5kZXJlZCBkaXZpZGVuZCB3aGVuIGxhaWQgb3V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG4gICAgY29uc3QgeyBub3RhdGlvbiwgZGl2aWRlbmQgfSA9IHBhcnRzKGVsKTtcbiAgICBjb25zdCBzdmcgPSBub3RhdGlvbi5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBjb25zdCBnbHlwaCA9IGRpdmlkZW5kLnF1ZXJ5U2VsZWN0b3IoJy5NTF9fY21yJyk7XG5cbiAgICAvLyB0aGUgc3ZnIGlzIDI1NHB4IHdpZGUgZm9yIGEgMi41NC11bml0IHZpZXdCb3g6IDEwMHB4IHBlciB1bml0XG4gICAgc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9ICgpID0+ICh7IGxlZnQ6IDEwMCwgd2lkdGg6IDI1NCwgcmlnaHQ6IDM1NCB9KTtcbiAgICBnbHlwaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxNDUsIHJpZ2h0OiAzNDAsIHdpZHRoOiAxOTUgfSk7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuXG4gICAgZXhwZWN0KHBhcnNlRmxvYXQocGFydHMoZWwpLmxpbmUuZ2V0QXR0cmlidXRlKCd4MicpKSkudG9CZUNsb3NlVG8oMi40LCA2KTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgdGhlIGNhcmV0IHdoZW4gbWVhc3VyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG4gICAgY29uc3QgeyBub3RhdGlvbiwgZGl2aWRlbmQgfSA9IHBhcnRzKGVsKTtcbiAgICBjb25zdCBjYXJldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGNhcmV0LmNsYXNzTmFtZSA9ICdNTF9fY2FyZXQnO1xuICAgIGRpdmlkZW5kLmFwcGVuZENoaWxkKGNhcmV0KTtcbiAgICBub3RhdGlvbi5xdWVyeVNlbGVjdG9yKCdzdmcnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxMDAsIHdpZHRoOiAyNTQsIHJpZ2h0OiAzNTQgfSk7XG4gICAgZGl2aWRlbmQucXVlcnlTZWxlY3RvcignLk1MX19jbXInKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxNDUsIHJpZ2h0OiAzNDAsIHdpZHRoOiAxOTUgfSk7XG4gICAgY2FyZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gKCkgPT4gKHsgbGVmdDogNDAwLCByaWdodDogNDAyLCB3aWR0aDogMiB9KTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICBleHBlY3QocGFyc2VGbG9hdChwYXJ0cyhlbCkubGluZS5nZXRBdHRyaWJ1dGUoJ3gyJykpKS50b0JlQ2xvc2VUbygyLjQsIDYpO1xuICB9KTtcblxuICBpdCgnY2FuIHJ1biBhZ2FpbiB3aXRob3V0IGRyaWZ0aW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuICAgIGNvbnN0IGZpcnN0ID0geyAuLi5wYXJ0cyhlbCksIHgyOiBwYXJ0cyhlbCkubGluZS5nZXRBdHRyaWJ1dGUoJ3gyJykgfTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG4gICAgY29uc3Qgc2Vjb25kID0gcGFydHMoZWwpO1xuXG4gICAgZXhwZWN0KHNlY29uZC5saW5lLmdldEF0dHJpYnV0ZSgneDInKSkudG9FcXVhbChmaXJzdC54Mik7XG4gICAgZXhwZWN0KHNlY29uZC5ib3guc3R5bGUucGFkZGluZ1RvcCkudG9FcXVhbCgnMC40NWVtJyk7XG4gICAgZXhwZWN0KHNlY29uZC5ub3RhdGlvbi5zdHlsZS53aWR0aCkudG9FcXVhbCgnY2FsYygyLjU0ZW0gKyAxcHgpJyk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgb3RoZXIgZW5jbG9zZSBub3RhdGlvbnMgYWxvbmUnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChCT1gpO1xuICAgIGNvbnN0IGJlZm9yZSA9IGVsLmlubmVySFRNTDtcblxuICAgIGV4cGVjdChmaXhMb25nRGl2aXNpb24oZWwpKS50b0JlKDApO1xuICAgIGV4cGVjdChlbC5pbm5lckhUTUwpLnRvRXF1YWwoYmVmb3JlKTtcbiAgfSk7XG5cbiAgaXQoJ2NvdW50cyB3aGF0IGl0IGNvcnJlY3RlZCcsICgpID0+IHtcbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uKG1vdW50KExPTkdESVYgKyBMT05HRElWKSkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KCdpcyBzYWZlIG9uIG5vdGhpbmcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbihudWxsKSkudG9CZSgwKTtcbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uKG1vdW50KCc8c3Bhbj5wbGFpbjwvc3Bhbj4nKSkpLnRvQmUoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmaXhMb25nRGl2aXNpb25XaGVuUmVhZHknLCAoKSA9PiB7XG4gIGl0KCdjb3JyZWN0cyBub3csIGFuZCBhZ2FpbiBvbmNlIHRoZSBmb250cyBoYXZlIGxvYWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgZm9udHNMb2FkZWQ7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBkb2N1bWVudC5mb250cztcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRzJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHsgcmVhZHk6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiAoZm9udHNMb2FkZWQgPSByZXNvbHZlKSkgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbCA9IG1vdW50KExPTkdESVYpO1xuXG4gICAgICBmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkoZWwpO1xuICAgICAgZXhwZWN0KHBhcnRzKGVsKS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuXG4gICAgICAvLyBhIHJlLXJlbmRlciBiZWZvcmUgdGhlIGZvbnRzIGFycml2ZS4uLlxuICAgICAgZWwuaW5uZXJIVE1MID0gTE9OR0RJVjtcbiAgICAgIGZvbnRzTG9hZGVkKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAvLyAuLi5pcyBjb3JyZWN0ZWQgb25jZSB0aGV5IGRvXG4gICAgICBleHBlY3QocGFydHMoZWwpLmRpdmlkZW5kLnN0eWxlLnRvcCkudG9FcXVhbCgnMHB4Jyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRzJywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBvcmlnaW5hbCB9KTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0cmFja0xvbmdEaXZpc2lvbicsICgpID0+IHtcbiAgY29uc3QgZmllbGQgPSAoKSA9PiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgaG9zdC5zaGFkb3dSb290LmlubmVySFRNTCA9IExPTkdESVY7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcblxuICAgIHJldHVybiBob3N0O1xuICB9O1xuXG4gIGl0KCdjb3JyZWN0cyB0aGUgZmllbGQgc3RyYWlnaHQgYXdheScsICgpID0+IHtcbiAgICBjb25zdCBob3N0ID0gZmllbGQoKTtcblxuICAgIHRyYWNrTG9uZ0RpdmlzaW9uKGhvc3QpO1xuXG4gICAgZXhwZWN0KHBhcnRzKGhvc3Quc2hhZG93Um9vdCkuZGl2aWRlbmQuc3R5bGUudG9wKS50b0VxdWFsKCcwcHgnKTtcbiAgfSk7XG5cbiAgLy8gamVzdC5zZXR1cC5qcyByZXBsYWNlcyBNdXRhdGlvbk9ic2VydmVyIHdpdGggYSBuby1vcCBmb3IgZXZlcnkgdGVzdCwgc28gdGhpc1xuICAvLyBpbnN0YWxscyBvbmUgdGhhdCByZWNvcmRzIHdoYXQgaXQgd2FzIGFza2VkIHRvIG9ic2VydmUgYW5kIGNhbiBiZSBmaXJlZC5cbiAgZGVzY3JpYmUoJ3JlLXJlbmRlcmluZycsICgpID0+IHtcbiAgICBsZXQgb2JzZXJ2ZXJzO1xuICAgIGNvbnN0IFJlYWxPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBvYnNlcnZlcnMgPSBbXTtcbiAgICAgIGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyID0gY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIG9ic2VydmVycy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgPSBSZWFsT2JzZXJ2ZXI7XG4gICAgfSk7XG5cbiAgICBpdCgnd2F0Y2hlcyB0aGUgd2hvbGUgc2hhZG93IHRyZWUgZm9yIE1hdGhMaXZlIHJlYnVpbGRpbmcgaXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gZmllbGQoKTtcblxuICAgICAgdHJhY2tMb25nRGl2aXNpb24oaG9zdCk7XG5cbiAgICAgIGV4cGVjdChvYnNlcnZlcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChvYnNlcnZlcnNbMF0udGFyZ2V0KS50b0JlKGhvc3Quc2hhZG93Um9vdCk7XG4gICAgICBleHBlY3Qob2JzZXJ2ZXJzWzBdLm9wdGlvbnMpLnRvRXF1YWwoeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBNYXRoTGl2ZSByZWJ1aWxkcyBpdHMgc2hhZG93IERPTSBvbiBldmVyeSBrZXlzdHJva2UsIHJlc2l6ZSBhbmQgZm9udCBsb2FkLlxuICAgIGl0KCdyZS1jb3JyZWN0cyBhZnRlciBNYXRoTGl2ZSByZS1yZW5kZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGZpZWxkKCk7XG5cbiAgICAgIHRyYWNrTG9uZ0RpdmlzaW9uKGhvc3QpO1xuICAgICAgaG9zdC5zaGFkb3dSb290LmlubmVySFRNTCA9IExPTkdESVY7XG4gICAgICBleHBlY3QocGFydHMoaG9zdC5zaGFkb3dSb290KS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzAuNDVlbScpO1xuXG4gICAgICBvYnNlcnZlcnNbMF0uY2FsbGJhY2soW10pO1xuXG4gICAgICBleHBlY3QocGFydHMoaG9zdC5zaGFkb3dSb290KS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGNvcnJlY3Rpb25zIGNoYW5nZSBhdHRyaWJ1dGVzIG9ubHksIHNvIG9ic2VydmluZyBjaGlsZExpc3QgYWxvbmVcbiAgICAvLyBjYW5ub3QgbG9vcC5cbiAgICBpdCgnZG9lcyBub3Qgb2JzZXJ2ZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgdHJhY2tMb25nRGl2aXNpb24oZmllbGQoKSk7XG5cbiAgICAgIGV4cGVjdChvYnNlcnZlcnNbMF0ub3B0aW9ucy5hdHRyaWJ1dGVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcHMgYWZ0ZXIgdGVhcmRvd24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnRyYWNrID0gdHJhY2tMb25nRGl2aXNpb24oZmllbGQoKSk7XG5cbiAgICAgIHVudHJhY2soKTtcblxuICAgICAgZXhwZWN0KG9ic2VydmVyc1swXS5kaXNjb25uZWN0ZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBhIG5vLW9wIHdpdGhvdXQgYSBzaGFkb3cgcm9vdCcsICgpID0+IHtcbiAgICBleHBlY3QodHJhY2tMb25nRGl2aXNpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdCh0cmFja0xvbmdEaXZpc2lvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFBMEYsU0FBQUMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENB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