@pie-lib/math-input-mathlive 1.1.5-beta.14 → 1.1.5-beta.15

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.
@@ -1,8 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
5
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
3
  var _latexBridge = require("../latex-bridge");
7
4
  /**
8
5
  * Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
@@ -13,37 +10,9 @@ describe('keypad label display normalisation', function () {
13
10
  it('gives empty groups a visible glyph', function () {
14
11
  var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
15
12
  expect(out).not.toEqual('\\frac{}{}');
16
- // a \rule, not a glyph: font metrics for a substituted glyph do not match
17
- // MathLive's, which left stretchy accents narrower than the box
18
- expect(out).toContain('\\rule');
13
+ expect(out).toContain('25AB'); // white small square
19
14
  expect(out).toContain('pie-empty');
20
15
  });
21
- it.each([['absolute value', '\\abs{}', '|', '|'], ['parenthesis', '\\left(\\right)', '(', ')'], ['brackets', '\\left[\\right]', '[', ']']])('gives an empty %s a tall, filled slot (the same muted tag as other slots)', function (_name, latex, open, close) {
22
- var out = (0, _latexBridge.withVisibleEmptySlots)((0, _latexBridge.toMathLive)(latex));
23
- expect(out).toContain('pie-empty=1');
24
- expect(out).toContain('\\rule[-0.25em]{0.55em}{1em}');
25
- expect(out).not.toContain('\\boxed');
26
- // the strut that keeps the fences tall while the box is centred on the axis
27
- expect(out).toContain('\\rule{0em}{1em}');
28
- expect(out.startsWith("\\left".concat(open))).toBe(true);
29
- expect(out.endsWith("\\right".concat(close))).toBe(true);
30
- });
31
- it('aligns an empty segment with the ray and line keys: bar up to the shaft, box down', function () {
32
- var out = (0, _latexBridge.withVisibleEmptySlots)('\\overline{}');
33
-
34
- // strut inside the bar (bar up) and one before it (label down)
35
- expect(out).toMatch(/^\\rule\{0em\}\{1\.3em\}\\overline\{\\rule\{0em\}\{0\.87em\}/);
36
- expect(out).toContain('pie-empty');
37
- // the ray and line keys are the reference, so they are left as they were
38
- expect((0, _latexBridge.withVisibleEmptySlots)('\\overrightarrow{}')).not.toContain('\\rule{0em}');
39
- expect((0, _latexBridge.withVisibleEmptySlots)('\\overleftrightarrow{}')).not.toContain('\\rule{0em}');
40
- // a filled bar is untouched
41
- expect((0, _latexBridge.withVisibleEmptySlots)('\\overline{AB}')).toEqual('\\overline{AB}');
42
- });
43
- it('leaves a filled pair of fences alone', function () {
44
- expect((0, _latexBridge.withVisibleEmptySlots)((0, _latexBridge.toMathLive)('\\abs{x}'))).toEqual('\\left|x\\right|');
45
- expect((0, _latexBridge.withVisibleEmptySlots)('\\left(x\\right)')).toEqual('\\left(x\\right)');
46
- });
47
16
  it('handles every empty-group key shape', function () {
48
17
  ['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
49
18
  expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
@@ -53,174 +22,6 @@ describe('keypad label display normalisation', function () {
53
22
  // e.g. \frac{x}{ }
54
23
  expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
55
24
  });
56
-
57
- // MathQuill needed a nested \overline{} to draw the empty box. MathLive
58
- // renders that as a real line, so those labels showed a spurious bar (a line
59
- // under the arrows, and a straight line instead of the arc).
60
- it('accent keys do not carry the nested-overline box hack', function () {
61
- // eslint-disable-next-line global-require
62
- var geometry = require('../keys/geometry');
63
- Object.values(geometry).forEach(function (key) {
64
- if (key && typeof key.latex === 'string') {
65
- expect(key.latex).not.toContain('\\overline{}}');
66
- }
67
- });
68
- });
69
- it('an accent over an empty slot still gets a visible box', function () {
70
- ['\\overleftrightarrow{}', '\\overarc{}'].forEach(function (latex) {
71
- var out = (0, _latexBridge.withVisibleEmptySlots)(latex);
72
- expect(out).toContain('pie-empty');
73
- expect(out).not.toContain('\\overline');
74
- });
75
- });
76
-
77
- // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
78
- // so the browser substituted a wider one and stretchy accents came out
79
- // narrower than the box. A rule has an explicit width.
80
- it('the empty slot has an explicit width, not font-dependent metrics', function () {
81
- var out = (0, _latexBridge.withVisibleEmptySlots)('\\overarc{}');
82
- expect(out).toContain('\\rule');
83
- expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
84
- expect(out).not.toContain('unicode');
85
- });
86
-
87
- // Measured in the browser: the accent's immediate wrapper computes to 0px
88
- // (its .ML__stretchy child is absolutely positioned), so the svg width has to
89
- // resolve against .ML__base - whose width equals the content. Without pinning
90
- // that, the arc collapsed to a spike and sat right of the box.
91
- it('pins the accent containing block and drops the centering shift', function () {
92
- // eslint-disable-next-line global-require
93
- var _require = require('../mf/common-styles'),
94
- placeholderStyles = _require.placeholderStyles;
95
- expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
96
- expect(placeholderStyles['& .ML__stretchy']).toEqual({
97
- position: 'absolute',
98
- left: 0,
99
- width: '100%'
100
- });
101
- // must be !important: MathLive writes margin-left as an inline style, and a
102
- // class cannot override that. Leaving it un-important also halved the arc's
103
- // width, because .ML__center is the stretchy's containing block.
104
- expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
105
- });
106
-
107
- // MathLive sets the index of \sqrt[n]{x} in scriptscriptstyle - an inline
108
- // `font-size: 50%` - which is too small to read on the nth-root key and in
109
- // authored radicals. It is scaled up to 80%.
110
- describe('radical index size', function () {
111
- // Real MathLive 0.110 output for `\sqrt[1]{2}`, trimmed to the index. The
112
- // selector walks this exact chain, so this fixture is what pins it down.
113
- var INDEX_MARKUP = "\n <span class=\"ML__base\">\n <span class=\"ML__sqrt-index\">\n <span class=\"ML__vlist-t\"><span class=\"ML__vlist-r\"><span class=\"ML__vlist\" style=\"height:0.78em\">\n <span style=\"top:-3.45em\">\n <span class=\"ML__pstrut\" style=\"height:3em\"></span>\n <span id=\"index-size\" style=\"height:0.33em;display:inline-block;font-size: 50%\">\n <span class=\"ML__cmr\">1</span>\n <span id=\"nested-size\" style=\"font-size: 50%\">nested</span>\n </span>\n </span>\n </span></span></span>\n </span>\n <span class=\"ML__sqrt-sign\"><span class=\"ML__delim-size1\">&#8730;</span></span>\n </span>";
114
- var rule = function rule() {
115
- // eslint-disable-next-line global-require
116
- var _require2 = require('../mf/common-styles'),
117
- rootIndexStyles = _require2.rootIndexStyles;
118
- var selectors = Object.keys(rootIndexStyles);
119
- expect(selectors).toHaveLength(1);
120
- return {
121
- selector: selectors[0],
122
- value: rootIndexStyles[selectors[0]].fontSize
123
- };
124
- };
125
- it("scales the index glyph to 80%, up from MathLive's 50%", function () {
126
- // !important: the 50% is an inline style, which a class cannot override.
127
- expect(rule().value).toEqual('80% !important');
128
- });
129
- it('targets the span MathLive puts the inline font-size on', function () {
130
- var holder = document.createElement('div');
131
- holder.innerHTML = INDEX_MARKUP;
132
- var matched = holder.querySelectorAll(rule().selector.replace(/^&\s*/, ''));
133
- expect(Array.from(matched).map(function (el) {
134
- return el.id;
135
- })).toEqual(['index-size']);
136
- });
137
- it('leaves the radical index box itself unscaled', function () {
138
- // Scaling `.ML__sqrt-index` would scale the em-based top/height offsets
139
- // that tuck the index into the radical, lifting it clear of the crook.
140
- var _rule = rule(),
141
- selector = _rule.selector;
142
- expect(selector).not.toMatch(/\.ML__sqrt-index\s*\{?$/);
143
- expect(selector.startsWith('& .ML__sqrt-index >')).toBe(true);
144
- });
145
- it('applies wherever math renders - keypad labels, static math, mathfield', function () {
146
- // eslint-disable-next-line global-require
147
- var cs = require('../mf/common-styles');
148
- var _rule2 = rule(),
149
- selector = _rule2.selector;
150
- ['commonKeyboardStyles', 'commonMathLiveStyles', 'supsubStyles'].forEach(function (name) {
151
- expect(cs[name][selector]).toBeDefined();
152
- });
153
-
154
- // The live mathfield renders in a shadow root, which host styles cannot
155
- // reach, so the same rule ships as plain CSS for `applyShadowStyles`.
156
- expect(cs.ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
157
- // Derived, so the size lives in one place: the two copies cannot drift.
158
- expect(cs.ROOT_INDEX_CSS).toContain("font-size:".concat(rule().value));
159
- });
160
- });
161
- it('applies those rules wherever static math renders', function () {
162
- // eslint-disable-next-line global-require
163
- var cs = require('../mf/common-styles');
164
- ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach(function (name) {
165
- expect(cs[name]['& .ML__stretchy']).toBeDefined();
166
- expect(cs[name]['& .ML__base']).toBeDefined();
167
- });
168
- });
169
-
170
- // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
171
- // is descendant-scoped to .ML__latex .ML__stretchy svg.
172
- it('does not use a blanket svg rule', function () {
173
- // eslint-disable-next-line global-require
174
- var cs = require('../mf/common-styles');
175
- Object.values(cs).forEach(function (style) {
176
- if (style && (0, _typeof2["default"])(style) === 'object') {
177
- expect(Object.keys(style)).not.toContain('& svg');
178
- }
179
- });
180
- });
181
-
182
- // The Percent key showed as a blank button on the Advanced Algebra keypad
183
- // (row 1, position 6). MathQuill defined `LatexCmds['%']` as a symbol that
184
- // serialised to `\\%`, so its bare `%` label parsed fine; MathLive parses real
185
- // LaTeX, where `%` opens a comment - the label rendered nothing, and pressing
186
- // the key inserted a comment that swallowed the rest of the expression.
187
- it('the percent key is escaped, not a latex comment', function () {
188
- // eslint-disable-next-line global-require
189
- var _require3 = require('../keys/misc'),
190
- percentage = _require3.percentage;
191
- expect(percentage.latex).toEqual('\\%');
192
- expect((0, _latexBridge.keyToAction)(percentage).value).toEqual('\\%');
193
- });
194
-
195
- // Any bare `%` in a key would fail the same way, silently.
196
- it('no keypad key carries an unescaped %', function () {
197
- // eslint-disable-next-line global-require
198
- var _require4 = require('../keys'),
199
- baseSet = _require4.baseSet;
200
- // eslint-disable-next-line global-require
201
- var _require5 = require('../keys/grades'),
202
- gradeSets = _require5.gradeSets;
203
- var every = [].concat((0, _toConsumableArray2["default"])(baseSet), (0, _toConsumableArray2["default"])(gradeSets.map(function (g) {
204
- return g.set;
205
- })));
206
- var _walk = function walk(node) {
207
- if (Array.isArray(node)) {
208
- node.forEach(_walk);
209
- return;
210
- }
211
- if (!node) {
212
- return;
213
- }
214
- ['latex', 'write', 'command'].forEach(function (field) {
215
- var value = node[field];
216
- if (typeof value === 'string') {
217
- // a `%` is only safe when preceded by an odd run of backslashes
218
- expect(value.replace(/\\./g, '')).not.toContain('%');
219
- }
220
- });
221
- };
222
- _walk(every);
223
- });
224
25
  it('leaves latex without empty groups alone', function () {
225
26
  ['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
226
27
  expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
@@ -240,4 +41,4 @@ describe('keypad label display normalisation', function () {
240
41
  expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
241
42
  });
242
43
  });
243
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsIm91dCIsImxhdGV4Rm9yRGlzcGxheSIsImV4cGVjdCIsIm5vdCIsInRvRXF1YWwiLCJ0b0NvbnRhaW4iLCJlYWNoIiwiX25hbWUiLCJsYXRleCIsIm9wZW4iLCJjbG9zZSIsInRvTWF0aExpdmUiLCJzdGFydHNXaXRoIiwiY29uY2F0IiwidG9CZSIsImVuZHNXaXRoIiwidG9NYXRjaCIsImZvckVhY2giLCJnZW9tZXRyeSIsIk9iamVjdCIsInZhbHVlcyIsImtleSIsIl9yZXF1aXJlIiwicGxhY2Vob2xkZXJTdHlsZXMiLCJwb3NpdGlvbiIsImxlZnQiLCJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJJTkRFWF9NQVJLVVAiLCJydWxlIiwiX3JlcXVpcmUyIiwicm9vdEluZGV4U3R5bGVzIiwic2VsZWN0b3JzIiwia2V5cyIsInRvSGF2ZUxlbmd0aCIsInNlbGVjdG9yIiwidmFsdWUiLCJmb250U2l6ZSIsImhvbGRlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsIm1hdGNoZWQiLCJxdWVyeVNlbGVjdG9yQWxsIiwicmVwbGFjZSIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImVsIiwiaWQiLCJfcnVsZSIsImNzIiwiX3J1bGUyIiwibmFtZSIsInRvQmVEZWZpbmVkIiwiUk9PVF9JTkRFWF9DU1MiLCJzdHlsZSIsIl90eXBlb2YyIiwiX3JlcXVpcmUzIiwicGVyY2VudGFnZSIsImtleVRvQWN0aW9uIiwiX3JlcXVpcmU0IiwiYmFzZVNldCIsIl9yZXF1aXJlNSIsImdyYWRlU2V0cyIsImV2ZXJ5IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImciLCJzZXQiLCJ3YWxrIiwibm9kZSIsImlzQXJyYXkiLCJmaWVsZCIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18va2V5cGFkLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhWaXNpYmxlRW1wdHlTbG90cyBhcyBsYXRleEZvckRpc3BsYXkgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IHsga2V5VG9BY3Rpb24sIHRvTWF0aExpdmUgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG4vKipcbiAqIEtleXMgdXNlIGVtcHR5IGdyb3VwcyB0byBzaG93IGEgY29tbWFuZCdzIHNoYXBlIChgXFxmcmFje317fWAsIGB4Xnt9YCkuXG4gKiBNYXRoTGl2ZSByZW5kZXJzIGB7fWAgYXMgbm90aGluZywgc28gbGFiZWxzIG5lZWQgYSB2aXNpYmxlIHN0YW5kLWluIC0gYnV0IHRoZVxuICogdmFsdWUgdGhhdCBnZXRzICppbnNlcnRlZCogbXVzdCBzdGF5IHVudG91Y2hlZC5cbiAqL1xuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCBkaXNwbGF5IG5vcm1hbGlzYXRpb24nLCAoKSA9PiB7XG4gIGl0KCdnaXZlcyBlbXB0eSBncm91cHMgYSB2aXNpYmxlIGdseXBoJywgKCkgPT4ge1xuICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheSgnXFxcXGZyYWN7fXt9Jyk7XG5cbiAgICBleHBlY3Qob3V0KS5ub3QudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgLy8gYSBcXHJ1bGUsIG5vdCBhIGdseXBoOiBmb250IG1ldHJpY3MgZm9yIGEgc3Vic3RpdHV0ZWQgZ2x5cGggZG8gbm90IG1hdGNoXG4gICAgLy8gTWF0aExpdmUncywgd2hpY2ggbGVmdCBzdHJldGNoeSBhY2NlbnRzIG5hcnJvd2VyIHRoYW4gdGhlIGJveFxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbignXFxcXHJ1bGUnKTtcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbJ2Fic29sdXRlIHZhbHVlJywgJ1xcXFxhYnN7fScsICd8JywgJ3wnXSxcbiAgICBbJ3BhcmVudGhlc2lzJywgJ1xcXFxsZWZ0KFxcXFxyaWdodCknLCAnKCcsICcpJ10sXG4gICAgWydicmFja2V0cycsICdcXFxcbGVmdFtcXFxccmlnaHRdJywgJ1snLCAnXSddLFxuICBdKSgnZ2l2ZXMgYW4gZW1wdHkgJXMgYSB0YWxsLCBmaWxsZWQgc2xvdCAodGhlIHNhbWUgbXV0ZWQgdGFnIGFzIG90aGVyIHNsb3RzKScsIChfbmFtZSwgbGF0ZXgsIG9wZW4sIGNsb3NlKSA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbGF0ZXhGb3JEaXNwbGF5KHRvTWF0aExpdmUobGF0ZXgpKTtcblxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5PTEnKTtcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ1xcXFxydWxlWy0wLjI1ZW1dezAuNTVlbX17MWVtfScpO1xuICAgIGV4cGVjdChvdXQpLm5vdC50b0NvbnRhaW4oJ1xcXFxib3hlZCcpO1xuICAgIC8vIHRoZSBzdHJ1dCB0aGF0IGtlZXBzIHRoZSBmZW5jZXMgdGFsbCB3aGlsZSB0aGUgYm94IGlzIGNlbnRyZWQgb24gdGhlIGF4aXNcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ1xcXFxydWxlezBlbX17MWVtfScpO1xuICAgIGV4cGVjdChvdXQuc3RhcnRzV2l0aChgXFxcXGxlZnQke29wZW59YCkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KG91dC5lbmRzV2l0aChgXFxcXHJpZ2h0JHtjbG9zZX1gKSkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2FsaWducyBhbiBlbXB0eSBzZWdtZW50IHdpdGggdGhlIHJheSBhbmQgbGluZSBrZXlzOiBiYXIgdXAgdG8gdGhlIHNoYWZ0LCBib3ggZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvdXQgPSBsYXRleEZvckRpc3BsYXkoJ1xcXFxvdmVybGluZXt9Jyk7XG5cbiAgICAvLyBzdHJ1dCBpbnNpZGUgdGhlIGJhciAoYmFyIHVwKSBhbmQgb25lIGJlZm9yZSBpdCAobGFiZWwgZG93bilcbiAgICBleHBlY3Qob3V0KS50b01hdGNoKC9eXFxcXHJ1bGVcXHswZW1cXH1cXHsxXFwuM2VtXFx9XFxcXG92ZXJsaW5lXFx7XFxcXHJ1bGVcXHswZW1cXH1cXHswXFwuODdlbVxcfS8pO1xuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gICAgLy8gdGhlIHJheSBhbmQgbGluZSBrZXlzIGFyZSB0aGUgcmVmZXJlbmNlLCBzbyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgd2VyZVxuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkoJ1xcXFxvdmVycmlnaHRhcnJvd3t9JykpLm5vdC50b0NvbnRhaW4oJ1xcXFxydWxlezBlbX0nKTtcbiAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KCdcXFxcb3ZlcmxlZnRyaWdodGFycm93e30nKSkubm90LnRvQ29udGFpbignXFxcXHJ1bGV7MGVtfScpO1xuICAgIC8vIGEgZmlsbGVkIGJhciBpcyB1bnRvdWNoZWRcbiAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KCdcXFxcb3ZlcmxpbmV7QUJ9JykpLnRvRXF1YWwoJ1xcXFxvdmVybGluZXtBQn0nKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyBhIGZpbGxlZCBwYWlyIG9mIGZlbmNlcyBhbG9uZScsICgpID0+IHtcbiAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KHRvTWF0aExpdmUoJ1xcXFxhYnN7eH0nKSkpLnRvRXF1YWwoJ1xcXFxsZWZ0fHhcXFxccmlnaHR8Jyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnXFxcXGxlZnQoeFxcXFxyaWdodCknKSkudG9FcXVhbCgnXFxcXGxlZnQoeFxcXFxyaWdodCknKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgZXZlcnkgZW1wdHktZ3JvdXAga2V5IHNoYXBlJywgKCkgPT4ge1xuICAgIFtcbiAgICAgICdcXFxcZnJhY3t9e30nLFxuICAgICAgJ1xcXFxvdmVybGluZXt9JyxcbiAgICAgICd4Xnt9JyxcbiAgICAgICd4X3t9JyxcbiAgICAgICdcXFxcc3FydHt9JyxcbiAgICAgICdcXFxcc3FydFt7fV17fScsXG4gICAgICAnXFxcXGFic3t9JyxcbiAgICAgICdcXFxcbG9nX3t9JyxcbiAgICAgICdcXFxcbG9uZ2Rpdnt9JyxcbiAgICBdLmZvckVhY2goKGxhdGV4KSA9PiB7XG4gICAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KGxhdGV4KSkubm90LnRvQ29udGFpbigne30nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3RyZWF0cyBhIHdoaXRlc3BhY2Utb25seSBncm91cCBhcyBlbXB0eScsICgpID0+IHtcbiAgICAvLyBlLmcuIFxcZnJhY3t4fXsgfVxuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkoJ1xcXFxmcmFje3h9eyB9JykpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gIH0pO1xuXG4gIC8vIE1hdGhRdWlsbCBuZWVkZWQgYSBuZXN0ZWQgXFxvdmVybGluZXt9IHRvIGRyYXcgdGhlIGVtcHR5IGJveC4gTWF0aExpdmVcbiAgLy8gcmVuZGVycyB0aGF0IGFzIGEgcmVhbCBsaW5lLCBzbyB0aG9zZSBsYWJlbHMgc2hvd2VkIGEgc3B1cmlvdXMgYmFyIChhIGxpbmVcbiAgLy8gdW5kZXIgdGhlIGFycm93cywgYW5kIGEgc3RyYWlnaHQgbGluZSBpbnN0ZWFkIG9mIHRoZSBhcmMpLlxuICBpdCgnYWNjZW50IGtleXMgZG8gbm90IGNhcnJ5IHRoZSBuZXN0ZWQtb3ZlcmxpbmUgYm94IGhhY2snLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgZ2VvbWV0cnkgPSByZXF1aXJlKCcuLi9rZXlzL2dlb21ldHJ5Jyk7XG5cbiAgICBPYmplY3QudmFsdWVzKGdlb21ldHJ5KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleS5sYXRleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXhwZWN0KGtleS5sYXRleCkubm90LnRvQ29udGFpbignXFxcXG92ZXJsaW5le319Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdhbiBhY2NlbnQgb3ZlciBhbiBlbXB0eSBzbG90IHN0aWxsIGdldHMgYSB2aXNpYmxlIGJveCcsICgpID0+IHtcbiAgICBbJ1xcXFxvdmVybGVmdHJpZ2h0YXJyb3d7fScsICdcXFxcb3ZlcmFyY3t9J10uZm9yRWFjaCgobGF0ZXgpID0+IHtcbiAgICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheShsYXRleCk7XG5cbiAgICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gICAgICBleHBlY3Qob3V0KS5ub3QudG9Db250YWluKCdcXFxcb3ZlcmxpbmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQSBnbHlwaCdzIHdpZHRoIGNvbWVzIGZyb20gZm9udCBtZXRyaWNzOyBVKzI1QUIgaXMgbm90IGluIHRoZSBLYVRlWCBmb250cyxcbiAgLy8gc28gdGhlIGJyb3dzZXIgc3Vic3RpdHV0ZWQgYSB3aWRlciBvbmUgYW5kIHN0cmV0Y2h5IGFjY2VudHMgY2FtZSBvdXRcbiAgLy8gbmFycm93ZXIgdGhhbiB0aGUgYm94LiBBIHJ1bGUgaGFzIGFuIGV4cGxpY2l0IHdpZHRoLlxuICBpdCgndGhlIGVtcHR5IHNsb3QgaGFzIGFuIGV4cGxpY2l0IHdpZHRoLCBub3QgZm9udC1kZXBlbmRlbnQgbWV0cmljcycsICgpID0+IHtcbiAgICBjb25zdCBvdXQgPSBsYXRleEZvckRpc3BsYXkoJ1xcXFxvdmVyYXJje30nKTtcblxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbignXFxcXHJ1bGUnKTtcbiAgICBleHBlY3Qob3V0KS50b01hdGNoKC9ydWxlXFx7W1xcZC5dK2VtXFx9XFx7W1xcZC5dK2VtXFx9Lyk7XG4gICAgZXhwZWN0KG91dCkubm90LnRvQ29udGFpbigndW5pY29kZScpO1xuICB9KTtcblxuICAvLyBNZWFzdXJlZCBpbiB0aGUgYnJvd3NlcjogdGhlIGFjY2VudCdzIGltbWVkaWF0ZSB3cmFwcGVyIGNvbXB1dGVzIHRvIDBweFxuICAvLyAoaXRzIC5NTF9fc3RyZXRjaHkgY2hpbGQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkKSwgc28gdGhlIHN2ZyB3aWR0aCBoYXMgdG9cbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IC5NTF9fYmFzZSAtIHdob3NlIHdpZHRoIGVxdWFscyB0aGUgY29udGVudC4gV2l0aG91dCBwaW5uaW5nXG4gIC8vIHRoYXQsIHRoZSBhcmMgY29sbGFwc2VkIHRvIGEgc3Bpa2UgYW5kIHNhdCByaWdodCBvZiB0aGUgYm94LlxuICBpdCgncGlucyB0aGUgYWNjZW50IGNvbnRhaW5pbmcgYmxvY2sgYW5kIGRyb3BzIHRoZSBjZW50ZXJpbmcgc2hpZnQnLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgeyBwbGFjZWhvbGRlclN0eWxlcyB9ID0gcmVxdWlyZSgnLi4vbWYvY29tbW9uLXN0eWxlcycpO1xuXG4gICAgZXhwZWN0KHBsYWNlaG9sZGVyU3R5bGVzWycmIC5NTF9fYmFzZSddLnBvc2l0aW9uKS50b0VxdWFsKCdyZWxhdGl2ZScpO1xuICAgIGV4cGVjdChwbGFjZWhvbGRlclN0eWxlc1snJiAuTUxfX3N0cmV0Y2h5J10pLnRvRXF1YWwoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgbGVmdDogMCwgd2lkdGg6ICcxMDAlJyB9KTtcbiAgICAvLyBtdXN0IGJlICFpbXBvcnRhbnQ6IE1hdGhMaXZlIHdyaXRlcyBtYXJnaW4tbGVmdCBhcyBhbiBpbmxpbmUgc3R5bGUsIGFuZCBhXG4gICAgLy8gY2xhc3MgY2Fubm90IG92ZXJyaWRlIHRoYXQuIExlYXZpbmcgaXQgdW4taW1wb3J0YW50IGFsc28gaGFsdmVkIHRoZSBhcmMnc1xuICAgIC8vIHdpZHRoLCBiZWNhdXNlIC5NTF9fY2VudGVyIGlzIHRoZSBzdHJldGNoeSdzIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgZXhwZWN0KHBsYWNlaG9sZGVyU3R5bGVzWycmIC5NTF9fY2VudGVyOmhhcyguTUxfX3N0cmV0Y2h5KSddLm1hcmdpbkxlZnQpLnRvRXF1YWwoJzAgIWltcG9ydGFudCcpO1xuICB9KTtcblxuICAvLyBNYXRoTGl2ZSBzZXRzIHRoZSBpbmRleCBvZiBcXHNxcnRbbl17eH0gaW4gc2NyaXB0c2NyaXB0c3R5bGUgLSBhbiBpbmxpbmVcbiAgLy8gYGZvbnQtc2l6ZTogNTAlYCAtIHdoaWNoIGlzIHRvbyBzbWFsbCB0byByZWFkIG9uIHRoZSBudGgtcm9vdCBrZXkgYW5kIGluXG4gIC8vIGF1dGhvcmVkIHJhZGljYWxzLiBJdCBpcyBzY2FsZWQgdXAgdG8gODAlLlxuICBkZXNjcmliZSgncmFkaWNhbCBpbmRleCBzaXplJywgKCkgPT4ge1xuICAgIC8vIFJlYWwgTWF0aExpdmUgMC4xMTAgb3V0cHV0IGZvciBgXFxzcXJ0WzFdezJ9YCwgdHJpbW1lZCB0byB0aGUgaW5kZXguIFRoZVxuICAgIC8vIHNlbGVjdG9yIHdhbGtzIHRoaXMgZXhhY3QgY2hhaW4sIHNvIHRoaXMgZml4dHVyZSBpcyB3aGF0IHBpbnMgaXQgZG93bi5cbiAgICBjb25zdCBJTkRFWF9NQVJLVVAgPSBgXG4gICAgICA8c3BhbiBjbGFzcz1cIk1MX19iYXNlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3NxcnQtaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIk1MX192bGlzdC10XCI+PHNwYW4gY2xhc3M9XCJNTF9fdmxpc3QtclwiPjxzcGFuIGNsYXNzPVwiTUxfX3ZsaXN0XCIgc3R5bGU9XCJoZWlnaHQ6MC43OGVtXCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDotMy40NWVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3BzdHJ1dFwiIHN0eWxlPVwiaGVpZ2h0OjNlbVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJpbmRleC1zaXplXCIgc3R5bGU9XCJoZWlnaHQ6MC4zM2VtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTogNTAlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJNTF9fY21yXCI+MTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cIm5lc3RlZC1zaXplXCIgc3R5bGU9XCJmb250LXNpemU6IDUwJVwiPm5lc3RlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj48L3NwYW4+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3NxcnQtc2lnblwiPjxzcGFuIGNsYXNzPVwiTUxfX2RlbGltLXNpemUxXCI+JiM4NzMwOzwvc3Bhbj48L3NwYW4+XG4gICAgICA8L3NwYW4+YDtcblxuICAgIGNvbnN0IHJ1bGUgPSAoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICAgIGNvbnN0IHsgcm9vdEluZGV4U3R5bGVzIH0gPSByZXF1aXJlKCcuLi9tZi9jb21tb24tc3R5bGVzJyk7XG4gICAgICBjb25zdCBzZWxlY3RvcnMgPSBPYmplY3Qua2V5cyhyb290SW5kZXhTdHlsZXMpO1xuXG4gICAgICBleHBlY3Qoc2VsZWN0b3JzKS50b0hhdmVMZW5ndGgoMSk7XG5cbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBzZWxlY3RvcnNbMF0sIHZhbHVlOiByb290SW5kZXhTdHlsZXNbc2VsZWN0b3JzWzBdXS5mb250U2l6ZSB9O1xuICAgIH07XG5cbiAgICBpdChcInNjYWxlcyB0aGUgaW5kZXggZ2x5cGggdG8gODAlLCB1cCBmcm9tIE1hdGhMaXZlJ3MgNTAlXCIsICgpID0+IHtcbiAgICAgIC8vICFpbXBvcnRhbnQ6IHRoZSA1MCUgaXMgYW4gaW5saW5lIHN0eWxlLCB3aGljaCBhIGNsYXNzIGNhbm5vdCBvdmVycmlkZS5cbiAgICAgIGV4cGVjdChydWxlKCkudmFsdWUpLnRvRXF1YWwoJzgwJSAhaW1wb3J0YW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGFyZ2V0cyB0aGUgc3BhbiBNYXRoTGl2ZSBwdXRzIHRoZSBpbmxpbmUgZm9udC1zaXplIG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGhvbGRlci5pbm5lckhUTUwgPSBJTkRFWF9NQVJLVVA7XG5cbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBob2xkZXIucXVlcnlTZWxlY3RvckFsbChydWxlKCkuc2VsZWN0b3IucmVwbGFjZSgvXiZcXHMqLywgJycpKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmZyb20obWF0Y2hlZCkubWFwKChlbCkgPT4gZWwuaWQpKS50b0VxdWFsKFsnaW5kZXgtc2l6ZSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIHJhZGljYWwgaW5kZXggYm94IGl0c2VsZiB1bnNjYWxlZCcsICgpID0+IHtcbiAgICAgIC8vIFNjYWxpbmcgYC5NTF9fc3FydC1pbmRleGAgd291bGQgc2NhbGUgdGhlIGVtLWJhc2VkIHRvcC9oZWlnaHQgb2Zmc2V0c1xuICAgICAgLy8gdGhhdCB0dWNrIHRoZSBpbmRleCBpbnRvIHRoZSByYWRpY2FsLCBsaWZ0aW5nIGl0IGNsZWFyIG9mIHRoZSBjcm9vay5cbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgZXhwZWN0KHNlbGVjdG9yKS5ub3QudG9NYXRjaCgvXFwuTUxfX3NxcnQtaW5kZXhcXHMqXFx7PyQvKTtcbiAgICAgIGV4cGVjdChzZWxlY3Rvci5zdGFydHNXaXRoKCcmIC5NTF9fc3FydC1pbmRleCA+JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYXBwbGllcyB3aGVyZXZlciBtYXRoIHJlbmRlcnMgLSBrZXlwYWQgbGFiZWxzLCBzdGF0aWMgbWF0aCwgbWF0aGZpZWxkJywgKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgWydjb21tb25LZXlib2FyZFN0eWxlcycsICdjb21tb25NYXRoTGl2ZVN0eWxlcycsICdzdXBzdWJTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGV4cGVjdChjc1tuYW1lXVtzZWxlY3Rvcl0pLnRvQmVEZWZpbmVkKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGxpdmUgbWF0aGZpZWxkIHJlbmRlcnMgaW4gYSBzaGFkb3cgcm9vdCwgd2hpY2ggaG9zdCBzdHlsZXMgY2Fubm90XG4gICAgICAvLyByZWFjaCwgc28gdGhlIHNhbWUgcnVsZSBzaGlwcyBhcyBwbGFpbiBDU1MgZm9yIGBhcHBseVNoYWRvd1N0eWxlc2AuXG4gICAgICBleHBlY3QoY3MuUk9PVF9JTkRFWF9DU1MpLnRvQ29udGFpbignLk1MX19zcXJ0LWluZGV4ID4nKTtcbiAgICAgIC8vIERlcml2ZWQsIHNvIHRoZSBzaXplIGxpdmVzIGluIG9uZSBwbGFjZTogdGhlIHR3byBjb3BpZXMgY2Fubm90IGRyaWZ0LlxuICAgICAgZXhwZWN0KGNzLlJPT1RfSU5ERVhfQ1NTKS50b0NvbnRhaW4oYGZvbnQtc2l6ZToke3J1bGUoKS52YWx1ZX1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgdGhvc2UgcnVsZXMgd2hlcmV2ZXIgc3RhdGljIG1hdGggcmVuZGVycycsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcblxuICAgIFsnY29tbW9uS2V5Ym9hcmRTdHlsZXMnLCAnY29tbW9uTWF0aExpdmVTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBleHBlY3QoY3NbbmFtZV1bJyYgLk1MX19zdHJldGNoeSddKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGNzW25hbWVdWycmIC5NTF9fYmFzZSddKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIGJhcmUgYCYgc3ZnYCBydWxlIHJlLXBhcmVudHMgZXZlcnkgc3ZnIGluIHRoZSBzdWJ0cmVlOyBNYXRoTGl2ZSdzIG93biBydWxlXG4gIC8vIGlzIGRlc2NlbmRhbnQtc2NvcGVkIHRvIC5NTF9fbGF0ZXggLk1MX19zdHJldGNoeSBzdmcuXG4gIGl0KCdkb2VzIG5vdCB1c2UgYSBibGFua2V0IHN2ZyBydWxlJywgKCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIGNvbnN0IGNzID0gcmVxdWlyZSgnLi4vbWYvY29tbW9uLXN0eWxlcycpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyhjcykuZm9yRWFjaCgoc3R5bGUpID0+IHtcbiAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdHlsZSkpLm5vdC50b0NvbnRhaW4oJyYgc3ZnJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBQZXJjZW50IGtleSBzaG93ZWQgYXMgYSBibGFuayBidXR0b24gb24gdGhlIEFkdmFuY2VkIEFsZ2VicmEga2V5cGFkXG4gIC8vIChyb3cgMSwgcG9zaXRpb24gNikuIE1hdGhRdWlsbCBkZWZpbmVkIGBMYXRleENtZHNbJyUnXWAgYXMgYSBzeW1ib2wgdGhhdFxuICAvLyBzZXJpYWxpc2VkIHRvIGBcXFxcJWAsIHNvIGl0cyBiYXJlIGAlYCBsYWJlbCBwYXJzZWQgZmluZTsgTWF0aExpdmUgcGFyc2VzIHJlYWxcbiAgLy8gTGFUZVgsIHdoZXJlIGAlYCBvcGVucyBhIGNvbW1lbnQgLSB0aGUgbGFiZWwgcmVuZGVyZWQgbm90aGluZywgYW5kIHByZXNzaW5nXG4gIC8vIHRoZSBrZXkgaW5zZXJ0ZWQgYSBjb21tZW50IHRoYXQgc3dhbGxvd2VkIHRoZSByZXN0IG9mIHRoZSBleHByZXNzaW9uLlxuICBpdCgndGhlIHBlcmNlbnQga2V5IGlzIGVzY2FwZWQsIG5vdCBhIGxhdGV4IGNvbW1lbnQnLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgeyBwZXJjZW50YWdlIH0gPSByZXF1aXJlKCcuLi9rZXlzL21pc2MnKTtcblxuICAgIGV4cGVjdChwZXJjZW50YWdlLmxhdGV4KS50b0VxdWFsKCdcXFxcJScpO1xuICAgIGV4cGVjdChrZXlUb0FjdGlvbihwZXJjZW50YWdlKS52YWx1ZSkudG9FcXVhbCgnXFxcXCUnKTtcbiAgfSk7XG5cbiAgLy8gQW55IGJhcmUgYCVgIGluIGEga2V5IHdvdWxkIGZhaWwgdGhlIHNhbWUgd2F5LCBzaWxlbnRseS5cbiAgaXQoJ25vIGtleXBhZCBrZXkgY2FycmllcyBhbiB1bmVzY2FwZWQgJScsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGJhc2VTZXQgfSA9IHJlcXVpcmUoJy4uL2tleXMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGdyYWRlU2V0cyB9ID0gcmVxdWlyZSgnLi4va2V5cy9ncmFkZXMnKTtcblxuICAgIGNvbnN0IGV2ZXJ5ID0gWy4uLmJhc2VTZXQsIC4uLmdyYWRlU2V0cy5tYXAoKGcpID0+IGcuc2V0KV07XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIG5vZGUuZm9yRWFjaCh3YWxrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBbJ2xhdGV4JywgJ3dyaXRlJywgJ2NvbW1hbmQnXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbZmllbGRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gYSBgJWAgaXMgb25seSBzYWZlIHdoZW4gcHJlY2VkZWQgYnkgYW4gb2RkIHJ1biBvZiBiYWNrc2xhc2hlc1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5yZXBsYWNlKC9cXFxcLi9nLCAnJykpLm5vdC50b0NvbnRhaW4oJyUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdhbGsoZXZlcnkpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGxhdGV4IHdpdGhvdXQgZW1wdHkgZ3JvdXBzIGFsb25lJywgKCkgPT4ge1xuICAgIFsnXFxcXHBpJywgJ1xcXFxzaW4nLCAneF4yJywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheShsYXRleCkpLnRvRXF1YWwobGF0ZXgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnJykpLnRvRXF1YWwoJycpO1xuICB9KTtcblxuICBpdCgnZG9lcyBOT1QgYWZmZWN0IHdoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICAvLyB0aGUgYWN0aW9uIG11c3QgdXNlIHRoZSBrZXkncyBvd24gbGF0ZXgsIG5ldmVyIHRoZSBkaXNwbGF5IGZvcm1cbiAgICBjb25zdCBrZXkgPSB7IG5hbWU6ICdmcmFjJywgbGF0ZXg6ICdcXFxcZnJhY3t9e30nIH07XG5cbiAgICBleHBlY3Qoa2V5VG9BY3Rpb24oa2V5KS52YWx1ZSkudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgZXhwZWN0KGtleVRvQWN0aW9uKGtleSkudmFsdWUpLm5vdC50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUMsUUFBUSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07RUFDbkRDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxZQUFNO0lBQzdDLElBQU1DLEdBQUcsR0FBRyxJQUFBQyxrQ0FBZSxFQUFDLFlBQVksQ0FBQztJQUV6Q0MsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0csR0FBRyxDQUFDQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3JDO0lBQ0E7SUFDQUYsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUMvQkgsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRk4sRUFBRSxDQUFDTyxJQUFJLENBQUMsQ0FDTixDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQ3ZDLENBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDNUMsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUMxQyxDQUFDLENBQUMsMkVBQTJFLEVBQUUsVUFBQ0MsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFLO0lBQzdHLElBQU1WLEdBQUcsR0FBRyxJQUFBQyxrQ0FBZSxFQUFDLElBQUFVLHVCQUFVLEVBQUNILEtBQUssQ0FBQyxDQUFDO0lBRTlDTixNQUFNLENBQUNGLEdBQUcs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
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsIm91dCIsImxhdGV4Rm9yRGlzcGxheSIsImV4cGVjdCIsIm5vdCIsInRvRXF1YWwiLCJ0b0NvbnRhaW4iLCJmb3JFYWNoIiwibGF0ZXgiLCJ1bmRlZmluZWQiLCJrZXkiLCJuYW1lIiwia2V5VG9BY3Rpb24iLCJ2YWx1ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18va2V5cGFkLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhWaXNpYmxlRW1wdHlTbG90cyBhcyBsYXRleEZvckRpc3BsYXkgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IHsga2V5VG9BY3Rpb24gfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG4vKipcbiAqIEtleXMgdXNlIGVtcHR5IGdyb3VwcyB0byBzaG93IGEgY29tbWFuZCdzIHNoYXBlIChgXFxmcmFje317fWAsIGB4Xnt9YCkuXG4gKiBNYXRoTGl2ZSByZW5kZXJzIGB7fWAgYXMgbm90aGluZywgc28gbGFiZWxzIG5lZWQgYSB2aXNpYmxlIHN0YW5kLWluIC0gYnV0IHRoZVxuICogdmFsdWUgdGhhdCBnZXRzICppbnNlcnRlZCogbXVzdCBzdGF5IHVudG91Y2hlZC5cbiAqL1xuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCBkaXNwbGF5IG5vcm1hbGlzYXRpb24nLCAoKSA9PiB7XG4gIGl0KCdnaXZlcyBlbXB0eSBncm91cHMgYSB2aXNpYmxlIGdseXBoJywgKCkgPT4ge1xuICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheSgnXFxcXGZyYWN7fXt9Jyk7XG5cbiAgICBleHBlY3Qob3V0KS5ub3QudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgZXhwZWN0KG91dCkudG9Db250YWluKCcyNUFCJyk7IC8vIHdoaXRlIHNtYWxsIHNxdWFyZVxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIGV2ZXJ5IGVtcHR5LWdyb3VwIGtleSBzaGFwZScsICgpID0+IHtcbiAgICBbXG4gICAgICAnXFxcXGZyYWN7fXt9JyxcbiAgICAgICdcXFxcb3ZlcmxpbmV7fScsXG4gICAgICAneF57fScsXG4gICAgICAneF97fScsXG4gICAgICAnXFxcXHNxcnR7fScsXG4gICAgICAnXFxcXHNxcnRbe31de30nLFxuICAgICAgJ1xcXFxhYnN7fScsXG4gICAgICAnXFxcXGxvZ197fScsXG4gICAgICAnXFxcXGxvbmdkaXZ7fScsXG4gICAgXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheShsYXRleCkpLm5vdC50b0NvbnRhaW4oJ3t9Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd0cmVhdHMgYSB3aGl0ZXNwYWNlLW9ubHkgZ3JvdXAgYXMgZW1wdHknLCAoKSA9PiB7XG4gICAgLy8gZS5nLiBcXGZyYWN7eH17IH1cbiAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KCdcXFxcZnJhY3t4fXsgfScpKS50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGxhdGV4IHdpdGhvdXQgZW1wdHkgZ3JvdXBzIGFsb25lJywgKCkgPT4ge1xuICAgIFsnXFxcXHBpJywgJ1xcXFxzaW4nLCAneF4yJywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheShsYXRleCkpLnRvRXF1YWwobGF0ZXgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnJykpLnRvRXF1YWwoJycpO1xuICB9KTtcblxuICBpdCgnZG9lcyBOT1QgYWZmZWN0IHdoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICAvLyB0aGUgYWN0aW9uIG11c3QgdXNlIHRoZSBrZXkncyBvd24gbGF0ZXgsIG5ldmVyIHRoZSBkaXNwbGF5IGZvcm1cbiAgICBjb25zdCBrZXkgPSB7IG5hbWU6ICdmcmFjJywgbGF0ZXg6ICdcXFxcZnJhY3t9e30nIH07XG5cbiAgICBleHBlY3Qoa2V5VG9BY3Rpb24oa2V5KS52YWx1ZSkudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgZXhwZWN0KGtleVRvQWN0aW9uKGtleSkudmFsdWUpLm5vdC50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUMsUUFBUSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07RUFDbkRDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxZQUFNO0lBQzdDLElBQU1DLEdBQUcsR0FBRyxJQUFBQyxrQ0FBZSxFQUFDLFlBQVksQ0FBQztJQUV6Q0MsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0csR0FBRyxDQUFDQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3JDRixNQUFNLENBQUNGLEdBQUcsQ0FBQyxDQUFDSyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMvQkgsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRk4sRUFBRSxDQUFDLHFDQUFxQyxFQUFFLFlBQU07SUFDOUMsQ0FDRSxZQUFZLEVBQ1osY0FBYyxFQUNkLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsQ0FDZCxDQUFDTyxPQUFPLENBQUMsVUFBQ0MsS0FBSyxFQUFLO01BQ25CTCxNQUFNLENBQUMsSUFBQUQsa0NBQWUsRUFBQ00sS0FBSyxDQUFDLENBQUMsQ0FBQ0osR0FBRyxDQUFDRSxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ3BELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGTixFQUFFLENBQUMseUNBQXlDLEVBQUUsWUFBTTtJQUNsRDtJQUNBRyxNQUFNLENBQUMsSUFBQUQsa0NBQWUsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDSSxTQUFTLENBQUMsV0FBVyxDQUFDO0VBQ2hFLENBQUMsQ0FBQztFQUVGTixFQUFFLENBQUMseUNBQXlDLEVBQUUsWUFBTTtJQUNsRCxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUNPLE9BQU8sQ0FBQyxVQUFDQyxLQUFLLEVBQUs7TUFDNURMLE1BQU0sQ0FBQyxJQUFBRCxrQ0FBZSxFQUFDTSxLQUFLLENBQUMsQ0FBQyxDQUFDSCxPQUFPLENBQUNHLEtBQUssQ0FBQztJQUMvQyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRlIsRUFBRSxDQUFDLHVCQUF1QixFQUFFLFlBQU07SUFDaENHLE1BQU0sQ0FBQyxJQUFBRCxrQ0FBZSxFQUFDTyxTQUFTLENBQUMsQ0FBQyxDQUFDSixPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzlDRixNQUFNLENBQUMsSUFBQUQsa0NBQWUsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDRyxPQUFPLENBQUMsRUFBRSxDQUFDO0VBQ3pDLENBQUMsQ0FBQztFQUVGTCxFQUFFLENBQUMsbURBQW1ELEVBQUUsWUFBTTtJQUM1RDtJQUNBLElBQU1VLEdBQUcsR0FBRztNQUFFQyxJQUFJLEVBQUUsTUFBTTtNQUFFSCxLQUFLLEVBQUU7SUFBYSxDQUFDO0lBRWpETCxNQUFNLENBQUMsSUFBQVMsd0JBQVcsRUFBQ0YsR0FBRyxDQUFDLENBQUNHLEtBQUssQ0FBQyxDQUFDUixPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3BERixNQUFNLENBQUMsSUFBQVMsd0JBQVcsRUFBQ0YsR0FBRyxDQUFDLENBQUNHLEtBQUssQ0FBQyxDQUFDVCxHQUFHLENBQUNFLFNBQVMsQ0FBQyxXQUFXLENBQUM7RUFDM0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119