@overlap.ai/react-video-subtitles 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2517 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var player = require('@remotion/player');
6
+ var remotion = require('remotion');
7
+
8
+ /******************************************************************************
9
+ Copyright (c) Microsoft Corporation.
10
+
11
+ Permission to use, copy, modify, and/or distribute this software for any
12
+ purpose with or without fee is hereby granted.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
15
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
16
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
17
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
18
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
19
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20
+ PERFORMANCE OF THIS SOFTWARE.
21
+ ***************************************************************************** */
22
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
23
+
24
+
25
+ var __assign = function() {
26
+ __assign = Object.assign || function __assign(t) {
27
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
28
+ s = arguments[i];
29
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
30
+ }
31
+ return t;
32
+ };
33
+ return __assign.apply(this, arguments);
34
+ };
35
+
36
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
37
+ var e = new Error(message);
38
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
39
+ };
40
+
41
+ function _arrayLikeToArray(r, a) {
42
+ (null == a || a > r.length) && (a = r.length);
43
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
44
+ return n;
45
+ }
46
+ function _arrayWithHoles(r) {
47
+ if (Array.isArray(r)) return r;
48
+ }
49
+ function _arrayWithoutHoles(r) {
50
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
51
+ }
52
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
53
+ try {
54
+ var i = n[a](c),
55
+ u = i.value;
56
+ } catch (n) {
57
+ return void e(n);
58
+ }
59
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
60
+ }
61
+ function _asyncToGenerator(n) {
62
+ return function () {
63
+ var t = this,
64
+ e = arguments;
65
+ return new Promise(function (r, o) {
66
+ var a = n.apply(t, e);
67
+ function _next(n) {
68
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
69
+ }
70
+ function _throw(n) {
71
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
72
+ }
73
+ _next(void 0);
74
+ });
75
+ };
76
+ }
77
+ function _defineProperty(e, r, t) {
78
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
79
+ value: t,
80
+ enumerable: !0,
81
+ configurable: !0,
82
+ writable: !0
83
+ }) : e[r] = t, e;
84
+ }
85
+ function _iterableToArray(r) {
86
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
87
+ }
88
+ function _iterableToArrayLimit(r, l) {
89
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
90
+ if (null != t) {
91
+ var e,
92
+ n,
93
+ i,
94
+ u,
95
+ a = [],
96
+ f = !0,
97
+ o = !1;
98
+ try {
99
+ if (i = (t = t.call(r)).next, 0 === l) {
100
+ if (Object(t) !== t) return;
101
+ f = !1;
102
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
103
+ } catch (r) {
104
+ o = !0, n = r;
105
+ } finally {
106
+ try {
107
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
108
+ } finally {
109
+ if (o) throw n;
110
+ }
111
+ }
112
+ return a;
113
+ }
114
+ }
115
+ function _nonIterableRest() {
116
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
117
+ }
118
+ function _nonIterableSpread() {
119
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
120
+ }
121
+ function ownKeys(e, r) {
122
+ var t = Object.keys(e);
123
+ if (Object.getOwnPropertySymbols) {
124
+ var o = Object.getOwnPropertySymbols(e);
125
+ r && (o = o.filter(function (r) {
126
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
127
+ })), t.push.apply(t, o);
128
+ }
129
+ return t;
130
+ }
131
+ function _objectSpread2(e) {
132
+ for (var r = 1; r < arguments.length; r++) {
133
+ var t = null != arguments[r] ? arguments[r] : {};
134
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
135
+ _defineProperty(e, r, t[r]);
136
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
137
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
138
+ });
139
+ }
140
+ return e;
141
+ }
142
+ function _regeneratorRuntime() {
143
+ _regeneratorRuntime = function () {
144
+ return e;
145
+ };
146
+ var t,
147
+ e = {},
148
+ r = Object.prototype,
149
+ n = r.hasOwnProperty,
150
+ o = Object.defineProperty || function (t, e, r) {
151
+ t[e] = r.value;
152
+ },
153
+ i = "function" == typeof Symbol ? Symbol : {},
154
+ a = i.iterator || "@@iterator",
155
+ c = i.asyncIterator || "@@asyncIterator",
156
+ u = i.toStringTag || "@@toStringTag";
157
+ function define(t, e, r) {
158
+ return Object.defineProperty(t, e, {
159
+ value: r,
160
+ enumerable: !0,
161
+ configurable: !0,
162
+ writable: !0
163
+ }), t[e];
164
+ }
165
+ try {
166
+ define({}, "");
167
+ } catch (t) {
168
+ define = function (t, e, r) {
169
+ return t[e] = r;
170
+ };
171
+ }
172
+ function wrap(t, e, r, n) {
173
+ var i = e && e.prototype instanceof Generator ? e : Generator,
174
+ a = Object.create(i.prototype),
175
+ c = new Context(n || []);
176
+ return o(a, "_invoke", {
177
+ value: makeInvokeMethod(t, r, c)
178
+ }), a;
179
+ }
180
+ function tryCatch(t, e, r) {
181
+ try {
182
+ return {
183
+ type: "normal",
184
+ arg: t.call(e, r)
185
+ };
186
+ } catch (t) {
187
+ return {
188
+ type: "throw",
189
+ arg: t
190
+ };
191
+ }
192
+ }
193
+ e.wrap = wrap;
194
+ var h = "suspendedStart",
195
+ l = "suspendedYield",
196
+ f = "executing",
197
+ s = "completed",
198
+ y = {};
199
+ function Generator() {}
200
+ function GeneratorFunction() {}
201
+ function GeneratorFunctionPrototype() {}
202
+ var p = {};
203
+ define(p, a, function () {
204
+ return this;
205
+ });
206
+ var d = Object.getPrototypeOf,
207
+ v = d && d(d(values([])));
208
+ v && v !== r && n.call(v, a) && (p = v);
209
+ var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
210
+ function defineIteratorMethods(t) {
211
+ ["next", "throw", "return"].forEach(function (e) {
212
+ define(t, e, function (t) {
213
+ return this._invoke(e, t);
214
+ });
215
+ });
216
+ }
217
+ function AsyncIterator(t, e) {
218
+ function invoke(r, o, i, a) {
219
+ var c = tryCatch(t[r], t, o);
220
+ if ("throw" !== c.type) {
221
+ var u = c.arg,
222
+ h = u.value;
223
+ return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
224
+ invoke("next", t, i, a);
225
+ }, function (t) {
226
+ invoke("throw", t, i, a);
227
+ }) : e.resolve(h).then(function (t) {
228
+ u.value = t, i(u);
229
+ }, function (t) {
230
+ return invoke("throw", t, i, a);
231
+ });
232
+ }
233
+ a(c.arg);
234
+ }
235
+ var r;
236
+ o(this, "_invoke", {
237
+ value: function (t, n) {
238
+ function callInvokeWithMethodAndArg() {
239
+ return new e(function (e, r) {
240
+ invoke(t, n, e, r);
241
+ });
242
+ }
243
+ return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
244
+ }
245
+ });
246
+ }
247
+ function makeInvokeMethod(e, r, n) {
248
+ var o = h;
249
+ return function (i, a) {
250
+ if (o === f) throw Error("Generator is already running");
251
+ if (o === s) {
252
+ if ("throw" === i) throw a;
253
+ return {
254
+ value: t,
255
+ done: !0
256
+ };
257
+ }
258
+ for (n.method = i, n.arg = a;;) {
259
+ var c = n.delegate;
260
+ if (c) {
261
+ var u = maybeInvokeDelegate(c, n);
262
+ if (u) {
263
+ if (u === y) continue;
264
+ return u;
265
+ }
266
+ }
267
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
268
+ if (o === h) throw o = s, n.arg;
269
+ n.dispatchException(n.arg);
270
+ } else "return" === n.method && n.abrupt("return", n.arg);
271
+ o = f;
272
+ var p = tryCatch(e, r, n);
273
+ if ("normal" === p.type) {
274
+ if (o = n.done ? s : l, p.arg === y) continue;
275
+ return {
276
+ value: p.arg,
277
+ done: n.done
278
+ };
279
+ }
280
+ "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
281
+ }
282
+ };
283
+ }
284
+ function maybeInvokeDelegate(e, r) {
285
+ var n = r.method,
286
+ o = e.iterator[n];
287
+ if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
288
+ var i = tryCatch(o, e.iterator, r.arg);
289
+ if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
290
+ var a = i.arg;
291
+ return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
292
+ }
293
+ function pushTryEntry(t) {
294
+ var e = {
295
+ tryLoc: t[0]
296
+ };
297
+ 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
298
+ }
299
+ function resetTryEntry(t) {
300
+ var e = t.completion || {};
301
+ e.type = "normal", delete e.arg, t.completion = e;
302
+ }
303
+ function Context(t) {
304
+ this.tryEntries = [{
305
+ tryLoc: "root"
306
+ }], t.forEach(pushTryEntry, this), this.reset(!0);
307
+ }
308
+ function values(e) {
309
+ if (e || "" === e) {
310
+ var r = e[a];
311
+ if (r) return r.call(e);
312
+ if ("function" == typeof e.next) return e;
313
+ if (!isNaN(e.length)) {
314
+ var o = -1,
315
+ i = function next() {
316
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
317
+ return next.value = t, next.done = !0, next;
318
+ };
319
+ return i.next = i;
320
+ }
321
+ }
322
+ throw new TypeError(typeof e + " is not iterable");
323
+ }
324
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
325
+ value: GeneratorFunctionPrototype,
326
+ configurable: !0
327
+ }), o(GeneratorFunctionPrototype, "constructor", {
328
+ value: GeneratorFunction,
329
+ configurable: !0
330
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
331
+ var e = "function" == typeof t && t.constructor;
332
+ return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
333
+ }, e.mark = function (t) {
334
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
335
+ }, e.awrap = function (t) {
336
+ return {
337
+ __await: t
338
+ };
339
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
340
+ return this;
341
+ }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
342
+ void 0 === i && (i = Promise);
343
+ var a = new AsyncIterator(wrap(t, r, n, o), i);
344
+ return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
345
+ return t.done ? t.value : a.next();
346
+ });
347
+ }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
348
+ return this;
349
+ }), define(g, "toString", function () {
350
+ return "[object Generator]";
351
+ }), e.keys = function (t) {
352
+ var e = Object(t),
353
+ r = [];
354
+ for (var n in e) r.push(n);
355
+ return r.reverse(), function next() {
356
+ for (; r.length;) {
357
+ var t = r.pop();
358
+ if (t in e) return next.value = t, next.done = !1, next;
359
+ }
360
+ return next.done = !0, next;
361
+ };
362
+ }, e.values = values, Context.prototype = {
363
+ constructor: Context,
364
+ reset: function (e) {
365
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
366
+ },
367
+ stop: function () {
368
+ this.done = !0;
369
+ var t = this.tryEntries[0].completion;
370
+ if ("throw" === t.type) throw t.arg;
371
+ return this.rval;
372
+ },
373
+ dispatchException: function (e) {
374
+ if (this.done) throw e;
375
+ var r = this;
376
+ function handle(n, o) {
377
+ return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
378
+ }
379
+ for (var o = this.tryEntries.length - 1; o >= 0; --o) {
380
+ var i = this.tryEntries[o],
381
+ a = i.completion;
382
+ if ("root" === i.tryLoc) return handle("end");
383
+ if (i.tryLoc <= this.prev) {
384
+ var c = n.call(i, "catchLoc"),
385
+ u = n.call(i, "finallyLoc");
386
+ if (c && u) {
387
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
388
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
389
+ } else if (c) {
390
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
391
+ } else {
392
+ if (!u) throw Error("try statement without catch or finally");
393
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
394
+ }
395
+ }
396
+ }
397
+ },
398
+ abrupt: function (t, e) {
399
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
400
+ var o = this.tryEntries[r];
401
+ if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
402
+ var i = o;
403
+ break;
404
+ }
405
+ }
406
+ i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
407
+ var a = i ? i.completion : {};
408
+ return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
409
+ },
410
+ complete: function (t, e) {
411
+ if ("throw" === t.type) throw t.arg;
412
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
413
+ },
414
+ finish: function (t) {
415
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
416
+ var r = this.tryEntries[e];
417
+ if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
418
+ }
419
+ },
420
+ catch: function (t) {
421
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
422
+ var r = this.tryEntries[e];
423
+ if (r.tryLoc === t) {
424
+ var n = r.completion;
425
+ if ("throw" === n.type) {
426
+ var o = n.arg;
427
+ resetTryEntry(r);
428
+ }
429
+ return o;
430
+ }
431
+ }
432
+ throw Error("illegal catch attempt");
433
+ },
434
+ delegateYield: function (e, r, n) {
435
+ return this.delegate = {
436
+ iterator: values(e),
437
+ resultName: r,
438
+ nextLoc: n
439
+ }, "next" === this.method && (this.arg = t), y;
440
+ }
441
+ }, e;
442
+ }
443
+ function _slicedToArray(r, e) {
444
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
445
+ }
446
+ function _toConsumableArray(r) {
447
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
448
+ }
449
+ function _toPrimitive(t, r) {
450
+ if ("object" != typeof t || !t) return t;
451
+ var e = t[Symbol.toPrimitive];
452
+ if (void 0 !== e) {
453
+ var i = e.call(t, r || "default");
454
+ if ("object" != typeof i) return i;
455
+ throw new TypeError("@@toPrimitive must return a primitive value.");
456
+ }
457
+ return ("string" === r ? String : Number)(t);
458
+ }
459
+ function _toPropertyKey(t) {
460
+ var i = _toPrimitive(t, "string");
461
+ return "symbol" == typeof i ? i : i + "";
462
+ }
463
+ function _typeof(o) {
464
+ "@babel/helpers - typeof";
465
+
466
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
467
+ return typeof o;
468
+ } : function (o) {
469
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
470
+ }, _typeof(o);
471
+ }
472
+ function _unsupportedIterableToArray(r, a) {
473
+ if (r) {
474
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
475
+ var t = {}.toString.call(r).slice(8, -1);
476
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
477
+ }
478
+ }
479
+
480
+ // Helper function to estimate text width
481
+ var estimateTextWidth = function estimateTextWidth(text, fontSize, fontFamily) {
482
+ var canvas = document.createElement('canvas');
483
+ var context = canvas.getContext('2d');
484
+ context.font = "".concat(fontSize, "px ").concat(fontFamily);
485
+ return context.measureText(text).width;
486
+ };
487
+
488
+ // Helper function to generate outline shadow
489
+ var generateOutlineShadow = function () {
490
+ var cache = new Map();
491
+ return function (color, width) {
492
+ var outlineStyle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "round";
493
+ var key = "".concat(color, "-").concat(width, "-").concat(outlineStyle);
494
+ if (cache.has(key)) {
495
+ return cache.get(key);
496
+ }
497
+ var shadows = [];
498
+ var parsedWidth = parseInt(width, 10);
499
+ if (outlineStyle === "angular") {
500
+ // Create sharp corners by using perpendicular lines
501
+ // Top, right, bottom, left
502
+ shadows.push("0 -".concat(parsedWidth, "px 0 ").concat(color)); // Top
503
+ shadows.push("".concat(parsedWidth, "px 0 0 ").concat(color)); // Right
504
+ shadows.push("0 ".concat(parsedWidth, "px 0 ").concat(color)); // Bottom
505
+ shadows.push("-".concat(parsedWidth, "px 0 0 ").concat(color)); // Left
506
+
507
+ // Add diagonal points for corners
508
+ shadows.push("".concat(parsedWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-right
509
+ shadows.push("".concat(parsedWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-right
510
+ shadows.push("-".concat(parsedWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-left
511
+ shadows.push("-".concat(parsedWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-left
512
+
513
+ // Add intermediate points for better coverage
514
+ var halfWidth = Math.round(parsedWidth * 0.7071); // cos(45°) ≈ 0.7071
515
+ shadows.push("".concat(halfWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-right intermediate
516
+ shadows.push("".concat(parsedWidth, "px -").concat(halfWidth, "px 0 ").concat(color)); // Right-top intermediate
517
+ shadows.push("".concat(parsedWidth, "px ").concat(halfWidth, "px 0 ").concat(color)); // Right-bottom intermediate
518
+ shadows.push("".concat(halfWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-right intermediate
519
+ shadows.push("-".concat(halfWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-left intermediate
520
+ shadows.push("-".concat(parsedWidth, "px ").concat(halfWidth, "px 0 ").concat(color)); // Left-bottom intermediate
521
+ shadows.push("-".concat(parsedWidth, "px -").concat(halfWidth, "px 0 ").concat(color)); // Left-top intermediate
522
+ shadows.push("-".concat(halfWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-left intermediate
523
+ } else {
524
+ // Original round style
525
+ for (var i = 0; i < 360; i += 22.5) {
526
+ var angle = i * Math.PI / 180;
527
+ var x = Math.round(Math.cos(angle) * parsedWidth);
528
+ var y = Math.round(Math.sin(angle) * parsedWidth);
529
+ shadows.push("".concat(x, "px ").concat(y, "px 0 ").concat(color));
530
+ }
531
+ }
532
+ var result = shadows.join(',');
533
+ cache.set(key, result);
534
+ return result;
535
+ };
536
+ }();
537
+ var SubtitleText = /*#__PURE__*/React.memo(function (_ref) {
538
+ var text = _ref.text,
539
+ style = _ref.style,
540
+ animationStyle = _ref.animationStyle,
541
+ frame = _ref.frame,
542
+ startFrame = _ref.startFrame,
543
+ randomColors = _ref.randomColors,
544
+ words = _ref.words,
545
+ fps = _ref.fps,
546
+ highlightWordsColor = _ref.highlightWordsColor;
547
+ var relativeFrame = frame - startFrame;
548
+ var scale = React.useMemo(function () {
549
+ if (animationStyle === "pleasure-pod-animation") {
550
+ return remotion.spring({
551
+ frame: relativeFrame,
552
+ from: 0.95,
553
+ to: 1.0,
554
+ fps: 30,
555
+ config: {
556
+ damping: 20,
557
+ stiffness: 400
558
+ }
559
+ });
560
+ }
561
+ if (animationStyle === "spring") {
562
+ var springValue = remotion.spring({
563
+ frame: relativeFrame,
564
+ from: 0.9,
565
+ to: 1,
566
+ fps: fps,
567
+ config: {
568
+ mass: 0.5,
569
+ stiffness: 150,
570
+ damping: 15
571
+ }
572
+ });
573
+ return springValue;
574
+ }
575
+ return 1;
576
+ }, [animationStyle, relativeFrame, fps]);
577
+ var translateY = React.useMemo(function () {
578
+ if (animationStyle === "spring") {
579
+ var translateValue = remotion.spring({
580
+ frame: relativeFrame,
581
+ from: 10,
582
+ to: 0,
583
+ fps: fps,
584
+ config: {
585
+ mass: 0.5,
586
+ stiffness: 150,
587
+ damping: 15
588
+ }
589
+ });
590
+ return translateValue;
591
+ }
592
+ return 0;
593
+ }, [animationStyle, relativeFrame, fps]);
594
+
595
+ // Calculate adjusted font size based on text width
596
+ var adjustedFontSize = React.useMemo(function () {
597
+ var maxLineWidth = style.maxLineWidth || 1080; // Default max width
598
+ var baseFontSize = style.fontSize * 2 || 64; // Default font size
599
+ var fontFamily = style.fontFamily || 'Arial';
600
+ var textWidth = estimateTextWidth(text, baseFontSize, fontFamily);
601
+ if (textWidth > maxLineWidth) {
602
+ var scaleFactor = maxLineWidth / textWidth;
603
+ return Math.floor(baseFontSize * scaleFactor);
604
+ }
605
+ return baseFontSize;
606
+ }, [text, style.maxLineWidth, style.fontSize, style.fontFamily]);
607
+
608
+ // Calculate adjusted font size based on text width
609
+ var animatedStyle = React.useMemo(function () {
610
+ var basePadding = style.backgroundPadding || '15';
611
+
612
+ // Create text shadow based on intensity
613
+ var shadowIntensity = style.shadowIntensity || 1;
614
+ var shadowColor = style.shadowColor || '#000000';
615
+ var shadowBlur = style.shadowBlur || '2';
616
+ var shadowOffsetX = style.shadowOffsetX || '0';
617
+ var shadowOffsetY = style.shadowOffsetY || '0';
618
+
619
+ // Stack multiple shadows based on intensity
620
+ var shadows = [];
621
+ for (var i = 0; i < shadowIntensity; i++) {
622
+ shadows.push("".concat(shadowOffsetX, "px ").concat(shadowOffsetY, "px ").concat(shadowBlur, "px ").concat(shadowColor));
623
+ }
624
+ var textShadow = shadows.join(', ');
625
+
626
+ // Convert hex to rgba for background color
627
+ var hexToRgba = function hexToRgba(hex, opacity) {
628
+ var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
629
+ hex = hex.replace(shorthandRegex, function (m, r, g, b) {
630
+ return r + r + g + g + b + b;
631
+ });
632
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
633
+ if (!result) return hex;
634
+ var r = parseInt(result[1], 16);
635
+ var g = parseInt(result[2], 16);
636
+ var b = parseInt(result[3], 16);
637
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(opacity, ")");
638
+ };
639
+ var backgroundColor = style.backgroundColor || '#000000';
640
+ var opacity = typeof style.backgroundOpacity === 'string' ? parseFloat(style.backgroundOpacity.trim()) : parseFloat(style.backgroundOpacity) || 0;
641
+ var background = hexToRgba(backgroundColor, opacity);
642
+ var hasBackground = opacity > 0;
643
+ var hasShadow = shadowIntensity > 0 && (shadowBlur !== '0' || shadowOffsetX !== '0' || shadowOffsetY !== '0');
644
+
645
+ // Handle border radius properly
646
+ var borderRadius = style.backgroundBorderRadius ? "".concat(parseInt(style.backgroundBorderRadius, 10), "px") : '0px';
647
+
648
+ // Handle background wrapping
649
+ var isWrapped = style.backgroundFillStyle === "wrap";
650
+ var paddingValue = parseInt(basePadding, 10);
651
+
652
+ // For wrapped style, use uniform padding
653
+ var padding = isWrapped ? "".concat(paddingValue, "px ").concat(Math.round(paddingValue * 1.2), "px") : "".concat(paddingValue, "px ").concat(paddingValue * 3, "px");
654
+ var width = isWrapped ? "auto" : style.width;
655
+ var display = isWrapped ? "inline-block" : style.display || "block";
656
+ var baseStyle = _objectSpread2(_objectSpread2({
657
+ padding: padding,
658
+ background: background,
659
+ borderRadius: borderRadius,
660
+ width: width,
661
+ display: display,
662
+ overflow: 'hidden'
663
+ }, style), {}, {
664
+ // Keep fontFamily in the inline styles now
665
+ textShadow: 'none',
666
+ boxShadow: hasBackground && hasShadow ? textShadow : 'none',
667
+ transform: animationStyle === "spring" ? "".concat(style.transform ? "".concat(style.transform, " ") : '', "translate3d(0, ").concat(translateY, "px, 0) scale(").concat(scale, ")") : style.transform || 'none',
668
+ fontSize: typeof style.fontSize === 'string' ? adjustedFontSize : adjustedFontSize
669
+ });
670
+ return baseStyle;
671
+ }, [style, scale, translateY, adjustedFontSize, animationStyle]);
672
+ var wrapperStyle = React.useMemo(function () {
673
+ return {
674
+ position: 'relative',
675
+ transform: "scaleY(".concat(style.verticalStretch || 1, ")"),
676
+ whiteSpace: 'nowrap',
677
+ display: 'flex',
678
+ alignItems: 'center',
679
+ width: 'fit-content',
680
+ willChange: 'transform'
681
+ };
682
+ }, [style.verticalStretch]);
683
+ var outlineStyle = React.useMemo(function () {
684
+ return {
685
+ position: 'absolute',
686
+ left: 0,
687
+ top: 0,
688
+ right: 0,
689
+ bottom: 0,
690
+ color: style.outlineColor,
691
+ textShadow: generateOutlineShadow(style.outlineColor, style.outlineWidth, style.outlineStyle),
692
+ WebkitTextFillColor: 'transparent',
693
+ zIndex: 0
694
+ };
695
+ }, [style.outlineColor, style.outlineWidth, style.outlineStyle]);
696
+ var mainTextStyle = React.useMemo(function () {
697
+ return {
698
+ position: 'relative',
699
+ zIndex: 1,
700
+ WebkitTextStroke: 'unset',
701
+ color: style.color
702
+ };
703
+ }, [style.color]);
704
+
705
+ // Split text into words and calculate current time
706
+ var textWords = React.useMemo(function () {
707
+ return text.split(' ');
708
+ }, [text]);
709
+ var currentWordTime = frame / fps;
710
+
711
+ // Find currently spoken word
712
+
713
+ // Create amplified gradient style if amplifiedColor is a gradient array
714
+ var phraseAmplifiedStyle = React.useMemo(function () {
715
+ if (Array.isArray(style.amplifiedColors)) {
716
+ var firstWord = words[0].word;
717
+ var gradientIndex = Math.floor(remotion.random("amplified-phrase-".concat(firstWord)) * style.amplifiedColors.length);
718
+ var gradient = style.amplifiedColors[gradientIndex];
719
+ return {
720
+ background: "linear-gradient(".concat(gradient.angle, "deg, ").concat(gradient.colors.join(", "), ")"),
721
+ backgroundClip: "text",
722
+ WebkitTextFillColor: "transparent",
723
+ WebkitBackgroundClip: "text",
724
+ display: "inline-block",
725
+ position: "relative",
726
+ zIndex: 1
727
+ };
728
+ }
729
+ console.log("highlight words color:", highlightWordsColor);
730
+ if (_typeof(style.amplifiedColor) === 'object' && style.amplifiedColor.type === 'gradient') {
731
+ return {
732
+ background: "linear-gradient(".concat(style.amplifiedColor.colors[0].angle, "deg, ").concat(style.amplifiedColor.colors[0].colors.join(", "), ")"),
733
+ backgroundClip: "text",
734
+ WebkitTextFillColor: "transparent",
735
+ WebkitBackgroundClip: "text",
736
+ display: "inline-block",
737
+ position: "relative",
738
+ zIndex: 1
739
+ };
740
+ }
741
+ return {
742
+ color: style.amplifiedColor,
743
+ WebkitTextFillColor: style.amplifiedColor
744
+ };
745
+ }, [style.amplifiedColors, style.amplifiedColor, words]);
746
+
747
+ // Handle random colors if enabled
748
+ var randomColorData = React.useMemo(function () {
749
+ if (!(randomColors !== null && randomColors !== void 0 && randomColors.enabled) || !words) return null;
750
+ var shouldColor = remotion.random("should-color-".concat(words[0].word)) < randomColors.pctApplied;
751
+ if (!shouldColor) return null;
752
+ var _ref2 = (randomColors === null || randomColors === void 0 ? void 0 : randomColors.randomWordCountRange) || [0, 0],
753
+ _ref3 = _slicedToArray(_ref2, 2),
754
+ minWords = _ref3[0],
755
+ maxWords = _ref3[1];
756
+ var range = maxWords - minWords + 1;
757
+ var randomWordCount = Math.floor(remotion.random("word-count-".concat(words[0].word)) * range) + minWords;
758
+ var maxStartIndex = Math.max(0, textWords.length - randomWordCount);
759
+ var startIndex = Math.floor(remotion.random("start-index-".concat(words[0].word)) * (maxStartIndex + 1));
760
+ var randomColorObj = randomColors.colors[Math.floor(remotion.random("color-".concat(words[0].word)) * randomColors.colors.length)];
761
+ return {
762
+ shouldColor: shouldColor,
763
+ randomWordCount: randomWordCount,
764
+ startIndex: startIndex,
765
+ randomColorObj: randomColorObj
766
+ };
767
+ }, [randomColors, words, textWords.length]);
768
+ var phraseStyle = React.useMemo(function () {
769
+ if (!randomColorData) {
770
+ return {
771
+ color: style.color,
772
+ WebkitTextFillColor: style.color
773
+ };
774
+ }
775
+ var randomColorObj = randomColorData.randomColorObj;
776
+ return randomColorObj.type === "gradient" ? {
777
+ background: "linear-gradient(".concat(randomColorObj.angle, "deg, ").concat(randomColorObj.colors.join(", "), ")"),
778
+ backgroundClip: "text",
779
+ WebkitTextFillColor: "transparent",
780
+ WebkitBackgroundClip: "text",
781
+ display: "inline-block",
782
+ position: "relative",
783
+ zIndex: 1
784
+ } : {
785
+ color: randomColorObj.color,
786
+ WebkitTextFillColor: randomColorObj.color
787
+ };
788
+ }, [randomColorData, style.color]);
789
+ var wordContent = React.useMemo(function () {
790
+ return textWords.map(function (word, index) {
791
+ // Check if the word is surrounded by <h> tags
792
+ var highlightedMatch = word.match(/^<h>(.*?)<\/h>$/);
793
+ var isHighlighted = highlightedMatch !== null;
794
+ var displayWord = isHighlighted ? highlightedMatch[1] : word;
795
+ var shouldColorThisWord = randomColorData && index >= randomColorData.startIndex && index < randomColorData.startIndex + randomColorData.randomWordCount && index < textWords.length;
796
+ var wordTiming = words === null || words === void 0 ? void 0 : words[index];
797
+ var hasBeenSpoken = wordTiming && currentWordTime >= wordTiming.end;
798
+ var isCurrentlySpoken = wordTiming && currentWordTime >= wordTiming.start && currentWordTime < wordTiming.end;
799
+ var textHighlightPersists = style.textHighlightPersists ? true : false;
800
+ var shouldHighlight = style.amplifySpokenWords && (isCurrentlySpoken || textHighlightPersists && hasBeenSpoken);
801
+
802
+ // Modified logic to prioritize <h> tag highlighting
803
+ var wordStyle = isHighlighted ? {
804
+ color: highlightWordsColor,
805
+ WebkitTextFillColor: highlightWordsColor,
806
+ opacity: style.opacity || 1,
807
+ position: 'relative'
808
+ } : shouldHighlight ? _objectSpread2(_objectSpread2({}, phraseAmplifiedStyle), {}, {
809
+ opacity: style.amplifiedOpacity || 1,
810
+ position: 'relative'
811
+ }) : shouldColorThisWord ? _objectSpread2(_objectSpread2({}, phraseStyle), {}, {
812
+ opacity: style.opacity || 1,
813
+ position: 'relative'
814
+ }) : {
815
+ color: style.color,
816
+ WebkitTextFillColor: style.color,
817
+ opacity: style.unAmplifiedOpacity || 1,
818
+ position: 'relative'
819
+ };
820
+
821
+ // Add z-index to ensure proper stacking of word blocks
822
+ var containerStyle = _objectSpread2(_objectSpread2({}, wordStyle), {}, {
823
+ display: 'inline-block',
824
+ marginRight: index < textWords.length - 1 ? '0.25em' : 0,
825
+ position: 'relative',
826
+ zIndex: isCurrentlySpoken ? 2 : 1,
827
+ whiteSpace: 'nowrap'
828
+ });
829
+ return /*#__PURE__*/React.createElement("span", {
830
+ key: index,
831
+ style: containerStyle
832
+ }, style.currentWordBlock && isCurrentlySpoken && /*#__PURE__*/React.createElement("span", {
833
+ style: {
834
+ position: 'absolute',
835
+ content: '""',
836
+ left: "-".concat((style.currentWordBlockPadding || 5) * 2, "px"),
837
+ right: "-".concat((style.currentWordBlockPadding || 5) * 2, "px"),
838
+ top: 0,
839
+ height: '70%',
840
+ backgroundColor: style.currentWordBlockBackgroundColor || '#000000',
841
+ opacity: style.currentWordBlockOpacity || 1,
842
+ borderRadius: "".concat(style.currentWordBlockBorderRadius || 15, "px"),
843
+ zIndex: -1,
844
+ pointerEvents: 'none',
845
+ transform: 'translateY(2px)',
846
+ padding: "".concat(style.currentWordBlockPadding || 5, "px 0"),
847
+ boxSizing: 'content-box'
848
+ }
849
+ }), displayWord, " ");
850
+ });
851
+ }, [textWords, randomColorData, words, currentWordTime, style.amplifySpokenWords, style.textHighlightPersists, phraseAmplifiedStyle, phraseStyle, style.color, style.currentWordBlock, style.currentWordBlockBackgroundColor, style.currentWordBlockOpacity, style.currentWordBlockPadding, style.currentWordBlockBorderRadius, highlightWordsColor]);
852
+ // console.log('SubtitleText - received style fontFamily:', style.fontFamily);
853
+ return /*#__PURE__*/React.createElement("div", {
854
+ style: _objectSpread2(_objectSpread2({}, animatedStyle), {}, {
855
+ whiteSpace: 'nowrap',
856
+ width: 'fit-content',
857
+ display: 'block'
858
+ })
859
+ }, /*#__PURE__*/React.createElement("div", {
860
+ style: wrapperStyle
861
+ }, /*#__PURE__*/React.createElement("div", {
862
+ style: _objectSpread2(_objectSpread2({}, outlineStyle), {}, {
863
+ whiteSpace: 'nowrap'
864
+ })
865
+ }, wordContent), /*#__PURE__*/React.createElement("div", {
866
+ style: _objectSpread2(_objectSpread2({}, mainTextStyle), {}, {
867
+ whiteSpace: 'nowrap'
868
+ })
869
+ }, wordContent)));
870
+ }, function (prevProps, nextProps) {
871
+ // Only re-render if these essential props have changed
872
+ var essentialProps = ['frame', 'text', 'startFrame'];
873
+ var hasEssentialPropsChanged = essentialProps.some(function (prop) {
874
+ return prevProps[prop] !== nextProps[prop];
875
+ });
876
+
877
+ // Deep compare style and randomColors only if essential props haven't changed
878
+ if (!hasEssentialPropsChanged) {
879
+ return JSON.stringify(prevProps.style) === JSON.stringify(nextProps.style) && JSON.stringify(prevProps.randomColors) === JSON.stringify(nextProps.randomColors);
880
+ }
881
+ return false;
882
+ });
883
+
884
+ var findPhrasesInRange = function findPhrasesInRange(time, phrases) {
885
+ // Binary search to find the first phrase that ends after current time
886
+ var start = 0;
887
+ var end = phrases.length - 1;
888
+ while (start <= end) {
889
+ var mid = Math.floor((start + end) / 2);
890
+ var phrase = phrases[mid];
891
+ if (phrase.start <= time && time <= phrase.end) {
892
+ // Found a phrase that contains current time
893
+ return [phrase];
894
+ } else if (phrase.end < time) {
895
+ start = mid + 1;
896
+ } else {
897
+ end = mid - 1;
898
+ }
899
+ }
900
+ return [];
901
+ };
902
+
903
+ // Helper to convert hex to rgb
904
+ var hexToRgb = function hexToRgb(hex) {
905
+ // Remove # if present
906
+ hex = hex.replace('#', '');
907
+
908
+ // Handle both 3-digit and 6-digit hex
909
+ var r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);
910
+ var g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);
911
+ var b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);
912
+ return "".concat(r, ", ").concat(g, ", ").concat(b);
913
+ };
914
+ var useTextStyle = function useTextStyle(preset, x, adjustedY, videoWidth) {
915
+ return React.useMemo(function () {
916
+ // Create text shadow based on intensity
917
+ var shadowIntensity = preset.shadowIntensity || 1;
918
+ var shadowColor = preset.shadowColor || '#000000';
919
+ var shadowBlur = preset.shadowBlur || '2';
920
+ var shadowOffsetX = preset.shadowOffsetX || '0';
921
+ var shadowOffsetY = preset.shadowOffsetY || '0';
922
+
923
+ // Stack multiple shadows based on intensity
924
+ var shadows = [];
925
+ for (var i = 0; i < shadowIntensity; i++) {
926
+ shadows.push("".concat(shadowOffsetX, "px ").concat(shadowOffsetY, "px ").concat(shadowBlur, "px ").concat(shadowColor));
927
+ }
928
+ var textShadow = shadows.join(', ');
929
+ var dropShadow = preset.shadowEnabled !== false && (preset.shadowOffsetX || preset.shadowOffsetY || preset.shadowBlur) ? "drop-shadow(".concat(preset.shadowOffsetX, "px ").concat(preset.shadowOffsetY, "px ").concat(preset.shadowBlur, "px ").concat(preset.shadowColor, ")") : 'none';
930
+ var backgroundColor = preset.backgroundColor === 'transparent' ? 'transparent' : preset.backgroundColor && preset.backgroundOpacity ? "rgba(".concat(hexToRgb(preset.backgroundColor), ", ").concat(preset.backgroundOpacity, ")") : preset.backgroundColor || '#000000';
931
+
932
+ // Handle both directional and uniform padding
933
+ var paddingX = preset.backgroundPaddingX || preset.backgroundPadding || '10';
934
+ var paddingY = preset.backgroundPaddingY || preset.backgroundPadding || '10';
935
+ var basePadding = "".concat(paddingY, "px ").concat(paddingX, "px");
936
+ var style = {
937
+ position: "absolute",
938
+ left: "".concat(x, "px"),
939
+ top: "".concat(adjustedY, "px"),
940
+ transform: "translate(-50%, -50%)",
941
+ fontFamily: preset.fontFamily,
942
+ fontSize: "".concat(preset.fontSize, "px"),
943
+ fontWeight: preset.fontWeight,
944
+ color: preset.fontColor,
945
+ amplifiedColor: preset.amplifiedColor,
946
+ amplifiedColors: preset.amplifiedColors,
947
+ amplifySpokenWords: preset.amplifySpokenWords,
948
+ textTransform: preset.textCase,
949
+ fontStyle: preset.isItalic ? "italic" : "normal",
950
+ textAlign: "center",
951
+ letterSpacing: "".concat(preset.textSpacing, "px"),
952
+ backgroundColor: backgroundColor,
953
+ backgroundPadding: basePadding,
954
+ backgroundBorderRadius: preset.backgroundBorderRadius,
955
+ verticalStretch: preset.verticalStretch || 1,
956
+ transformOrigin: "center center",
957
+ width: "auto",
958
+ maxWidth: "".concat(videoWidth * 0.9, "px"),
959
+ whiteSpace: "pre-wrap",
960
+ overflow: "visible",
961
+ outlineColor: preset.outlineColor,
962
+ outlineWidth: preset.outlineWidth,
963
+ filter: dropShadow,
964
+ display: "inline-block",
965
+ textHighlightPersists: preset.textHighlightPersists,
966
+ amplifiedOpacity: preset.amplifiedOpacity,
967
+ unAmplifiedOpacity: preset.opacity,
968
+ currentWordBlock: preset.currentWordBlock,
969
+ currentWordBlockBackgroundColor: preset.currentWordBlockBackgroundColor,
970
+ currentWordBlockOpacity: preset.currentWordBlockOpacity,
971
+ currentWordBlockPadding: preset.currentWordBlockPadding,
972
+ currentWordBlockBorderRadius: preset.currentWordBlockBorderRadius,
973
+ amplifyOpacityTransitionDuration: preset.amplifyOpacityTransitionDuration,
974
+ textShadow: textShadow,
975
+ shadowIntensity: preset.shadowIntensity
976
+ };
977
+
978
+ // console.log('useTextStyle - output style fontFamily:', style.fontFamily);
979
+ return style;
980
+ }, [preset, x, adjustedY, videoWidth]);
981
+ };
982
+
983
+ // Font map that matches CSS font-family names to their font files and weights
984
+ var FONT_MAP = {
985
+ 'Posterama-1927-W01-UltraBlack': [{
986
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Posterama-1927-W01-UltraBlack.ttf?alt=media',
987
+ weight: 900,
988
+ style: 'normal'
989
+ }],
990
+ 'Stapel-Narrow': [{
991
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/NeueHaasDisplay/NeueHaasDisplayRoman.ttf?alt=media',
992
+ weight: 400,
993
+ style: 'normal'
994
+ }],
995
+ 'Stapel-NarrowMedium': [{
996
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/stapel/Stapel-NarrowMedium.ttf?alt=media',
997
+ weight: 500,
998
+ style: 'normal'
999
+ }],
1000
+ 'NeueHaasDisplayBold': [{
1001
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/NeueHaasDisplayBold.ttf?alt=media',
1002
+ weight: 700,
1003
+ style: 'normal'
1004
+ }],
1005
+ 'TheBoldFont': [{
1006
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/theboldfont.ttf?alt=media',
1007
+ weight: 700,
1008
+ style: 'normal'
1009
+ }],
1010
+ 'Mercadillo Black': [{
1011
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/mercadillo/Mercadillo-Black.ttf?alt=media',
1012
+ weight: 900,
1013
+ style: 'normal'
1014
+ }],
1015
+ 'Mercadillo Bold': [{
1016
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/mercadillo/Mercadillo-Bold.ttf?alt=media',
1017
+ weight: 700,
1018
+ style: 'normal'
1019
+ }],
1020
+ // need to add inter font variations
1021
+ // Inter font variations
1022
+ 'Inter': [{
1023
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Thin.woff2?alt=media',
1024
+ weight: 100,
1025
+ style: 'normal'
1026
+ }, {
1027
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-ExtraLight.woff2?alt=media',
1028
+ weight: 200,
1029
+ style: 'normal'
1030
+ }, {
1031
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Light.woff2?alt=media',
1032
+ weight: 300,
1033
+ style: 'normal'
1034
+ }, {
1035
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Regular.woff2?alt=media',
1036
+ weight: 400,
1037
+ style: 'normal'
1038
+ }, {
1039
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Medium.woff2?alt=media',
1040
+ weight: 500,
1041
+ style: 'normal'
1042
+ }, {
1043
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-SemiBold.woff2?alt=media',
1044
+ weight: 600,
1045
+ style: 'normal'
1046
+ }, {
1047
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Bold.woff2?alt=media',
1048
+ weight: 700,
1049
+ style: 'normal'
1050
+ }, {
1051
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-ExtraBold.woff2?alt=media',
1052
+ weight: 800,
1053
+ style: 'normal'
1054
+ }, {
1055
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Black.woff2?alt=media',
1056
+ weight: 900,
1057
+ style: 'normal'
1058
+ }],
1059
+ // Milliard font variations
1060
+ 'Milliard': [{
1061
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Thin.otf?alt=media',
1062
+ weight: 100,
1063
+ style: 'normal'
1064
+ }, {
1065
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Thin%20Italic.otf?alt=media',
1066
+ weight: 100,
1067
+ style: 'italic'
1068
+ }, {
1069
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraLight.otf?alt=media',
1070
+ weight: 200,
1071
+ style: 'normal'
1072
+ }, {
1073
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraLight%20Italic.otf?alt=media',
1074
+ weight: 200,
1075
+ style: 'italic'
1076
+ }, {
1077
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Light.otf?alt=media',
1078
+ weight: 300,
1079
+ style: 'normal'
1080
+ }, {
1081
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Light%20Italic.otf?alt=media',
1082
+ weight: 300,
1083
+ style: 'italic'
1084
+ }, {
1085
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Book.otf?alt=media',
1086
+ weight: 400,
1087
+ style: 'normal'
1088
+ }, {
1089
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Book%20Italic.otf?alt=media',
1090
+ weight: 400,
1091
+ style: 'italic'
1092
+ }, {
1093
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Medium.otf?alt=media',
1094
+ weight: 500,
1095
+ style: 'normal'
1096
+ }, {
1097
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Medium%20Italic.otf?alt=media',
1098
+ weight: 500,
1099
+ style: 'italic'
1100
+ }, {
1101
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20SemiBold.otf?alt=media',
1102
+ weight: 600,
1103
+ style: 'normal'
1104
+ }, {
1105
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20SemiBold%20Italic.otf?alt=media',
1106
+ weight: 600,
1107
+ style: 'italic'
1108
+ }, {
1109
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Bold.otf?alt=media',
1110
+ weight: 700,
1111
+ style: 'normal'
1112
+ }, {
1113
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Bold%20Italic.otf?alt=media',
1114
+ weight: 700,
1115
+ style: 'italic'
1116
+ }, {
1117
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraBold.otf?alt=media',
1118
+ weight: 800,
1119
+ style: 'normal'
1120
+ }, {
1121
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraBold%20Italic.otf?alt=media',
1122
+ weight: 800,
1123
+ style: 'italic'
1124
+ }, {
1125
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Black.otf?alt=media',
1126
+ weight: 900,
1127
+ style: 'normal'
1128
+ }, {
1129
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Black%20Italic.otf?alt=media',
1130
+ weight: 900,
1131
+ style: 'italic'
1132
+ }],
1133
+ 'Arial Black': [{
1134
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Arial%20Black.ttf?alt=media',
1135
+ weight: 900,
1136
+ style: 'normal'
1137
+ }],
1138
+ // Sofia Pro font variations
1139
+ 'Sofia Pro': [{
1140
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Light%20Az.otf?alt=media',
1141
+ weight: 300,
1142
+ style: 'normal'
1143
+ }, {
1144
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Light%20Italic%20Az.otf?alt=media',
1145
+ weight: 300,
1146
+ style: 'italic'
1147
+ }, {
1148
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Regular%20Az.otf?alt=media',
1149
+ weight: 400,
1150
+ style: 'normal'
1151
+ }, {
1152
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Regular%20Italic%20Az.otf?alt=media',
1153
+ weight: 400,
1154
+ style: 'italic'
1155
+ }, {
1156
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Medium%20Az.otf?alt=media',
1157
+ weight: 500,
1158
+ style: 'normal'
1159
+ }, {
1160
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Medium%20Italic%20Az.otf?alt=media',
1161
+ weight: 500,
1162
+ style: 'italic'
1163
+ }, {
1164
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Semi%20Bold%20Az.otf?alt=media',
1165
+ weight: 600,
1166
+ style: 'normal'
1167
+ }, {
1168
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Semi%20Bold%20Italic%20Az.otf?alt=media',
1169
+ weight: 600,
1170
+ style: 'italic'
1171
+ }, {
1172
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Bold%20Az.otf?alt=media',
1173
+ weight: 700,
1174
+ style: 'normal'
1175
+ }, {
1176
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Bold%20Italic%20Az.otf?alt=media',
1177
+ weight: 700,
1178
+ style: 'italic'
1179
+ }, {
1180
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Black%20Az.otf?alt=media',
1181
+ weight: 900,
1182
+ style: 'normal'
1183
+ }, {
1184
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Black%20Italic%20Az.otf?alt=media',
1185
+ weight: 900,
1186
+ style: 'italic'
1187
+ }, {
1188
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20ExtraLight%20Az.otf?alt=media',
1189
+ weight: 200,
1190
+ style: 'normal'
1191
+ }, {
1192
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20ExtraLight%20Italic%20Az.otf?alt=media',
1193
+ weight: 200,
1194
+ style: 'italic'
1195
+ }, {
1196
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20UltraLight%20Az.otf?alt=media',
1197
+ weight: 100,
1198
+ style: 'normal'
1199
+ }, {
1200
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20UltraLight%20Italic%20Az.otf?alt=media',
1201
+ weight: 100,
1202
+ style: 'italic'
1203
+ }]
1204
+ };
1205
+ var loadDocumentFonts = /*#__PURE__*/function () {
1206
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(fontFamily) {
1207
+ var cleanFontFamily, fontVariations, loadPromises;
1208
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
1209
+ while (1) switch (_context2.prev = _context2.next) {
1210
+ case 0:
1211
+ if (!(fontFamily === 'Arial')) {
1212
+ _context2.next = 4;
1213
+ break;
1214
+ }
1215
+ return _context2.abrupt("return");
1216
+ case 4:
1217
+ if (!(!fontFamily || typeof document === 'undefined')) {
1218
+ _context2.next = 7;
1219
+ break;
1220
+ }
1221
+ console.warn('Font family is not provided or document is undefined.');
1222
+ return _context2.abrupt("return");
1223
+ case 7:
1224
+ // Clean the font family name (remove quotes and fallbacks)
1225
+ cleanFontFamily = fontFamily.replace(/['"]/g, '').split(',')[0].trim(); // console.log(`Cleaned font family name: ${cleanFontFamily}`);
1226
+ // Get font variations for this family
1227
+ fontVariations = FONT_MAP[cleanFontFamily];
1228
+ if (fontVariations) {
1229
+ _context2.next = 12;
1230
+ break;
1231
+ }
1232
+ console.warn("Font family \"".concat(cleanFontFamily, "\" not found in font map"));
1233
+ return _context2.abrupt("return");
1234
+ case 12:
1235
+ _context2.prev = 12;
1236
+ // Load all variations of the font family
1237
+ loadPromises = fontVariations.map(/*#__PURE__*/function () {
1238
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
1239
+ var src, weight, style, font, loadedFont;
1240
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1241
+ while (1) switch (_context.prev = _context.next) {
1242
+ case 0:
1243
+ src = _ref2.src, weight = _ref2.weight, style = _ref2.style;
1244
+ font = new FontFace(cleanFontFamily, "url(".concat(src, ")"), {
1245
+ weight: weight,
1246
+ style: style
1247
+ });
1248
+ _context.next = 4;
1249
+ return font.load();
1250
+ case 4:
1251
+ loadedFont = _context.sent;
1252
+ document.fonts.add(loadedFont);
1253
+ return _context.abrupt("return", loadedFont);
1254
+ case 7:
1255
+ case "end":
1256
+ return _context.stop();
1257
+ }
1258
+ }, _callee);
1259
+ }));
1260
+ return function (_x2) {
1261
+ return _ref3.apply(this, arguments);
1262
+ };
1263
+ }());
1264
+ _context2.next = 16;
1265
+ return Promise.all(loadPromises);
1266
+ case 16:
1267
+ _context2.next = 21;
1268
+ break;
1269
+ case 18:
1270
+ _context2.prev = 18;
1271
+ _context2.t0 = _context2["catch"](12);
1272
+ console.error("Error loading font family \"".concat(cleanFontFamily, "\":"), _context2.t0);
1273
+ case 21:
1274
+ case "end":
1275
+ return _context2.stop();
1276
+ }
1277
+ }, _callee2, null, [[12, 18]]);
1278
+ }));
1279
+ return function loadDocumentFonts(_x) {
1280
+ return _ref.apply(this, arguments);
1281
+ };
1282
+ }();
1283
+
1284
+ var addPixelUnit = function addPixelUnit(value) {
1285
+ if (typeof value === 'string' && value.endsWith('px')) {
1286
+ return value;
1287
+ }
1288
+ return "".concat(value, "px");
1289
+ };
1290
+ var SubtitlesComposition = function SubtitlesComposition(_a) {
1291
+ var phrases = _a.phrases,
1292
+ styleConfig = _a.styleConfig,
1293
+ x = _a.x,
1294
+ y = _a.y,
1295
+ currentFrame = _a.currentFrame,
1296
+ currentTime = _a.currentTime,
1297
+ fps = _a.fps,
1298
+ highlightWordsColor = _a.highlightWordsColor;
1299
+ React.useEffect(function () {
1300
+ if (styleConfig.fontFamily) {
1301
+ loadDocumentFonts(styleConfig.fontFamily);
1302
+ }
1303
+ }, [styleConfig.fontFamily]);
1304
+ var style = useTextStyle(styleConfig);
1305
+ var currentPhrases = React.useMemo(function () {
1306
+ return findPhrasesInRange(currentTime, phrases);
1307
+ }, [currentTime, phrases]);
1308
+ return jsxRuntime.jsx("div", __assign({
1309
+ style: {
1310
+ position: 'absolute',
1311
+ top: 0,
1312
+ left: 0,
1313
+ width: '100%',
1314
+ height: '100%',
1315
+ boxSizing: 'border-box'
1316
+ }
1317
+ }, {
1318
+ children: jsxRuntime.jsx("div", __assign({
1319
+ style: {
1320
+ position: 'absolute',
1321
+ top: 0,
1322
+ left: 0,
1323
+ width: '100%',
1324
+ height: '100%'
1325
+ }
1326
+ }, {
1327
+ children: currentPhrases.map(function (phrase) {
1328
+ var props = {
1329
+ text: phrase.text,
1330
+ style: style,
1331
+ animationStyle: styleConfig.animationStyle,
1332
+ frame: currentFrame,
1333
+ startFrame: Math.floor(phrase.start * fps),
1334
+ randomColors: styleConfig.randomColors,
1335
+ words: phrase.words,
1336
+ fps: fps,
1337
+ highlightWordsColor: highlightWordsColor
1338
+ };
1339
+ var top = addPixelUnit(y);
1340
+ var left = addPixelUnit(x);
1341
+ return jsxRuntime.jsx("div", __assign({
1342
+ style: {
1343
+ position: 'absolute',
1344
+ top: top,
1345
+ left: left
1346
+ }
1347
+ }, {
1348
+ children: jsxRuntime.jsx(SubtitleText, __assign({}, props))
1349
+ }), "".concat(phrase.start, "-").concat(phrase.end));
1350
+ })
1351
+ }))
1352
+ }));
1353
+ };
1354
+ var Subtitles = function Subtitles(props) {
1355
+ var width = props.width,
1356
+ height = props.height,
1357
+ fps = props.fps,
1358
+ devMode = props.devMode;
1359
+ return jsxRuntime.jsx("div", __assign({
1360
+ style: {
1361
+ width: '100%',
1362
+ height: '100%'
1363
+ }
1364
+ }, {
1365
+ children: jsxRuntime.jsx(player.Player, {
1366
+ component: SubtitlesComposition,
1367
+ inputProps: __assign({}, props),
1368
+ durationInFrames: 1000000,
1369
+ compositionWidth: width,
1370
+ compositionHeight: height,
1371
+ fps: fps ? fps : 30,
1372
+ style: {
1373
+ width: '100%',
1374
+ height: '100%'
1375
+ },
1376
+ controls: false,
1377
+ autoPlay: false,
1378
+ loop: devMode
1379
+ })
1380
+ }));
1381
+ };
1382
+
1383
+ var useStyleConfig = function useStyleConfig(subtitleStyle, baseStyle, textStyle) {
1384
+ return React.useMemo(function () {
1385
+ if (subtitleStyle === "kp-upgrade") {
1386
+ return __assign(__assign({}, baseStyle), {
1387
+ name: "kp-upgrade",
1388
+ captionPosition: "middle",
1389
+ fontSize: "50",
1390
+ fontFamily: "Arial",
1391
+ fontWeight: "800",
1392
+ fontColor: "#ffffff",
1393
+ textCase: "sentence",
1394
+ outlineColor: "#000000",
1395
+ outlineWidth: "2",
1396
+ outlineStyle: "round",
1397
+ shadowEnabled: true,
1398
+ shadowColor: "#000000",
1399
+ shadowBlur: "2",
1400
+ shadowOffsetX: "0",
1401
+ shadowOffsetY: "2",
1402
+ verticalStretch: "1.4",
1403
+ amplifySpokenWords: true,
1404
+ amplifiedColor: "#ffff00"
1405
+ });
1406
+ }
1407
+ return textStyle;
1408
+ }, [subtitleStyle, baseStyle, textStyle]);
1409
+ };
1410
+
1411
+ var useAdjustedPosition = function useAdjustedPosition(y, faceData) {
1412
+ var currentFrame = remotion.useCurrentFrame();
1413
+
1414
+ // Memoize face event lookup
1415
+ var currentFaceEvent = React.useMemo(function () {
1416
+ var _faceData$events;
1417
+ if (!(faceData !== null && faceData !== void 0 && (_faceData$events = faceData.events) !== null && _faceData$events !== void 0 && _faceData$events.length)) {
1418
+ return {
1419
+ numPeople: 2
1420
+ };
1421
+ }
1422
+ return faceData.events.findLast(function (event) {
1423
+ return event.frame <= currentFrame;
1424
+ }) || {
1425
+ numPeople: 2
1426
+ };
1427
+ }, [currentFrame, faceData === null || faceData === void 0 ? void 0 : faceData.events]);
1428
+
1429
+ // Adjust Y position only if face detection data is available
1430
+ var adjustedY = React.useMemo(function () {
1431
+ if (currentFaceEvent.numPeople === 2) {
1432
+ return y;
1433
+ }
1434
+ if (y === 960) {
1435
+ return y * 2 - 300;
1436
+ }
1437
+ return y;
1438
+ }, [y, currentFaceEvent.numPeople]);
1439
+ return {
1440
+ currentFaceEvent: currentFaceEvent,
1441
+ adjustedY: adjustedY
1442
+ };
1443
+ };
1444
+
1445
+ var useAdjustedPhrases = function useAdjustedPhrases(subtitlesData, maxCharsPerLine, fps) {
1446
+ var segmentData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
1447
+ return React.useMemo(function () {
1448
+ // If no segment data, return empty array
1449
+ if (!segmentData || segmentData.length === 0) {
1450
+ return [];
1451
+ }
1452
+ var getMissingWordPhrasesIfExist = function getMissingWordPhrasesIfExist(startTime, endTime) {
1453
+ // Find words that fall in the gap
1454
+ var gapWords = subtitlesData.filter(function (word) {
1455
+ return word.start >= startTime && word.end <= endTime;
1456
+ });
1457
+ if (gapWords.length === 0) return [];
1458
+
1459
+ // Create phrases from gap words using same logic as segment phrases
1460
+ var gapPhrases = [];
1461
+ var currentPhrase = {
1462
+ text: "",
1463
+ words: [],
1464
+ start: null,
1465
+ end: null,
1466
+ segmentIndex: -1,
1467
+ // Special index for gap phrases
1468
+ durationInFrames: 0
1469
+ };
1470
+ gapWords.forEach(function (word, wordIndex) {
1471
+ var wordWithSpace = wordIndex === 0 ? word.word : " ".concat(word.word);
1472
+ var newLength = currentPhrase.text.length + wordWithSpace.length;
1473
+ if (newLength <= maxCharsPerLine) {
1474
+ // Add to current phrase
1475
+ currentPhrase.text += wordWithSpace;
1476
+ currentPhrase.words.push(word);
1477
+ currentPhrase.start = currentPhrase.start === null ? word.start : currentPhrase.start;
1478
+ currentPhrase.end = word.end;
1479
+ } else {
1480
+ // Finalize current phrase
1481
+ if (currentPhrase.words.length > 0) {
1482
+ gapPhrases.push(currentPhrase);
1483
+ }
1484
+
1485
+ // Start new phrase with current word
1486
+ currentPhrase = {
1487
+ text: word.word,
1488
+ words: [word],
1489
+ start: word.start,
1490
+ end: word.end,
1491
+ segmentIndex: -1
1492
+ };
1493
+ }
1494
+ });
1495
+
1496
+ // Add the last phrase if it has words
1497
+ if (currentPhrase.words.length > 0) {
1498
+ gapPhrases.push(currentPhrase);
1499
+ }
1500
+
1501
+ // Process timing for gap phrases
1502
+ var processedGapPhrases = gapPhrases.map(function (phrase, phraseIndex) {
1503
+ var startFrame = Math.floor(phrase.start * fps);
1504
+ var endFrame;
1505
+ if (phraseIndex < gapPhrases.length - 1) {
1506
+ var nextPhrase = gapPhrases[phraseIndex + 1];
1507
+ var timeDiff = nextPhrase.start - phrase.end;
1508
+ endFrame = timeDiff > 0.3 ? Math.floor(phrase.end * fps) : Math.floor(nextPhrase.start * fps);
1509
+ } else {
1510
+ endFrame = Math.floor(phrase.end * fps);
1511
+ }
1512
+ return _objectSpread2(_objectSpread2({}, phrase), {}, {
1513
+ startFrame: startFrame,
1514
+ endFrame: endFrame,
1515
+ durationInFrames: endFrame - startFrame + 1
1516
+ });
1517
+ });
1518
+ return processedGapPhrases;
1519
+ };
1520
+ var masterPhrases = [];
1521
+
1522
+ // Check for words before the first segment
1523
+ if (segmentData.length > 0 && subtitlesData.length > 0) {
1524
+ var firstSegmentStart = segmentData[0].start;
1525
+ var firstWordStart = 0; // Start from the beginning
1526
+ var preSegmentPhrases = getMissingWordPhrasesIfExist(firstWordStart, firstSegmentStart);
1527
+ if (preSegmentPhrases.length > 0) {
1528
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(preSegmentPhrases));
1529
+ }
1530
+ }
1531
+
1532
+ // Process each segment and gaps between segments
1533
+ segmentData.forEach(function (segment, segmentIndex) {
1534
+ // 1. Get words for this segment
1535
+ var segmentWords = subtitlesData.filter(function (word) {
1536
+ return word.segmentId === segmentIndex;
1537
+ });
1538
+
1539
+ // Process segment phrases
1540
+ if (segmentWords.length > 0) {
1541
+ // 2. Create phrases for this segment
1542
+ var currentSegmentPhrases = [];
1543
+ var currentPhrase = {
1544
+ text: "",
1545
+ words: [],
1546
+ start: null,
1547
+ end: null,
1548
+ segmentIndex: segmentIndex
1549
+ };
1550
+ segmentWords.forEach(function (word, wordIndex) {
1551
+ var wordWithSpace = wordIndex === 0 ? word.word : " ".concat(word.word);
1552
+ var newLength = currentPhrase.text.length + wordWithSpace.length;
1553
+ if (newLength <= maxCharsPerLine) {
1554
+ // Add to current phrase
1555
+ currentPhrase.text += wordWithSpace;
1556
+ currentPhrase.words.push(word);
1557
+ currentPhrase.start = currentPhrase.start === null ? word.start : currentPhrase.start;
1558
+ currentPhrase.end = word.end;
1559
+ } else {
1560
+ // Finalize current phrase
1561
+ if (currentPhrase.words.length > 0) {
1562
+ currentSegmentPhrases.push(currentPhrase);
1563
+ }
1564
+
1565
+ // Start new phrase with current word
1566
+ currentPhrase = {
1567
+ text: word.word,
1568
+ words: [word],
1569
+ start: word.start,
1570
+ end: word.end,
1571
+ segmentIndex: segmentIndex
1572
+ };
1573
+ }
1574
+ });
1575
+
1576
+ // Add the last phrase if it has words
1577
+ if (currentPhrase.words.length > 0) {
1578
+ currentSegmentPhrases.push(currentPhrase);
1579
+ }
1580
+
1581
+ // 3. Process timing for phrases
1582
+ var processedPhrases = currentSegmentPhrases.map(function (phrase, phraseIndex) {
1583
+ var startFrame = Math.floor(phrase.start * fps);
1584
+ var endFrame;
1585
+
1586
+ // Calculate end frame based on next phrase or segment end
1587
+ if (phraseIndex < currentSegmentPhrases.length - 1) {
1588
+ var nextPhrase = currentSegmentPhrases[phraseIndex + 1];
1589
+ var timeDiff = nextPhrase.start - phrase.end;
1590
+ endFrame = timeDiff > 0.3 ? Math.floor(phrase.end * fps) : Math.floor(nextPhrase.start * fps);
1591
+ } else {
1592
+ endFrame = Math.floor(phrase.end * fps);
1593
+ }
1594
+
1595
+ // Ensure phrase doesn't extend beyond segment boundaries
1596
+ endFrame = Math.min(endFrame, Math.floor(segment.end * fps));
1597
+ var processedPhrase = _objectSpread2(_objectSpread2({}, phrase), {}, {
1598
+ startFrame: startFrame,
1599
+ endFrame: endFrame,
1600
+ durationInFrames: endFrame - startFrame + 1
1601
+ });
1602
+ return processedPhrase;
1603
+ });
1604
+
1605
+ // 4. Add to master array
1606
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(processedPhrases));
1607
+ }
1608
+
1609
+ // Check for gap after this segment
1610
+ if (segmentIndex < segmentData.length - 1) {
1611
+ var nextSegment = segmentData[segmentIndex + 1];
1612
+ var gapPhrases = getMissingWordPhrasesIfExist(segment.end, nextSegment.start);
1613
+ if (gapPhrases.length > 0) {
1614
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(gapPhrases));
1615
+ }
1616
+ }
1617
+ });
1618
+
1619
+ // Sort final phrases by start time
1620
+ masterPhrases.sort(function (a, b) {
1621
+ return a.start - b.start;
1622
+ });
1623
+ return masterPhrases;
1624
+ }, [subtitlesData, maxCharsPerLine, fps, segmentData]);
1625
+ };
1626
+
1627
+ var presets = [
1628
+ {
1629
+ name: "tvShow",
1630
+ captionPosition: "middle",
1631
+ amplifiedColor: "#ffff00",
1632
+ amplifySpokenWords: false,
1633
+ fontFamily: "Arial",
1634
+ fontWeight: "800",
1635
+ fontColor: "#ffffff",
1636
+ fontSize: "50",
1637
+ textCase: "lowercase",
1638
+ outlineColor: "#000000",
1639
+ outlineWidth: "3",
1640
+ shadowColor: "#000000",
1641
+ shadowBlur: "1",
1642
+ shadowOffsetX: "2",
1643
+ shadowOffsetY: "2",
1644
+ backgroundColor: "#808080",
1645
+ backgroundOpacity: "0",
1646
+ backgroundBorderRadius: "10",
1647
+ textSpacing: "0",
1648
+ animationStyle: "spring",
1649
+ isItalic: true,
1650
+ shinyWordHighlight: true,
1651
+ shinySegmentHighlight: true
1652
+ },
1653
+ {
1654
+ name: "youtubeShort",
1655
+ captionPosition: "middle",
1656
+ amplifiedColor: "#FFFF00",
1657
+ amplifySpokenWords: false,
1658
+ fontFamily: "Mercadillo Black",
1659
+ fontWeight: "700",
1660
+ fontColor: "#FFFFFF",
1661
+ fontSize: "42",
1662
+ textCase: "uppercase",
1663
+ outlineColor: "#000000",
1664
+ outlineWidth: "0.5",
1665
+ shadowColor: "#000000",
1666
+ shadowBlur: "0",
1667
+ shadowOffsetX: "0",
1668
+ shadowOffsetY: "0",
1669
+ backgroundColor: "#000000",
1670
+ backgroundOpacity: "0.0",
1671
+ backgroundBorderRadius: "0",
1672
+ textSpacing: "0",
1673
+ animationStyle: "spring",
1674
+ isItalic: false,
1675
+ shinyWordHighlight: true,
1676
+ shinySegmentHighlight: true
1677
+ },
1678
+ {
1679
+ name: "podcast",
1680
+ captionPosition: "bottom",
1681
+ amplifiedColor: "#ffff00",
1682
+ amplifySpokenWords: false,
1683
+ fontFamily: "Arial",
1684
+ fontWeight: "700",
1685
+ fontColor: "#ffffff",
1686
+ fontSize: "28",
1687
+ textCase: "lowercase",
1688
+ outlineColor: "#000000",
1689
+ outlineWidth: "0",
1690
+ shadowColor: "#000000",
1691
+ shadowBlur: "0",
1692
+ shadowOffsetX: "0",
1693
+ shadowOffsetY: "0",
1694
+ backgroundColor: "#000000",
1695
+ backgroundOpacity: "0.7",
1696
+ backgroundBorderRadius: "5",
1697
+ textSpacing: "0",
1698
+ animationStyle: "none",
1699
+ isItalic: false,
1700
+ shinyWordHighlight: false,
1701
+ shinySegmentHighlight: false
1702
+ },
1703
+ {
1704
+ name: "podcastWhite",
1705
+ captionPosition: "bottom",
1706
+ amplifiedColor: "#ffffff",
1707
+ amplifySpokenWords: false,
1708
+ fontFamily: "Arial",
1709
+ fontWeight: "700",
1710
+ fontColor: "#ffffff",
1711
+ fontSize: "28",
1712
+ textCase: "lowercase",
1713
+ outlineColor: "#000000",
1714
+ outlineWidth: "0",
1715
+ shadowColor: "#000000",
1716
+ shadowBlur: "0",
1717
+ shadowOffsetX: "0",
1718
+ shadowOffsetY: "0",
1719
+ backgroundColor: "#000000",
1720
+ backgroundOpacity: "0.7",
1721
+ backgroundBorderRadius: "5",
1722
+ textSpacing: "0",
1723
+ animationStyle: "none",
1724
+ isItalic: false,
1725
+ shinyWordHighlight: true,
1726
+ shinySegmentHighlight: true
1727
+ },
1728
+ {
1729
+ name: "tiktokBold",
1730
+ captionPosition: "middle",
1731
+ amplifiedColor: "#00ffff",
1732
+ amplifySpokenWords: false,
1733
+ fontFamily: "Mercadillo Black",
1734
+ fontWeight: "800",
1735
+ fontColor: "#ffffff",
1736
+ fontSize: "48",
1737
+ textCase: "uppercase",
1738
+ outlineColor: "#000000",
1739
+ outlineWidth: "2",
1740
+ shadowColor: "#000000",
1741
+ shadowBlur: "0",
1742
+ shadowOffsetX: "0",
1743
+ shadowOffsetY: "0",
1744
+ backgroundColor: "#000000",
1745
+ backgroundOpacity: "0",
1746
+ backgroundBorderRadius: "0",
1747
+ textSpacing: "1",
1748
+ animationStyle: "spring",
1749
+ isItalic: false,
1750
+ shinyWordHighlight: true,
1751
+ shinySegmentHighlight: true
1752
+ },
1753
+ {
1754
+ name: "instagramStory",
1755
+ captionPosition: "bottom",
1756
+ amplifiedColor: "#ff3399",
1757
+ amplifySpokenWords: false,
1758
+ fontFamily: "Arial Black",
1759
+ fontWeight: "900",
1760
+ fontColor: "#ffffff",
1761
+ fontSize: "36",
1762
+ textCase: "uppercase",
1763
+ outlineColor: "#000000",
1764
+ outlineWidth: "1",
1765
+ shadowColor: "#000000",
1766
+ shadowBlur: "0",
1767
+ shadowOffsetX: "0",
1768
+ shadowOffsetY: "0",
1769
+ backgroundColor: "#000000",
1770
+ backgroundOpacity: "0.5",
1771
+ backgroundBorderRadius: "8",
1772
+ textSpacing: "0",
1773
+ animationStyle: "spring",
1774
+ isItalic: false,
1775
+ shinyWordHighlight: true,
1776
+ shinySegmentHighlight: true
1777
+ },
1778
+ {
1779
+ name: "reelsCasual",
1780
+ captionPosition: "middle",
1781
+ amplifiedColor: "#ff6600",
1782
+ amplifySpokenWords: false,
1783
+ fontFamily: "Mercadillo Black",
1784
+ fontWeight: "700",
1785
+ fontColor: "#ffffff",
1786
+ fontSize: "38",
1787
+ textCase: "lowercase",
1788
+ outlineColor: "#000000",
1789
+ outlineWidth: "1.5",
1790
+ shadowColor: "#000000",
1791
+ shadowBlur: "1",
1792
+ shadowOffsetX: "1",
1793
+ shadowOffsetY: "1",
1794
+ backgroundColor: "#000000",
1795
+ backgroundOpacity: "0.3",
1796
+ backgroundBorderRadius: "5",
1797
+ textSpacing: "0",
1798
+ animationStyle: "spring",
1799
+ isItalic: false,
1800
+ shinyWordHighlight: true,
1801
+ shinySegmentHighlight: true
1802
+ },
1803
+ {
1804
+ name: "youtubeGaming",
1805
+ captionPosition: "bottom",
1806
+ amplifiedColor: "#33ff33",
1807
+ amplifySpokenWords: false,
1808
+ fontFamily: "Arial Black",
1809
+ fontWeight: "900",
1810
+ fontColor: "#ffffff",
1811
+ fontSize: "44",
1812
+ textCase: "uppercase",
1813
+ outlineColor: "#000000",
1814
+ outlineWidth: "2.5",
1815
+ shadowColor: "#000000",
1816
+ shadowBlur: "2",
1817
+ shadowOffsetX: "2",
1818
+ shadowOffsetY: "2",
1819
+ backgroundColor: "#000000",
1820
+ backgroundOpacity: "0",
1821
+ backgroundBorderRadius: "0",
1822
+ textSpacing: "1",
1823
+ animationStyle: "spring",
1824
+ isItalic: false,
1825
+ shinyWordHighlight: true,
1826
+ shinySegmentHighlight: true
1827
+ },
1828
+ {
1829
+ name: "tutorialStyle",
1830
+ captionPosition: "bottom",
1831
+ amplifiedColor: "#00ccff",
1832
+ amplifySpokenWords: false,
1833
+ fontFamily: "Arial Black",
1834
+ fontWeight: "900",
1835
+ fontColor: "#ffffff",
1836
+ fontSize: "32",
1837
+ textCase: "sentence",
1838
+ outlineColor: "#000000",
1839
+ outlineWidth: "1",
1840
+ shadowColor: "#000000",
1841
+ shadowBlur: "0",
1842
+ shadowOffsetX: "1",
1843
+ shadowOffsetY: "1",
1844
+ backgroundColor: "#000000",
1845
+ backgroundOpacity: "0.6",
1846
+ backgroundBorderRadius: "4",
1847
+ textSpacing: "0",
1848
+ animationStyle: "spring",
1849
+ isItalic: false,
1850
+ shinyWordHighlight: true,
1851
+ shinySegmentHighlight: true
1852
+ },
1853
+ {
1854
+ name: "motivationalQuote",
1855
+ captionPosition: "middle",
1856
+ amplifiedColor: "#ffcc00",
1857
+ amplifySpokenWords: false,
1858
+ fontFamily: "Mercadillo Black",
1859
+ fontWeight: "800",
1860
+ fontColor: "#ffffff",
1861
+ fontSize: "46",
1862
+ textCase: "uppercase",
1863
+ outlineColor: "#000000",
1864
+ outlineWidth: "2",
1865
+ shadowColor: "#000000",
1866
+ shadowBlur: "1",
1867
+ shadowOffsetX: "2",
1868
+ shadowOffsetY: "2",
1869
+ backgroundColor: "#000000",
1870
+ backgroundOpacity: "0.4",
1871
+ backgroundBorderRadius: "10",
1872
+ textSpacing: "2",
1873
+ animationStyle: "spring",
1874
+ isItalic: false,
1875
+ shinyWordHighlight: true,
1876
+ shinySegmentHighlight: true
1877
+ },
1878
+ {
1879
+ name: "neonGlow",
1880
+ captionPosition: "middle",
1881
+ amplifiedColor: "#ff00ff",
1882
+ amplifySpokenWords: false,
1883
+ fontFamily: "Arial Black",
1884
+ fontWeight: "900",
1885
+ fontColor: "#ffffff",
1886
+ fontSize: "40",
1887
+ textCase: "uppercase",
1888
+ outlineColor: "#ff00ff",
1889
+ outlineWidth: "3",
1890
+ shadowColor: "#ff00ff",
1891
+ shadowBlur: "15",
1892
+ shadowOffsetX: "0",
1893
+ shadowOffsetY: "0",
1894
+ backgroundColor: "#000000",
1895
+ backgroundOpacity: "0",
1896
+ backgroundBorderRadius: "0",
1897
+ textSpacing: "2",
1898
+ animationStyle: "spring",
1899
+ isItalic: false,
1900
+ shinyWordHighlight: true,
1901
+ shinySegmentHighlight: true
1902
+ },
1903
+ {
1904
+ name: "retroWave",
1905
+ captionPosition: "bottom",
1906
+ amplifiedColor: "#00ffff",
1907
+ amplifySpokenWords: false,
1908
+ fontFamily: "Arial Black",
1909
+ fontWeight: "800",
1910
+ fontColor: "#ff69b4",
1911
+ fontSize: "38",
1912
+ textCase: "uppercase",
1913
+ outlineColor: "#00ffff",
1914
+ outlineWidth: "2",
1915
+ shadowColor: "#ff00ff",
1916
+ shadowBlur: "4",
1917
+ shadowOffsetX: "4",
1918
+ shadowOffsetY: "4",
1919
+ backgroundColor: "#000000",
1920
+ backgroundOpacity: "0.3",
1921
+ backgroundBorderRadius: "0",
1922
+ textSpacing: "3",
1923
+ animationStyle: "spring",
1924
+ isItalic: false,
1925
+ shinyWordHighlight: true,
1926
+ shinySegmentHighlight: true
1927
+ },
1928
+ {
1929
+ name: "comicBook",
1930
+ captionPosition: "middle",
1931
+ amplifiedColor: "#ffff00",
1932
+ amplifySpokenWords: false,
1933
+ fontFamily: "Arial Black",
1934
+ fontWeight: "900",
1935
+ fontColor: "#ffffff",
1936
+ fontSize: "42",
1937
+ textCase: "uppercase",
1938
+ outlineColor: "#000000",
1939
+ outlineWidth: "4",
1940
+ shadowColor: "#000000",
1941
+ shadowBlur: "0",
1942
+ shadowOffsetX: "3",
1943
+ shadowOffsetY: "3",
1944
+ backgroundColor: "#ff0000",
1945
+ backgroundOpacity: "0.2",
1946
+ backgroundBorderRadius: "15",
1947
+ textSpacing: "1",
1948
+ animationStyle: "spring",
1949
+ isItalic: false,
1950
+ shinyWordHighlight: true,
1951
+ shinySegmentHighlight: true
1952
+ },
1953
+ {
1954
+ name: "Pleasure Pod",
1955
+ captionPosition: "middle",
1956
+ amplifiedColor: "#0572ff",
1957
+ amplifySpokenWords: false,
1958
+ fontFamily: "Arial Black",
1959
+ fontWeight: "bold",
1960
+ fontColor: "#0572ff",
1961
+ fontSize: "60",
1962
+ textCase: "uppercase",
1963
+ outlineColor: "#000000",
1964
+ outlineWidth: "8",
1965
+ shadowColor: "#000000",
1966
+ shadowBlur: "0",
1967
+ shadowOffsetX: "3",
1968
+ shadowOffsetY: "3",
1969
+ backgroundColor: "#ff0000",
1970
+ backgroundOpacity: "0.0",
1971
+ backgroundBorderRadius: "15",
1972
+ textSpacing: "-2",
1973
+ animationStyle: "pleasure-pod-animation",
1974
+ verticalStretch: "1.3"
1975
+ },
1976
+ {
1977
+ name: "Grit",
1978
+ captionPosition: "middle",
1979
+ amplifiedColor: "#ffffff",
1980
+ amplifySpokenWords: false,
1981
+ fontFamily: "Posterama-1927-W01-UltraBlack",
1982
+ fontWeight: "900",
1983
+ fontColor: "#ffffff",
1984
+ fontSize: "80",
1985
+ textCase: "uppercase",
1986
+ outlineColor: "#000000",
1987
+ outlineWidth: "8",
1988
+ shadowColor: "#000000",
1989
+ shadowBlur: "20",
1990
+ shadowOffsetX: "10",
1991
+ shadowOffsetY: "10",
1992
+ backgroundColor: "#000000",
1993
+ backgroundOpacity: "0",
1994
+ backgroundBorderRadius: "0",
1995
+ textSpacing: "0",
1996
+ animationStyle: "spring",
1997
+ isItalic: false,
1998
+ shinyWordHighlight: false,
1999
+ shinySegmentHighlight: false,
2000
+ randomColors: {
2001
+ enabled: "true",
2002
+ colors: [
2003
+ {
2004
+ type: "still",
2005
+ color: "#59a3eb"
2006
+ }
2007
+ ],
2008
+ avoidFillers: true,
2009
+ pctApplied: 0.5,
2010
+ randomWordCountRange: [
2011
+ 2,
2012
+ 3
2013
+ ]
2014
+ }
2015
+ },
2016
+ {
2017
+ name: "abc",
2018
+ captionPosition: "middle",
2019
+ amplifiedColor: "#ffffff",
2020
+ amplifySpokenWords: false,
2021
+ fontFamily: "Posterama-1927-W01-UltraBlack",
2022
+ fontWeight: "900",
2023
+ fontColor: "#ffffff",
2024
+ fontSize: "80",
2025
+ textCase: "uppercase",
2026
+ outlineColor: "#000000",
2027
+ outlineWidth: "8",
2028
+ shadowColor: "#000000",
2029
+ shadowBlur: "20",
2030
+ shadowOffsetX: "10",
2031
+ shadowOffsetY: "10",
2032
+ backgroundColor: "#000000",
2033
+ backgroundOpacity: "0",
2034
+ backgroundBorderRadius: "0",
2035
+ textSpacing: "0",
2036
+ animationStyle: "spring",
2037
+ isItalic: false,
2038
+ shinyWordHighlight: false,
2039
+ shinySegmentHighlight: false,
2040
+ randomColors: {
2041
+ enabled: false,
2042
+ colors: [
2043
+ {
2044
+ type: "still",
2045
+ color: "#fff"
2046
+ }
2047
+ ],
2048
+ avoidFillers: true,
2049
+ pctApplied: 0.5,
2050
+ randomWordCountRange: [
2051
+ 2,
2052
+ 3
2053
+ ]
2054
+ }
2055
+ },
2056
+ {
2057
+ name: "eth",
2058
+ captionPosition: "middle",
2059
+ amplifiedColors: [
2060
+ {
2061
+ type: "gradient",
2062
+ colors: [
2063
+ "#ff86b2",
2064
+ "#ffe1dd"
2065
+ ],
2066
+ angle: 0
2067
+ },
2068
+ {
2069
+ type: "gradient",
2070
+ colors: [
2071
+ "#f5bd9b",
2072
+ "#feba99",
2073
+ "#e76e93"
2074
+ ],
2075
+ angle: 45
2076
+ },
2077
+ {
2078
+ type: "gradient",
2079
+ colors: [
2080
+ "#cdfbca",
2081
+ "#adf8e2"
2082
+ ],
2083
+ angle: 90
2084
+ },
2085
+ {
2086
+ type: "gradient",
2087
+ colors: [
2088
+ "#eba9b9",
2089
+ "#bc9fff"
2090
+ ],
2091
+ angle: 135
2092
+ }
2093
+ ],
2094
+ amplifySpokenWords: true,
2095
+ fontFamily: "Posterama-1927-W01-UltraBlack",
2096
+ fontWeight: "900",
2097
+ fontColor: "#ffffff",
2098
+ fontSize: "80",
2099
+ textCase: "uppercase",
2100
+ outlineColor: "#000000",
2101
+ outlineWidth: "4",
2102
+ shadowColor: "#000000",
2103
+ shadowBlur: "8",
2104
+ shadowOffsetX: "8",
2105
+ shadowOffsetY: "8",
2106
+ backgroundColor: "#000000",
2107
+ backgroundOpacity: "0",
2108
+ backgroundBorderRadius: "0",
2109
+ textSpacing: "0",
2110
+ animationStyle: "spring",
2111
+ isItalic: false,
2112
+ shinyWordHighlight: false,
2113
+ shinySegmentHighlight: false
2114
+ },
2115
+ {
2116
+ name: "lion-tree",
2117
+ captionPosition: "middle",
2118
+ amplifiedColor: "#4e0c72",
2119
+ amplifySpokenWords: false,
2120
+ fontFamily: "Arial",
2121
+ fontWeight: "bold",
2122
+ fontColor: "#4e0c72",
2123
+ fontSize: "60",
2124
+ textCase: "lowercase",
2125
+ outlineColor: "#000000",
2126
+ outlineWidth: "0",
2127
+ shadowColor: "#000000",
2128
+ shadowEnabled: false,
2129
+ shadowBlur: "0",
2130
+ shadowOffsetX: "3",
2131
+ shadowOffsetY: "3",
2132
+ backgroundColor: "#fff",
2133
+ backgroundOpacity: "1",
2134
+ backgroundPadding: "5",
2135
+ backgroundBorderRadius: "15",
2136
+ textSpacing: "1",
2137
+ animationStyle: "none",
2138
+ isItalic: false,
2139
+ shinyWordHighlight: false,
2140
+ shinySegmentHighlight: false
2141
+ },
2142
+ {
2143
+ name: "kp-upgrade",
2144
+ captionPosition: "middle",
2145
+ fontFamily: "NeueHaasDisplayBold",
2146
+ amplifiedColor: "#fff",
2147
+ amplifySpokenWords: false,
2148
+ fontWeight: "700",
2149
+ fontColor: "#fff",
2150
+ fontSize: "75px",
2151
+ textCase: "lowercase",
2152
+ outlineColor: "#000000",
2153
+ outlineWidth: "0",
2154
+ shadowColor: "rgba(0, 0, 0, 0.7)",
2155
+ shadowEnabled: true,
2156
+ backgroundFillStyle: "wrap",
2157
+ shadowBlur: "2",
2158
+ shadowOffsetX: "3",
2159
+ shadowOffsetY: "3",
2160
+ backgroundColor: "#000",
2161
+ backgroundOpacity: "1 ",
2162
+ backgroundPadding: "24",
2163
+ backgroundBorderRadius: "15",
2164
+ textSpacing: "1",
2165
+ animationStyle: "none",
2166
+ isItalic: false
2167
+ },
2168
+ {
2169
+ name: "partner-path",
2170
+ captionPosition: "middle",
2171
+ fontFamily: "TheBoldFont",
2172
+ amplifiedColor: "#fff",
2173
+ amplifySpokenWords: false,
2174
+ fontWeight: "700",
2175
+ fontColor: "#fff",
2176
+ fontSize: "74",
2177
+ textCase: "uppercase",
2178
+ outlineColor: "#000000",
2179
+ outlineWidth: "0",
2180
+ shadowColor: "rgba(0, 0, 0, 0.7)",
2181
+ shadowEnabled: true,
2182
+ backgroundFillStyle: "wrap",
2183
+ shadowBlur: "10",
2184
+ shadowOffsetX: "2",
2185
+ shadowOffsetY: "2",
2186
+ backgroundColor: "#000000",
2187
+ backgroundOpacity: "0",
2188
+ backgroundPadding: "24",
2189
+ backgroundBorderRadius: "15",
2190
+ textSpacing: "1",
2191
+ animationStyle: "none",
2192
+ isItalic: false
2193
+ },
2194
+ {
2195
+ name: "fidelity",
2196
+ captionPosition: "middle",
2197
+ amplifiedColor: "#ffffff",
2198
+ amplifySpokenWords: false,
2199
+ fontFamily: "Milliard",
2200
+ fontWeight: "500",
2201
+ fontColor: "#ffffff",
2202
+ fontSize: "50",
2203
+ textCase: "sentence",
2204
+ outlineColor: "#000000",
2205
+ outlineWidth: "0",
2206
+ shadowColor: "#000000",
2207
+ shadowBlur: "0",
2208
+ backgroundFillStyle: "wrap",
2209
+ shadowEnabled: false,
2210
+ shadowOffsetX: "0",
2211
+ shadowOffsetY: "0",
2212
+ backgroundColor: "#00830a",
2213
+ backgroundOpacity: "1",
2214
+ backgroundPadding: "10",
2215
+ backgroundBorderRadius: "30",
2216
+ textSpacing: "0",
2217
+ animationStyle: "spring",
2218
+ isItalic: false,
2219
+ shinyWordHighlight: false,
2220
+ shinySegmentHighlight: false
2221
+ },
2222
+ {
2223
+ name: "black-fill",
2224
+ captionPosition: "middle",
2225
+ amplifiedColor: "#000000",
2226
+ amplifySpokenWords: true,
2227
+ fontFamily: "Inter",
2228
+ fontWeight: "800",
2229
+ fontColor: "#E5E5E5",
2230
+ fontSize: "64",
2231
+ textCase: "sentence",
2232
+ shadowColor: "#000000",
2233
+ shadowBlur: "0",
2234
+ shadowOffsetX: "0",
2235
+ shadowOffsetY: "0",
2236
+ shadowEnabled: false,
2237
+ textSpacing: "-4",
2238
+ animationStyle: "none",
2239
+ isItalic: false,
2240
+ shinyWordHighlight: false,
2241
+ shinySegmentHighlight: false,
2242
+ background: "transparent",
2243
+ backgroundColor: "transparent",
2244
+ backgroundOpacity: "0",
2245
+ backgroundPadding: "0",
2246
+ backgroundBorderRadius: "0",
2247
+ backgroundFillStyle: "none",
2248
+ padding: "0",
2249
+ textHighlightPersists: true
2250
+ },
2251
+ {
2252
+ name: "white-plain",
2253
+ captionPosition: "middle",
2254
+ amplifiedColor: "#ffffff",
2255
+ amplifySpokenWords: true,
2256
+ fontFamily: "Inter",
2257
+ fontWeight: "700",
2258
+ fontColor: "#ffffff",
2259
+ fontSize: "64",
2260
+ textCase: "sentence",
2261
+ shadowColor: "#000000",
2262
+ shadowBlur: "4",
2263
+ shadowOffsetX: "0",
2264
+ shadowOffsetY: "0",
2265
+ textSpacing: "-3",
2266
+ animationStyle: "none",
2267
+ isItalic: false,
2268
+ shinyWordHighlight: false,
2269
+ shinySegmentHighlight: false,
2270
+ backgroundColor: "#000000",
2271
+ backgroundOpacity: "0",
2272
+ backgroundPadding: "0",
2273
+ backgroundBorderRadius: "0",
2274
+ backgroundFillStyle: "none",
2275
+ padding: "0",
2276
+ textHighlightPersists: true
2277
+ },
2278
+ {
2279
+ name: "black-rounded",
2280
+ captionPosition: "middle",
2281
+ amplifiedColor: "#ffffff",
2282
+ amplifySpokenWords: true,
2283
+ fontFamily: "Inter",
2284
+ fontWeight: "700",
2285
+ fontColor: "#878787",
2286
+ fontSize: "64",
2287
+ textCase: "sentence",
2288
+ shadowColor: "#000000",
2289
+ shadowBlur: "0",
2290
+ shadowOffsetX: "0",
2291
+ shadowOffsetY: "0",
2292
+ shadowEnabled: false,
2293
+ textSpacing: "-3",
2294
+ animationStyle: "none",
2295
+ isItalic: false,
2296
+ shinyWordHighlight: false,
2297
+ shinySegmentHighlight: false,
2298
+ backgroundColor: "#000000",
2299
+ backgroundOpacity: "1.0",
2300
+ backgroundPaddingX: "20",
2301
+ backgroundPaddingY: "10",
2302
+ backgroundBorderRadius: "15",
2303
+ backgroundFillStyle: "none",
2304
+ padding: "0"
2305
+ },
2306
+ {
2307
+ name: "failing-up",
2308
+ captionPosition: "middle",
2309
+ amplifiedColor: "#6bddf0",
2310
+ amplifiedOpacity: "1",
2311
+ amplifySpokenWords: true,
2312
+ fontFamily: "Milliard",
2313
+ fontWeight: "800",
2314
+ fontColor: "#6bddf0",
2315
+ opacity: "0.3",
2316
+ fontSize: "60",
2317
+ textCase: "uppercase",
2318
+ shadowColor: "#000000",
2319
+ shadowBlur: "0",
2320
+ shadowOffsetX: "0",
2321
+ shadowOffsetY: "0",
2322
+ shadowEnabled: false,
2323
+ textSpacing: "0",
2324
+ animationStyle: "none",
2325
+ isItalic: false,
2326
+ outlineColor: "#000000",
2327
+ outlineWidth: "4",
2328
+ shinyWordHighlight: false,
2329
+ shinySegmentHighlight: false,
2330
+ background: "transparent",
2331
+ backgroundColor: "transparent",
2332
+ backgroundOpacity: "0",
2333
+ backgroundPadding: "0",
2334
+ backgroundBorderRadius: "0",
2335
+ backgroundFillStyle: "none",
2336
+ padding: "0",
2337
+ textHighlightPersists: true,
2338
+ currentWordBlock: true,
2339
+ currentWordBlockBorderRadius: "10",
2340
+ currentWordBlockBackgroundColor: "#000000",
2341
+ currentWordBlockOpacity: "1",
2342
+ currentWordBlockPadding: "5",
2343
+ maxCharsPerLine: 20,
2344
+ amplifyOpacityTransitionDuration: "0.1"
2345
+ },
2346
+ {
2347
+ name: "y-combinator",
2348
+ captionPosition: "middle",
2349
+ amplifiedColor: "#ffffff",
2350
+ amplifySpokenWords: true,
2351
+ fontFamily: "Inter",
2352
+ fontWeight: "400",
2353
+ fontColor: "#ffffff",
2354
+ fontSize: "70",
2355
+ textCase: "sentence",
2356
+ shadowColor: "#000000",
2357
+ shadowBlur: "5",
2358
+ shadowOffsetX: "0",
2359
+ shadowOffsetY: "0",
2360
+ shadowIntensity: 1,
2361
+ textSpacing: "1",
2362
+ animationStyle: "none",
2363
+ isItalic: false,
2364
+ shinyWordHighlight: false,
2365
+ shinySegmentHighlight: false,
2366
+ backgroundColor: "#000000",
2367
+ backgroundOpacity: "0",
2368
+ backgroundPadding: "8",
2369
+ backgroundBorderRadius: "0",
2370
+ backgroundFillStyle: "none",
2371
+ padding: "8",
2372
+ textHighlightPersists: true
2373
+ },
2374
+ {
2375
+ name: "farnam-street",
2376
+ captionPosition: "middle",
2377
+ amplifiedColor: "#ffffff",
2378
+ amplifySpokenWords: false,
2379
+ fontFamily: "Sofia Pro",
2380
+ fontWeight: "900",
2381
+ fontColor: "#ffffff",
2382
+ fontSize: "110",
2383
+ textCase: "uppercase",
2384
+ outlineColor: "#000000",
2385
+ outlineWidth: "0",
2386
+ shadowColor: "rgba(0, 0, 0, 0.5)",
2387
+ shadowBlur: "20",
2388
+ shadowOffsetX: "0",
2389
+ shadowOffsetY: "1",
2390
+ backgroundColor: "#000000",
2391
+ backgroundOpacity: "0",
2392
+ backgroundBorderRadius: "0",
2393
+ textSpacing: "-4",
2394
+ animationStyle: "none",
2395
+ isItalic: false,
2396
+ shinyWordHighlight: false,
2397
+ shinySegmentHighlight: false,
2398
+ verticalStretch: "0.82s"
2399
+ },
2400
+ {
2401
+ name: "leveling-up",
2402
+ captionPosition: "middle",
2403
+ amplifiedColor: "#ffffff",
2404
+ amplifySpokenWords: false,
2405
+ fontFamily: "Arial Black",
2406
+ fontWeight: "900",
2407
+ fontColor: "#ffffff",
2408
+ fontSize: "70",
2409
+ textCase: "uppercase",
2410
+ outlineColor: "#6205e0",
2411
+ outlineWidth: "6",
2412
+ outlineStyle: "angular",
2413
+ shadowColor: "rgba(0, 0, 0, 0.8)",
2414
+ shadowBlur: "3",
2415
+ shadowOffsetX: "0",
2416
+ shadowOffsetY: "0",
2417
+ backgroundColor: "#000000",
2418
+ backgroundOpacity: "0",
2419
+ backgroundBorderRadius: "0",
2420
+ textSpacing: "0",
2421
+ animationStyle: "none",
2422
+ isItalic: false,
2423
+ shinyWordHighlight: false,
2424
+ shinySegmentHighlight: false
2425
+ },
2426
+ {
2427
+ name: "the-peel-horizontal",
2428
+ captionPosition: "middle",
2429
+ amplifiedColor: "#ffffff",
2430
+ amplifySpokenWords: false,
2431
+ fontFamily: "Arial Black ",
2432
+ fontWeight: "900",
2433
+ fontColor: "#ffffff",
2434
+ fontSize: "90",
2435
+ textCase: "sentence",
2436
+ outlineColor: "#000000",
2437
+ outlineWidth: "0",
2438
+ shadowColor: "#000000",
2439
+ shadowBlur: "2",
2440
+ shadowOffsetX: "2",
2441
+ shadowOffsetY: "2",
2442
+ backgroundColor: "#000000",
2443
+ backgroundOpacity: "0",
2444
+ backgroundBorderRadius: "0",
2445
+ textSpacing: "2",
2446
+ animationStyle: "none",
2447
+ isItalic: false,
2448
+ shinyWordHighlight: false,
2449
+ shinySegmentHighlight: false
2450
+ },
2451
+ {
2452
+ name: "the-peel-vertical",
2453
+ captionPosition: "middle",
2454
+ amplifiedColor: "#ffffff",
2455
+ amplifySpokenWords: false,
2456
+ fontFamily: "Mercadillo Black",
2457
+ fontWeight: "900",
2458
+ fontColor: "#ffffff",
2459
+ fontSize: "80",
2460
+ textCase: "uppercase",
2461
+ outlineColor: "#000000",
2462
+ outlineWidth: "6",
2463
+ shadowColor: "#000000",
2464
+ shadowBlur: "2",
2465
+ shadowOffsetX: "2",
2466
+ shadowOffsetY: "2",
2467
+ backgroundColor: "#000000",
2468
+ backgroundOpacity: "0",
2469
+ backgroundBorderRadius: "0",
2470
+ textSpacing: "3",
2471
+ animationStyle: "spring",
2472
+ isItalic: true,
2473
+ shinyWordHighlight: false,
2474
+ shinySegmentHighlight: false
2475
+ },
2476
+ {
2477
+ name: "marketing-school",
2478
+ captionPosition: "middle",
2479
+ amplifiedColor: "#ff6c39",
2480
+ amplifySpokenWords: false,
2481
+ fontFamily: "Stapel-NarrowMedium",
2482
+ fontWeight: "500",
2483
+ fontColor: "#ff6c39",
2484
+ fontSize: "65",
2485
+ textCase: "uppercase",
2486
+ outlineColor: "#ffffff",
2487
+ outlineWidth: "3",
2488
+ outlineStyle: "angular",
2489
+ shadowColor: "#000000",
2490
+ shadowBlur: "2",
2491
+ shadowOffsetX: "3",
2492
+ shadowOffsetY: "4",
2493
+ shadowIntensity: "2",
2494
+ backgroundColor: "#000000",
2495
+ backgroundOpacity: "0",
2496
+ backgroundBorderRadius: "0",
2497
+ textSpacing: "-1",
2498
+ animationStyle: "none",
2499
+ isItalic: false,
2500
+ shinyWordHighlight: false,
2501
+ shinySegmentHighlight: false,
2502
+ verticalStretch: "1.4"
2503
+ },
2504
+ ""
2505
+ ];
2506
+ var subtitlePresets = {
2507
+ presets: presets
2508
+ };
2509
+
2510
+ exports.SubtitleText = SubtitleText;
2511
+ exports.Subtitles = Subtitles;
2512
+ exports.subtitlePresets = subtitlePresets;
2513
+ exports.useAdjustedPhrases = useAdjustedPhrases;
2514
+ exports.useAdjustedPosition = useAdjustedPosition;
2515
+ exports.useStyleConfig = useStyleConfig;
2516
+ exports.useTextStyle = useTextStyle;
2517
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9zcmMvY29tcG9uZW50cy9TdWJ0aXRsZVRleHQuanN4IiwiLi4vc3JjL3V0aWxzL2ZpbmRQaHJhc2VzSW5SYW5nZS50cyIsIi4uL3NyYy9ob29rcy91c2VUZXh0U3R5bGUuanMiLCIuLi9zcmMvaG9va3MvZm9udExvYWRlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL1N1YnRpdGxlcy50c3giLCIuLi9zcmMvaG9va3MvdXNlU3R5bGVDb25maWcudHMiLCIuLi9zcmMvaG9va3MvdXNlQWRqdXN0ZWRQb3NpdGlvbi5qcyIsIi4uL3NyYy9ob29rcy91c2VBZGp1c3RlZFBocmFzZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCJpbXBvcnQgUmVhY3QseyBtZW1vLCB1c2VNZW1vLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHNwcmluZywgcmFuZG9tLCB1c2VDdXJyZW50RnJhbWUgfSBmcm9tIFwicmVtb3Rpb25cIjtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGVzdGltYXRlIHRleHQgd2lkdGhcbmNvbnN0IGVzdGltYXRlVGV4dFdpZHRoID0gKHRleHQsIGZvbnRTaXplLCBmb250RmFtaWx5KSA9PiB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGNvbnRleHQuZm9udCA9IGAke2ZvbnRTaXplfXB4ICR7Zm9udEZhbWlseX1gO1xuICByZXR1cm4gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBvdXRsaW5lIHNoYWRvd1xuY29uc3QgZ2VuZXJhdGVPdXRsaW5lU2hhZG93ID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIFxuICByZXR1cm4gKGNvbG9yLCB3aWR0aCwgb3V0bGluZVN0eWxlID0gXCJyb3VuZFwiKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYCR7Y29sb3J9LSR7d2lkdGh9LSR7b3V0bGluZVN0eWxlfWA7XG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHNoYWRvd3MgPSBbXTtcbiAgICBjb25zdCBwYXJzZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCk7XG4gICAgXG4gICAgaWYgKG91dGxpbmVTdHlsZSA9PT0gXCJhbmd1bGFyXCIpIHtcbiAgICAgIC8vIENyZWF0ZSBzaGFycCBjb3JuZXJzIGJ5IHVzaW5nIHBlcnBlbmRpY3VsYXIgbGluZXNcbiAgICAgIC8vIFRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxuICAgICAgc2hhZG93cy5wdXNoKGAwIC0ke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgIC8vIFRvcFxuICAgICAgc2hhZG93cy5wdXNoKGAke3BhcnNlZFdpZHRofXB4IDAgMCAke2NvbG9yfWApOyAgIC8vIFJpZ2h0XG4gICAgICBzaGFkb3dzLnB1c2goYDAgJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgLy8gQm90dG9tXG4gICAgICBzaGFkb3dzLnB1c2goYC0ke3BhcnNlZFdpZHRofXB4IDAgMCAke2NvbG9yfWApOyAgLy8gTGVmdFxuICAgICAgXG4gICAgICAvLyBBZGQgZGlhZ29uYWwgcG9pbnRzIGZvciBjb3JuZXJzXG4gICAgICBzaGFkb3dzLnB1c2goYCR7cGFyc2VkV2lkdGh9cHggLSR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgLy8gVG9wLXJpZ2h0XG4gICAgICBzaGFkb3dzLnB1c2goYCR7cGFyc2VkV2lkdGh9cHggJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgLy8gQm90dG9tLXJpZ2h0XG4gICAgICBzaGFkb3dzLnB1c2goYC0ke3BhcnNlZFdpZHRofXB4ICR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgLy8gQm90dG9tLWxlZnRcbiAgICAgIHNoYWRvd3MucHVzaChgLSR7cGFyc2VkV2lkdGh9cHggLSR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAvLyBUb3AtbGVmdFxuICAgICAgXG4gICAgICAvLyBBZGQgaW50ZXJtZWRpYXRlIHBvaW50cyBmb3IgYmV0dGVyIGNvdmVyYWdlXG4gICAgICBjb25zdCBoYWxmV2lkdGggPSBNYXRoLnJvdW5kKHBhcnNlZFdpZHRoICogMC43MDcxKTsgLy8gY29zKDQ1wrApIOKJiCAwLjcwNzFcbiAgICAgIHNoYWRvd3MucHVzaChgJHtoYWxmV2lkdGh9cHggLSR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgICAvLyBUb3AtcmlnaHQgaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYCR7cGFyc2VkV2lkdGh9cHggLSR7aGFsZldpZHRofXB4IDAgJHtjb2xvcn1gKTsgICAgLy8gUmlnaHQtdG9wIGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAke3BhcnNlZFdpZHRofXB4ICR7aGFsZldpZHRofXB4IDAgJHtjb2xvcn1gKTsgICAgIC8vIFJpZ2h0LWJvdHRvbSBpbnRlcm1lZGlhdGVcbiAgICAgIHNoYWRvd3MucHVzaChgJHtoYWxmV2lkdGh9cHggJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgICAvLyBCb3R0b20tcmlnaHQgaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYC0ke2hhbGZXaWR0aH1weCAke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgICAgLy8gQm90dG9tLWxlZnQgaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYC0ke3BhcnNlZFdpZHRofXB4ICR7aGFsZldpZHRofXB4IDAgJHtjb2xvcn1gKTsgICAgLy8gTGVmdC1ib3R0b20gaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYC0ke3BhcnNlZFdpZHRofXB4IC0ke2hhbGZXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgLy8gTGVmdC10b3AgaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYC0ke2hhbGZXaWR0aH1weCAtJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgLy8gVG9wLWxlZnQgaW50ZXJtZWRpYXRlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9yaWdpbmFsIHJvdW5kIHN0eWxlXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM2MDsgaSArPSAyMi41KSB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gKGkgKiBNYXRoLlBJKSAvIDE4MDtcbiAgICAgICAgY29uc3QgeCA9IE1hdGgucm91bmQoTWF0aC5jb3MoYW5nbGUpICogcGFyc2VkV2lkdGgpO1xuICAgICAgICBjb25zdCB5ID0gTWF0aC5yb3VuZChNYXRoLnNpbihhbmdsZSkgKiBwYXJzZWRXaWR0aCk7XG4gICAgICAgIHNoYWRvd3MucHVzaChgJHt4fXB4ICR7eX1weCAwICR7Y29sb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IHNoYWRvd3Muam9pbignLCcpO1xuICAgIGNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0pKCk7XG5cblxuZXhwb3J0IGNvbnN0IFN1YnRpdGxlVGV4dCA9IG1lbW8oKHsgXG4gIHRleHQsIFxuICBzdHlsZSwgXG4gIGFuaW1hdGlvblN0eWxlLCBcbiAgZnJhbWUsXG4gIHN0YXJ0RnJhbWUsIFxuICByYW5kb21Db2xvcnMsIFxuICB3b3JkcywgXG4gIGZwcyxcbiAgaGlnaGxpZ2h0V29yZHNDb2xvcixcbn0pID0+IHtcbiAgY29uc3QgcmVsYXRpdmVGcmFtZSA9IGZyYW1lIC0gc3RhcnRGcmFtZTtcbiAgXG4gIGNvbnN0IHNjYWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGFuaW1hdGlvblN0eWxlID09PSBcInBsZWFzdXJlLXBvZC1hbmltYXRpb25cIikge1xuICAgICAgcmV0dXJuIHNwcmluZyh7XG4gICAgICAgIGZyYW1lOiByZWxhdGl2ZUZyYW1lLFxuICAgICAgICBmcm9tOiAwLjk1LFxuICAgICAgICB0bzogMS4wLCAgXG4gICAgICAgIGZwczogMzAsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIGRhbXBpbmc6IDIwLFxuICAgICAgICAgIHN0aWZmbmVzczogNDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFuaW1hdGlvblN0eWxlID09PSBcInNwcmluZ1wiKSB7XG4gICAgICBjb25zdCBzcHJpbmdWYWx1ZSA9IHNwcmluZyh7XG4gICAgICAgIGZyYW1lOiByZWxhdGl2ZUZyYW1lLFxuICAgICAgICBmcm9tOiAwLjksXG4gICAgICAgIHRvOiAxLFxuICAgICAgICBmcHMsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIG1hc3M6IDAuNSxcbiAgICAgICAgICBzdGlmZm5lc3M6IDE1MCxcbiAgICAgICAgICBkYW1waW5nOiAxNSxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3ByaW5nVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAxO1xuICB9LCBbYW5pbWF0aW9uU3R5bGUsIHJlbGF0aXZlRnJhbWUsIGZwc10pO1xuXG4gIGNvbnN0IHRyYW5zbGF0ZVkgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoYW5pbWF0aW9uU3R5bGUgPT09IFwic3ByaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZVZhbHVlID0gc3ByaW5nKHtcbiAgICAgICAgZnJhbWU6IHJlbGF0aXZlRnJhbWUsXG4gICAgICAgIGZyb206IDEwLFxuICAgICAgICB0bzogMCxcbiAgICAgICAgZnBzLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBtYXNzOiAwLjUsXG4gICAgICAgICAgc3RpZmZuZXNzOiAxNTAsXG4gICAgICAgICAgZGFtcGluZzogMTUsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSwgW2FuaW1hdGlvblN0eWxlLCByZWxhdGl2ZUZyYW1lLCBmcHNdKTtcblxuXG4gIC8vIENhbGN1bGF0ZSBhZGp1c3RlZCBmb250IHNpemUgYmFzZWQgb24gdGV4dCB3aWR0aFxuICBjb25zdCBhZGp1c3RlZEZvbnRTaXplID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWF4TGluZVdpZHRoID0gc3R5bGUubWF4TGluZVdpZHRoIHx8IDEwODA7IC8vIERlZmF1bHQgbWF4IHdpZHRoXG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gc3R5bGUuZm9udFNpemUgKiAyfHwgNjQ7IC8vIERlZmF1bHQgZm9udCBzaXplXG4gICAgY29uc3QgZm9udEZhbWlseSA9IHN0eWxlLmZvbnRGYW1pbHkgfHwgJ0FyaWFsJztcbiAgICBcbiAgICBjb25zdCB0ZXh0V2lkdGggPSBlc3RpbWF0ZVRleHRXaWR0aCh0ZXh0LCBiYXNlRm9udFNpemUsIGZvbnRGYW1pbHkpO1xuICAgIGlmICh0ZXh0V2lkdGggPiBtYXhMaW5lV2lkdGgpIHtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gbWF4TGluZVdpZHRoIC8gdGV4dFdpZHRoO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoYmFzZUZvbnRTaXplICogc2NhbGVGYWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZUZvbnRTaXplO1xuICB9LCBbdGV4dCwgc3R5bGUubWF4TGluZVdpZHRoLCBzdHlsZS5mb250U2l6ZSwgc3R5bGUuZm9udEZhbWlseV0pO1xuXG4gIC8vIENhbGN1bGF0ZSBhZGp1c3RlZCBmb250IHNpemUgYmFzZWQgb24gdGV4dCB3aWR0aFxuICBjb25zdCBhbmltYXRlZFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgYmFzZVBhZGRpbmcgPSBzdHlsZS5iYWNrZ3JvdW5kUGFkZGluZyB8fCAnMTUnO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0ZXh0IHNoYWRvdyBiYXNlZCBvbiBpbnRlbnNpdHlcbiAgICBjb25zdCBzaGFkb3dJbnRlbnNpdHkgPSBzdHlsZS5zaGFkb3dJbnRlbnNpdHkgfHwgMTtcbiAgICBjb25zdCBzaGFkb3dDb2xvciA9IHN0eWxlLnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwJztcbiAgICBjb25zdCBzaGFkb3dCbHVyID0gc3R5bGUuc2hhZG93Qmx1ciB8fCAnMic7XG4gICAgY29uc3Qgc2hhZG93T2Zmc2V0WCA9IHN0eWxlLnNoYWRvd09mZnNldFggfHwgJzAnO1xuICAgIGNvbnN0IHNoYWRvd09mZnNldFkgPSBzdHlsZS5zaGFkb3dPZmZzZXRZIHx8ICcwJztcbiAgICBcbiAgICAvLyBTdGFjayBtdWx0aXBsZSBzaGFkb3dzIGJhc2VkIG9uIGludGVuc2l0eVxuICAgIGNvbnN0IHNoYWRvd3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYWRvd0ludGVuc2l0eTsgaSsrKSB7XG4gICAgICBzaGFkb3dzLnB1c2goYCR7c2hhZG93T2Zmc2V0WH1weCAke3NoYWRvd09mZnNldFl9cHggJHtzaGFkb3dCbHVyfXB4ICR7c2hhZG93Q29sb3J9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRTaGFkb3cgPSBzaGFkb3dzLmpvaW4oJywgJyk7XG5cbiAgICAvLyBDb252ZXJ0IGhleCB0byByZ2JhIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgY29uc3QgaGV4VG9SZ2JhID0gKGhleCwgb3BhY2l0eSkgPT4ge1xuICAgICAgY29uc3Qgc2hvcnRoYW5kUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICAgICAgaGV4ID0gaGV4LnJlcGxhY2Uoc2hvcnRoYW5kUmVnZXgsIChtLCByLCBnLCBiKSA9PiByICsgciArIGcgKyBnICsgYiArIGIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIGhleDtcbiAgICAgIGNvbnN0IHIgPSBwYXJzZUludChyZXN1bHRbMV0sIDE2KTtcbiAgICAgIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcbiAgICAgIGNvbnN0IGIgPSBwYXJzZUludChyZXN1bHRbM10sIDE2KTtcbiAgICAgIHJldHVybiBgcmdiYSgke3J9LCAke2d9LCAke2J9LCAke29wYWNpdHl9KWA7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvciB8fCAnIzAwMDAwMCc7XG4gICAgY29uc3Qgb3BhY2l0eSA9IHR5cGVvZiBzdHlsZS5iYWNrZ3JvdW5kT3BhY2l0eSA9PT0gJ3N0cmluZycgXG4gICAgICA/IHBhcnNlRmxvYXQoc3R5bGUuYmFja2dyb3VuZE9wYWNpdHkudHJpbSgpKVxuICAgICAgOiBwYXJzZUZsb2F0KHN0eWxlLmJhY2tncm91bmRPcGFjaXR5KSB8fCAwO1xuICAgICAgXG4gICAgY29uc3QgYmFja2dyb3VuZCA9IGhleFRvUmdiYShiYWNrZ3JvdW5kQ29sb3IsIG9wYWNpdHkpO1xuICAgIGNvbnN0IGhhc0JhY2tncm91bmQgPSBvcGFjaXR5ID4gMDtcbiAgICBjb25zdCBoYXNTaGFkb3cgPSBzaGFkb3dJbnRlbnNpdHkgPiAwICYmIChzaGFkb3dCbHVyICE9PSAnMCcgfHwgc2hhZG93T2Zmc2V0WCAhPT0gJzAnIHx8IHNoYWRvd09mZnNldFkgIT09ICcwJyk7XG5cbiAgICAvLyBIYW5kbGUgYm9yZGVyIHJhZGl1cyBwcm9wZXJseVxuICAgIGNvbnN0IGJvcmRlclJhZGl1cyA9IHN0eWxlLmJhY2tncm91bmRCb3JkZXJSYWRpdXMgXG4gICAgICA/IGAke3BhcnNlSW50KHN0eWxlLmJhY2tncm91bmRCb3JkZXJSYWRpdXMsIDEwKX1weGBcbiAgICAgIDogJzBweCc7XG4gICAgXG4gICAgLy8gSGFuZGxlIGJhY2tncm91bmQgd3JhcHBpbmdcbiAgICBjb25zdCBpc1dyYXBwZWQgPSBzdHlsZS5iYWNrZ3JvdW5kRmlsbFN0eWxlID09PSBcIndyYXBcIjtcbiAgICBjb25zdCBwYWRkaW5nVmFsdWUgPSBwYXJzZUludChiYXNlUGFkZGluZywgMTApO1xuICAgIFxuICAgIC8vIEZvciB3cmFwcGVkIHN0eWxlLCB1c2UgdW5pZm9ybSBwYWRkaW5nXG4gICAgY29uc3QgcGFkZGluZyA9IGlzV3JhcHBlZCBcbiAgICAgID8gYCR7cGFkZGluZ1ZhbHVlfXB4ICR7TWF0aC5yb3VuZChwYWRkaW5nVmFsdWUgKiAxLjIpfXB4YFxuICAgICAgOiBgJHtwYWRkaW5nVmFsdWV9cHggJHtwYWRkaW5nVmFsdWUgKiAzfXB4YDtcbiAgICBcbiAgICBjb25zdCB3aWR0aCA9IGlzV3JhcHBlZCA/IFwiYXV0b1wiIDogc3R5bGUud2lkdGg7XG4gICAgY29uc3QgZGlzcGxheSA9IGlzV3JhcHBlZCA/IFwiaW5saW5lLWJsb2NrXCIgOiBzdHlsZS5kaXNwbGF5IHx8IFwiYmxvY2tcIjtcbiAgICBcbiAgICBjb25zdCBiYXNlU3R5bGUgPSB7XG4gICAgICBwYWRkaW5nLFxuICAgICAgYmFja2dyb3VuZCxcbiAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgIHdpZHRoLFxuICAgICAgZGlzcGxheSxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIC4uLnN0eWxlLFxuICAgICAgLy8gS2VlcCBmb250RmFtaWx5IGluIHRoZSBpbmxpbmUgc3R5bGVzIG5vd1xuICAgICAgdGV4dFNoYWRvdzogJ25vbmUnLFxuICAgICAgYm94U2hhZG93OiBoYXNCYWNrZ3JvdW5kICYmIGhhc1NoYWRvdyA/IHRleHRTaGFkb3cgOiAnbm9uZScsXG4gICAgICB0cmFuc2Zvcm06IGFuaW1hdGlvblN0eWxlID09PSBcInNwcmluZ1wiIFxuICAgICAgICA/IGAke3N0eWxlLnRyYW5zZm9ybSA/IGAke3N0eWxlLnRyYW5zZm9ybX0gYCA6ICcnfXRyYW5zbGF0ZTNkKDAsICR7dHJhbnNsYXRlWX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pYFxuICAgICAgICA6IHN0eWxlLnRyYW5zZm9ybSB8fCAnbm9uZScsXG4gICAgICBmb250U2l6ZTogdHlwZW9mIHN0eWxlLmZvbnRTaXplID09PSAnc3RyaW5nJyA/IGFkanVzdGVkRm9udFNpemUgOiBhZGp1c3RlZEZvbnRTaXplLFxuICAgIH07XG5cbiAgICByZXR1cm4gYmFzZVN0eWxlO1xuICB9LCBbc3R5bGUsIHNjYWxlLCB0cmFuc2xhdGVZLCBhZGp1c3RlZEZvbnRTaXplLCBhbmltYXRpb25TdHlsZV0pO1xuXG4gIGNvbnN0IHdyYXBwZXJTdHlsZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICB0cmFuc2Zvcm06IGBzY2FsZVkoJHtzdHlsZS52ZXJ0aWNhbFN0cmV0Y2ggfHwgMX0pYCxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgd2lkdGg6ICdmaXQtY29udGVudCcsXG4gICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybSdcbiAgfSksIFtzdHlsZS52ZXJ0aWNhbFN0cmV0Y2hdKTtcblxuICBjb25zdCBvdXRsaW5lU3R5bGUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGNvbG9yOiBzdHlsZS5vdXRsaW5lQ29sb3IsXG4gICAgdGV4dFNoYWRvdzogZ2VuZXJhdGVPdXRsaW5lU2hhZG93KHN0eWxlLm91dGxpbmVDb2xvciwgc3R5bGUub3V0bGluZVdpZHRoLCBzdHlsZS5vdXRsaW5lU3R5bGUpLFxuICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgekluZGV4OiAwLFxuICB9KSwgW3N0eWxlLm91dGxpbmVDb2xvciwgc3R5bGUub3V0bGluZVdpZHRoLCBzdHlsZS5vdXRsaW5lU3R5bGVdKTtcblxuICBjb25zdCBtYWluVGV4dFN0eWxlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHpJbmRleDogMSxcbiAgICBXZWJraXRUZXh0U3Ryb2tlOiAndW5zZXQnLFxuICAgIGNvbG9yOiBzdHlsZS5jb2xvcixcbiAgfSksIFtzdHlsZS5jb2xvcl0pO1xuXG4gIC8vIFNwbGl0IHRleHQgaW50byB3b3JkcyBhbmQgY2FsY3VsYXRlIGN1cnJlbnQgdGltZVxuICBjb25zdCB0ZXh0V29yZHMgPSB1c2VNZW1vKCgpID0+IHRleHQuc3BsaXQoJyAnKSwgW3RleHRdKTtcbiAgY29uc3QgY3VycmVudFdvcmRUaW1lID0gZnJhbWUgLyBmcHM7XG5cbiAgLy8gRmluZCBjdXJyZW50bHkgc3Bva2VuIHdvcmRcblxuICAvLyBDcmVhdGUgYW1wbGlmaWVkIGdyYWRpZW50IHN0eWxlIGlmIGFtcGxpZmllZENvbG9yIGlzIGEgZ3JhZGllbnQgYXJyYXlcbiAgY29uc3QgcGhyYXNlQW1wbGlmaWVkU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5hbXBsaWZpZWRDb2xvcnMpKSB7XG4gICAgICBjb25zdCBmaXJzdFdvcmQgPSB3b3Jkc1swXS53b3JkO1xuICAgICAgY29uc3QgZ3JhZGllbnRJbmRleCA9IE1hdGguZmxvb3IocmFuZG9tKGBhbXBsaWZpZWQtcGhyYXNlLSR7Zmlyc3RXb3JkfWApICogc3R5bGUuYW1wbGlmaWVkQ29sb3JzLmxlbmd0aCk7XG4gICAgICBjb25zdCBncmFkaWVudCA9IHN0eWxlLmFtcGxpZmllZENvbG9yc1tncmFkaWVudEluZGV4XTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhY2tncm91bmQ6IGBsaW5lYXItZ3JhZGllbnQoJHtncmFkaWVudC5hbmdsZX1kZWcsICR7Z3JhZGllbnQuY29sb3JzLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgYmFja2dyb3VuZENsaXA6IFwidGV4dFwiLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFdlYmtpdEJhY2tncm91bmRDbGlwOiBcInRleHRcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJoaWdobGlnaHQgd29yZHMgY29sb3I6XCIsIGhpZ2hsaWdodFdvcmRzQ29sb3IpO1xuICAgIGlmICh0eXBlb2Ygc3R5bGUuYW1wbGlmaWVkQ29sb3IgPT09ICdvYmplY3QnICYmIHN0eWxlLmFtcGxpZmllZENvbG9yLnR5cGUgPT09ICdncmFkaWVudCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhY2tncm91bmQ6IGBsaW5lYXItZ3JhZGllbnQoJHtzdHlsZS5hbXBsaWZpZWRDb2xvci5jb2xvcnNbMF0uYW5nbGV9ZGVnLCAke3N0eWxlLmFtcGxpZmllZENvbG9yLmNvbG9yc1swXS5jb2xvcnMuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICBiYWNrZ3JvdW5kQ2xpcDogXCJ0ZXh0XCIsXG4gICAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgV2Via2l0QmFja2dyb3VuZENsaXA6IFwidGV4dFwiLFxuICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBcbiAgICAgIGNvbG9yOiBzdHlsZS5hbXBsaWZpZWRDb2xvcixcbiAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6IHN0eWxlLmFtcGxpZmllZENvbG9yLFxuICAgIH07XG4gIH0sIFtzdHlsZS5hbXBsaWZpZWRDb2xvcnMsIHN0eWxlLmFtcGxpZmllZENvbG9yLCB3b3Jkc10pO1xuXG4gIC8vIEhhbmRsZSByYW5kb20gY29sb3JzIGlmIGVuYWJsZWRcbiAgY29uc3QgcmFuZG9tQ29sb3JEYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFyYW5kb21Db2xvcnM/LmVuYWJsZWQgfHwgIXdvcmRzKSByZXR1cm4gbnVsbDtcbiAgICBcbiAgICBjb25zdCBzaG91bGRDb2xvciA9IHJhbmRvbShgc2hvdWxkLWNvbG9yLSR7d29yZHNbMF0ud29yZH1gKSA8IHJhbmRvbUNvbG9ycy5wY3RBcHBsaWVkO1xuICAgIGlmICghc2hvdWxkQ29sb3IpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgW21pbldvcmRzLCBtYXhXb3Jkc10gPSByYW5kb21Db2xvcnM/LnJhbmRvbVdvcmRDb3VudFJhbmdlIHx8IFswLCAwXTtcbiAgICBjb25zdCByYW5nZSA9IG1heFdvcmRzIC0gbWluV29yZHMgKyAxO1xuICAgIGNvbnN0IHJhbmRvbVdvcmRDb3VudCA9IE1hdGguZmxvb3IocmFuZG9tKGB3b3JkLWNvdW50LSR7d29yZHNbMF0ud29yZH1gKSAqIHJhbmdlKSArIG1pbldvcmRzO1xuICAgIGNvbnN0IG1heFN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCB0ZXh0V29yZHMubGVuZ3RoIC0gcmFuZG9tV29yZENvdW50KTtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5mbG9vcihyYW5kb20oYHN0YXJ0LWluZGV4LSR7d29yZHNbMF0ud29yZH1gKSAqIChtYXhTdGFydEluZGV4ICsgMSkpO1xuICAgIGNvbnN0IHJhbmRvbUNvbG9yT2JqID0gcmFuZG9tQ29sb3JzLmNvbG9yc1tNYXRoLmZsb29yKHJhbmRvbShgY29sb3ItJHt3b3Jkc1swXS53b3JkfWApICogcmFuZG9tQ29sb3JzLmNvbG9ycy5sZW5ndGgpXTtcblxuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRDb2xvcixcbiAgICAgIHJhbmRvbVdvcmRDb3VudCxcbiAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICByYW5kb21Db2xvck9ialxuICAgIH07XG4gIH0sIFtyYW5kb21Db2xvcnMsIHdvcmRzLCB0ZXh0V29yZHMubGVuZ3RoXSk7XG5cbiAgY29uc3QgcGhyYXNlU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXJhbmRvbUNvbG9yRGF0YSkge1xuICAgICAgcmV0dXJuIHsgXG4gICAgICAgIGNvbG9yOiBzdHlsZS5jb2xvcixcbiAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogc3R5bGUuY29sb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmFuZG9tQ29sb3JPYmogfSA9IHJhbmRvbUNvbG9yRGF0YTtcbiAgICByZXR1cm4gcmFuZG9tQ29sb3JPYmoudHlwZSA9PT0gXCJncmFkaWVudFwiID8gXG4gICAgICB7XG4gICAgICAgIGJhY2tncm91bmQ6IGBsaW5lYXItZ3JhZGllbnQoJHtyYW5kb21Db2xvck9iai5hbmdsZX1kZWcsICR7cmFuZG9tQ29sb3JPYmouY29sb3JzLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgYmFja2dyb3VuZENsaXA6IFwidGV4dFwiLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFdlYmtpdEJhY2tncm91bmRDbGlwOiBcInRleHRcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgfSA6IFxuICAgICAgeyBcbiAgICAgICAgY29sb3I6IHJhbmRvbUNvbG9yT2JqLmNvbG9yLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiByYW5kb21Db2xvck9iai5jb2xvcixcbiAgICAgIH07XG4gIH0sIFtyYW5kb21Db2xvckRhdGEsIHN0eWxlLmNvbG9yXSk7XG5cbiAgY29uc3Qgd29yZENvbnRlbnQgPSB1c2VNZW1vKCgpID0+IHRleHRXb3Jkcy5tYXAoKHdvcmQsIGluZGV4KSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmQgaXMgc3Vycm91bmRlZCBieSA8aD4gdGFnc1xuICAgIGNvbnN0IGhpZ2hsaWdodGVkTWF0Y2ggPSB3b3JkLm1hdGNoKC9ePGg+KC4qPyk8XFwvaD4kLyk7XG4gICAgY29uc3QgaXNIaWdobGlnaHRlZCA9IGhpZ2hsaWdodGVkTWF0Y2ggIT09IG51bGw7XG4gICAgY29uc3QgZGlzcGxheVdvcmQgPSBpc0hpZ2hsaWdodGVkID8gaGlnaGxpZ2h0ZWRNYXRjaFsxXSA6IHdvcmQ7XG5cbiAgICBjb25zdCBzaG91bGRDb2xvclRoaXNXb3JkID0gcmFuZG9tQ29sb3JEYXRhICYmIFxuICAgICAgaW5kZXggPj0gcmFuZG9tQ29sb3JEYXRhLnN0YXJ0SW5kZXggJiYgXG4gICAgICBpbmRleCA8IHJhbmRvbUNvbG9yRGF0YS5zdGFydEluZGV4ICsgcmFuZG9tQ29sb3JEYXRhLnJhbmRvbVdvcmRDb3VudCAmJlxuICAgICAgaW5kZXggPCB0ZXh0V29yZHMubGVuZ3RoO1xuXG4gICAgY29uc3Qgd29yZFRpbWluZyA9IHdvcmRzPy5baW5kZXhdO1xuICAgIGNvbnN0IGhhc0JlZW5TcG9rZW4gPSB3b3JkVGltaW5nICYmIGN1cnJlbnRXb3JkVGltZSA+PSB3b3JkVGltaW5nLmVuZDtcbiAgICBjb25zdCBpc0N1cnJlbnRseVNwb2tlbiA9IHdvcmRUaW1pbmcgJiYgXG4gICAgICBjdXJyZW50V29yZFRpbWUgPj0gd29yZFRpbWluZy5zdGFydCAmJiBcbiAgICAgIGN1cnJlbnRXb3JkVGltZSA8IHdvcmRUaW1pbmcuZW5kO1xuXG4gICAgY29uc3QgdGV4dEhpZ2hsaWdodFBlcnNpc3RzID0gc3R5bGUudGV4dEhpZ2hsaWdodFBlcnNpc3RzID8gdHJ1ZSA6IGZhbHNlO1xuICAgIFxuICAgIGNvbnN0IHNob3VsZEhpZ2hsaWdodCA9IHN0eWxlLmFtcGxpZnlTcG9rZW5Xb3JkcyAmJiBcbiAgICAgIChpc0N1cnJlbnRseVNwb2tlbiB8fCAodGV4dEhpZ2hsaWdodFBlcnNpc3RzICYmIGhhc0JlZW5TcG9rZW4pKTtcbiAgICBcbiAgICAvLyBNb2RpZmllZCBsb2dpYyB0byBwcmlvcml0aXplIDxoPiB0YWcgaGlnaGxpZ2h0aW5nXG4gICAgY29uc3Qgd29yZFN0eWxlID0gaXNIaWdobGlnaHRlZFxuICAgICAgPyB7IFxuICAgICAgICAgIGNvbG9yOiBoaWdobGlnaHRXb3Jkc0NvbG9yLFxuICAgICAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6IGhpZ2hsaWdodFdvcmRzQ29sb3IsXG4gICAgICAgICAgb3BhY2l0eTogc3R5bGUub3BhY2l0eSB8fCAxLFxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB9XG4gICAgICA6IHNob3VsZEhpZ2hsaWdodFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnBocmFzZUFtcGxpZmllZFN0eWxlLFxuICAgICAgICAgICAgb3BhY2l0eTogc3R5bGUuYW1wbGlmaWVkT3BhY2l0eSB8fCAxLFxuICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgfVxuICAgICAgICA6IHNob3VsZENvbG9yVGhpc1dvcmQgXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLnBocmFzZVN0eWxlLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBzdHlsZS5vcGFjaXR5IHx8IDEsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogeyBcbiAgICAgICAgICAgICAgY29sb3I6IHN0eWxlLmNvbG9yLFxuICAgICAgICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBzdHlsZS5jb2xvcixcbiAgICAgICAgICAgICAgb3BhY2l0eTogc3R5bGUudW5BbXBsaWZpZWRPcGFjaXR5IHx8IDEsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgfTtcblxuICAgIC8vIEFkZCB6LWluZGV4IHRvIGVuc3VyZSBwcm9wZXIgc3RhY2tpbmcgb2Ygd29yZCBibG9ja3NcbiAgICBjb25zdCBjb250YWluZXJTdHlsZSA9IHtcbiAgICAgIC4uLndvcmRTdHlsZSxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgbWFyZ2luUmlnaHQ6IGluZGV4IDwgdGV4dFdvcmRzLmxlbmd0aCAtIDEgPyAnMC4yNWVtJyA6IDAsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIHpJbmRleDogaXNDdXJyZW50bHlTcG9rZW4gPyAyIDogMSxcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnXG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8c3BhbiBrZXk9e2luZGV4fSBzdHlsZT17Y29udGFpbmVyU3R5bGV9PlxuICAgICAgICB7c3R5bGUuY3VycmVudFdvcmRCbG9jayAmJiBpc0N1cnJlbnRseVNwb2tlbiAmJiAoXG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICAgICAgbGVmdDogYC0keyhzdHlsZS5jdXJyZW50V29yZEJsb2NrUGFkZGluZyB8fCA1KSAqIDJ9cHhgLFxuICAgICAgICAgICAgcmlnaHQ6IGAtJHsoc3R5bGUuY3VycmVudFdvcmRCbG9ja1BhZGRpbmcgfHwgNSkgKiAyfXB4YCxcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGhlaWdodDogJzcwJScsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tCYWNrZ3JvdW5kQ29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICAgICAgICAgb3BhY2l0eTogc3R5bGUuY3VycmVudFdvcmRCbG9ja09wYWNpdHkgfHwgMSxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogYCR7c3R5bGUuY3VycmVudFdvcmRCbG9ja0JvcmRlclJhZGl1cyB8fCAxNX1weGAsXG4gICAgICAgICAgICB6SW5kZXg6IC0xLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgycHgpJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IGAke3N0eWxlLmN1cnJlbnRXb3JkQmxvY2tQYWRkaW5nIHx8IDV9cHggMGAsXG4gICAgICAgICAgICBib3hTaXppbmc6ICdjb250ZW50LWJveCdcbiAgICAgICAgICB9fSAvPlxuICAgICAgICApfVxuICAgICAgICB7ZGlzcGxheVdvcmR9IHsvKiBEaXNwbGF5IHRoZSB3b3JkIHdpdGhvdXQgPGg+IHRhZ3MgKi99XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfSksIFt0ZXh0V29yZHMsIHJhbmRvbUNvbG9yRGF0YSwgd29yZHMsIGN1cnJlbnRXb3JkVGltZSwgc3R5bGUuYW1wbGlmeVNwb2tlbldvcmRzLCBzdHlsZS50ZXh0SGlnaGxpZ2h0UGVyc2lzdHMsIHBocmFzZUFtcGxpZmllZFN0eWxlLCBwaHJhc2VTdHlsZSwgc3R5bGUuY29sb3IsIHN0eWxlLmN1cnJlbnRXb3JkQmxvY2ssIHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tCYWNrZ3JvdW5kQ29sb3IsIHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tPcGFjaXR5LCBzdHlsZS5jdXJyZW50V29yZEJsb2NrUGFkZGluZywgc3R5bGUuY3VycmVudFdvcmRCbG9ja0JvcmRlclJhZGl1cywgaGlnaGxpZ2h0V29yZHNDb2xvcl0pO1xuICAvLyBjb25zb2xlLmxvZygnU3VidGl0bGVUZXh0IC0gcmVjZWl2ZWQgc3R5bGUgZm9udEZhbWlseTonLCBzdHlsZS5mb250RmFtaWx5KTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IFxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgLi4uYW5pbWF0ZWRTdHlsZSxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIHdpZHRoOiAnZml0LWNvbnRlbnQnLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgc3R5bGU9e3dyYXBwZXJTdHlsZX0+XG4gICAgICAgIDxkaXYgc3R5bGU9e3suLi5vdXRsaW5lU3R5bGUsIHdoaXRlU3BhY2U6ICdub3dyYXAnfX0+e3dvcmRDb250ZW50fTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPXt7Li4ubWFpblRleHRTdHlsZSwgd2hpdGVTcGFjZTogJ25vd3JhcCd9fT57d29yZENvbnRlbnR9PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0sIChwcmV2UHJvcHMsIG5leHRQcm9wcykgPT4ge1xuICAvLyBPbmx5IHJlLXJlbmRlciBpZiB0aGVzZSBlc3NlbnRpYWwgcHJvcHMgaGF2ZSBjaGFuZ2VkXG4gIGNvbnN0IGVzc2VudGlhbFByb3BzID0gWydmcmFtZScsICd0ZXh0JywgJ3N0YXJ0RnJhbWUnXTtcbiAgY29uc3QgaGFzRXNzZW50aWFsUHJvcHNDaGFuZ2VkID0gZXNzZW50aWFsUHJvcHMuc29tZShcbiAgICBwcm9wID0+IHByZXZQcm9wc1twcm9wXSAhPT0gbmV4dFByb3BzW3Byb3BdXG4gICk7XG4gIFxuICAvLyBEZWVwIGNvbXBhcmUgc3R5bGUgYW5kIHJhbmRvbUNvbG9ycyBvbmx5IGlmIGVzc2VudGlhbCBwcm9wcyBoYXZlbid0IGNoYW5nZWRcbiAgaWYgKCFoYXNFc3NlbnRpYWxQcm9wc0NoYW5nZWQpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJldlByb3BzLnN0eWxlKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dFByb3BzLnN0eWxlKSAmJlxuICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcmV2UHJvcHMucmFuZG9tQ29sb3JzKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dFByb3BzLnJhbmRvbUNvbG9ycyk7XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn0pOyAiLG51bGwsImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG4vLyBIZWxwZXIgdG8gY29udmVydCBoZXggdG8gcmdiXG5jb25zdCBoZXhUb1JnYiA9IChoZXgpID0+IHtcbiAgLy8gUmVtb3ZlICMgaWYgcHJlc2VudFxuICBoZXggPSBoZXgucmVwbGFjZSgnIycsICcnKTtcbiAgXG4gIC8vIEhhbmRsZSBib3RoIDMtZGlnaXQgYW5kIDYtZGlnaXQgaGV4XG4gIGNvbnN0IHIgPSBwYXJzZUludChoZXgubGVuZ3RoID09PSAzID8gaGV4WzBdICsgaGV4WzBdIDogaGV4LnNsaWNlKDAsIDIpLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChoZXgubGVuZ3RoID09PSAzID8gaGV4WzFdICsgaGV4WzFdIDogaGV4LnNsaWNlKDIsIDQpLCAxNik7XG4gIGNvbnN0IGIgPSBwYXJzZUludChoZXgubGVuZ3RoID09PSAzID8gaGV4WzJdICsgaGV4WzJdIDogaGV4LnNsaWNlKDQsIDYpLCAxNik7XG4gIFxuICByZXR1cm4gYCR7cn0sICR7Z30sICR7Yn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVRleHRTdHlsZSA9IChwcmVzZXQsIHgsIGFkanVzdGVkWSwgdmlkZW9XaWR0aCkgPT4geyAgXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBDcmVhdGUgdGV4dCBzaGFkb3cgYmFzZWQgb24gaW50ZW5zaXR5XG4gICAgY29uc3Qgc2hhZG93SW50ZW5zaXR5ID0gcHJlc2V0LnNoYWRvd0ludGVuc2l0eSB8fCAxO1xuICAgIGNvbnN0IHNoYWRvd0NvbG9yID0gcHJlc2V0LnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwJztcbiAgICBjb25zdCBzaGFkb3dCbHVyID0gcHJlc2V0LnNoYWRvd0JsdXIgfHwgJzInO1xuICAgIGNvbnN0IHNoYWRvd09mZnNldFggPSBwcmVzZXQuc2hhZG93T2Zmc2V0WCB8fCAnMCc7XG4gICAgY29uc3Qgc2hhZG93T2Zmc2V0WSA9IHByZXNldC5zaGFkb3dPZmZzZXRZIHx8ICcwJztcbiAgICBcbiAgICAvLyBTdGFjayBtdWx0aXBsZSBzaGFkb3dzIGJhc2VkIG9uIGludGVuc2l0eVxuICAgIGNvbnN0IHNoYWRvd3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYWRvd0ludGVuc2l0eTsgaSsrKSB7XG4gICAgICBzaGFkb3dzLnB1c2goYCR7c2hhZG93T2Zmc2V0WH1weCAke3NoYWRvd09mZnNldFl9cHggJHtzaGFkb3dCbHVyfXB4ICR7c2hhZG93Q29sb3J9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRleHRTaGFkb3cgPSBzaGFkb3dzLmpvaW4oJywgJyk7XG5cbiAgICBjb25zdCBkcm9wU2hhZG93ID0gKHByZXNldC5zaGFkb3dFbmFibGVkICE9PSBmYWxzZSAmJiAocHJlc2V0LnNoYWRvd09mZnNldFggfHwgcHJlc2V0LnNoYWRvd09mZnNldFkgfHwgcHJlc2V0LnNoYWRvd0JsdXIpKVxuICAgICAgPyBgZHJvcC1zaGFkb3coJHtwcmVzZXQuc2hhZG93T2Zmc2V0WH1weCAke3ByZXNldC5zaGFkb3dPZmZzZXRZfXB4ICR7cHJlc2V0LnNoYWRvd0JsdXJ9cHggJHtwcmVzZXQuc2hhZG93Q29sb3J9KWBcbiAgICAgIDogJ25vbmUnO1xuXG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gcHJlc2V0LmJhY2tncm91bmRDb2xvciA9PT0gJ3RyYW5zcGFyZW50JyBcbiAgICAgID8gJ3RyYW5zcGFyZW50JyBcbiAgICAgIDogcHJlc2V0LmJhY2tncm91bmRDb2xvciAmJiBwcmVzZXQuYmFja2dyb3VuZE9wYWNpdHlcbiAgICAgICAgPyBgcmdiYSgke2hleFRvUmdiKHByZXNldC5iYWNrZ3JvdW5kQ29sb3IpfSwgJHtwcmVzZXQuYmFja2dyb3VuZE9wYWNpdHl9KWBcbiAgICAgICAgOiBwcmVzZXQuYmFja2dyb3VuZENvbG9yIHx8ICcjMDAwMDAwJztcbiAgICBcbiAgICAvLyBIYW5kbGUgYm90aCBkaXJlY3Rpb25hbCBhbmQgdW5pZm9ybSBwYWRkaW5nXG4gICAgY29uc3QgcGFkZGluZ1ggPSBwcmVzZXQuYmFja2dyb3VuZFBhZGRpbmdYIHx8IHByZXNldC5iYWNrZ3JvdW5kUGFkZGluZyB8fCAnMTAnO1xuICAgIGNvbnN0IHBhZGRpbmdZID0gcHJlc2V0LmJhY2tncm91bmRQYWRkaW5nWSB8fCBwcmVzZXQuYmFja2dyb3VuZFBhZGRpbmcgfHwgJzEwJztcbiAgICBjb25zdCBiYXNlUGFkZGluZyA9IGAke3BhZGRpbmdZfXB4ICR7cGFkZGluZ1h9cHhgO1xuICAgIFxuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgdG9wOiBgJHthZGp1c3RlZFl9cHhgLFxuICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgtNTAlLCAtNTAlKVwiLFxuICAgICAgZm9udEZhbWlseTogcHJlc2V0LmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogYCR7cHJlc2V0LmZvbnRTaXplfXB4YCxcbiAgICAgIGZvbnRXZWlnaHQ6IHByZXNldC5mb250V2VpZ2h0LFxuICAgICAgY29sb3I6IHByZXNldC5mb250Q29sb3IsXG4gICAgICBhbXBsaWZpZWRDb2xvcjogcHJlc2V0LmFtcGxpZmllZENvbG9yLFxuICAgICAgYW1wbGlmaWVkQ29sb3JzOiBwcmVzZXQuYW1wbGlmaWVkQ29sb3JzLFxuICAgICAgYW1wbGlmeVNwb2tlbldvcmRzOiBwcmVzZXQuYW1wbGlmeVNwb2tlbldvcmRzLFxuICAgICAgdGV4dFRyYW5zZm9ybTogcHJlc2V0LnRleHRDYXNlLFxuICAgICAgZm9udFN0eWxlOiBwcmVzZXQuaXNJdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGxldHRlclNwYWNpbmc6IGAke3ByZXNldC50ZXh0U3BhY2luZ31weGAsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZzogYmFzZVBhZGRpbmcsXG4gICAgICBiYWNrZ3JvdW5kQm9yZGVyUmFkaXVzOiBwcmVzZXQuYmFja2dyb3VuZEJvcmRlclJhZGl1cyxcbiAgICAgIHZlcnRpY2FsU3RyZXRjaDogcHJlc2V0LnZlcnRpY2FsU3RyZXRjaCB8fCAxLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiBcImNlbnRlciBjZW50ZXJcIixcbiAgICAgIHdpZHRoOiBcImF1dG9cIixcbiAgICAgIG1heFdpZHRoOiBgJHt2aWRlb1dpZHRoICogMC45fXB4YCxcbiAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIG92ZXJmbG93OiBcInZpc2libGVcIixcbiAgICAgIG91dGxpbmVDb2xvcjogcHJlc2V0Lm91dGxpbmVDb2xvcixcbiAgICAgIG91dGxpbmVXaWR0aDogcHJlc2V0Lm91dGxpbmVXaWR0aCxcbiAgICAgIGZpbHRlcjogZHJvcFNoYWRvdyxcbiAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICB0ZXh0SGlnaGxpZ2h0UGVyc2lzdHM6IHByZXNldC50ZXh0SGlnaGxpZ2h0UGVyc2lzdHMsXG4gICAgICBhbXBsaWZpZWRPcGFjaXR5OiBwcmVzZXQuYW1wbGlmaWVkT3BhY2l0eSxcbiAgICAgIHVuQW1wbGlmaWVkT3BhY2l0eTogcHJlc2V0Lm9wYWNpdHksXG4gICAgICBjdXJyZW50V29yZEJsb2NrOiBwcmVzZXQuY3VycmVudFdvcmRCbG9jayxcbiAgICAgIGN1cnJlbnRXb3JkQmxvY2tCYWNrZ3JvdW5kQ29sb3I6IHByZXNldC5jdXJyZW50V29yZEJsb2NrQmFja2dyb3VuZENvbG9yLFxuICAgICAgY3VycmVudFdvcmRCbG9ja09wYWNpdHk6IHByZXNldC5jdXJyZW50V29yZEJsb2NrT3BhY2l0eSxcbiAgICAgIGN1cnJlbnRXb3JkQmxvY2tQYWRkaW5nOiBwcmVzZXQuY3VycmVudFdvcmRCbG9ja1BhZGRpbmcsXG4gICAgICBjdXJyZW50V29yZEJsb2NrQm9yZGVyUmFkaXVzOiBwcmVzZXQuY3VycmVudFdvcmRCbG9ja0JvcmRlclJhZGl1cyxcbiAgICAgIGFtcGxpZnlPcGFjaXR5VHJhbnNpdGlvbkR1cmF0aW9uOiBwcmVzZXQuYW1wbGlmeU9wYWNpdHlUcmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICB0ZXh0U2hhZG93LFxuICAgICAgc2hhZG93SW50ZW5zaXR5OiBwcmVzZXQuc2hhZG93SW50ZW5zaXR5LFxuICAgIH07XG4gICAgXG4gICAgLy8gY29uc29sZS5sb2coJ3VzZVRleHRTdHlsZSAtIG91dHB1dCBzdHlsZSBmb250RmFtaWx5OicsIHN0eWxlLmZvbnRGYW1pbHkpO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSwgW3ByZXNldCwgeCwgYWRqdXN0ZWRZLCB2aWRlb1dpZHRoXSk7XG59OyAiLCIvLyBGb250IG1hcCB0aGF0IG1hdGNoZXMgQ1NTIGZvbnQtZmFtaWx5IG5hbWVzIHRvIHRoZWlyIGZvbnQgZmlsZXMgYW5kIHdlaWdodHNcbmNvbnN0IEZPTlRfTUFQID0ge1xuICAnUG9zdGVyYW1hLTE5MjctVzAxLVVsdHJhQmxhY2snOiBbeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9Qb3N0ZXJhbWEtMTkyNy1XMDEtVWx0cmFCbGFjay50dGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA5MDAsIHN0eWxlOiAnbm9ybWFsJyB9XSxcbiAgJ1N0YXBlbC1OYXJyb3cnOiBbeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9OZXVlSGFhc0Rpc3BsYXkvTmV1ZUhhYXNEaXNwbGF5Um9tYW4udHRmP2FsdD1tZWRpYScsIHdlaWdodDogNDAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gICdTdGFwZWwtTmFycm93TWVkaXVtJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc3RhcGVsL1N0YXBlbC1OYXJyb3dNZWRpdW0udHRmP2FsdD1tZWRpYScsIHdlaWdodDogNTAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gICdOZXVlSGFhc0Rpc3BsYXlCb2xkJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvTmV1ZUhhYXNEaXNwbGF5Qm9sZC50dGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA3MDAsIHN0eWxlOiAnbm9ybWFsJyB9XSxcbiAgJ1RoZUJvbGRGb250JzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvdGhlYm9sZGZvbnQudHRmP2FsdD1tZWRpYScsIHdlaWdodDogNzAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gICdNZXJjYWRpbGxvIEJsYWNrJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWVyY2FkaWxsby9NZXJjYWRpbGxvLUJsYWNrLnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICAnTWVyY2FkaWxsbyBCb2xkJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWVyY2FkaWxsby9NZXJjYWRpbGxvLUJvbGQudHRmP2FsdD1tZWRpYScsIHdlaWdodDogNzAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gIFxuICAvLyBuZWVkIHRvIGFkZCBpbnRlciBmb250IHZhcmlhdGlvbnNcbiAgLy8gSW50ZXIgZm9udCB2YXJpYXRpb25zXG4gICdJbnRlcic6IFtcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL0ludGVyL0ludGVyLVRoaW4ud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiAxMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItRXh0cmFMaWdodC53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDIwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1MaWdodC53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDMwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1SZWd1bGFyLndvZmYyP2FsdD1tZWRpYScsIHdlaWdodDogNDAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL0ludGVyL0ludGVyLU1lZGl1bS53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDUwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1TZW1pQm9sZC53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDYwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1Cb2xkLndvZmYyP2FsdD1tZWRpYScsIHdlaWdodDogNzAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL0ludGVyL0ludGVyLUV4dHJhQm9sZC53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDgwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1CbGFjay53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdub3JtYWwnIH1cbiAgXSxcblxuICAvLyBNaWxsaWFyZCBmb250IHZhcmlhdGlvbnNcbiAgJ01pbGxpYXJkJzogW1xuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwVGhpbi5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAxMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwVGhpbiUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAxMDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwRXh0cmFMaWdodC5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAyMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwRXh0cmFMaWdodCUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAyMDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwTGlnaHQub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMzAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMExpZ2h0JTIwSXRhbGljLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDMwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBCb29rLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBCb29rJTIwSXRhbGljLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBNZWRpdW0ub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyME1lZGl1bSUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA1MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwU2VtaUJvbGQub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNjAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMFNlbWlCb2xkJTIwSXRhbGljLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDYwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBCb2xkLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBCb2xkJTIwSXRhbGljLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBFeHRyYUJvbGQub3RmP2FsdD1tZWRpYScsIHdlaWdodDogODAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMEV4dHJhQm9sZCUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA4MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwQmxhY2sub3RmP2FsdD1tZWRpYScsIHdlaWdodDogOTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMEJsYWNrJTIwSXRhbGljLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdpdGFsaWMnIH1cbiAgXSxcblxuICAnQXJpYWwgQmxhY2snOiBbeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9BcmlhbCUyMEJsYWNrLnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICBcbiAgLy8gU29maWEgUHJvIGZvbnQgdmFyaWF0aW9uc1xuICAnU29maWEgUHJvJzogW1xuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwTGlnaHQlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAzMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwTGlnaHQlMjBJdGFsaWMlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAzMDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwUmVndWxhciUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBSZWd1bGFyJTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNDAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyME1lZGl1bSUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDUwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBNZWRpdW0lMjBJdGFsaWMlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA1MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwU2VtaSUyMEJvbGQlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA2MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwU2VtaSUyMEJvbGQlMjBJdGFsaWMlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA2MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwQm9sZCUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBCb2xkJTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNzAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMEJsYWNrJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogOTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMEJsYWNrJTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogOTAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMEV4dHJhTGlnaHQlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAyMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwRXh0cmFMaWdodCUyMEl0YWxpYyUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDIwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBVbHRyYUxpZ2h0JTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMFVsdHJhTGlnaHQlMjBJdGFsaWMlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAxMDAsIHN0eWxlOiAnaXRhbGljJyB9XG4gIF1cbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkRG9jdW1lbnRGb250cyA9IGFzeW5jIChmb250RmFtaWx5KSA9PiB7ICBcbiAgaWYgKGZvbnRGYW1pbHkgPT09ICdBcmlhbCcpIHsgXG4gICAgcmV0dXJuO1xuICB9XG4gIGVsc2UgaWYgKCFmb250RmFtaWx5IHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ZvbnQgZmFtaWx5IGlzIG5vdCBwcm92aWRlZCBvciBkb2N1bWVudCBpcyB1bmRlZmluZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9IFxuXG4gIC8vIENsZWFuIHRoZSBmb250IGZhbWlseSBuYW1lIChyZW1vdmUgcXVvdGVzIGFuZCBmYWxsYmFja3MpXG4gIGNvbnN0IGNsZWFuRm9udEZhbWlseSA9IGZvbnRGYW1pbHkucmVwbGFjZSgvWydcIl0vZywgJycpLnNwbGl0KCcsJylbMF0udHJpbSgpO1xuICAvLyBjb25zb2xlLmxvZyhgQ2xlYW5lZCBmb250IGZhbWlseSBuYW1lOiAke2NsZWFuRm9udEZhbWlseX1gKTtcbiAgXG4gIC8vIEdldCBmb250IHZhcmlhdGlvbnMgZm9yIHRoaXMgZmFtaWx5XG4gIGNvbnN0IGZvbnRWYXJpYXRpb25zID0gRk9OVF9NQVBbY2xlYW5Gb250RmFtaWx5XTtcbiAgaWYgKCFmb250VmFyaWF0aW9ucykge1xuICAgIGNvbnNvbGUud2FybihgRm9udCBmYW1pbHkgXCIke2NsZWFuRm9udEZhbWlseX1cIiBub3QgZm91bmQgaW4gZm9udCBtYXBgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIC8vIGNvbnNvbGUubG9nKGBGb3VuZCBmb250IHZhcmlhdGlvbnMgZm9yIFwiJHtjbGVhbkZvbnRGYW1pbHl9XCI6YCwgZm9udFZhcmlhdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgLy8gTG9hZCBhbGwgdmFyaWF0aW9ucyBvZiB0aGUgZm9udCBmYW1pbHlcbiAgICBjb25zdCBsb2FkUHJvbWlzZXMgPSBmb250VmFyaWF0aW9ucy5tYXAoYXN5bmMgKHsgc3JjLCB3ZWlnaHQsIHN0eWxlIH0pID0+IHtcbiAgICAgIGNvbnN0IGZvbnQgPSBuZXcgRm9udEZhY2UoY2xlYW5Gb250RmFtaWx5LCBgdXJsKCR7c3JjfSlgLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICBjb25zdCBsb2FkZWRGb250ID0gYXdhaXQgZm9udC5sb2FkKCk7XG4gICAgICBkb2N1bWVudC5mb250cy5hZGQobG9hZGVkRm9udCk7XG4gICAgICByZXR1cm4gbG9hZGVkRm9udDtcbiAgICB9KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvYWRQcm9taXNlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBmb250IGZhbWlseSBcIiR7Y2xlYW5Gb250RmFtaWx5fVwiOmAsIGVycm9yKTtcbiAgfVxufTsiLG51bGwsbnVsbCwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUN1cnJlbnRGcmFtZSB9IGZyb20gJ3JlbW90aW9uJztcblxuZXhwb3J0IGNvbnN0IHVzZUFkanVzdGVkUG9zaXRpb24gPSAoeSwgZmFjZURhdGEpID0+IHtcbiAgY29uc3QgY3VycmVudEZyYW1lID0gdXNlQ3VycmVudEZyYW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBmYWNlIGV2ZW50IGxvb2t1cFxuICBjb25zdCBjdXJyZW50RmFjZUV2ZW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFmYWNlRGF0YT8uZXZlbnRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IG51bVBlb3BsZTogMiB9O1xuICAgIH1cbiAgICByZXR1cm4gZmFjZURhdGEuZXZlbnRzLmZpbmRMYXN0KFxuICAgICAgKGV2ZW50KSA9PiBldmVudC5mcmFtZSA8PSBjdXJyZW50RnJhbWVcbiAgICApIHx8IHsgbnVtUGVvcGxlOiAyIH07XG4gIH0sIFtjdXJyZW50RnJhbWUsIGZhY2VEYXRhPy5ldmVudHNdKTtcbiAgXG4gIC8vIEFkanVzdCBZIHBvc2l0aW9uIG9ubHkgaWYgZmFjZSBkZXRlY3Rpb24gZGF0YSBpcyBhdmFpbGFibGVcbiAgY29uc3QgYWRqdXN0ZWRZID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRGYWNlRXZlbnQubnVtUGVvcGxlID09PSAyKSB7XG4gICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgaWYgKHkgPT09IDk2MCkge1xuICAgICAgcmV0dXJuIHkgKiAyIC0gMzAwO1xuICAgIH1cbiAgICByZXR1cm4geTtcbiAgfSwgW3ksIGN1cnJlbnRGYWNlRXZlbnQubnVtUGVvcGxlXSk7XG5cbiAgcmV0dXJuIHsgY3VycmVudEZhY2VFdmVudCwgYWRqdXN0ZWRZIH07XG59OyAiLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgY29uc3QgdXNlQWRqdXN0ZWRQaHJhc2VzID0gKHN1YnRpdGxlc0RhdGEsIG1heENoYXJzUGVyTGluZSwgZnBzLCBzZWdtZW50RGF0YSA9IFtdKSA9PiB7XG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBJZiBubyBzZWdtZW50IGRhdGEsIHJldHVybiBlbXB0eSBhcnJheVxuICAgIGlmICghc2VnbWVudERhdGEgfHwgc2VnbWVudERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0TWlzc2luZ1dvcmRQaHJhc2VzSWZFeGlzdCA9IChzdGFydFRpbWUsIGVuZFRpbWUpID0+IHtcbiAgICAgIC8vIEZpbmQgd29yZHMgdGhhdCBmYWxsIGluIHRoZSBnYXBcbiAgICAgIGNvbnN0IGdhcFdvcmRzID0gc3VidGl0bGVzRGF0YS5maWx0ZXIod29yZCA9PiBcbiAgICAgICAgd29yZC5zdGFydCA+PSBzdGFydFRpbWUgJiYgd29yZC5lbmQgPD0gZW5kVGltZVxuICAgICAgKTtcblxuICAgICAgaWYgKGdhcFdvcmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgICAvLyBDcmVhdGUgcGhyYXNlcyBmcm9tIGdhcCB3b3JkcyB1c2luZyBzYW1lIGxvZ2ljIGFzIHNlZ21lbnQgcGhyYXNlc1xuICAgICAgY29uc3QgZ2FwUGhyYXNlcyA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnRQaHJhc2UgPSB7XG4gICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgIHdvcmRzOiBbXSxcbiAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgc2VnbWVudEluZGV4OiAtMSwgIC8vIFNwZWNpYWwgaW5kZXggZm9yIGdhcCBwaHJhc2VzXG4gICAgICAgIGR1cmF0aW9uSW5GcmFtZXM6IDBcbiAgICAgIH07XG5cbiAgICAgIGdhcFdvcmRzLmZvckVhY2goKHdvcmQsIHdvcmRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB3b3JkV2l0aFNwYWNlID0gd29yZEluZGV4ID09PSAwID8gd29yZC53b3JkIDogYCAke3dvcmQud29yZH1gO1xuICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBjdXJyZW50UGhyYXNlLnRleHQubGVuZ3RoICsgd29yZFdpdGhTcGFjZS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG5ld0xlbmd0aCA8PSBtYXhDaGFyc1BlckxpbmUpIHtcbiAgICAgICAgICAvLyBBZGQgdG8gY3VycmVudCBwaHJhc2VcbiAgICAgICAgICBjdXJyZW50UGhyYXNlLnRleHQgKz0gd29yZFdpdGhTcGFjZTtcbiAgICAgICAgICBjdXJyZW50UGhyYXNlLndvcmRzLnB1c2god29yZCk7XG4gICAgICAgICAgY3VycmVudFBocmFzZS5zdGFydCA9IGN1cnJlbnRQaHJhc2Uuc3RhcnQgPT09IG51bGwgPyB3b3JkLnN0YXJ0IDogY3VycmVudFBocmFzZS5zdGFydDtcbiAgICAgICAgICBjdXJyZW50UGhyYXNlLmVuZCA9IHdvcmQuZW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZpbmFsaXplIGN1cnJlbnQgcGhyYXNlXG4gICAgICAgICAgaWYgKGN1cnJlbnRQaHJhc2Uud29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2FwUGhyYXNlcy5wdXNoKGN1cnJlbnRQaHJhc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IG5ldyBwaHJhc2Ugd2l0aCBjdXJyZW50IHdvcmRcbiAgICAgICAgICBjdXJyZW50UGhyYXNlID0ge1xuICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgd29yZHM6IFt3b3JkXSxcbiAgICAgICAgICAgIHN0YXJ0OiB3b3JkLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB3b3JkLmVuZCxcbiAgICAgICAgICAgIHNlZ21lbnRJbmRleDogLTFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIHRoZSBsYXN0IHBocmFzZSBpZiBpdCBoYXMgd29yZHNcbiAgICAgIGlmIChjdXJyZW50UGhyYXNlLndvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZ2FwUGhyYXNlcy5wdXNoKGN1cnJlbnRQaHJhc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRpbWluZyBmb3IgZ2FwIHBocmFzZXNcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEdhcFBocmFzZXMgPSBnYXBQaHJhc2VzLm1hcCgocGhyYXNlLCBwaHJhc2VJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydEZyYW1lID0gTWF0aC5mbG9vcihwaHJhc2Uuc3RhcnQgKiBmcHMpO1xuICAgICAgICBsZXQgZW5kRnJhbWU7XG5cbiAgICAgICAgaWYgKHBocmFzZUluZGV4IDwgZ2FwUGhyYXNlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFBocmFzZSA9IGdhcFBocmFzZXNbcGhyYXNlSW5kZXggKyAxXTtcbiAgICAgICAgICBjb25zdCB0aW1lRGlmZiA9IG5leHRQaHJhc2Uuc3RhcnQgLSBwaHJhc2UuZW5kO1xuICAgICAgICAgIGVuZEZyYW1lID0gdGltZURpZmYgPiAwLjMgPyBcbiAgICAgICAgICAgIE1hdGguZmxvb3IocGhyYXNlLmVuZCAqIGZwcykgOiBcbiAgICAgICAgICAgIE1hdGguZmxvb3IobmV4dFBocmFzZS5zdGFydCAqIGZwcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kRnJhbWUgPSBNYXRoLmZsb29yKHBocmFzZS5lbmQgKiBmcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5waHJhc2UsXG4gICAgICAgICAgc3RhcnRGcmFtZSxcbiAgICAgICAgICBlbmRGcmFtZSxcbiAgICAgICAgICBkdXJhdGlvbkluRnJhbWVzOiBlbmRGcmFtZSAtIHN0YXJ0RnJhbWUgKyAxXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb2Nlc3NlZEdhcFBocmFzZXM7XG4gICAgfTtcblxuICAgIGNvbnN0IG1hc3RlclBocmFzZXMgPSBbXTtcblxuICAgIC8vIENoZWNrIGZvciB3b3JkcyBiZWZvcmUgdGhlIGZpcnN0IHNlZ21lbnRcbiAgICBpZiAoc2VnbWVudERhdGEubGVuZ3RoID4gMCAmJiBzdWJ0aXRsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0U2VnbWVudFN0YXJ0ID0gc2VnbWVudERhdGFbMF0uc3RhcnQ7XG4gICAgICBjb25zdCBmaXJzdFdvcmRTdGFydCA9IDA7IC8vIFN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZ1xuICAgICAgY29uc3QgcHJlU2VnbWVudFBocmFzZXMgPSBnZXRNaXNzaW5nV29yZFBocmFzZXNJZkV4aXN0KGZpcnN0V29yZFN0YXJ0LCBmaXJzdFNlZ21lbnRTdGFydCk7XG4gICAgICBpZiAocHJlU2VnbWVudFBocmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXN0ZXJQaHJhc2VzLnB1c2goLi4ucHJlU2VnbWVudFBocmFzZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZWFjaCBzZWdtZW50IGFuZCBnYXBzIGJldHdlZW4gc2VnbWVudHNcbiAgICBzZWdtZW50RGF0YS5mb3JFYWNoKChzZWdtZW50LCBzZWdtZW50SW5kZXgpID0+IHtcbiAgICAgIC8vIDEuIEdldCB3b3JkcyBmb3IgdGhpcyBzZWdtZW50XG4gICAgICBjb25zdCBzZWdtZW50V29yZHMgPSBzdWJ0aXRsZXNEYXRhLmZpbHRlcih3b3JkID0+IHdvcmQuc2VnbWVudElkID09PSBzZWdtZW50SW5kZXgpO1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIHNlZ21lbnQgcGhyYXNlc1xuICAgICAgaWYgKHNlZ21lbnRXb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIDIuIENyZWF0ZSBwaHJhc2VzIGZvciB0aGlzIHNlZ21lbnRcbiAgICAgICAgY29uc3QgY3VycmVudFNlZ21lbnRQaHJhc2VzID0gW107XG4gICAgICAgIGxldCBjdXJyZW50UGhyYXNlID0ge1xuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgd29yZHM6IFtdLFxuICAgICAgICAgIHN0YXJ0OiBudWxsLFxuICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICBzZWdtZW50SW5kZXhcbiAgICAgICAgfTtcblxuICAgICAgICBzZWdtZW50V29yZHMuZm9yRWFjaCgod29yZCwgd29yZEluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29yZFdpdGhTcGFjZSA9IHdvcmRJbmRleCA9PT0gMCA/IHdvcmQud29yZCA6IGAgJHt3b3JkLndvcmR9YDtcbiAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBjdXJyZW50UGhyYXNlLnRleHQubGVuZ3RoICsgd29yZFdpdGhTcGFjZS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAobmV3TGVuZ3RoIDw9IG1heENoYXJzUGVyTGluZSkge1xuICAgICAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgcGhyYXNlXG4gICAgICAgICAgICBjdXJyZW50UGhyYXNlLnRleHQgKz0gd29yZFdpdGhTcGFjZTtcbiAgICAgICAgICAgIGN1cnJlbnRQaHJhc2Uud29yZHMucHVzaCh3b3JkKTtcbiAgICAgICAgICAgIGN1cnJlbnRQaHJhc2Uuc3RhcnQgPSBjdXJyZW50UGhyYXNlLnN0YXJ0ID09PSBudWxsID8gd29yZC5zdGFydCA6IGN1cnJlbnRQaHJhc2Uuc3RhcnQ7XG4gICAgICAgICAgICBjdXJyZW50UGhyYXNlLmVuZCA9IHdvcmQuZW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5hbGl6ZSBjdXJyZW50IHBocmFzZVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQaHJhc2Uud29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50U2VnbWVudFBocmFzZXMucHVzaChjdXJyZW50UGhyYXNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV3IHBocmFzZSB3aXRoIGN1cnJlbnQgd29yZFxuICAgICAgICAgICAgY3VycmVudFBocmFzZSA9IHtcbiAgICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgICB3b3JkczogW3dvcmRdLFxuICAgICAgICAgICAgICBzdGFydDogd29yZC5zdGFydCxcbiAgICAgICAgICAgICAgZW5kOiB3b3JkLmVuZCxcbiAgICAgICAgICAgICAgc2VnbWVudEluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBsYXN0IHBocmFzZSBpZiBpdCBoYXMgd29yZHNcbiAgICAgICAgaWYgKGN1cnJlbnRQaHJhc2Uud29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGN1cnJlbnRTZWdtZW50UGhyYXNlcy5wdXNoKGN1cnJlbnRQaHJhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gUHJvY2VzcyB0aW1pbmcgZm9yIHBocmFzZXNcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkUGhyYXNlcyA9IGN1cnJlbnRTZWdtZW50UGhyYXNlcy5tYXAoKHBocmFzZSwgcGhyYXNlSW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydEZyYW1lID0gTWF0aC5mbG9vcihwaHJhc2Uuc3RhcnQgKiBmcHMpO1xuICAgICAgICAgIGxldCBlbmRGcmFtZTtcblxuICAgICAgICAgIC8vIENhbGN1bGF0ZSBlbmQgZnJhbWUgYmFzZWQgb24gbmV4dCBwaHJhc2Ugb3Igc2VnbWVudCBlbmRcbiAgICAgICAgICBpZiAocGhyYXNlSW5kZXggPCBjdXJyZW50U2VnbWVudFBocmFzZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFBocmFzZSA9IGN1cnJlbnRTZWdtZW50UGhyYXNlc1twaHJhc2VJbmRleCArIDFdO1xuICAgICAgICAgICAgY29uc3QgdGltZURpZmYgPSBuZXh0UGhyYXNlLnN0YXJ0IC0gcGhyYXNlLmVuZDtcbiAgICAgICAgICAgIGVuZEZyYW1lID0gdGltZURpZmYgPiAwLjMgPyBcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihwaHJhc2UuZW5kICogZnBzKSA6IFxuICAgICAgICAgICAgICBNYXRoLmZsb29yKG5leHRQaHJhc2Uuc3RhcnQgKiBmcHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmRGcmFtZSA9IE1hdGguZmxvb3IocGhyYXNlLmVuZCAqIGZwcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHBocmFzZSBkb2Vzbid0IGV4dGVuZCBiZXlvbmQgc2VnbWVudCBib3VuZGFyaWVzXG4gICAgICAgICAgZW5kRnJhbWUgPSBNYXRoLm1pbihlbmRGcmFtZSwgTWF0aC5mbG9vcihzZWdtZW50LmVuZCAqIGZwcykpO1xuXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkUGhyYXNlID0ge1xuICAgICAgICAgICAgLi4ucGhyYXNlLFxuICAgICAgICAgICAgc3RhcnRGcmFtZSxcbiAgICAgICAgICAgIGVuZEZyYW1lLFxuICAgICAgICAgICAgZHVyYXRpb25JbkZyYW1lczogZW5kRnJhbWUgLSBzdGFydEZyYW1lICsgMVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZFBocmFzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNC4gQWRkIHRvIG1hc3RlciBhcnJheVxuICAgICAgICBtYXN0ZXJQaHJhc2VzLnB1c2goLi4ucHJvY2Vzc2VkUGhyYXNlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBnYXAgYWZ0ZXIgdGhpcyBzZWdtZW50XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgc2VnbWVudERhdGEubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBuZXh0U2VnbWVudCA9IHNlZ21lbnREYXRhW3NlZ21lbnRJbmRleCArIDFdO1xuICAgICAgICBjb25zdCBnYXBQaHJhc2VzID0gZ2V0TWlzc2luZ1dvcmRQaHJhc2VzSWZFeGlzdChzZWdtZW50LmVuZCwgbmV4dFNlZ21lbnQuc3RhcnQpO1xuICAgICAgICBpZiAoZ2FwUGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbWFzdGVyUGhyYXNlcy5wdXNoKC4uLmdhcFBocmFzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTb3J0IGZpbmFsIHBocmFzZXMgYnkgc3RhcnQgdGltZVxuICAgIG1hc3RlclBocmFzZXMuc29ydCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQpO1xuICAgIFxuICAgIHJldHVybiBtYXN0ZXJQaHJhc2VzO1xuICB9LCBbc3VidGl0bGVzRGF0YSwgbWF4Q2hhcnNQZXJMaW5lLCBmcHMsIHNlZ21lbnREYXRhXSk7XG59OyAiXSwibmFtZXMiOlsiZXN0aW1hdGVUZXh0V2lkdGgiLCJ0ZXh0IiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY29udGV4dCIsImdldENvbnRleHQiLCJmb250IiwiY29uY2F0IiwibWVhc3VyZVRleHQiLCJ3aWR0aCIsImdlbmVyYXRlT3V0bGluZVNoYWRvdyIsImNhY2hlIiwiTWFwIiwiY29sb3IiLCJvdXRsaW5lU3R5bGUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJrZXkiLCJoYXMiLCJnZXQiLCJzaGFkb3dzIiwicGFyc2VkV2lkdGgiLCJwYXJzZUludCIsInB1c2giLCJoYWxmV2lkdGgiLCJNYXRoIiwicm91bmQiLCJpIiwiYW5nbGUiLCJQSSIsIngiLCJjb3MiLCJ5Iiwic2luIiwicmVzdWx0Iiwiam9pbiIsInNldCIsIlN1YnRpdGxlVGV4dCIsIm1lbW8iLCJfcmVmIiwic3R5bGUiLCJhbmltYXRpb25TdHlsZSIsImZyYW1lIiwic3RhcnRGcmFtZSIsInJhbmRvbUNvbG9ycyIsIndvcmRzIiwiZnBzIiwiaGlnaGxpZ2h0V29yZHNDb2xvciIsInJlbGF0aXZlRnJhbWUiLCJzY2FsZSIsInVzZU1lbW8iLCJzcHJpbmciLCJmcm9tIiwidG8iLCJjb25maWciLCJkYW1waW5nIiwic3RpZmZuZXNzIiwic3ByaW5nVmFsdWUiLCJtYXNzIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVZhbHVlIiwiYWRqdXN0ZWRGb250U2l6ZSIsIm1heExpbmVXaWR0aCIsImJhc2VGb250U2l6ZSIsInRleHRXaWR0aCIsInNjYWxlRmFjdG9yIiwiZmxvb3IiLCJhbmltYXRlZFN0eWxlIiwiYmFzZVBhZGRpbmciLCJiYWNrZ3JvdW5kUGFkZGluZyIsInNoYWRvd0ludGVuc2l0eSIsInNoYWRvd0NvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIiwidGV4dFNoYWRvdyIsImhleFRvUmdiYSIsImhleCIsIm9wYWNpdHkiLCJzaG9ydGhhbmRSZWdleCIsInJlcGxhY2UiLCJtIiwiciIsImciLCJiIiwiZXhlYyIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRPcGFjaXR5IiwicGFyc2VGbG9hdCIsInRyaW0iLCJiYWNrZ3JvdW5kIiwiaGFzQmFja2dyb3VuZCIsImhhc1NoYWRvdyIsImJvcmRlclJhZGl1cyIsImJhY2tncm91bmRCb3JkZXJSYWRpdXMiLCJpc1dyYXBwZWQiLCJiYWNrZ3JvdW5kRmlsbFN0eWxlIiwicGFkZGluZ1ZhbHVlIiwicGFkZGluZyIsImRpc3BsYXkiLCJiYXNlU3R5bGUiLCJfb2JqZWN0U3ByZWFkIiwib3ZlcmZsb3ciLCJib3hTaGFkb3ciLCJ0cmFuc2Zvcm0iLCJ3cmFwcGVyU3R5bGUiLCJwb3NpdGlvbiIsInZlcnRpY2FsU3RyZXRjaCIsIndoaXRlU3BhY2UiLCJhbGlnbkl0ZW1zIiwid2lsbENoYW5nZSIsImxlZnQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsIm91dGxpbmVDb2xvciIsIm91dGxpbmVXaWR0aCIsIldlYmtpdFRleHRGaWxsQ29sb3IiLCJ6SW5kZXgiLCJtYWluVGV4dFN0eWxlIiwiV2Via2l0VGV4dFN0cm9rZSIsInRleHRXb3JkcyIsInNwbGl0IiwiY3VycmVudFdvcmRUaW1lIiwicGhyYXNlQW1wbGlmaWVkU3R5bGUiLCJBcnJheSIsImlzQXJyYXkiLCJhbXBsaWZpZWRDb2xvcnMiLCJmaXJzdFdvcmQiLCJ3b3JkIiwiZ3JhZGllbnRJbmRleCIsInJhbmRvbSIsImdyYWRpZW50IiwiY29sb3JzIiwiYmFja2dyb3VuZENsaXAiLCJXZWJraXRCYWNrZ3JvdW5kQ2xpcCIsImNvbnNvbGUiLCJsb2ciLCJfdHlwZW9mIiwiYW1wbGlmaWVkQ29sb3IiLCJ0eXBlIiwicmFuZG9tQ29sb3JEYXRhIiwiZW5hYmxlZCIsInNob3VsZENvbG9yIiwicGN0QXBwbGllZCIsIl9yZWYyIiwicmFuZG9tV29yZENvdW50UmFuZ2UiLCJfcmVmMyIsIl9zbGljZWRUb0FycmF5IiwibWluV29yZHMiLCJtYXhXb3JkcyIsInJhbmdlIiwicmFuZG9tV29yZENvdW50IiwibWF4U3RhcnRJbmRleCIsIm1heCIsInN0YXJ0SW5kZXgiLCJyYW5kb21Db2xvck9iaiIsInBocmFzZVN0eWxlIiwid29yZENvbnRlbnQiLCJtYXAiLCJpbmRleCIsImhpZ2hsaWdodGVkTWF0Y2giLCJtYXRjaCIsImlzSGlnaGxpZ2h0ZWQiLCJkaXNwbGF5V29yZCIsInNob3VsZENvbG9yVGhpc1dvcmQiLCJ3b3JkVGltaW5nIiwiaGFzQmVlblNwb2tlbiIsImVuZCIsImlzQ3VycmVudGx5U3Bva2VuIiwic3RhcnQiLCJ0ZXh0SGlnaGxpZ2h0UGVyc2lzdHMiLCJzaG91bGRIaWdobGlnaHQiLCJhbXBsaWZ5U3Bva2VuV29yZHMiLCJ3b3JkU3R5bGUiLCJhbXBsaWZpZWRPcGFjaXR5IiwidW5BbXBsaWZpZWRPcGFjaXR5IiwiY29udGFpbmVyU3R5bGUiLCJtYXJnaW5SaWdodCIsIlJlYWN0IiwiY3VycmVudFdvcmRCbG9jayIsImNvbnRlbnQiLCJjdXJyZW50V29yZEJsb2NrUGFkZGluZyIsImhlaWdodCIsImN1cnJlbnRXb3JkQmxvY2tCYWNrZ3JvdW5kQ29sb3IiLCJjdXJyZW50V29yZEJsb2NrT3BhY2l0eSIsImN1cnJlbnRXb3JkQmxvY2tCb3JkZXJSYWRpdXMiLCJwb2ludGVyRXZlbnRzIiwiYm94U2l6aW5nIiwicHJldlByb3BzIiwibmV4dFByb3BzIiwiZXNzZW50aWFsUHJvcHMiLCJoYXNFc3NlbnRpYWxQcm9wc0NoYW5nZWQiLCJzb21lIiwicHJvcCIsIkpTT04iLCJzdHJpbmdpZnkiLCJmaW5kUGhyYXNlc0luUmFuZ2UiLCJ0aW1lIiwicGhyYXNlcyIsIm1pZCIsInBocmFzZSIsImhleFRvUmdiIiwic2xpY2UiLCJ1c2VUZXh0U3R5bGUiLCJwcmVzZXQiLCJhZGp1c3RlZFkiLCJ2aWRlb1dpZHRoIiwiZHJvcFNoYWRvdyIsInNoYWRvd0VuYWJsZWQiLCJwYWRkaW5nWCIsImJhY2tncm91bmRQYWRkaW5nWCIsInBhZGRpbmdZIiwiYmFja2dyb3VuZFBhZGRpbmdZIiwiZm9udFdlaWdodCIsImZvbnRDb2xvciIsInRleHRUcmFuc2Zvcm0iLCJ0ZXh0Q2FzZSIsImZvbnRTdHlsZSIsImlzSXRhbGljIiwidGV4dEFsaWduIiwibGV0dGVyU3BhY2luZyIsInRleHRTcGFjaW5nIiwidHJhbnNmb3JtT3JpZ2luIiwibWF4V2lkdGgiLCJmaWx0ZXIiLCJhbXBsaWZ5T3BhY2l0eVRyYW5zaXRpb25EdXJhdGlvbiIsIkZPTlRfTUFQIiwic3JjIiwid2VpZ2h0IiwibG9hZERvY3VtZW50Rm9udHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJjbGVhbkZvbnRGYW1pbHkiLCJmb250VmFyaWF0aW9ucyIsImxvYWRQcm9taXNlcyIsIndyYXAiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsIndhcm4iLCJfY2FsbGVlIiwibG9hZGVkRm9udCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJGb250RmFjZSIsImxvYWQiLCJzZW50IiwiZm9udHMiLCJhZGQiLCJzdG9wIiwiX3gyIiwiYXBwbHkiLCJQcm9taXNlIiwiYWxsIiwidDAiLCJlcnJvciIsIl94IiwiYWRkUGl4ZWxVbml0IiwidmFsdWUiLCJlbmRzV2l0aCIsIlN1YnRpdGxlc0NvbXBvc2l0aW9uIiwiX2EiLCJzdHlsZUNvbmZpZyIsImN1cnJlbnRGcmFtZSIsImN1cnJlbnRUaW1lIiwidXNlRWZmZWN0IiwiY3VycmVudFBocmFzZXMiLCJfanN4IiwiX19hc3NpZ24iLCJjaGlsZHJlbiIsInByb3BzIiwiU3VidGl0bGVzIiwiZGV2TW9kZSIsIlBsYXllciIsImNvbXBvbmVudCIsImlucHV0UHJvcHMiLCJkdXJhdGlvbkluRnJhbWVzIiwiY29tcG9zaXRpb25XaWR0aCIsImNvbXBvc2l0aW9uSGVpZ2h0IiwiY29udHJvbHMiLCJhdXRvUGxheSIsImxvb3AiLCJ1c2VTdHlsZUNvbmZpZyIsInN1YnRpdGxlU3R5bGUiLCJ0ZXh0U3R5bGUiLCJuYW1lIiwiY2FwdGlvblBvc2l0aW9uIiwidXNlQWRqdXN0ZWRQb3NpdGlvbiIsImZhY2VEYXRhIiwidXNlQ3VycmVudEZyYW1lIiwiY3VycmVudEZhY2VFdmVudCIsIl9mYWNlRGF0YSRldmVudHMiLCJldmVudHMiLCJudW1QZW9wbGUiLCJmaW5kTGFzdCIsImV2ZW50IiwidXNlQWRqdXN0ZWRQaHJhc2VzIiwic3VidGl0bGVzRGF0YSIsIm1heENoYXJzUGVyTGluZSIsInNlZ21lbnREYXRhIiwiZ2V0TWlzc2luZ1dvcmRQaHJhc2VzSWZFeGlzdCIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJnYXBXb3JkcyIsImdhcFBocmFzZXMiLCJjdXJyZW50UGhyYXNlIiwic2VnbWVudEluZGV4IiwiZm9yRWFjaCIsIndvcmRJbmRleCIsIndvcmRXaXRoU3BhY2UiLCJuZXdMZW5ndGgiLCJwcm9jZXNzZWRHYXBQaHJhc2VzIiwicGhyYXNlSW5kZXgiLCJlbmRGcmFtZSIsIm5leHRQaHJhc2UiLCJ0aW1lRGlmZiIsIm1hc3RlclBocmFzZXMiLCJmaXJzdFNlZ21lbnRTdGFydCIsImZpcnN0V29yZFN0YXJ0IiwicHJlU2VnbWVudFBocmFzZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzZWdtZW50Iiwic2VnbWVudFdvcmRzIiwic2VnbWVudElkIiwiY3VycmVudFNlZ21lbnRQaHJhc2VzIiwicHJvY2Vzc2VkUGhyYXNlcyIsIm1pbiIsInByb2Nlc3NlZFBocmFzZSIsIm5leHRTZWdtZW50Iiwic29ydCIsImEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWVBO0FBQ08sSUFBSSxRQUFRLEdBQUcsV0FBVztBQUNqQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyRCxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdELFlBQVksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0=