UNPKG

36.4 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6var _exportNames = {
7 invertBase16Theme: true,
8 createStyling: true,
9 getBase16Theme: true,
10 invertTheme: true,
11 Base16Theme: true
12};
13Object.defineProperty(exports, "Base16Theme", {
14 enumerable: true,
15 get: function get() {
16 return base16.Base16Theme;
17 }
18});
19exports.invertTheme = exports.invertBase16Theme = exports.getBase16Theme = exports.createStyling = void 0;
20
21var base16 = _interopRequireWildcard(require("base16"));
22
23var _color = _interopRequireDefault(require("color"));
24
25var _lodash = _interopRequireDefault(require("lodash.curry"));
26
27var _colorConverters = require("./colorConverters");
28
29var _types = require("./types");
30
31Object.keys(_types).forEach(function (key) {
32 if (key === "default" || key === "__esModule") return;
33 if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
34 if (key in exports && exports[key] === _types[key]) return;
35 Object.defineProperty(exports, key, {
36 enumerable: true,
37 get: function get() {
38 return _types[key];
39 }
40 });
41});
42
43function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
44
45function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
46
47function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
49function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
50
51function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
52
53function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
54
55function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
56
57function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
58
59function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
60
61function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
62
63function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
64
65function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
66
67function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
68
69var DEFAULT_BASE16 = base16["default"];
70var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color
71// converts to bright enough inversed color
72
73var flip = function flip(x) {
74 return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x;
75};
76
77var invertColor = function invertColor(hexString) {
78 var color = (0, _color["default"])(hexString);
79
80 var _rgb2yuv = (0, _colorConverters.rgb2yuv)(color.array()),
81 _rgb2yuv2 = _slicedToArray(_rgb2yuv, 3),
82 y = _rgb2yuv2[0],
83 u = _rgb2yuv2[1],
84 v = _rgb2yuv2[2];
85
86 var flippedYuv = [flip(y), u, v];
87 var rgb = (0, _colorConverters.yuv2rgb)(flippedYuv);
88 return _color["default"].rgb(rgb).hex();
89};
90
91var merger = function merger(styling) {
92 return function (prevStyling) {
93 return {
94 className: [prevStyling.className, styling.className].filter(Boolean).join(' '),
95 style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {})
96 };
97 };
98};
99
100var mergeStyling = function mergeStyling(customStyling, defaultStyling) {
101 if (customStyling === undefined) {
102 return defaultStyling;
103 }
104
105 if (defaultStyling === undefined) {
106 return customStyling;
107 }
108
109 var customType = _typeof(customStyling);
110
111 var defaultType = _typeof(defaultStyling);
112
113 switch (customType) {
114 case 'string':
115 switch (defaultType) {
116 case 'string':
117 return [defaultStyling, customStyling].filter(Boolean).join(' ');
118
119 case 'object':
120 return merger({
121 className: customStyling,
122 style: defaultStyling
123 });
124
125 case 'function':
126 return function (styling) {
127 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
128 args[_key - 1] = arguments[_key];
129 }
130
131 return merger({
132 className: customStyling
133 })(defaultStyling.apply(void 0, [styling].concat(args)));
134 };
135 }
136
137 break;
138
139 case 'object':
140 switch (defaultType) {
141 case 'string':
142 return merger({
143 className: defaultStyling,
144 style: customStyling
145 });
146
147 case 'object':
148 return _objectSpread(_objectSpread({}, defaultStyling), customStyling);
149
150 case 'function':
151 return function (styling) {
152 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
153 args[_key2 - 1] = arguments[_key2];
154 }
155
156 return merger({
157 style: customStyling
158 })(defaultStyling.apply(void 0, [styling].concat(args)));
159 };
160 }
161
162 break;
163
164 case 'function':
165 switch (defaultType) {
166 case 'string':
167 return function (styling) {
168 for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
169 args[_key3 - 1] = arguments[_key3];
170 }
171
172 return customStyling.apply(void 0, [merger(styling)({
173 className: defaultStyling
174 })].concat(args));
175 };
176
177 case 'object':
178 return function (styling) {
179 for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
180 args[_key4 - 1] = arguments[_key4];
181 }
182
183 return customStyling.apply(void 0, [merger(styling)({
184 style: defaultStyling
185 })].concat(args));
186 };
187
188 case 'function':
189 return function (styling) {
190 for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
191 args[_key5 - 1] = arguments[_key5];
192 }
193
194 return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args));
195 };
196 }
197
198 }
199};
200
201var mergeStylings = function mergeStylings(customStylings, defaultStylings) {
202 var keys = Object.keys(defaultStylings);
203
204 for (var key in customStylings) {
205 if (keys.indexOf(key) === -1) keys.push(key);
206 }
207
208 return keys.reduce(function (mergedStyling, key) {
209 return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling;
210 }, {});
211};
212
213var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) {
214 for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
215 args[_key6 - 2] = arguments[_key6];
216 }
217
218 if (keys === null) {
219 return mergedStyling;
220 }
221
222 if (!Array.isArray(keys)) {
223 keys = [keys];
224 }
225
226 var styles = keys.map(function (key) {
227 return mergedStyling[key];
228 }).filter(Boolean);
229 var props = styles.reduce(function (obj, s) {
230 if (typeof s === 'string') {
231 obj.className = [obj.className, s].filter(Boolean).join(' ');
232 } else if (_typeof(s) === 'object') {
233 obj.style = _objectSpread(_objectSpread({}, obj.style), s);
234 } else if (typeof s === 'function') {
235 obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args)));
236 }
237
238 return obj;
239 }, {
240 className: '',
241 style: {}
242 });
243
244 if (!props.className) {
245 delete props.className;
246 }
247
248 if (Object.keys(props.style).length === 0) {
249 delete props.style;
250 }
251
252 return props;
253};
254
255var invertBase16Theme = function invertBase16Theme(base16Theme) {
256 return Object.keys(base16Theme).reduce(function (t, key) {
257 return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t;
258 }, {});
259};
260
261exports.invertBase16Theme = invertBase16Theme;
262var createStyling = (0, _lodash["default"])(function (getStylingFromBase16) {
263 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
264 var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
265 var _options$defaultBase = options.defaultBase16,
266 defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase,
267 _options$base16Themes = options.base16Themes,
268 base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes;
269 var base16Theme = getBase16Theme(themeOrStyling, base16Themes);
270
271 if (base16Theme) {
272 themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling);
273 }
274
275 var theme = BASE16_KEYS.reduce(function (t, key) {
276 return t[key] = themeOrStyling[key] || defaultBase16[key], t;
277 }, {});
278 var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) {
279 return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s;
280 }, {});
281 var defaultStyling = getStylingFromBase16(theme);
282 var mergedStyling = mergeStylings(customStyling, defaultStyling);
283
284 for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) {
285 args[_key7 - 3] = arguments[_key7];
286 }
287
288 return (0, _lodash["default"])(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args));
289}, 3);
290exports.createStyling = createStyling;
291
292var isStylingConfig = function isStylingConfig(theme) {
293 return !!theme.extend;
294};
295
296var getBase16Theme = function getBase16Theme(theme, base16Themes) {
297 if (theme && isStylingConfig(theme) && theme.extend) {
298 theme = theme.extend;
299 }
300
301 if (typeof theme === 'string') {
302 var _theme$split = theme.split(':'),
303 _theme$split2 = _slicedToArray(_theme$split, 2),
304 _themeName = _theme$split2[0],
305 modifier = _theme$split2[1];
306
307 if (base16Themes) {
308 theme = base16Themes[_themeName];
309 } else {
310 theme = base16[_themeName];
311 }
312
313 if (modifier === 'inverted') {
314 theme = invertBase16Theme(theme);
315 }
316 }
317
318 return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined;
319};
320
321exports.getBase16Theme = getBase16Theme;
322
323var invertTheme = function invertTheme(theme) {
324 if (typeof theme === 'string') {
325 return "".concat(theme, ":inverted");
326 }
327
328 if (theme && isStylingConfig(theme) && theme.extend) {
329 if (typeof theme.extend === 'string') {
330 return _objectSpread(_objectSpread({}, theme), {}, {
331 extend: "".concat(theme.extend, ":inverted")
332 });
333 }
334
335 return _objectSpread(_objectSpread({}, theme), {}, {
336 extend: invertBase16Theme(theme.extend)
337 });
338 }
339
340 if (theme) {
341 return invertBase16Theme(theme);
342 }
343
344 return theme;
345};
346
347exports.invertTheme = invertTheme;
348//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0JBU0UxNiIsImJhc2UxNiIsIkJBU0UxNl9LRVlTIiwiT2JqZWN0Iiwia2V5cyIsImZsaXAiLCJ4IiwiaW52ZXJ0Q29sb3IiLCJoZXhTdHJpbmciLCJjb2xvciIsImFycmF5IiwieSIsInUiLCJ2IiwiZmxpcHBlZFl1diIsInJnYiIsIkNvbG9yIiwiaGV4IiwibWVyZ2VyIiwic3R5bGluZyIsInByZXZTdHlsaW5nIiwiY2xhc3NOYW1lIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJzdHlsZSIsIm1lcmdlU3R5bGluZyIsImN1c3RvbVN0eWxpbmciLCJkZWZhdWx0U3R5bGluZyIsInVuZGVmaW5lZCIsImN1c3RvbVR5cGUiLCJkZWZhdWx0VHlwZSIsImFyZ3MiLCJtZXJnZVN0eWxpbmdzIiwiY3VzdG9tU3R5bGluZ3MiLCJkZWZhdWx0U3R5bGluZ3MiLCJrZXkiLCJpbmRleE9mIiwicHVzaCIsInJlZHVjZSIsIm1lcmdlZFN0eWxpbmciLCJnZXRTdHlsaW5nQnlLZXlzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3R5bGVzIiwibWFwIiwicHJvcHMiLCJvYmoiLCJzIiwibGVuZ3RoIiwiaW52ZXJ0QmFzZTE2VGhlbWUiLCJiYXNlMTZUaGVtZSIsInQiLCJ0ZXN0IiwiY3JlYXRlU3R5bGluZyIsImdldFN0eWxpbmdGcm9tQmFzZTE2Iiwib3B0aW9ucyIsInRoZW1lT3JTdHlsaW5nIiwiZGVmYXVsdEJhc2UxNiIsImJhc2UxNlRoZW1lcyIsImdldEJhc2UxNlRoZW1lIiwidGhlbWUiLCJpc1N0eWxpbmdDb25maWciLCJleHRlbmQiLCJzcGxpdCIsInRoZW1lTmFtZSIsIm1vZGlmaWVyIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW52ZXJ0VGhlbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBMlNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFqU0EsSUFBTUEsY0FBYyxHQUFHQyxNQUFNLFdBQTdCO0FBRUEsSUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosY0FBWixDQUFwQixDLENBRUE7QUFDQTs7QUFDQSxJQUFNSyxJQUFJLEdBQUcsU0FBUEEsSUFBTyxDQUFDQyxDQUFEO0FBQUEsU0FBZ0JBLENBQUMsR0FBRyxJQUFKLEdBQVcsQ0FBWCxHQUFlQSxDQUFDLEdBQUcsR0FBSixHQUFVLE1BQU1BLENBQWhCLEdBQW9CLE1BQU1BLENBQXpEO0FBQUEsQ0FBYjs7QUFFQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDQyxTQUFELEVBQXVCO0FBQ3pDLE1BQU1DLEtBQUssR0FBRyx1QkFBTUQsU0FBTixDQUFkOztBQUNBLGlCQUFrQiw4QkFBUUMsS0FBSyxDQUFDQyxLQUFOLEVBQVIsQ0FBbEI7QUFBQTtBQUFBLE1BQU9DLENBQVA7QUFBQSxNQUFVQyxDQUFWO0FBQUEsTUFBYUMsQ0FBYjs7QUFDQSxNQUFNQyxVQUFzQixHQUFHLENBQUNULElBQUksQ0FBQ00sQ0FBRCxDQUFMLEVBQVVDLENBQVYsRUFBYUMsQ0FBYixDQUEvQjtBQUNBLE1BQU1FLEdBQUcsR0FBRyw4QkFBUUQsVUFBUixDQUFaO0FBQ0EsU0FBT0Usa0JBQU1ELEdBQU4sQ0FBVUEsR0FBVixFQUFlRSxHQUFmLEVBQVA7QUFDRCxDQU5EOztBQVFBLElBQU1DLE1BQU0sR0FBRyxTQUFUQSxNQUFTLENBQUNDLE9BQUQsRUFBK0I7QUFDNUMsU0FBTyxVQUFDQyxXQUFEO0FBQUEsV0FBb0M7QUFDekNDLE1BQUFBLFNBQVMsRUFBRSxDQUFDRCxXQUFXLENBQUNDLFNBQWIsRUFBd0JGLE9BQU8sQ0FBQ0UsU0FBaEMsRUFDUkMsTUFEUSxDQUNEQyxPQURDLEVBRVJDLElBRlEsQ0FFSCxHQUZHLENBRDhCO0FBSXpDQyxNQUFBQSxLQUFLLGtDQUFRTCxXQUFXLENBQUNLLEtBQVosSUFBcUIsRUFBN0IsR0FBc0NOLE9BQU8sQ0FBQ00sS0FBUixJQUFpQixFQUF2RDtBQUpvQyxLQUFwQztBQUFBLEdBQVA7QUFNRCxDQVBEOztBQVNBLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQ25CQyxhQURtQixFQUVuQkMsY0FGbUIsRUFHVTtBQUM3QixNQUFJRCxhQUFhLEtBQUtFLFNBQXRCLEVBQWlDO0FBQy9CLFdBQU9ELGNBQVA7QUFDRDs7QUFDRCxNQUFJQSxjQUFjLEtBQUtDLFNBQXZCLEVBQWtDO0FBQ2hDLFdBQU9GLGFBQVA7QUFDRDs7QUFFRCxNQUFNRyxVQUFVLFdBQVVILGFBQVYsQ0FBaEI7O0FBQ0EsTUFBTUksV0FBVyxXQUFVSCxjQUFWLENBQWpCOztBQUVBLFVBQVFFLFVBQVI7QUFDRSxTQUFLLFFBQUw7QUFDRSxjQUFRQyxXQUFSO0FBQ0UsYUFBSyxRQUFMO0FBQ0UsaUJBQU8sQ0FBQ0gsY0FBRCxFQUFpQkQsYUFBakIsRUFBZ0NMLE1BQWhDLENBQXVDQyxPQUF2QyxFQUFnREMsSUFBaEQsQ0FBcUQsR0FBckQsQ0FBUDs7QUFDRixhQUFLLFFBQUw7QUFDRSxpQkFBT04sTUFBTSxDQUFDO0FBQ1pHLFlBQUFBLFNBQVMsRUFBRU0sYUFEQztBQUVaRixZQUFBQSxLQUFLLEVBQUVHO0FBRkssV0FBRCxDQUFiOztBQUlGLGFBQUssVUFBTDtBQUNFLGlCQUFPLFVBQUNULE9BQUQ7QUFBQSw4Q0FBc0JhLElBQXRCO0FBQXNCQSxjQUFBQSxJQUF0QjtBQUFBOztBQUFBLG1CQUNMZCxNQUFNLENBQUM7QUFDTEcsY0FBQUEsU0FBUyxFQUFFTTtBQUROLGFBQUQsQ0FBTixDQUVJQyxjQUFELGdCQUF5Q1QsT0FBekMsU0FBcURhLElBQXJELEVBRkgsQ0FESztBQUFBLFdBQVA7QUFUSjs7QUFjQTs7QUFDRixTQUFLLFFBQUw7QUFDRSxjQUFRRCxXQUFSO0FBQ0UsYUFBSyxRQUFMO0FBQ0UsaUJBQU9iLE1BQU0sQ0FBQztBQUNaRyxZQUFBQSxTQUFTLEVBQUVPLGNBREM7QUFFWkgsWUFBQUEsS0FBSyxFQUFFRTtBQUZLLFdBQUQsQ0FBYjs7QUFJRixhQUFLLFFBQUw7QUFDRSxpREFDTUMsY0FETixHQUVNRCxhQUZOOztBQUlGLGFBQUssVUFBTDtBQUNFLGlCQUFPLFVBQUNSLE9BQUQ7QUFBQSwrQ0FBc0JhLElBQXRCO0FBQXNCQSxjQUFBQSxJQUF0QjtBQUFBOztBQUFBLG1CQUNMZCxNQUFNLENBQUM7QUFDTE8sY0FBQUEsS0FBSyxFQUFFRTtBQURGLGFBQUQsQ0FBTixDQUVJQyxjQUFELGdCQUF5Q1QsT0FBekMsU0FBcURhLElBQXJELEVBRkgsQ0FESztBQUFBLFdBQVA7QUFaSjs7QUFpQkE7O0FBQ0YsU0FBSyxVQUFMO0FBQ0UsY0FBUUQsV0FBUjtBQUNFLGFBQUssUUFBTDtBQUNFLGlCQUFPLFVBQUNaLE9BQUQ7QUFBQSwrQ0FBYWEsSUFBYjtBQUFhQSxjQUFBQSxJQUFiO0FBQUE7O0FBQUEsbUJBQ0pMLGFBQUQsZ0JBQ0VULE1BQU0sQ0FBQ0MsT0FBRCxDQUFOLENBQWdCO0FBQ2RFLGNBQUFBLFNBQVMsRUFBRU87QUFERyxhQUFoQixDQURGLFNBSUtJLElBSkwsRUFESztBQUFBLFdBQVA7O0FBT0YsYUFBSyxRQUFMO0FBQ0UsaUJBQU8sVUFBQ2IsT0FBRDtBQUFBLCtDQUFhYSxJQUFiO0FBQWFBLGNBQUFBLElBQWI7QUFBQTs7QUFBQSxtQkFDSkwsYUFBRCxnQkFDRVQsTUFBTSxDQUFDQyxPQUFELENBQU4sQ0FBZ0I7QUFDZE0sY0FBQUEsS0FBSyxFQUFFRztBQURPLGFBQWhCLENBREYsU0FJS0ksSUFKTCxFQURLO0FBQUEsV0FBUDs7QUFPRixhQUFLLFVBQUw7QUFDRSxpQkFBTyxVQUFDYixPQUFEO0FBQUEsK0NBQWFhLElBQWI7QUFBYUEsY0FBQUEsSUFBYjtBQUFBOztBQUFBLG1CQUNKTCxhQUFELGdCQUNHQyxjQUFELGdCQUNFVCxPQURGLFNBRUthLElBRkwsRUFERixTQUtLQSxJQUxMLEVBREs7QUFBQSxXQUFQO0FBbEJKOztBQXJDSjtBQWlFRCxDQS9FRDs7QUFpRkEsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUNwQkMsY0FEb0IsRUFFcEJDLGVBRm9CLEVBR0Y7QUFDbEIsTUFBTS9CLElBQUksR0FBR0QsTUFBTSxDQUFDQyxJQUFQLENBQVkrQixlQUFaLENBQWI7O0FBQ0EsT0FBSyxJQUFNQyxHQUFYLElBQWtCRixjQUFsQixFQUFrQztBQUNoQyxRQUFJOUIsSUFBSSxDQUFDaUMsT0FBTCxDQUFhRCxHQUFiLE1BQXNCLENBQUMsQ0FBM0IsRUFBOEJoQyxJQUFJLENBQUNrQyxJQUFMLENBQVVGLEdBQVY7QUFDL0I7O0FBRUQsU0FBT2hDLElBQUksQ0FBQ21DLE1BQUwsQ0FDTCxVQUFDQyxhQUFELEVBQWdCSixHQUFoQjtBQUFBLFdBQ0dJLGFBQWEsQ0FBQ0osR0FBRCxDQUFiLEdBQTRDVixZQUFZLENBQ3ZEUSxjQUFjLENBQUNFLEdBQUQsQ0FEeUMsRUFFdkRELGVBQWUsQ0FBQ0MsR0FBRCxDQUZ3QyxDQUF6RCxFQUlBSSxhQUxGO0FBQUEsR0FESyxFQVFMLEVBUkssQ0FBUDtBQVVELENBbkJEOztBQXFCQSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQ3ZCRCxhQUR1QixFQUV2QnBDLElBRnVCLEVBSVg7QUFBQSxxQ0FEVDRCLElBQ1M7QUFEVEEsSUFBQUEsSUFDUztBQUFBOztBQUNaLE1BQUk1QixJQUFJLEtBQUssSUFBYixFQUFtQjtBQUNqQixXQUFPb0MsYUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0UsS0FBSyxDQUFDQyxPQUFOLENBQWN2QyxJQUFkLENBQUwsRUFBMEI7QUFDeEJBLElBQUFBLElBQUksR0FBRyxDQUFDQSxJQUFELENBQVA7QUFDRDs7QUFFRCxNQUFNd0MsTUFBTSxHQUFHeEMsSUFBSSxDQUNoQnlDLEdBRFksQ0FDUixVQUFDVCxHQUFEO0FBQUEsV0FBU0ksYUFBYSxDQUFDSixHQUFELENBQXRCO0FBQUEsR0FEUSxFQUVaZCxNQUZZLENBRUxDLE9BRkssQ0FBZjtBQUlBLE1BQU11QixLQUFLLEdBQUdGLE1BQU0sQ0FBQ0wsTUFBUCxDQUNaLFVBQUNRLEdBQUQsRUFBTUMsQ0FBTixFQUFZO0FBQ1YsUUFBSSxPQUFPQSxDQUFQLEtBQWEsUUFBakIsRUFBMkI7QUFDekJELE1BQUFBLEdBQUcsQ0FBQzFCLFNBQUosR0FBZ0IsQ0FBQzBCLEdBQUcsQ0FBQzFCLFNBQUwsRUFBZ0IyQixDQUFoQixFQUFtQjFCLE1BQW5CLENBQTBCQyxPQUExQixFQUFtQ0MsSUFBbkMsQ0FBd0MsR0FBeEMsQ0FBaEI7QUFDRCxLQUZELE1BRU8sSUFBSSxRQUFPd0IsQ0FBUCxNQUFhLFFBQWpCLEVBQTJCO0FBQ2hDRCxNQUFBQSxHQUFHLENBQUN0QixLQUFKLG1DQUFpQnNCLEdBQUcsQ0FBQ3RCLEtBQXJCLEdBQStCdUIsQ0FBL0I7QUFDRCxLQUZNLE1BRUEsSUFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBakIsRUFBNkI7QUFDbENELE1BQUFBLEdBQUcsbUNBQVFBLEdBQVIsR0FBZ0JDLENBQUMsTUFBRCxVQUFFRCxHQUFGLFNBQVVmLElBQVYsRUFBaEIsQ0FBSDtBQUNEOztBQUVELFdBQU9lLEdBQVA7QUFDRCxHQVhXLEVBWVo7QUFBRTFCLElBQUFBLFNBQVMsRUFBRSxFQUFiO0FBQWlCSSxJQUFBQSxLQUFLLEVBQUU7QUFBeEIsR0FaWSxDQUFkOztBQWVBLE1BQUksQ0FBQ3FCLEtBQUssQ0FBQ3pCLFNBQVgsRUFBc0I7QUFDcEIsV0FBT3lCLEtBQUssQ0FBQ3pCLFNBQWI7QUFDRDs7QUFFRCxNQUFJbEIsTUFBTSxDQUFDQyxJQUFQLENBQVkwQyxLQUFLLENBQUNyQixLQUFsQixFQUEwQndCLE1BQTFCLEtBQXFDLENBQXpDLEVBQTRDO0FBQzFDLFdBQU9ILEtBQUssQ0FBQ3JCLEtBQWI7QUFDRDs7QUFFRCxTQUFPcUIsS0FBUDtBQUNELENBekNEOztBQTJDTyxJQUFNSSxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQUNDLFdBQUQ7QUFBQSxTQUMvQmhELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZK0MsV0FBWixFQUF5QlosTUFBekIsQ0FDRSxVQUFDYSxDQUFELEVBQUloQixHQUFKO0FBQUEsV0FDR2dCLENBQUMsQ0FBQ2hCLEdBQUQsQ0FBRCxHQUE4QixRQUFRaUIsSUFBUixDQUFhakIsR0FBYixJQUMzQjdCLFdBQVcsQ0FBQzRDLFdBQVcsQ0FBQ2YsR0FBRCxDQUFaLENBRGdCLEdBRTNCQSxHQUFHLEtBQUssUUFBUixHQUNBZSxXQUFXLENBQUNmLEdBQUQsQ0FBWCxHQUFtQixXQURuQixHQUVBZSxXQUFXLENBQUNmLEdBQUQsQ0FKZixFQUtBZ0IsQ0FORjtBQUFBLEdBREYsRUFTRSxFQVRGLENBRCtCO0FBQUEsQ0FBMUI7OztBQWtCQSxJQUFNRSxhQUFhLEdBQUcsd0JBTTNCLFVBQ0VDLG9CQURGLEVBS3NCO0FBQUEsTUFIcEJDLE9BR29CLHVFQUhELEVBR0M7QUFBQSxNQUZwQkMsY0FFb0IsdUVBRkksRUFFSjtBQUNwQiw2QkFBZ0VELE9BQWhFLENBQVFFLGFBQVI7QUFBQSxNQUFRQSxhQUFSLHFDQUF3QjFELGNBQXhCO0FBQUEsOEJBQWdFd0QsT0FBaEUsQ0FBd0NHLFlBQXhDO0FBQUEsTUFBd0NBLFlBQXhDLHNDQUF1RCxJQUF2RDtBQUVBLE1BQU1SLFdBQVcsR0FBR1MsY0FBYyxDQUFDSCxjQUFELEVBQWlCRSxZQUFqQixDQUFsQzs7QUFDQSxNQUFJUixXQUFKLEVBQWlCO0FBQ2ZNLElBQUFBLGNBQWMsbUNBQ1ROLFdBRFMsR0FFUk0sY0FGUSxDQUFkO0FBSUQ7O0FBRUQsTUFBTUksS0FBSyxHQUFHM0QsV0FBVyxDQUFDcUMsTUFBWixDQUNaLFVBQUNhLENBQUQsRUFBSWhCLEdBQUo7QUFBQSxXQUNHZ0IsQ0FBQyxDQUFDaEIsR0FBRCxDQUFELEdBQ0VxQixjQUFELENBQWdDckIsR0FBaEMsS0FDQXNCLGFBQWEsQ0FBQ3RCLEdBQUQsQ0FGZixFQUdBZ0IsQ0FKRjtBQUFBLEdBRFksRUFPWixFQVBZLENBQWQ7QUFVQSxNQUFNekIsYUFBYSxHQUFHeEIsTUFBTSxDQUFDQyxJQUFQLENBQVlxRCxjQUFaLEVBQTRCbEIsTUFBNUIsQ0FDcEIsVUFBQ1MsQ0FBRCxFQUFJWixHQUFKO0FBQUEsV0FDRWxDLFdBQVcsQ0FBQ21DLE9BQVosQ0FBb0JELEdBQXBCLE1BQTZCLENBQUMsQ0FBOUIsSUFDTVksQ0FBQyxDQUFDWixHQUFELENBQUQsR0FBVXFCLGNBQUQsQ0FBa0NyQixHQUFsQyxDQUFWLEVBQW1EWSxDQUR4RCxJQUVJQSxDQUhOO0FBQUEsR0FEb0IsRUFLcEIsRUFMb0IsQ0FBdEI7QUFRQSxNQUFNcEIsY0FBYyxHQUFHMkIsb0JBQW9CLENBQUNNLEtBQUQsQ0FBM0M7QUFFQSxNQUFNckIsYUFBYSxHQUFHUCxhQUFhLENBQUNOLGFBQUQsRUFBZ0JDLGNBQWhCLENBQW5DOztBQS9Cb0IscUNBRGpCSSxJQUNpQjtBQURqQkEsSUFBQUEsSUFDaUI7QUFBQTs7QUFpQ3BCLFNBQU8sd0JBQU1TLGdCQUFOLEVBQXdCLENBQXhCLGlCQUEyQkQsYUFBM0IsU0FBNkNSLElBQTdDLEVBQVA7QUFDRCxDQTdDMEIsRUE4QzNCLENBOUMyQixDQUF0Qjs7O0FBaURQLElBQU04QixlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNELEtBQUQ7QUFBQSxTQUN0QixDQUFDLENBQUVBLEtBQUQsQ0FBeUJFLE1BREw7QUFBQSxDQUF4Qjs7QUFHTyxJQUFNSCxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQzVCQyxLQUQ0QixFQUU1QkYsWUFGNEIsRUFHQTtBQUM1QixNQUFJRSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuREYsSUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLE1BQWQ7QUFDRDs7QUFFRCxNQUFJLE9BQU9GLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsdUJBQThCQSxLQUFLLENBQUNHLEtBQU4sQ0FBWSxHQUFaLENBQTlCO0FBQUE7QUFBQSxRQUFPQyxVQUFQO0FBQUEsUUFBa0JDLFFBQWxCOztBQUNBLFFBQUlQLFlBQUosRUFBa0I7QUFDaEJFLE1BQUFBLEtBQUssR0FBR0YsWUFBWSxDQUFDTSxVQUFELENBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xKLE1BQUFBLEtBQUssR0FBRzVELE1BQU0sQ0FBQ2dFLFVBQUQsQ0FBZDtBQUNEOztBQUNELFFBQUlDLFFBQVEsS0FBSyxVQUFqQixFQUE2QjtBQUMzQkwsTUFBQUEsS0FBSyxHQUFHWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF6QjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0EsS0FBSyxJQUFJMUQsTUFBTSxDQUFDZ0UsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDUixLQUFyQyxFQUE0QyxRQUE1QyxDQUFULEdBQ0ZBLEtBREUsR0FFSGhDLFNBRko7QUFHRCxDQXZCTTs7OztBQXlCQSxJQUFNeUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ1QsS0FBRCxFQUFpRDtBQUMxRSxNQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IscUJBQVVBLEtBQVY7QUFDRDs7QUFFRCxNQUFJQSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuRCxRQUFJLE9BQU9GLEtBQUssQ0FBQ0UsTUFBYixLQUF3QixRQUE1QixFQUFzQztBQUNwQyw2Q0FBWUYsS0FBWjtBQUFtQkUsUUFBQUEsTUFBTSxZQUFLRixLQUFLLENBQUNFLE1BQVg7QUFBekI7QUFDRDs7QUFFRCwyQ0FDS0YsS0FETDtBQUVFRSxNQUFBQSxNQUFNLEVBQUViLGlCQUFpQixDQUFDVyxLQUFLLENBQUNFLE1BQVA7QUFGM0I7QUFJRDs7QUFFRCxNQUFJRixLQUFKLEVBQVc7QUFDVCxXQUFPWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF4QjtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRCxDQXJCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IHsgQmFzZTE2VGhlbWUgfSBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCAqIGFzIENTUyBmcm9tICdjc3N0eXBlJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgQ29sb3IgYXMgQ29sb3JUdXBsZSwgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbmltcG9ydCB7XG4gIFN0eWxpbmcsXG4gIFN0eWxpbmdDb25maWcsXG4gIFN0eWxpbmdGdW5jdGlvbixcbiAgU3R5bGluZ1ZhbHVlLFxuICBTdHlsaW5nVmFsdWVGdW5jdGlvbixcbiAgVGhlbWUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xuXG5jb25zdCBCQVNFMTZfS0VZUyA9IE9iamVjdC5rZXlzKERFRkFVTFRfQkFTRTE2KTtcblxuLy8gd2UgbmVlZCBhIGNvcnJlY3RpbmcgZmFjdG9yLCBzbyB0aGF0IGEgZGFyaywgYnV0IG5vdCBibGFjayBiYWNrZ3JvdW5kIGNvbG9yXG4vLyBjb252ZXJ0cyB0byBicmlnaHQgZW5vdWdoIGludmVyc2VkIGNvbG9yXG5jb25zdCBmbGlwID0gKHg6IG51bWJlcikgPT4gKHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geCk7XG5cbmNvbnN0IGludmVydENvbG9yID0gKGhleFN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNvbG9yID0gQ29sb3IoaGV4U3RyaW5nKTtcbiAgY29uc3QgW3ksIHUsIHZdID0gcmdiMnl1dihjb2xvci5hcnJheSgpIGFzIENvbG9yVHVwbGUpO1xuICBjb25zdCBmbGlwcGVkWXV2OiBDb2xvclR1cGxlID0gW2ZsaXAoeSksIHUsIHZdO1xuICBjb25zdCByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG5jb25zdCBtZXJnZXIgPSAoc3R5bGluZzogUGFydGlhbDxTdHlsaW5nPikgPT4ge1xuICByZXR1cm4gKHByZXZTdHlsaW5nOiBQYXJ0aWFsPFN0eWxpbmc+KSA9PiAoe1xuICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignICcpLFxuICAgIHN0eWxlOiB7IC4uLihwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIC4uLihzdHlsaW5nLnN0eWxlIHx8IHt9KSB9LFxuICB9KTtcbn07XG5cbmNvbnN0IG1lcmdlU3R5bGluZyA9IChcbiAgY3VzdG9tU3R5bGluZzogU3R5bGluZ1ZhbHVlLFxuICBkZWZhdWx0U3R5bGluZzogU3R5bGluZ1ZhbHVlXG4pOiBTdHlsaW5nVmFsdWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoY3VzdG9tU3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHlsaW5nO1xuICB9XG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICBjb25zdCBjdXN0b21UeXBlID0gdHlwZW9mIGN1c3RvbVN0eWxpbmc7XG4gIGNvbnN0IGRlZmF1bHRUeXBlID0gdHlwZW9mIGRlZmF1bHRTdHlsaW5nO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgICAgbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgIH0pKChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoc3R5bGluZywgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uKGRlZmF1bHRTdHlsaW5nIGFzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4pLFxuICAgICAgICAgICAgLi4uKGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiksXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgICAgbWVyZ2VyKHtcbiAgICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICAgIH0pKChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoc3R5bGluZywgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgbWVyZ2VyKHN0eWxpbmcpKHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIChzdHlsaW5nLCAuLi5hcmdzKSA9PlxuICAgICAgICAgICAgKGN1c3RvbVN0eWxpbmcgYXMgU3R5bGluZ1ZhbHVlRnVuY3Rpb24pKFxuICAgICAgICAgICAgICBtZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgKGRlZmF1bHRTdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgICBzdHlsaW5nLFxuICAgICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICAgKSBhcyBTdHlsaW5nLFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgfVxuICB9XG59O1xuXG5jb25zdCBtZXJnZVN0eWxpbmdzID0gKFxuICBjdXN0b21TdHlsaW5nczogU3R5bGluZ0NvbmZpZyxcbiAgZGVmYXVsdFN0eWxpbmdzOiBTdHlsaW5nQ29uZmlnXG4pOiBTdHlsaW5nQ29uZmlnID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRTdHlsaW5ncyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGN1c3RvbVN0eWxpbmdzKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihrZXkpID09PSAtMSkga2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICByZXR1cm4ga2V5cy5yZWR1Y2UoXG4gICAgKG1lcmdlZFN0eWxpbmcsIGtleSkgPT4gKFxuICAgICAgKG1lcmdlZFN0eWxpbmdba2V5IGFzIGtleW9mIFN0eWxpbmdDb25maWddID0gbWVyZ2VTdHlsaW5nKFxuICAgICAgICBjdXN0b21TdHlsaW5nc1trZXldIGFzIFN0eWxpbmdWYWx1ZSxcbiAgICAgICAgZGVmYXVsdFN0eWxpbmdzW2tleV0gYXMgU3R5bGluZ1ZhbHVlXG4gICAgICApIGFzIFN0eWxpbmdWYWx1ZSksXG4gICAgICBtZXJnZWRTdHlsaW5nXG4gICAgKSxcbiAgICB7fSBhcyBTdHlsaW5nQ29uZmlnXG4gICk7XG59O1xuXG5jb25zdCBnZXRTdHlsaW5nQnlLZXlzID0gKFxuICBtZXJnZWRTdHlsaW5nOiBTdHlsaW5nQ29uZmlnLFxuICBrZXlzOiAoc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQpIHwgKHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkKVtdLFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IFN0eWxpbmcgPT4ge1xuICBpZiAoa2V5cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nIGFzIHVua25vd24gYXMgU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSBrZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBtZXJnZWRTdHlsaW5nW2tleSBhcyBzdHJpbmddKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgY29uc3QgcHJvcHMgPSBzdHlsZXMucmVkdWNlPFN0eWxpbmc+KFxuICAgIChvYmosIHMpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqLnN0eWxlID0geyAuLi5vYmouc3R5bGUsIC4uLnMgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0geyAuLi5vYmosIC4uLnMob2JqLCAuLi5hcmdzKSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgeyBjbGFzc05hbWU6ICcnLCBzdHlsZToge30gfVxuICApO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSEpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBwcm9wcy5zdHlsZTtcbiAgfVxuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbmV4cG9ydCBjb25zdCBpbnZlcnRCYXNlMTZUaGVtZSA9IChiYXNlMTZUaGVtZTogQmFzZTE2VGhlbWUpOiBCYXNlMTZUaGVtZSA9PlxuICBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKFxuICAgICh0LCBrZXkpID0+IChcbiAgICAgICh0W2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0gPSAvXmJhc2UvLnRlc3Qoa2V5KVxuICAgICAgICA/IGludmVydENvbG9yKGJhc2UxNlRoZW1lW2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0pXG4gICAgICAgIDoga2V5ID09PSAnc2NoZW1lJ1xuICAgICAgICA/IGJhc2UxNlRoZW1lW2tleV0gKyAnOmludmVydGVkJ1xuICAgICAgICA6IGJhc2UxNlRoZW1lW2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0pLFxuICAgICAgdFxuICAgICksXG4gICAge30gYXMgQmFzZTE2VGhlbWVcbiAgKTtcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBkZWZhdWx0QmFzZTE2PzogQmFzZTE2VGhlbWU7XG4gIGJhc2UxNlRoZW1lcz86IHsgW3RoZW1lTmFtZTogc3RyaW5nXTogQmFzZTE2VGhlbWUgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN0eWxpbmcgPSBjdXJyeTxcbiAgKGJhc2UxNlRoZW1lOiBCYXNlMTZUaGVtZSkgPT4gU3R5bGluZ0NvbmZpZyxcbiAgT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgVGhlbWUgfCB1bmRlZmluZWQsXG4gIFN0eWxpbmdGdW5jdGlvblxuPihcbiAgKFxuICAgIGdldFN0eWxpbmdGcm9tQmFzZTE2OiAoYmFzZTE2VGhlbWU6IEJhc2UxNlRoZW1lKSA9PiBTdHlsaW5nQ29uZmlnLFxuICAgIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgICB0aGVtZU9yU3R5bGluZzogVGhlbWUgPSB7fSxcbiAgICAuLi5hcmdzXG4gICk6IFN0eWxpbmdGdW5jdGlvbiA9PiB7XG4gICAgY29uc3QgeyBkZWZhdWx0QmFzZTE2ID0gREVGQVVMVF9CQVNFMTYsIGJhc2UxNlRoZW1lcyA9IG51bGwgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuICAgIGlmIChiYXNlMTZUaGVtZSkge1xuICAgICAgdGhlbWVPclN0eWxpbmcgPSB7XG4gICAgICAgIC4uLmJhc2UxNlRoZW1lLFxuICAgICAgICAuLi4odGhlbWVPclN0eWxpbmcgYXMgQmFzZTE2VGhlbWUgfCBTdHlsaW5nQ29uZmlnKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGhlbWUgPSBCQVNFMTZfS0VZUy5yZWR1Y2UoXG4gICAgICAodCwga2V5KSA9PiAoXG4gICAgICAgICh0W2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0gPVxuICAgICAgICAgICh0aGVtZU9yU3R5bGluZyBhcyBCYXNlMTZUaGVtZSlba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSB8fFxuICAgICAgICAgIGRlZmF1bHRCYXNlMTZba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSksXG4gICAgICAgIHRcbiAgICAgICksXG4gICAgICB7fSBhcyBCYXNlMTZUaGVtZVxuICAgICk7XG5cbiAgICBjb25zdCBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShcbiAgICAgIChzLCBrZXkpID0+XG4gICAgICAgIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgICAgICAgICA/ICgoc1trZXldID0gKHRoZW1lT3JTdHlsaW5nIGFzIFN0eWxpbmdDb25maWcpW2tleV0pLCBzKVxuICAgICAgICAgIDogcyxcbiAgICAgIHt9IGFzIFN0eWxpbmdDb25maWdcbiAgICApO1xuXG4gICAgY29uc3QgZGVmYXVsdFN0eWxpbmcgPSBnZXRTdHlsaW5nRnJvbUJhc2UxNih0aGVtZSk7XG5cbiAgICBjb25zdCBtZXJnZWRTdHlsaW5nID0gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5nLCBkZWZhdWx0U3R5bGluZyk7XG5cbiAgICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikobWVyZ2VkU3R5bGluZywgLi4uYXJncyk7XG4gIH0sXG4gIDNcbik7XG5cbmNvbnN0IGlzU3R5bGluZ0NvbmZpZyA9ICh0aGVtZTogVGhlbWUpOiB0aGVtZSBpcyBTdHlsaW5nQ29uZmlnID0+XG4gICEhKHRoZW1lIGFzIFN0eWxpbmdDb25maWcpLmV4dGVuZDtcblxuZXhwb3J0IGNvbnN0IGdldEJhc2UxNlRoZW1lID0gKFxuICB0aGVtZTogVGhlbWUsXG4gIGJhc2UxNlRoZW1lcz86IHsgW3RoZW1lTmFtZTogc3RyaW5nXTogQmFzZTE2VGhlbWUgfSB8IG51bGxcbik6IEJhc2UxNlRoZW1lIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgdGhlbWUgPSB0aGVtZS5leHRlbmQgYXMgc3RyaW5nIHwgQmFzZTE2VGhlbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IFt0aGVtZU5hbWUsIG1vZGlmaWVyXSA9IHRoZW1lLnNwbGl0KCc6Jyk7XG4gICAgaWYgKGJhc2UxNlRoZW1lcykge1xuICAgICAgdGhlbWUgPSBiYXNlMTZUaGVtZXNbdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbdGhlbWVOYW1lIGFzIGtleW9mIHR5cGVvZiBiYXNlMTZdO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXIgPT09ICdpbnZlcnRlZCcpIHtcbiAgICAgIHRoZW1lID0gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGVtZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhlbWUsICdiYXNlMDAnKVxuICAgID8gKHRoZW1lIGFzIEJhc2UxNlRoZW1lKVxuICAgIDogdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmVydFRoZW1lID0gKHRoZW1lOiBUaGVtZSB8IHVuZGVmaW5lZCk6IFRoZW1lIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYCR7dGhlbWV9OmludmVydGVkYDtcbiAgfVxuXG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIGlmICh0eXBlb2YgdGhlbWUuZXh0ZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4udGhlbWUsIGV4dGVuZDogYCR7dGhlbWUuZXh0ZW5kfTppbnZlcnRlZGAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhlbWUsXG4gICAgICBleHRlbmQ6IGludmVydEJhc2UxNlRoZW1lKHRoZW1lLmV4dGVuZCBhcyBCYXNlMTZUaGVtZSksXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0aGVtZSkge1xuICAgIHJldHVybiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSBhcyBCYXNlMTZUaGVtZSk7XG4gIH1cblxuICByZXR1cm4gdGhlbWU7XG59O1xuXG5leHBvcnQgeyBCYXNlMTZUaGVtZSB9O1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
\No newline at end of file